@truedat/auth 4.51.2 → 4.51.4
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.
- package/CHANGELOG.md +12 -0
- package/package.json +4 -4
- package/src/messages/en.js +2 -0
- package/src/messages/es.js +2 -0
- package/src/users/components/UserDomainsFilter.js +38 -42
- package/src/users/components/UsersSearchLoader.js +4 -2
- package/src/users/components/__tests__/UserDomainsFilter.spec.js +23 -32
- package/src/users/components/__tests__/__snapshots__/UserDomainsFilter.spec.js.snap +19 -4
- package/src/users/sagas/searchUsers.js +5 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [4.51.4] 2022-09-16
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- [TD-5133] Added parameter `permission` for UsersSearchLoader
|
|
8
|
+
|
|
9
|
+
## [4.51.3] 2022-09-16
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- [TD-4794] Use `DomainSelector` in `UserDomainsFilter`
|
|
14
|
+
|
|
3
15
|
## [4.51.2] 2022-09-15
|
|
4
16
|
|
|
5
17
|
### Added
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@truedat/auth",
|
|
3
|
-
"version": "4.51.
|
|
3
|
+
"version": "4.51.4",
|
|
4
4
|
"description": "Truedat Web Auth",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"jsnext:main": "src/index.js",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"@testing-library/jest-dom": "^5.16.4",
|
|
35
35
|
"@testing-library/react": "^12.0.0",
|
|
36
36
|
"@testing-library/user-event": "^13.2.1",
|
|
37
|
-
"@truedat/test": "4.
|
|
37
|
+
"@truedat/test": "4.51.4",
|
|
38
38
|
"babel-jest": "^28.1.0",
|
|
39
39
|
"babel-plugin-dynamic-import-node": "^2.3.3",
|
|
40
40
|
"babel-plugin-lodash": "^3.3.4",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
]
|
|
88
88
|
},
|
|
89
89
|
"dependencies": {
|
|
90
|
-
"@truedat/core": "4.51.
|
|
90
|
+
"@truedat/core": "4.51.4",
|
|
91
91
|
"auth0-js": "^9.12.2",
|
|
92
92
|
"immutable": "^4.0.0-rc.12",
|
|
93
93
|
"jwt-decode": "^2.2.0",
|
|
@@ -109,5 +109,5 @@
|
|
|
109
109
|
"react-dom": ">= 16.8.6 < 17",
|
|
110
110
|
"semantic-ui-react": ">= 0.88.2 < 2.1"
|
|
111
111
|
},
|
|
112
|
-
"gitHead": "
|
|
112
|
+
"gitHead": "d3e3af905c2330f5e4aaeeefc3549acaa19575f7"
|
|
113
113
|
}
|
package/src/messages/en.js
CHANGED
|
@@ -49,12 +49,14 @@ export default {
|
|
|
49
49
|
"navigation.members": "Members",
|
|
50
50
|
"navigation.members.roles": "Roles",
|
|
51
51
|
"navigation.members.users": "Users",
|
|
52
|
+
"permission.allow_foreign_grant_request": "Allow grant request from third parties",
|
|
52
53
|
"permission.approve_grant_request": "Approve grant request",
|
|
53
54
|
"permission.create_acl_entry": "Assign domain roles to users or groups",
|
|
54
55
|
"permission.create_business_concept": "Create business concepts",
|
|
55
56
|
"permission.create_business_concept_link": "Create business concept Links",
|
|
56
57
|
"permission.create_data_structure": "Create structures",
|
|
57
58
|
"permission.create_domain": "Create domains",
|
|
59
|
+
"permission.create_foreign_grant_request": "Create grant request for third parties",
|
|
58
60
|
"permission.create_grant_request": "Create grant request",
|
|
59
61
|
"permission.create_ingest": "Create ingests",
|
|
60
62
|
"permission.create_structure_note": "Create note",
|
package/src/messages/es.js
CHANGED
|
@@ -49,12 +49,14 @@ export default {
|
|
|
49
49
|
"navigation.members": "Miembros",
|
|
50
50
|
"navigation.members.roles": "Roles",
|
|
51
51
|
"navigation.members.users": "Usuarios",
|
|
52
|
+
"permission.allow_foreign_grant_request": "Permitir creación de petición de acceso ajena",
|
|
52
53
|
"permission.approve_grant_request": "Aprobar petición de acceso a estructuras",
|
|
53
54
|
"permission.create_acl_entry": "Asignar rol a un usuario/grupo en el dominio",
|
|
54
55
|
"permission.create_business_concept": "Crear conceptos",
|
|
55
56
|
"permission.create_business_concept_link": "Crear enlaces para un concepto",
|
|
56
57
|
"permission.create_data_structure": "Crear estructuras",
|
|
57
58
|
"permission.create_domain": "Crear dominios",
|
|
59
|
+
"permission.create_foreign_grant_request": "Crear petición de acceso ajena",
|
|
58
60
|
"permission.create_grant_request": "Crear petición de acceso a estructuras",
|
|
59
61
|
"permission.create_ingest": "Crear ingesta",
|
|
60
62
|
"permission.create_structure_note": "Crear nota",
|
|
@@ -1,69 +1,65 @@
|
|
|
1
1
|
import _ from "lodash/fp";
|
|
2
|
-
import React, { useState
|
|
2
|
+
import React, { useState } from "react";
|
|
3
3
|
import { connect } from "react-redux";
|
|
4
4
|
import { Form } from "semantic-ui-react";
|
|
5
5
|
import { setDashboardDomains } from "@truedat/core/routines";
|
|
6
6
|
import { useIntl } from "react-intl";
|
|
7
7
|
import PropTypes from "prop-types";
|
|
8
|
-
import {
|
|
9
|
-
import { getDomainSelectorOptions } from "@truedat/bg/selectors";
|
|
8
|
+
import { DomainSelector } from "@truedat/core/components";
|
|
10
9
|
|
|
11
10
|
export const UserDomainsFilter = ({
|
|
12
|
-
|
|
13
|
-
domainsLoading,
|
|
11
|
+
action = "viewDomain",
|
|
14
12
|
setDashboardDomains,
|
|
15
13
|
}) => {
|
|
16
|
-
const [
|
|
14
|
+
const [domainIds, setDomainIds] = useState("loading");
|
|
15
|
+
const [selectedDomainIds, setSelectedDomainIds] = useState([]);
|
|
17
16
|
const { formatMessage } = useIntl();
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const handleChange = (_e, data) => {
|
|
24
|
-
const { value } = data;
|
|
25
|
-
setDomainsFilter(value);
|
|
18
|
+
const handleDomainsLoaded = ({ domains }) => {
|
|
19
|
+
const domainIds = _.map(({ id }) => _.toInteger(id))(domains);
|
|
20
|
+
setDomainIds(domainIds);
|
|
26
21
|
};
|
|
27
22
|
|
|
28
23
|
const onClick = (_e) => {
|
|
29
|
-
_.isEmpty(
|
|
30
|
-
? setDashboardDomains(
|
|
31
|
-
: setDashboardDomains(
|
|
24
|
+
_.isEmpty(selectedDomainIds)
|
|
25
|
+
? setDashboardDomains(domainIds)
|
|
26
|
+
: setDashboardDomains(_.map(_.toInteger)(selectedDomainIds));
|
|
32
27
|
};
|
|
33
28
|
|
|
34
29
|
return (
|
|
35
|
-
|
|
36
|
-
<Form>
|
|
37
|
-
<
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
30
|
+
<Form loading={domainIds === "loading"}>
|
|
31
|
+
<Form.Group inline>
|
|
32
|
+
<DomainSelector
|
|
33
|
+
action={action}
|
|
34
|
+
placeholder={formatMessage({ id: "domain.multiple.placeholder" })}
|
|
35
|
+
labels
|
|
36
|
+
multiple
|
|
37
|
+
onChange={(_e, { value }) => setSelectedDomainIds(value)}
|
|
38
|
+
onLoad={handleDomainsLoaded}
|
|
39
|
+
value={selectedDomainIds}
|
|
40
|
+
/>
|
|
41
|
+
<Form.Field>
|
|
42
|
+
<Form.Button
|
|
43
|
+
name="applyFilter"
|
|
44
|
+
disabled={domainIds === "loading"}
|
|
45
|
+
onClick={onClick}
|
|
46
|
+
>
|
|
47
|
+
{formatMessage({
|
|
48
|
+
id: "userDomainsFilter.button",
|
|
49
|
+
defaultMessage: "Apply filters",
|
|
50
|
+
})}
|
|
51
|
+
</Form.Button>
|
|
52
|
+
</Form.Field>
|
|
53
|
+
</Form.Group>
|
|
54
|
+
</Form>
|
|
53
55
|
);
|
|
54
56
|
};
|
|
55
57
|
|
|
56
58
|
UserDomainsFilter.propTypes = {
|
|
57
|
-
|
|
58
|
-
domainsLoading: PropTypes.bool,
|
|
59
|
+
action: PropTypes.string,
|
|
59
60
|
setDashboardDomains: PropTypes.func,
|
|
60
61
|
};
|
|
61
62
|
|
|
62
|
-
const mapStateToProps = (state) => ({
|
|
63
|
-
domainOptions: getDomainSelectorOptions(state),
|
|
64
|
-
domainsLoading: state.domainsLoading,
|
|
65
|
-
});
|
|
66
|
-
|
|
67
63
|
const mapDispatchToProps = { setDashboardDomains };
|
|
68
64
|
|
|
69
|
-
export default connect(
|
|
65
|
+
export default connect(null, mapDispatchToProps)(UserDomainsFilter);
|
|
@@ -6,17 +6,18 @@ import { searchUsers, clearUsersSearch } from "../routines";
|
|
|
6
6
|
|
|
7
7
|
export const UsersSearchLoader = ({
|
|
8
8
|
query,
|
|
9
|
+
permission,
|
|
9
10
|
hideLoading,
|
|
10
11
|
searchUsers,
|
|
11
12
|
clearUsersSearch,
|
|
12
13
|
loading,
|
|
13
14
|
}) => {
|
|
14
15
|
useEffect(() => {
|
|
15
|
-
searchUsers({ query });
|
|
16
|
+
searchUsers({ query, permission });
|
|
16
17
|
return () => {
|
|
17
18
|
clearUsersSearch();
|
|
18
19
|
};
|
|
19
|
-
}, [searchUsers, clearUsersSearch, query]);
|
|
20
|
+
}, [searchUsers, clearUsersSearch, query, permission]);
|
|
20
21
|
return loading && !hideLoading ? (
|
|
21
22
|
<Dimmer active inverted>
|
|
22
23
|
<Loader size="massive" inverted />
|
|
@@ -26,6 +27,7 @@ export const UsersSearchLoader = ({
|
|
|
26
27
|
|
|
27
28
|
UsersSearchLoader.propTypes = {
|
|
28
29
|
query: PropTypes.string,
|
|
30
|
+
permission: PropTypes.string,
|
|
29
31
|
hideLoading: PropTypes.bool,
|
|
30
32
|
searchUsers: PropTypes.func,
|
|
31
33
|
clearUsersSearch: PropTypes.func,
|
|
@@ -2,54 +2,45 @@ import React from "react";
|
|
|
2
2
|
import userEvent from "@testing-library/user-event";
|
|
3
3
|
import { waitFor } from "@testing-library/react";
|
|
4
4
|
import { render } from "@truedat/test/render";
|
|
5
|
-
import {
|
|
5
|
+
import { domainsMock } from "@truedat/test/mocks";
|
|
6
6
|
import { UserDomainsFilter } from "../UserDomainsFilter";
|
|
7
7
|
|
|
8
|
-
// workaround for enzyme issue with React.useContext
|
|
9
|
-
// see https://github.com/airbnb/enzyme/issues/2176#issuecomment-532361526
|
|
10
|
-
jest.spyOn(React, "useContext").mockImplementation(() => intl);
|
|
11
|
-
|
|
12
8
|
describe("<UserDomainsFilter />", () => {
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
{
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
domainsLoading: false,
|
|
24
|
-
domainOptions: domains,
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
it("matches the latest snapshot", () => {
|
|
28
|
-
const { container } = render(<UserDomainsFilter {...props} />, {
|
|
29
|
-
state: { domains },
|
|
9
|
+
const props = { setDashboardDomains: jest.fn() };
|
|
10
|
+
const mocks = [domainsMock({ action: "viewDomain" })];
|
|
11
|
+
|
|
12
|
+
it("matches the latest snapshot", async () => {
|
|
13
|
+
const { container, queryByText } = render(
|
|
14
|
+
<UserDomainsFilter {...props} />,
|
|
15
|
+
{ mocks }
|
|
16
|
+
);
|
|
17
|
+
await waitFor(() => {
|
|
18
|
+
expect(queryByText(/fooDomain/)).toBeInTheDocument();
|
|
30
19
|
});
|
|
31
20
|
expect(container).toMatchSnapshot();
|
|
32
21
|
});
|
|
33
22
|
|
|
34
23
|
it("calls setDashboardDomains when clicking button", async () => {
|
|
35
|
-
const {
|
|
36
|
-
|
|
37
|
-
|
|
24
|
+
const { queryByText, findByText } = render(
|
|
25
|
+
<UserDomainsFilter {...props} />,
|
|
26
|
+
{ mocks }
|
|
27
|
+
);
|
|
38
28
|
|
|
39
|
-
|
|
40
|
-
|
|
29
|
+
await waitFor(() => {
|
|
30
|
+
expect(queryByText(/fooDomain/)).toBeInTheDocument();
|
|
31
|
+
});
|
|
41
32
|
|
|
42
|
-
userEvent.click(
|
|
33
|
+
userEvent.click(await findByText("Filter"));
|
|
43
34
|
|
|
44
35
|
await waitFor(() => {
|
|
45
|
-
expect(setDashboardDomains).toHaveBeenCalledWith([1, 2]);
|
|
36
|
+
expect(props.setDashboardDomains).toHaveBeenCalledWith([1, 2, 3, 33]);
|
|
46
37
|
});
|
|
47
38
|
|
|
48
|
-
userEvent.click(
|
|
49
|
-
userEvent.click(
|
|
39
|
+
userEvent.click(await findByText("fooDomain"));
|
|
40
|
+
userEvent.click(await findByText("Filter"));
|
|
50
41
|
|
|
51
42
|
await waitFor(() => {
|
|
52
|
-
expect(setDashboardDomains).toHaveBeenCalledWith([1]);
|
|
43
|
+
expect(props.setDashboardDomains).toHaveBeenCalledWith([1]);
|
|
53
44
|
});
|
|
54
45
|
});
|
|
55
46
|
});
|
|
@@ -19,7 +19,7 @@ exports[`<UserDomainsFilter /> matches the latest snapshot 1`] = `
|
|
|
19
19
|
tabindex="0"
|
|
20
20
|
>
|
|
21
21
|
<label>
|
|
22
|
-
|
|
22
|
+
Select domains
|
|
23
23
|
</label>
|
|
24
24
|
<i
|
|
25
25
|
aria-hidden="true"
|
|
@@ -42,6 +42,21 @@ exports[`<UserDomainsFilter /> matches the latest snapshot 1`] = `
|
|
|
42
42
|
<div
|
|
43
43
|
class="scrolling menu transition"
|
|
44
44
|
>
|
|
45
|
+
<div
|
|
46
|
+
aria-selected="false"
|
|
47
|
+
class="item"
|
|
48
|
+
role="option"
|
|
49
|
+
>
|
|
50
|
+
<div
|
|
51
|
+
style="margin-left: 0px;"
|
|
52
|
+
>
|
|
53
|
+
<i
|
|
54
|
+
aria-hidden="true"
|
|
55
|
+
class="plus icon"
|
|
56
|
+
/>
|
|
57
|
+
barDomain
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
45
60
|
<div
|
|
46
61
|
aria-selected="false"
|
|
47
62
|
class="item"
|
|
@@ -54,7 +69,7 @@ exports[`<UserDomainsFilter /> matches the latest snapshot 1`] = `
|
|
|
54
69
|
aria-hidden="true"
|
|
55
70
|
class="icon"
|
|
56
71
|
/>
|
|
57
|
-
|
|
72
|
+
bazDomain
|
|
58
73
|
</div>
|
|
59
74
|
</div>
|
|
60
75
|
<div
|
|
@@ -69,7 +84,7 @@ exports[`<UserDomainsFilter /> matches the latest snapshot 1`] = `
|
|
|
69
84
|
aria-hidden="true"
|
|
70
85
|
class="icon"
|
|
71
86
|
/>
|
|
72
|
-
|
|
87
|
+
fooDomain
|
|
73
88
|
</div>
|
|
74
89
|
</div>
|
|
75
90
|
</div>
|
|
@@ -86,7 +101,7 @@ exports[`<UserDomainsFilter /> matches the latest snapshot 1`] = `
|
|
|
86
101
|
class="ui button"
|
|
87
102
|
name="applyFilter"
|
|
88
103
|
>
|
|
89
|
-
|
|
104
|
+
Filter
|
|
90
105
|
</button>
|
|
91
106
|
</div>
|
|
92
107
|
</div>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import _ from "lodash/fp";
|
|
1
2
|
import { call, put, takeLatest } from "redux-saga/effects";
|
|
2
3
|
import { apiJsonPost, JSON_OPTS } from "@truedat/core/services/api";
|
|
3
4
|
import { searchUsers } from "../routines";
|
|
@@ -5,9 +6,11 @@ import { API_USERS_SEARCH } from "../api";
|
|
|
5
6
|
|
|
6
7
|
export function* searchUsersSaga({ payload }) {
|
|
7
8
|
try {
|
|
8
|
-
const
|
|
9
|
+
const requestData = _.flow(
|
|
10
|
+
_.omitBy(_.isNil),
|
|
11
|
+
_.pick(["query", "permission"])
|
|
12
|
+
)(payload);
|
|
9
13
|
const url = API_USERS_SEARCH;
|
|
10
|
-
const requestData = { query };
|
|
11
14
|
yield put(searchUsers.request());
|
|
12
15
|
const { data } = yield call(apiJsonPost, url, requestData, JSON_OPTS);
|
|
13
16
|
yield put(searchUsers.success(data));
|