qpp-style 1.0.0-cc.77 → 1.0.0-cc.78

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 (114) hide show
  1. package/components/Breadcrumb/Breadcrumb.stories.js +18 -0
  2. package/components/Breadcrumb/index.js +4 -4
  3. package/components/Header/HeaderMenuItem.jsx +1 -10
  4. package/components/Header/HeaderUI.jsx +2 -1
  5. package/components/Header/ImpersonatorBanner.jsx +55 -0
  6. package/components/SideNav/Content/LevelOneContent.jsx +18 -4
  7. package/components/SideNav/UI/SideNavUI.jsx +2 -0
  8. package/components/SideNav/UI/default-content.json +23 -0
  9. package/coverage/clover.xml +213 -141
  10. package/coverage/coverage-final.json +36 -34
  11. package/coverage/lcov-report/index.html +100 -85
  12. package/coverage/lcov-report/react/components/Accordion/index.html +1 -1
  13. package/coverage/lcov-report/react/components/Accordion/index.jsx.html +1 -1
  14. package/coverage/lcov-report/react/components/Button/index.html +111 -0
  15. package/coverage/lcov-report/react/components/Button/index.js.html +350 -0
  16. package/coverage/lcov-report/react/components/Error/Collapsible.jsx.html +5 -5
  17. package/coverage/lcov-report/react/components/Error/ErrorUI.jsx.html +1 -1
  18. package/coverage/lcov-report/react/components/Error/error.js.html +1 -1
  19. package/coverage/lcov-report/react/components/Error/index.html +4 -4
  20. package/coverage/lcov-report/react/components/Footer/FooterUI.jsx.html +160 -118
  21. package/coverage/lcov-report/react/components/Footer/LegacyFooterUI.jsx.html +1 -1
  22. package/coverage/lcov-report/react/components/Footer/SocialLinks.jsx.html +1 -1
  23. package/coverage/lcov-report/react/components/Footer/Subscribe.jsx.html +1 -1
  24. package/coverage/lcov-report/react/components/Footer/footer.js.html +1 -1
  25. package/coverage/lcov-report/react/components/Footer/index.html +19 -19
  26. package/coverage/lcov-report/react/components/Header/HeaderAccountMenu.jsx.html +2 -2
  27. package/coverage/lcov-report/react/components/Header/HeaderCancel.jsx.html +3 -3
  28. package/coverage/lcov-report/react/components/Header/HeaderContainer.jsx.html +14 -5
  29. package/coverage/lcov-report/react/components/Header/HeaderLogo.jsx.html +1 -1
  30. package/coverage/lcov-report/react/components/Header/HeaderMenuButton.js.html +1 -1
  31. package/coverage/lcov-report/react/components/Header/HeaderMenuItem.jsx.html +3 -3
  32. package/coverage/lcov-report/react/components/Header/HeaderMenuLink.js.html +1 -1
  33. package/coverage/lcov-report/react/components/Header/HeaderMenuSignOutButton.js.html +2 -2
  34. package/coverage/lcov-report/react/components/Header/HeaderMobileButton.js.html +2 -2
  35. package/coverage/lcov-report/react/components/Header/HeaderUI.jsx.html +24 -3
  36. package/coverage/lcov-report/react/components/Header/HelpIcon.jsx.html +1 -1
  37. package/coverage/lcov-report/react/components/Header/ImpersonatorBanner.jsx.html +245 -0
  38. package/coverage/lcov-report/react/components/Header/NavigationButtonIcon.jsx.html +1 -1
  39. package/coverage/lcov-report/react/components/Header/header.js.html +8 -2
  40. package/coverage/lcov-report/react/components/Header/hooks.js.html +2 -2
  41. package/coverage/lcov-report/react/components/Header/index.html +36 -21
  42. package/coverage/lcov-report/react/components/Header/utag-helpers.js.html +1 -1
  43. package/coverage/lcov-report/react/components/Infotip/Infotip.jsx.html +1 -1
  44. package/coverage/lcov-report/react/components/Infotip/InfotipIcon.jsx.html +1 -1
  45. package/coverage/lcov-report/react/components/Infotip/index.html +1 -1
  46. package/coverage/lcov-report/react/components/Infotip/index.js.html +1 -1
  47. package/coverage/lcov-report/react/components/Modal/LegacyModal.jsx.html +3 -3
  48. package/coverage/lcov-report/react/components/Modal/Modal.jsx.html +5 -5
  49. package/coverage/lcov-report/react/components/Modal/index.html +10 -10
  50. package/coverage/lcov-report/react/components/Modal/index.jsx.html +2 -2
  51. package/coverage/lcov-report/react/components/NotificationBanner/index.html +3 -3
  52. package/coverage/lcov-report/react/components/NotificationBanner/index.js.html +4 -4
  53. package/coverage/lcov-report/react/components/SanitizedContent/index.html +1 -1
  54. package/coverage/lcov-report/react/components/SanitizedContent/index.jsx.html +1 -1
  55. package/coverage/lcov-report/react/components/SessionDialog/index.html +1 -1
  56. package/coverage/lcov-report/react/components/SessionDialog/sessionDialog.js.html +1 -1
  57. package/coverage/lcov-report/react/components/SessionDialogUI.jsx.html +2 -2
  58. package/coverage/lcov-report/react/components/SideNav/AnimationGroup/AnimationGroup.jsx.html +24 -9
  59. package/coverage/lcov-report/react/components/SideNav/AnimationGroup/index.html +11 -11
  60. package/coverage/lcov-report/react/components/SideNav/Chart/ScoreChart.jsx.html +2 -2
  61. package/coverage/lcov-report/react/components/SideNav/Chart/index.html +1 -1
  62. package/coverage/lcov-report/react/components/SideNav/Chart/index.js.html +1 -1
  63. package/coverage/lcov-report/react/components/SideNav/Content/LevelOneContent.jsx.html +32 -14
  64. package/coverage/lcov-report/react/components/SideNav/Content/LevelTwoContent.jsx.html +3 -3
  65. package/coverage/lcov-report/react/components/SideNav/Content/index.html +22 -22
  66. package/coverage/lcov-report/react/components/SideNav/Content/index.js.html +1 -1
  67. package/coverage/lcov-report/react/components/SideNav/Details/IndividualDetails.jsx.html +3 -3
  68. package/coverage/lcov-report/react/components/SideNav/Details/PracticeDetails.jsx.html +3 -3
  69. package/coverage/lcov-report/react/components/SideNav/Details/index.html +9 -9
  70. package/coverage/lcov-report/react/components/SideNav/Details/index.js.html +1 -1
  71. package/coverage/lcov-report/react/components/SideNav/Links/CmsSwitchLink.jsx.html +1 -1
  72. package/coverage/lcov-report/react/components/SideNav/Links/NavItemInline.jsx.html +1 -1
  73. package/coverage/lcov-report/react/components/SideNav/Links/NavLinkContainer.jsx.html +3 -3
  74. package/coverage/lcov-report/react/components/SideNav/Links/NavLinkDrawer.jsx.html +149 -17
  75. package/coverage/lcov-report/react/components/SideNav/Links/NavLinkInline.jsx.html +3 -3
  76. package/coverage/lcov-report/react/components/SideNav/Links/NavLinkToggle.jsx.html +1 -1
  77. package/coverage/lcov-report/react/components/SideNav/Links/index.html +23 -23
  78. package/coverage/lcov-report/react/components/SideNav/Links/index.js.html +1 -1
  79. package/coverage/lcov-report/react/components/SideNav/UI/SideNavUI.jsx.html +33 -12
  80. package/coverage/lcov-report/react/components/SideNav/UI/index.html +19 -19
  81. package/coverage/lcov-report/react/components/SideNav/UI/index.js.html +1 -1
  82. package/coverage/lcov-report/react/components/SideNav/helpers.js.html +3 -3
  83. package/coverage/lcov-report/react/components/SideNav/index.html +1 -1
  84. package/coverage/lcov-report/react/components/SideNav/index.js.html +1 -1
  85. package/coverage/lcov-report/react/components/Tooltip/Tooltip.jsx.html +1 -1
  86. package/coverage/lcov-report/react/components/Tooltip/index.html +1 -1
  87. package/coverage/lcov-report/react/components/Tooltip/index.js.html +1 -1
  88. package/coverage/lcov-report/react/components/Tooltip/position.js.html +1 -1
  89. package/coverage/lcov-report/react/components/hooks/index.html +3 -3
  90. package/coverage/lcov-report/react/components/hooks/useGetConfig.js.html +2 -2
  91. package/coverage/lcov-report/react/components/index.html +3 -3
  92. package/coverage/lcov-report/react/index.html +6 -6
  93. package/coverage/lcov-report/react/index.js.html +3 -3
  94. package/coverage/lcov-report/react/lib/Chevron.jsx.html +1 -1
  95. package/coverage/lcov-report/react/lib/SvgComponents.jsx.html +1 -1
  96. package/coverage/lcov-report/react/lib/index.html +3 -3
  97. package/coverage/lcov-report/react/lib/svg-definitions.svg.html +1 -1
  98. package/coverage/lcov-report/react/session/index.html +21 -21
  99. package/coverage/lcov-report/react/session/index.js.html +1 -1
  100. package/coverage/lcov-report/react/session/logout.js.html +40 -13
  101. package/coverage/lcov-report/react/session/refresh.js.html +7 -7
  102. package/coverage/lcov-report/react/session/ttl.js.html +2 -2
  103. package/coverage/lcov.info +498 -327
  104. package/dist/browser.js +1 -1
  105. package/dist/browser.js.LICENSE.txt +17 -0
  106. package/dist/browser.js.map +1 -1
  107. package/dist/index.js +1 -1
  108. package/dist/index.js.LICENSE.txt +17 -0
  109. package/dist/index.js.map +1 -1
  110. package/dist/react/index.js +1 -1
  111. package/dist/react/index.js.map +1 -1
  112. package/package.json +6 -6
  113. package/session/logout.js +11 -2
  114. package/styles/qppds/components/sidebar/_sidebar.scss +2 -1
@@ -32,6 +32,24 @@ export const ExampleLightBreadcrumb = () => (
32
32
 
33
33
  ExampleLightBreadcrumb.storyName = 'Light';
34
34
 
35
+ export const ExampleScreenreaderOnlyBreadcrumb = () => (
36
+ <div className="qppds qpp-u-padding--16 qpp-u-fill--blue-80">
37
+ <Breadcrumb
38
+ newBreadcrumb={boolean('newBreadcrumb', true)}
39
+ crumbs={[
40
+ {
41
+ url: '/',
42
+ category: 'MainContent',
43
+ label: 'Home',
44
+ title: 'Home',
45
+ },
46
+ 'Mips Overview',
47
+ ]}
48
+ />
49
+ </div>
50
+ );
51
+ ExampleScreenreaderOnlyBreadcrumb.storyName = 'SR Only Breadcrumb';
52
+
35
53
  export const ExampleDarkBreadcrumb = () => (
36
54
  <div className="qppds qpp-u-padding--16">
37
55
  <Breadcrumb
@@ -50,12 +50,12 @@ const Breadcrumb = ({
50
50
  return (
51
51
  <li
52
52
  key={crumb}
53
- className="qpp-c-breadcrumbs__list-item qpp-c-breadcrumbs__list-item--current"
53
+ className={`${
54
+ i === crumbs.length - 1 ? 'sr-only' : ''
55
+ } qpp-c-breadcrumbs__list-itemqpp-c-breadcrumbs__list-item--current`}
54
56
  aria-current="page"
55
57
  >
56
- <span className={i === crumbs.length - 1 ? 'sr-only' : ''}>
57
- {crumb}
58
- </span>
58
+ <span>{crumb}</span>
59
59
  </li>
60
60
  );
61
61
  }
@@ -33,7 +33,6 @@ const excludedClickOutClasses = [
33
33
 
34
34
  const HeaderMenuItem = ({
35
35
  handleClick,
36
- isMobileMenuExpanded,
37
36
  columns,
38
37
  menuName,
39
38
  rows,
@@ -77,19 +76,12 @@ const HeaderMenuItem = ({
77
76
  ) {
78
77
  return;
79
78
  }
80
- setOpenMobileSubMenu('')
81
79
  closeMenus();
82
80
  };
83
81
  document.addEventListener('mousedown', listener);
84
82
  return () => document.removeEventListener('mousedown', listener);
85
83
  }, [menuRef]);
86
84
 
87
- useEffect(() => {
88
- if (!isMobileMenuExpanded || !isOpen){
89
- setOpenMobileSubMenu('')
90
- }
91
- }, [isMobileMenuExpanded, isOpen])
92
-
93
85
  return (
94
86
  <li
95
87
  key={`header-item-${menuIdentifier}`}
@@ -170,7 +162,7 @@ const HeaderMenuItem = ({
170
162
  >
171
163
  <Accordion
172
164
  title={c.heading}
173
- isOpen={isMobileMenuExpanded && openMobileSubMenu === c.heading}
165
+ isOpen={openMobileSubMenu === c.heading}
174
166
  >
175
167
  <ul>
176
168
  {c.items.map((item) => {
@@ -220,7 +212,6 @@ HeaderMenuItem.propTypes = {
220
212
  subtitle: PropTypes.string.isRequired,
221
213
  className: PropTypes.string,
222
214
  handleClick: PropTypes.func.isRequired,
223
- isMobileMenuExpanded: PropTypes.bool.isRequired,
224
215
  };
225
216
  HeaderMenuItem.defaultProps = {
226
217
  menuName: '',
@@ -6,6 +6,7 @@ import HeaderCancel from './HeaderCancel.jsx';
6
6
  import HeaderContainer from './HeaderContainer';
7
7
  import HeaderMenuItem from './HeaderMenuItem';
8
8
  import HeaderMobileButton from './HeaderMobileButton';
9
+ import ImpersonatorBanner from './ImpersonatorBanner';
9
10
  import HelpIcon from './HelpIcon';
10
11
  import defaultHeaderContent from './default-content.json';
11
12
  import { HeaderStateProvider } from './hooks';
@@ -110,7 +111,6 @@ const HeaderUI = ({
110
111
  handleClick={() => {
111
112
  setIsMobileMenuExpanded(!isMobileMenuExpanded);
112
113
  }}
113
- isMobileMenuExpanded={isMobileMenuExpanded}
114
114
  key={header.name}
115
115
  {...header}
116
116
  />
@@ -127,6 +127,7 @@ const HeaderUI = ({
127
127
  </ul>
128
128
  </nav>
129
129
  </HeaderContainer>
130
+ <ImpersonatorBanner />
130
131
  </HeaderStateProvider>
131
132
  );
132
133
  };
@@ -0,0 +1,55 @@
1
+ import React from 'react';
2
+ import cookie from 'cookie';
3
+ import axios from 'axios';
4
+ import CloseIcon from '@material-ui/icons/Close';
5
+
6
+ import { TextButton } from '../Button';
7
+ import { deleteImpersonatedUser } from '../../session/logout';
8
+
9
+ const ImpersonatorBanner = () => {
10
+ const { qpp_auth_token: token = null, qpp_impersonated_user: user = null } =
11
+ cookie.parse(document.cookie);
12
+
13
+ const className = [
14
+ 'qpp-u-display--flex',
15
+ 'qpp-u-justify-content--between',
16
+ 'qpp-u-fill--gold-20',
17
+ 'qpp-u-padding-x--40',
18
+ 'qpp-u-padding-y--24',
19
+ 'qpp-u-font-size--14',
20
+ 'qpp-u-color--gray-80',
21
+ ].join(' ');
22
+
23
+ const onClick = () => {
24
+ const fn = () => {
25
+ deleteImpersonatedUser({ qpp_impersonated_user: user });
26
+ window.location.reload();
27
+ };
28
+ return axios
29
+ .delete('/api/auth/users/impersonate', {
30
+ headers: {
31
+ Accept: 'application/vnd.qpp.cms.gov.v1+json',
32
+ Authorization: `Bearer ${token}`,
33
+ },
34
+ })
35
+ .then(fn, fn);
36
+ };
37
+
38
+ return (
39
+ token &&
40
+ user && (
41
+ <div className={className}>
42
+ <div>
43
+ VIEW ONLY | You are currently impersonating HARP user:{' '}
44
+ <strong>{user}</strong>
45
+ </div>
46
+ <TextButton onClick={onClick} className="qpp-u-color--gray-80">
47
+ Exit Impersonation Mode
48
+ <CloseIcon />
49
+ </TextButton>
50
+ </div>
51
+ )
52
+ );
53
+ };
54
+
55
+ export default ImpersonatorBanner;
@@ -18,6 +18,7 @@ import {
18
18
  PhysicianCompareIcon,
19
19
  StarIcon,
20
20
  TargetIcon,
21
+ IndividualReporting,
21
22
  } from '../../../lib/SvgComponents';
22
23
  import {
23
24
  dashboardUrl,
@@ -45,6 +46,7 @@ const getIcon = (url) =>
45
46
  '/user/exception/#/landing': HardshipIcon,
46
47
  '/user/targeted-review/#/landing': TargetIcon,
47
48
  '/user/test-data': MyTestDataIcon,
49
+ '/user/self-nomination/#/landing': IndividualReporting,
48
50
  }[url] || null);
49
51
 
50
52
  const LevelOneContent = ({
@@ -59,6 +61,8 @@ const LevelOneContent = ({
59
61
  qpp_ehr_authorized,
60
62
  qpp_has_non_registry_authorizations,
61
63
  qpp_auth_token,
64
+ qpp_cms_internal_authorized,
65
+ qpp_can_impersonate,
62
66
  } = cookie.parse(document.cookie);
63
67
 
64
68
  let name = '';
@@ -67,15 +71,20 @@ const LevelOneContent = ({
67
71
  name = `${firstName} ${lastName}`;
68
72
  }
69
73
 
74
+ const canImpersonate = qpp_can_impersonate === 'true';
70
75
  const hasAuthorizations = qpp_has_authorizations === 'true';
71
76
  const hasApmPayments = user_has_apm_payments === 'true';
72
77
  const isDevPre = qpp_is_dev_pre === 'true';
78
+ const isInternalReviewer = qpp_cms_internal_authorized === 'true';
73
79
  const ehrAuthorized = qpp_ehr_authorized === 'true';
74
80
  const hasNonRegistryAuthorizations =
75
81
  qpp_has_non_registry_authorizations === 'true';
76
82
 
77
83
  const linkClass = isExpanded ? 'link-inline' : 'link-collapsed';
78
- const content = isDevPre ? levelOneContent?.devPre : levelOneContent?.default;
84
+ let content = isDevPre ? levelOneContent?.devPre : levelOneContent?.default;
85
+ if (isInternalReviewer) {
86
+ content = levelOneContent?.internalReviewers
87
+ }
79
88
 
80
89
  // Mapping side nav link urls to the conditions that determine their inclusion in the side nav
81
90
  const urlConditionMap = {
@@ -85,6 +94,7 @@ const LevelOneContent = ({
85
94
  [physicianCompareUrl]: hasNonRegistryAuthorizations,
86
95
  [reportsPortalUrl]: hasAuthorizations,
87
96
  [facilityBasedPreviewBaseUrl]: hasAuthorizations,
97
+ '/user/impersonate': canImpersonate,
88
98
 
89
99
  // dev pre
90
100
  '/user/applications': ehrAuthorized,
@@ -109,10 +119,13 @@ const LevelOneContent = ({
109
119
  };
110
120
 
111
121
  const { pathname, hash } = window.location;
122
+ const filteredListOfLinks = (listOfLinks || []).filter((sublink) => {
123
+ return !(sublink.url in urlConditionMap && !urlConditionMap[sublink.url]);
124
+ });
112
125
  if (
113
- listOfLinks &&
126
+ filteredListOfLinks?.length > 0 &&
114
127
  (pathname === url ||
115
- listOfLinks.some(
128
+ filteredListOfLinks.some(
116
129
  (sublink) =>
117
130
  pathname === sublink.url || `${pathname}${hash}` === sublink.url
118
131
  ))
@@ -121,7 +134,7 @@ const LevelOneContent = ({
121
134
  <NavLinkDrawer
122
135
  key={`nav-drawer-${url}-${label}`}
123
136
  leftIcon={Icon}
124
- listOfLinks={listOfLinks}
137
+ listOfLinks={filteredListOfLinks}
125
138
  isExpanded={isExpanded}
126
139
  staticDrawer={false}
127
140
  openByDefault
@@ -164,6 +177,7 @@ LevelOneContent.propTypes = {
164
177
  default: PropTypes.arrayOf(PropTypes.object),
165
178
  devPre: PropTypes.arrayOf(PropTypes.object),
166
179
  viewer: PropTypes.arrayOf(PropTypes.object),
180
+ internalReviewers: PropTypes.arrayOf(PropTypes.object),
167
181
  }),
168
182
  };
169
183
 
@@ -297,6 +297,7 @@ SideNavUI.propTypes = {
297
297
  content: PropTypes.shape({
298
298
  default: PropTypes.arrayOf(PropTypes.object),
299
299
  devPre: PropTypes.arrayOf(PropTypes.object),
300
+ internalReviewers: PropTypes.arrayOf(PropTypes.object),
300
301
  viewer: PropTypes.arrayOf(PropTypes.object),
301
302
  }),
302
303
  }),
@@ -318,6 +319,7 @@ SideNavUI.defaultProps = {
318
319
  content: {
319
320
  default: [],
320
321
  devPre: [],
322
+ internalReviewers: [],
321
323
  viewer: [],
322
324
  },
323
325
  },
@@ -42,6 +42,10 @@
42
42
  "url": "/user/manage-access",
43
43
  "label": "Manage Access",
44
44
  "listOfLinks": [
45
+ {
46
+ "url": "/user/impersonate",
47
+ "label": "QPP User Impersonation"
48
+ },
45
49
  {
46
50
  "url": "/user/self-nomination/#/landing",
47
51
  "label": "Registry/QCDR Self-Nomination",
@@ -72,5 +76,24 @@
72
76
  "label": "Developer Tools"
73
77
  }
74
78
  ],
79
+ "internalReviewers": [
80
+ {
81
+ "url": "/user/submissions",
82
+ "label": "Dashboard Home"
83
+ },
84
+ {
85
+ "url": "/user/exception/#/landing",
86
+ "label": "Exceptions Application"
87
+ },
88
+ {
89
+ "className": "stroke-based-icon",
90
+ "url": "/user/targeted-review/#/landing",
91
+ "label": "Targeted Review"
92
+ },
93
+ {
94
+ "url": "/user/self-nomination/#/landing",
95
+ "label": "Self Nomination"
96
+ }
97
+ ],
75
98
  "viewer": []
76
99
  }