@truedat/auth 7.5.9 → 7.5.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 (160) hide show
  1. package/package.json +40 -64
  2. package/src/groups/components/EditGroup.js +0 -1
  3. package/src/groups/components/Group.js +0 -1
  4. package/src/groups/components/GroupBreadcrumbs.js +1 -2
  5. package/src/groups/components/GroupCard.js +3 -3
  6. package/src/groups/components/GroupCards.js +2 -3
  7. package/src/groups/components/GroupForm.js +0 -1
  8. package/src/groups/components/GroupLoader.js +19 -51
  9. package/src/groups/components/GroupUsers.js +4 -3
  10. package/src/groups/components/GroupUsersTable.js +4 -4
  11. package/src/groups/components/GroupsLoader.js +2 -2
  12. package/src/groups/components/GroupsSearchLoader.js +1 -1
  13. package/src/groups/components/NewGroup.js +0 -1
  14. package/src/groups/components/__tests__/Group.spec.js +0 -1
  15. package/src/groups/components/__tests__/GroupCard.spec.js +23 -7
  16. package/src/groups/components/__tests__/GroupCards.spec.js +9 -6
  17. package/src/groups/components/__tests__/GroupLoader.spec.js +71 -0
  18. package/src/groups/components/__tests__/GroupUsers.spec.js +8 -12
  19. package/src/groups/components/__tests__/GroupUsersTable.spec.js +34 -42
  20. package/src/groups/components/__tests__/GroupsSearchLoader.spec.js +0 -1
  21. package/src/groups/components/__tests__/__snapshots__/Group.spec.js.snap +1 -2
  22. package/src/groups/components/__tests__/__snapshots__/GroupCard.spec.js.snap +43 -94
  23. package/src/groups/components/__tests__/__snapshots__/GroupCards.spec.js.snap +118 -53
  24. package/src/groups/components/__tests__/__snapshots__/GroupLoader.spec.js.snap +11 -0
  25. package/src/groups/components/__tests__/__snapshots__/GroupUsers.spec.js.snap +38 -45
  26. package/src/groups/components/__tests__/__snapshots__/GroupUsersTable.spec.js.snap +121 -213
  27. package/src/groups/components/index.js +1 -1
  28. package/src/groups/sagas/__tests__/deleteGroupUser.spec.js +6 -6
  29. package/src/groups/sagas/deleteGroup.js +1 -1
  30. package/src/groups/sagas/deleteGroupUser.js +2 -2
  31. package/src/groups/sagas/fetchGroup.js +1 -1
  32. package/src/groups/sagas/updateGroup.js +1 -1
  33. package/src/roles/components/NewRole.js +0 -1
  34. package/src/roles/components/PermissionGroup.js +0 -1
  35. package/src/roles/components/Role.js +8 -3
  36. package/src/roles/components/RoleCards.js +2 -3
  37. package/src/roles/components/RoleForm.js +1 -1
  38. package/src/roles/components/RoleLoader.js +26 -39
  39. package/src/roles/components/RoleRoutes.js +29 -32
  40. package/src/roles/components/RoleSelector.js +0 -1
  41. package/src/roles/components/Roles.js +1 -3
  42. package/src/roles/components/RolesLoader.js +2 -2
  43. package/src/roles/components/__tests__/PermissionGroup.spec.js +7 -17
  44. package/src/roles/components/__tests__/Role.spec.js +0 -1
  45. package/src/roles/components/__tests__/RoleCards.spec.js +11 -10
  46. package/src/roles/components/__tests__/RoleRoutes.spec.js +53 -7
  47. package/src/roles/components/__tests__/RoleSelector.spec.js +0 -1
  48. package/src/roles/components/__tests__/Roles.spec.js +2 -3
  49. package/src/roles/components/__tests__/__snapshots__/PermissionGroup.spec.js.snap +3 -5
  50. package/src/roles/components/__tests__/__snapshots__/Role.spec.js.snap +4 -4
  51. package/src/roles/components/__tests__/__snapshots__/RoleCards.spec.js.snap +57 -127
  52. package/src/roles/components/__tests__/__snapshots__/RoleRoutes.spec.js.snap +38 -5
  53. package/src/roles/components/__tests__/__snapshots__/RoleSelector.spec.js.snap +1 -1
  54. package/src/roles/components/__tests__/__snapshots__/Roles.spec.js.snap +6 -3
  55. package/src/roles/components/index.js +1 -1
  56. package/src/roles/reducers/rolePermissions.js +1 -1
  57. package/src/roles/reducers/roleRedirect.js +1 -1
  58. package/src/roles/sagas/deleteRole.js +1 -1
  59. package/src/roles/sagas/fetchRole.js +1 -1
  60. package/src/roles/sagas/fetchRolePermissions.js +1 -1
  61. package/src/roles/sagas/updateRole.js +1 -1
  62. package/src/roles/sagas/updateRolePermissions.js +1 -1
  63. package/src/sessions/components/Auth0Callback.js +5 -4
  64. package/src/sessions/components/Auth0LoginButton.js +2 -2
  65. package/src/sessions/components/AuthMethodsLoader.js +10 -19
  66. package/src/sessions/components/LoginButtons.js +4 -4
  67. package/src/sessions/components/NonceCallback.js +21 -38
  68. package/src/sessions/components/OidcLoginButton.js +0 -1
  69. package/src/sessions/components/OpenIDConnect.js +5 -4
  70. package/src/sessions/components/PrivateRoute.js +25 -57
  71. package/src/sessions/components/ProxyLoginCallback.js +0 -2
  72. package/src/sessions/components/SamlCallback.js +0 -2
  73. package/src/sessions/components/UnauthorizedRoute.js +28 -31
  74. package/src/sessions/components/__tests__/Auth0LoginButton.spec.js +12 -12
  75. package/src/sessions/components/__tests__/AuthMethodsLoader.spec.js +15 -12
  76. package/src/sessions/components/__tests__/NonceCallback.spec.js +84 -0
  77. package/src/sessions/components/__tests__/OidcLoginButton.spec.js +10 -10
  78. package/src/sessions/components/__tests__/OpenIDConnect.spec.js +7 -8
  79. package/src/sessions/components/__tests__/PrivateRoute.spec.js +90 -0
  80. package/src/sessions/components/__tests__/UnauthorizedRoute.spec.js +88 -0
  81. package/src/sessions/components/__tests__/__snapshots__/Auth0LoginButton.spec.js.snap +22 -24
  82. package/src/sessions/components/__tests__/__snapshots__/NonceCallback.spec.js.snap +18 -0
  83. package/src/sessions/components/__tests__/__snapshots__/OidcLoginButton.spec.js.snap +18 -18
  84. package/src/sessions/components/__tests__/__snapshots__/PrivateRoute.spec.js.snap +9 -0
  85. package/src/sessions/components/__tests__/__snapshots__/UnauthorizedRoute.spec.js.snap +9 -0
  86. package/src/sessions/components/index.js +1 -1
  87. package/src/sessions/sagas/__tests__/login.spec.js +4 -4
  88. package/src/sessions/sagas/__tests__/refresh.spec.js +2 -2
  89. package/src/sessions/sagas/__tests__/token.spec.js +4 -4
  90. package/src/sessions/sagas/login.js +5 -5
  91. package/src/sessions/sagas/refresh.js +2 -2
  92. package/src/sessions/sagas/token.js +2 -2
  93. package/src/users/components/AdminUserRoutes.js +35 -51
  94. package/src/users/components/EditUser.js +0 -1
  95. package/src/users/components/GroupUserCrumbs.js +8 -8
  96. package/src/users/components/InitialUser.js +0 -1
  97. package/src/users/components/NewUser.js +0 -1
  98. package/src/users/components/Password.js +0 -1
  99. package/src/users/components/User.js +2 -2
  100. package/src/users/components/UserAclRow.js +1 -2
  101. package/src/users/components/UserAcls.js +0 -1
  102. package/src/users/components/UserActions.js +1 -2
  103. package/src/users/components/UserBreadcrumbs.js +2 -3
  104. package/src/users/components/UserCard.js +3 -3
  105. package/src/users/components/UserCards.js +5 -4
  106. package/src/users/components/UserDomainsFilter.js +2 -5
  107. package/src/users/components/UserForm.js +8 -33
  108. package/src/users/components/UserGroupAclRow.js +1 -2
  109. package/src/users/components/UserGroupAcls.js +0 -1
  110. package/src/users/components/UserLoader.js +21 -48
  111. package/src/users/components/UserPassword.js +0 -1
  112. package/src/users/components/UserRoutes.js +73 -7
  113. package/src/users/components/UserSelector.js +0 -1
  114. package/src/users/components/UserTabs.js +1 -2
  115. package/src/users/components/UsersAndGroups.js +6 -6
  116. package/src/users/components/UsersLoader.js +2 -2
  117. package/src/users/components/UsersSearchLoader.js +2 -1
  118. package/src/users/components/__tests__/CanInitLoader.spec.js +6 -13
  119. package/src/users/components/__tests__/EditUser.spec.js +4 -33
  120. package/src/users/components/__tests__/InitialUser.spec.js +4 -34
  121. package/src/users/components/__tests__/NewUser.spec.js +4 -35
  122. package/src/users/components/__tests__/Password.spec.js +59 -69
  123. package/src/users/components/__tests__/User.spec.js +1 -2
  124. package/src/users/components/__tests__/UserAclRow.spec.js +5 -7
  125. package/src/users/components/__tests__/UserAcls.spec.js +8 -9
  126. package/src/users/components/__tests__/UserActions.spec.js +4 -5
  127. package/src/users/components/__tests__/UserCard.spec.js +11 -11
  128. package/src/users/components/__tests__/UserCards.spec.js +39 -31
  129. package/src/users/components/__tests__/UserDomainsFilter.spec.js +12 -22
  130. package/src/users/components/__tests__/UserForm.spec.js +24 -44
  131. package/src/users/components/__tests__/UserGroupAclRow.spec.js +1 -2
  132. package/src/users/components/__tests__/UserGroupAcls.spec.js +8 -9
  133. package/src/users/components/__tests__/UserLoader.spec.js +85 -0
  134. package/src/users/components/__tests__/UserPassword.spec.js +8 -21
  135. package/src/users/components/__tests__/UserRoutes.spec.js +129 -4
  136. package/src/users/components/__tests__/UserSelector.spec.js +0 -1
  137. package/src/users/components/__tests__/UsersAndGroups.spec.js +45 -5
  138. package/src/users/components/__tests__/UsersSearchLoader.spec.js +0 -1
  139. package/src/users/components/__tests__/__snapshots__/EditUser.spec.js.snap +23 -21
  140. package/src/users/components/__tests__/__snapshots__/InitialUser.spec.js.snap +22 -21
  141. package/src/users/components/__tests__/__snapshots__/NewUser.spec.js.snap +25 -23
  142. package/src/users/components/__tests__/__snapshots__/Password.spec.js.snap +8 -7
  143. package/src/users/components/__tests__/__snapshots__/User.spec.js.snap +7 -6
  144. package/src/users/components/__tests__/__snapshots__/UserAclRow.spec.js.snap +12 -11
  145. package/src/users/components/__tests__/__snapshots__/UserActions.spec.js.snap +56 -67
  146. package/src/users/components/__tests__/__snapshots__/UserCard.spec.js.snap +56 -70
  147. package/src/users/components/__tests__/__snapshots__/UserCards.spec.js.snap +117 -83
  148. package/src/users/components/__tests__/__snapshots__/UserDomainsFilter.spec.js.snap +2 -2
  149. package/src/users/components/__tests__/__snapshots__/UserForm.spec.js.snap +21 -20
  150. package/src/users/components/__tests__/__snapshots__/UserLoader.spec.js.snap +3 -0
  151. package/src/users/components/__tests__/__snapshots__/UserPassword.spec.js.snap +9 -7
  152. package/src/users/components/__tests__/__snapshots__/UserRoutes.spec.js.snap +170 -16
  153. package/src/users/components/__tests__/__snapshots__/UserSelector.spec.js.snap +1 -1
  154. package/src/users/components/__tests__/__snapshots__/UsersAndGroups.spec.js.snap +75 -14
  155. package/src/users/sagas/__tests__/fetchUser.spec.js +3 -5
  156. package/src/users/sagas/__tests__/updateUser.spec.js +1 -1
  157. package/src/users/sagas/deleteUser.js +1 -1
  158. package/src/users/sagas/fetchUser.js +1 -1
  159. package/src/users/sagas/updateUser.js +1 -1
  160. package/src/users/components/__tests__/__snapshots__/CanInitLoader.spec.js.snap +0 -3
@@ -0,0 +1,90 @@
1
+ import React from "react";
2
+ import { render, waitForLoad } from "@truedat/test/render";
3
+ import { LOGIN, UNAUTHORIZED } from "@truedat/core/routes";
4
+ import PrivateRoute from "../PrivateRoute";
5
+
6
+ jest.mock("react-router", () => ({
7
+ ...jest.requireActual("react-router"),
8
+ useLocation: jest.fn().mockReturnValue({ pathname: "/current" }),
9
+ Navigate: ({ to: { pathname } }) => <div>Navigate to {pathname}</div>,
10
+ }));
11
+
12
+ describe("<PrivateRoute />", () => {
13
+ const TestComponent = () => <div>Test Component</div>;
14
+
15
+ it("matches the latest snapshot", async () => {
16
+ const rendered = render(<PrivateRoute component={TestComponent} />, {
17
+ state: {
18
+ authentication: {
19
+ token: "valid-token",
20
+ entitlements: { some: "permission" },
21
+ },
22
+ },
23
+ });
24
+ await waitForLoad(rendered);
25
+ expect(rendered.container).toMatchSnapshot();
26
+ });
27
+
28
+ it("redirects to login when no token", async () => {
29
+ const rendered = render(<PrivateRoute component={TestComponent} />, {
30
+ state: {
31
+ authentication: {
32
+ token: null,
33
+ entitlements: {},
34
+ },
35
+ },
36
+ });
37
+ await waitForLoad(rendered);
38
+
39
+ expect(rendered.getByText(`Navigate to ${LOGIN}`)).toBeInTheDocument();
40
+ });
41
+
42
+ it("redirects to unauthorized when token but no permissions", async () => {
43
+ const rendered = render(<PrivateRoute component={TestComponent} />, {
44
+ state: {
45
+ authentication: {
46
+ token: "valid-token",
47
+ entitlements: {},
48
+ },
49
+ },
50
+ });
51
+ await waitForLoad(rendered);
52
+
53
+ expect(
54
+ rendered.getByText(`Navigate to ${UNAUTHORIZED}`)
55
+ ).toBeInTheDocument();
56
+ });
57
+
58
+ it("renders component when token and permissions exist", async () => {
59
+ const rendered = render(<PrivateRoute component={TestComponent} />, {
60
+ state: {
61
+ authentication: {
62
+ token: "valid-token",
63
+ entitlements: { some: "permission" },
64
+ },
65
+ },
66
+ });
67
+ await waitForLoad(rendered);
68
+
69
+ expect(rendered.getByText(/test component/i)).toBeInTheDocument();
70
+ });
71
+
72
+ it("dispatches retrieveToken when token is undefined", async () => {
73
+ const mockDispatch = jest.fn();
74
+ const rendered = render(
75
+ <PrivateRoute component={TestComponent} path="/" />,
76
+ {
77
+ state: {
78
+ authentication: {
79
+ token: undefined,
80
+ entitlements: {},
81
+ },
82
+ },
83
+ dispatch: mockDispatch,
84
+ }
85
+ );
86
+ await waitForLoad(rendered);
87
+
88
+ expect(mockDispatch).toHaveBeenCalled();
89
+ });
90
+ });
@@ -0,0 +1,88 @@
1
+ import React from "react";
2
+ import { render, waitForLoad } from "@truedat/test/render";
3
+ import { LOGIN } from "@truedat/core/routes";
4
+ import UnauthorizedRoute from "../UnauthorizedRoute";
5
+
6
+ jest.mock("react-router", () => ({
7
+ ...jest.requireActual("react-router"),
8
+ useLocation: jest.fn().mockReturnValue({ pathname: "/current" }),
9
+ Navigate: ({ to: { pathname } }) => <div>Navigate to {pathname}</div>,
10
+ }));
11
+
12
+ describe("<UnauthorizedRoute />", () => {
13
+ const TestComponent = () => <div>Test Component</div>;
14
+
15
+ it("matches the latest snapshot", async () => {
16
+ const rendered = render(<UnauthorizedRoute component={TestComponent} />, {
17
+ state: {
18
+ authentication: {
19
+ token: "valid-token",
20
+ entitlements: {},
21
+ },
22
+ },
23
+ });
24
+ await waitForLoad(rendered);
25
+ expect(rendered.container).toMatchSnapshot();
26
+ });
27
+
28
+ it("redirects to login when no token", async () => {
29
+ const rendered = render(<UnauthorizedRoute component={TestComponent} />, {
30
+ state: {
31
+ authentication: {
32
+ token: null,
33
+ entitlements: {},
34
+ },
35
+ },
36
+ });
37
+ await waitForLoad(rendered);
38
+
39
+ expect(rendered.getByText(`Navigate to ${LOGIN}`)).toBeInTheDocument();
40
+ });
41
+
42
+ it("redirects to login when token and permissions exist", async () => {
43
+ const rendered = render(<UnauthorizedRoute component={TestComponent} />, {
44
+ state: {
45
+ authentication: {
46
+ token: "valid-token",
47
+ entitlements: { some: "permission" },
48
+ },
49
+ },
50
+ });
51
+ await waitForLoad(rendered);
52
+
53
+ expect(rendered.getByText(`Navigate to ${LOGIN}`)).toBeInTheDocument();
54
+ });
55
+
56
+ it("renders component when token exists but no permissions", async () => {
57
+ const rendered = render(<UnauthorizedRoute component={TestComponent} />, {
58
+ state: {
59
+ authentication: {
60
+ token: "valid-token",
61
+ entitlements: {},
62
+ },
63
+ },
64
+ });
65
+ await waitForLoad(rendered);
66
+
67
+ expect(rendered.getByText(/test component/i)).toBeInTheDocument();
68
+ });
69
+
70
+ it("dispatches retrieveToken when token is undefined", async () => {
71
+ const mockDispatch = jest.fn();
72
+ const rendered = render(
73
+ <UnauthorizedRoute component={TestComponent} path="/" />,
74
+ {
75
+ state: {
76
+ authentication: {
77
+ token: undefined,
78
+ entitlements: {},
79
+ },
80
+ },
81
+ dispatch: mockDispatch,
82
+ }
83
+ );
84
+ await waitForLoad(rendered);
85
+
86
+ expect(mockDispatch).toHaveBeenCalled();
87
+ });
88
+ });
@@ -1,29 +1,27 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`<Auth0LoginButton /> matches the latest snapshot 1`] = `
4
- <a
5
- className="ui button yellow fluid"
6
- onClick={[Function]}
7
- >
8
- <i
9
- className="user icon"
10
- />
11
- <MemoizedFormattedMessage
12
- id="login.form.actions.auth0"
13
- />
14
- </a>
3
+ exports[`<Auth0LoginButton /> matches the latest snapshot with a default icon 1`] = `
4
+ <div>
5
+ <a
6
+ class="ui button yellow fluid"
7
+ >
8
+ <i
9
+ class="sign-in icon"
10
+ />
11
+ login.form.actions.auth0
12
+ </a>
13
+ </div>
15
14
  `;
16
15
 
17
- exports[`<Auth0LoginButton /> matches the latest snapshot with a default icon 1`] = `
18
- <a
19
- className="ui button yellow fluid"
20
- onClick={[Function]}
21
- >
22
- <i
23
- className="sign-in icon"
24
- />
25
- <MemoizedFormattedMessage
26
- id="login.form.actions.auth0"
27
- />
28
- </a>
16
+ exports[`<Auth0LoginButton /> matches the latest snapshot with custom icon 1`] = `
17
+ <div>
18
+ <a
19
+ class="ui button yellow fluid"
20
+ >
21
+ <i
22
+ class="user icon"
23
+ />
24
+ login.form.actions.auth0
25
+ </a>
26
+ </div>
29
27
  `;
@@ -0,0 +1,18 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`<NonceCallback /> matches the latest snapshot 1`] = `
4
+ <div>
5
+ <div>
6
+ Navigate to
7
+ /
8
+ </div>
9
+ </div>
10
+ `;
11
+
12
+ exports[`<NonceCallback /> shows loading when no token or redirect exists 1`] = `
13
+ <div>
14
+ <div
15
+ class="ui active loader"
16
+ />
17
+ </div>
18
+ `;
@@ -1,23 +1,23 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`<OidcLoginButton /> matches the latest snapshot 1`] = `
4
- <a
5
- className="ui secondary button yellow"
6
- href="https://auth.oidc.org/authorize?foo=bar"
7
- >
8
- <MemoizedFormattedMessage
9
- id="login.form.actions.oidc"
10
- />
11
- </a>
3
+ exports[`<OidcLoginButton /> matches the latest snapshot with a default icon 1`] = `
4
+ <div>
5
+ <a
6
+ class="ui secondary button yellow"
7
+ href="https://auth.oidc.org/authorize?foo=bar"
8
+ >
9
+ login.form.actions.oidc
10
+ </a>
11
+ </div>
12
12
  `;
13
13
 
14
- exports[`<OidcLoginButton /> matches the latest snapshot with a default icon 1`] = `
15
- <a
16
- className="ui secondary button yellow"
17
- href="https://auth.oidc.org/authorize?foo=bar"
18
- >
19
- <MemoizedFormattedMessage
20
- id="login.form.actions.oidc"
21
- />
22
- </a>
14
+ exports[`<OidcLoginButton /> matches the latest snapshot with custom icon 1`] = `
15
+ <div>
16
+ <a
17
+ class="ui secondary button yellow"
18
+ href="https://auth.oidc.org/authorize?foo=bar"
19
+ >
20
+ login.form.actions.oidc
21
+ </a>
22
+ </div>
23
23
  `;
@@ -0,0 +1,9 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`<PrivateRoute /> matches the latest snapshot 1`] = `
4
+ <div>
5
+ <div>
6
+ Test Component
7
+ </div>
8
+ </div>
9
+ `;
@@ -0,0 +1,9 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`<UnauthorizedRoute /> matches the latest snapshot 1`] = `
4
+ <div>
5
+ <div>
6
+ Test Component
7
+ </div>
8
+ </div>
9
+ `;
@@ -19,5 +19,5 @@ export {
19
19
  PrivateRoute,
20
20
  SamlCallback,
21
21
  ProxyLoginCallback,
22
- UnauthorizedRoute
22
+ UnauthorizedRoute,
23
23
  };
@@ -1,4 +1,4 @@
1
- import jwt_decode from "jwt-decode";
1
+ import { jwtDecode } from "jwt-decode";
2
2
  import { takeLatest } from "redux-saga/effects";
3
3
  import { testSaga } from "redux-saga-test-plan";
4
4
  import {
@@ -59,7 +59,7 @@ describe("sagas: post login", () => {
59
59
  .next({ data })
60
60
  .call(saveToken, token)
61
61
  .next()
62
- .call(jwt_decode, token)
62
+ .call(jwtDecode, token)
63
63
  .next({
64
64
  amr,
65
65
  entitlements,
@@ -136,7 +136,7 @@ describe("sagas: openIdLogin", () => {
136
136
  .next({ data })
137
137
  .call(saveToken, token)
138
138
  .next()
139
- .call(jwt_decode, token)
139
+ .call(jwtDecode, token)
140
140
  .next({
141
141
  amr,
142
142
  entitlements,
@@ -192,7 +192,7 @@ describe("sagas: openIdLogin", () => {
192
192
  .next({ data })
193
193
  .call(saveToken, token)
194
194
  .next()
195
- .call(jwt_decode, token)
195
+ .call(jwtDecode, token)
196
196
  .next({
197
197
  amr,
198
198
  entitlements,
@@ -1,4 +1,4 @@
1
- import jwt_decode from "jwt-decode";
1
+ import { jwtDecode } from "jwt-decode";
2
2
  import { testSaga } from "redux-saga-test-plan";
3
3
  import { takeLatest } from "redux-saga/effects";
4
4
  import { apiJsonPost, JSON_OPTS } from "@truedat/core/services/api";
@@ -65,7 +65,7 @@ describe("sagas: refreshSaga", () => {
65
65
  .next({ data })
66
66
  .call(saveToken, token)
67
67
  .next()
68
- .call(jwt_decode, token)
68
+ .call(jwtDecode, token)
69
69
  .next({ amr, entitlements, exp, groups, role, user_name })
70
70
  .put(
71
71
  refreshSession.success({
@@ -1,5 +1,5 @@
1
1
  import _ from "lodash/fp";
2
- import jwt_decode from "jwt-decode";
2
+ import { jwtDecode } from "jwt-decode";
3
3
  import { testSaga } from "redux-saga-test-plan";
4
4
  import { readToken as readTokenFromStorage } from "@truedat/core/services/storage";
5
5
  import { tokenRequestSaga, checkExpired, readToken } from "../token";
@@ -36,13 +36,13 @@ describe("sagas: read token", () => {
36
36
  const groups = ["business_glossary"];
37
37
  const entitlements = ["p"];
38
38
 
39
- it("should call readTokenFromStorage, jwt_decode and checkExpired", () => {
39
+ it("should call readTokenFromStorage, jwtDecode and checkExpired", () => {
40
40
  expect(() => {
41
41
  testSaga(readToken)
42
42
  .next()
43
43
  .call(readTokenFromStorage)
44
44
  .next(token)
45
- .call(jwt_decode, token)
45
+ .call(jwtDecode, token)
46
46
  .next({ user_name, entitlements, exp, role, groups })
47
47
  .call(checkExpired, exp)
48
48
  .next(false)
@@ -68,7 +68,7 @@ describe("sagas: read token", () => {
68
68
  .next()
69
69
  .call(readTokenFromStorage)
70
70
  .next(token)
71
- .call(jwt_decode, token)
71
+ .call(jwtDecode, token)
72
72
  .next({ user_name, exp })
73
73
  .call(checkExpired, exp)
74
74
  .next(true)
@@ -1,5 +1,5 @@
1
1
  import _ from "lodash/fp";
2
- import jwt_decode from "jwt-decode";
2
+ import { jwtDecode } from "jwt-decode";
3
3
  import { all, call, put, takeLatest } from "redux-saga/effects";
4
4
  import {
5
5
  apiJsonPost,
@@ -24,7 +24,7 @@ export function* auth0LoginSaga({ payload }) {
24
24
  const { token } = data;
25
25
  yield call(saveToken, token);
26
26
  const { amr, entitlements, exp, groups, role, user_name } = yield call(
27
- jwt_decode,
27
+ jwtDecode,
28
28
  token
29
29
  );
30
30
  yield put(
@@ -59,7 +59,7 @@ export function* openIdLoginSaga({ payload }) {
59
59
  const { token } = data;
60
60
  yield call(saveToken, token);
61
61
  const { amr, entitlements, exp, groups, role, user_name } = yield call(
62
- jwt_decode,
62
+ jwtDecode,
63
63
  token
64
64
  );
65
65
  yield put(
@@ -90,7 +90,7 @@ export function* nonceLoginSaga({ payload }) {
90
90
  const { token } = data;
91
91
  yield call(saveToken, token);
92
92
  const { amr, entitlements, exp, groups, role, user_name } = yield call(
93
- jwt_decode,
93
+ jwtDecode,
94
94
  token
95
95
  );
96
96
  yield put(
@@ -124,7 +124,7 @@ export function* postLoginSaga({ payload }) {
124
124
  const { token } = data;
125
125
  yield call(saveToken, token);
126
126
  const { amr, entitlements, exp, groups, role, user_name } = yield call(
127
- jwt_decode,
127
+ jwtDecode,
128
128
  token
129
129
  );
130
130
  yield put(
@@ -1,4 +1,4 @@
1
- import jwt_decode from "jwt-decode";
1
+ import { jwtDecode } from "jwt-decode";
2
2
  import { all, call, put, takeLatest, delay } from "redux-saga/effects";
3
3
  import { apiJsonPost, JSON_OPTS } from "@truedat/core/services/api";
4
4
  import { saveToken } from "@truedat/core/services/storage";
@@ -33,7 +33,7 @@ export function* refreshSaga({ payload }) {
33
33
  const { token } = data;
34
34
  yield call(saveToken, token);
35
35
  const { amr, entitlements, exp, groups, role, user_name } = yield call(
36
- jwt_decode,
36
+ jwtDecode,
37
37
  token
38
38
  );
39
39
  yield put(
@@ -1,4 +1,4 @@
1
- import jwt_decode from "jwt-decode";
1
+ import { jwtDecode } from "jwt-decode";
2
2
  import { call, put, takeLatest } from "redux-saga/effects";
3
3
  import { readToken as readTokenFromStorage } from "@truedat/core/services/storage";
4
4
  import { retrieveToken } from "../routines";
@@ -16,7 +16,7 @@ export function* readToken() {
16
16
  const token = yield call(readTokenFromStorage);
17
17
  if (token) {
18
18
  const { amr, entitlements, exp, groups, role, user_name } = yield call(
19
- jwt_decode,
19
+ jwtDecode,
20
20
  token
21
21
  );
22
22
  const isExpired = yield call(checkExpired, exp);
@@ -1,8 +1,9 @@
1
1
  import React from "react";
2
- import { Route, Switch } from "react-router-dom";
2
+ import { Route, Routes } from "react-router";
3
3
  import { Divider, Segment } from "semantic-ui-react";
4
4
  import { Unauthorized } from "@truedat/core/components";
5
5
  import { useActiveRoute, useAuthorized } from "@truedat/core/hooks";
6
+ import { ProtectedRoute, Loader } from "@truedat/core/router";
6
7
  import {
7
8
  GROUP,
8
9
  GROUP_CREATE,
@@ -31,65 +32,38 @@ import UserPassword from "./UserPassword";
31
32
 
32
33
  const UsersGroupsLoader = () => (
33
34
  <>
34
- <Route component={UsersLoader} />
35
- <Route component={GroupsLoader} />
35
+ <UsersLoader />
36
+ <GroupsLoader />
36
37
  </>
37
38
  );
38
39
 
39
40
  const UserRoutes = () => (
40
- <Switch>
41
- <Route exact path={USERS_NEW} component={NewUser} />
42
- <Route
43
- exact
44
- path={USER}
45
- render={() => (
46
- <>
47
- <UserLoader />
48
- <User />
49
- </>
50
- )}
51
- />
52
- <Route
53
- exact
54
- path={USER_EDIT}
55
- render={() => (
56
- <>
57
- <UserLoader />
58
- <EditUser />
59
- </>
60
- )}
61
- />
62
- <Route exact path={USERS} component={UsersAndGroups} />
63
- <Route
64
- exact
65
- path={USER_EDIT_PASSWORD}
66
- render={() => (
67
- <>
68
- <UserLoader />
69
- <UserPassword />
70
- </>
71
- )}
72
- />
73
- </Switch>
41
+ <Routes>
42
+ <Route index element={<UsersAndGroups />} />
43
+ <Route path="new" element={<NewUser />} />
44
+ <Route path=":id" element={<Loader loaders={<UserLoader />} />}>
45
+ <Route index element={<User />} />
46
+ <Route path="edit" element={<EditUser />} />
47
+ <Route path="password" element={<UserPassword />} />
48
+ </Route>
49
+ </Routes>
74
50
  );
75
51
 
76
52
  const GroupRoutes = () => (
77
- <Switch>
78
- <Route exact path={GROUP_CREATE} render={() => <NewGroup />} />
53
+ <Routes>
54
+ <Route path={GROUP_CREATE} element={<NewGroup />} />
79
55
  <Route
80
- exact
81
56
  path={GROUP_EDIT}
82
- render={() => (
57
+ element={
83
58
  <>
84
59
  <GroupLoader />
85
60
  <EditGroup />
86
61
  </>
87
- )}
62
+ }
88
63
  />
89
64
  <Route
90
- exact
91
65
  path={GROUP}
92
- render={() => (
66
+ element={
93
67
  <>
94
68
  <GroupUserCrumbs action="show" />
95
69
  <Segment>
@@ -99,10 +73,11 @@ const GroupRoutes = () => (
99
73
  <GroupUsers />
100
74
  </Segment>
101
75
  </>
102
- )}
76
+ }
103
77
  />
104
- <Route exact path={GROUPS} render={() => <UsersAndGroups />} />
105
- </Switch>
78
+ <Route path={GROUPS} element={<UsersAndGroups />} />
79
+ <Route path="*" element={null} />
80
+ </Routes>
106
81
  );
107
82
 
108
83
  export const AdminUserRoutes = () => {
@@ -113,16 +88,25 @@ export const AdminUserRoutes = () => {
113
88
  return (
114
89
  <>
115
90
  {authorized && active && <UsersGroupsLoader />}
116
- <Switch>
91
+ <Routes>
117
92
  <Route
118
93
  path={USERS}
119
- render={() => (authorized ? <UserRoutes /> : <Unauthorized />)}
94
+ element={
95
+ <ProtectedRoute>
96
+ <UserRoutes />
97
+ </ProtectedRoute>
98
+ }
120
99
  />
121
100
  <Route
122
101
  path={GROUPS}
123
- render={() => (authorized ? <GroupRoutes /> : <Unauthorized />)}
102
+ element={
103
+ <ProtectedRoute>
104
+ <GroupRoutes />
105
+ </ProtectedRoute>
106
+ }
124
107
  />
125
- </Switch>
108
+ <Route path="*" element={null} />
109
+ </Routes>
126
110
  </>
127
111
  );
128
112
  };
@@ -1,5 +1,4 @@
1
1
  import _ from "lodash/fp";
2
- import React from "react";
3
2
  import PropTypes from "prop-types";
4
3
  import { Header, Container, Segment } from "semantic-ui-react";
5
4
  import { connect } from "react-redux";
@@ -1,8 +1,7 @@
1
- import React from "react";
2
1
  import PropTypes from "prop-types";
3
2
  import { Breadcrumb } from "semantic-ui-react";
4
3
  import { connect } from "react-redux";
5
- import { Link } from "react-router-dom";
4
+ import { Link } from "react-router";
6
5
  import { FormattedMessage } from "react-intl";
7
6
  import { GROUPS, linkTo } from "@truedat/core/routes";
8
7
 
@@ -13,20 +12,19 @@ export const GroupUserCrumbs = ({ group, groupLoading, action }) => {
13
12
  <Breadcrumb.Section as={Link} to={GROUPS} active={false}>
14
13
  <FormattedMessage id="groups.crumbs.top" />
15
14
  </Breadcrumb.Section>
16
-
17
- {action == "show" && (
15
+ {action === "show" && (
18
16
  <>
19
17
  <Breadcrumb.Divider icon="right angle" />
20
18
  {group.name}
21
19
  </>
22
20
  )}
23
- {action == "add" && (
21
+ {action === "add" && (
24
22
  <>
25
23
  <Breadcrumb.Divider icon="right angle" />
26
24
  <Breadcrumb.Section
27
25
  as={Link}
28
26
  to={linkTo.GROUP({ id: group.id })}
29
- active={action == "show"}
27
+ active={action === "show"}
30
28
  >
31
29
  {group.name}
32
30
  </Breadcrumb.Section>
@@ -40,11 +38,13 @@ export const GroupUserCrumbs = ({ group, groupLoading, action }) => {
40
38
 
41
39
  GroupUserCrumbs.propTypes = {
42
40
  group: PropTypes.object,
43
- groupLoading: PropTypes.bool
41
+ groupLoading: PropTypes.bool,
42
+ action: PropTypes.string,
44
43
  };
45
44
 
46
45
  const mapStateToProps = ({ group, groupLoading }) => ({
47
46
  group,
48
- groupLoading
47
+ groupLoading,
49
48
  });
49
+
50
50
  export default connect(mapStateToProps)(GroupUserCrumbs);
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import PropTypes from "prop-types";
3
2
  import { Header, Container, Segment } from "semantic-ui-react";
4
3
  import { connect } from "react-redux";