@truedat/bg 6.3.0 → 6.3.2

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 (43) hide show
  1. package/package.json +6 -6
  2. package/src/concepts/components/ConceptCreate.js +1 -1
  3. package/src/taxonomy/api.js +1 -15
  4. package/src/taxonomy/components/AddDomainMember.js +24 -0
  5. package/src/taxonomy/components/DomainMembers.js +4 -105
  6. package/src/taxonomy/components/DomainRoutes.js +4 -4
  7. package/src/taxonomy/components/__tests__/AddDomainMember.spec.js +12 -0
  8. package/src/taxonomy/components/__tests__/DomainMembers.spec.js +10 -93
  9. package/src/taxonomy/components/__tests__/__snapshots__/AddDomainMember.spec.js.snap +170 -0
  10. package/src/taxonomy/components/__tests__/__snapshots__/DomainMembers.spec.js.snap +37 -111
  11. package/src/taxonomy/reducers/__tests__/domainRedirect.spec.js +1 -20
  12. package/src/taxonomy/reducers/domainRedirect.js +1 -15
  13. package/src/taxonomy/reducers/index.js +0 -10
  14. package/src/taxonomy/routines.js +0 -9
  15. package/src/taxonomy/sagas/index.js +0 -15
  16. package/src/taxonomy/components/AddMember.js +0 -23
  17. package/src/taxonomy/components/AddMemberForm.js +0 -187
  18. package/src/taxonomy/components/DomainMember.js +0 -230
  19. package/src/taxonomy/components/DomainMembersActions.js +0 -32
  20. package/src/taxonomy/components/ModalOnRoleDeletion.js +0 -77
  21. package/src/taxonomy/components/__tests__/AddMember.spec.js +0 -10
  22. package/src/taxonomy/components/__tests__/AddMemberForm.spec.js +0 -78
  23. package/src/taxonomy/components/__tests__/DomainMember.spec.js +0 -61
  24. package/src/taxonomy/components/__tests__/__snapshots__/AddMember.spec.js.snap +0 -26
  25. package/src/taxonomy/components/__tests__/__snapshots__/AddMemberForm.spec.js.snap +0 -187
  26. package/src/taxonomy/components/__tests__/__snapshots__/DomainMember.spec.js.snap +0 -47
  27. package/src/taxonomy/reducers/__tests__/domainConceptChildren.spec.js +0 -45
  28. package/src/taxonomy/reducers/__tests__/domainConceptChildrenLoading.spec.js +0 -38
  29. package/src/taxonomy/reducers/__tests__/domainMembers.spec.js +0 -33
  30. package/src/taxonomy/reducers/domainConceptChildren.js +0 -24
  31. package/src/taxonomy/reducers/domainConceptChildrenLoading.js +0 -16
  32. package/src/taxonomy/reducers/domainMemberDeleting.js +0 -14
  33. package/src/taxonomy/reducers/domainMemberSaving.js +0 -12
  34. package/src/taxonomy/reducers/domainMembers.js +0 -22
  35. package/src/taxonomy/sagas/__tests__/addDomainMember.spec.js +0 -49
  36. package/src/taxonomy/sagas/__tests__/fetchDomainConceptChildren.spec.js +0 -105
  37. package/src/taxonomy/sagas/__tests__/fetchDomainMembers.spec.js +0 -73
  38. package/src/taxonomy/sagas/__tests__/updateDomainMember.spec.js +0 -81
  39. package/src/taxonomy/sagas/addDomainMember.js +0 -32
  40. package/src/taxonomy/sagas/deleteDomainMember.js +0 -29
  41. package/src/taxonomy/sagas/fetchDomainConceptChildren.js +0 -47
  42. package/src/taxonomy/sagas/fetchDomainMembers.js +0 -28
  43. package/src/taxonomy/sagas/updateDomainMember.js +0 -28
@@ -1,10 +1,5 @@
1
1
  import { clearRedirect } from "@truedat/core/routines";
2
- import {
3
- addDomainMember,
4
- createDomain,
5
- updateDomain,
6
- updateDomainMember,
7
- } from "../../routines";
2
+ import { createDomain, updateDomain } from "../../routines";
8
3
  import { domainRedirect } from "..";
9
4
 
10
5
  describe("reducers: domainRedirect", () => {
@@ -35,20 +30,6 @@ describe("reducers: domainRedirect", () => {
35
30
  ).toEqual("/domains/10");
36
31
  });
37
32
 
38
- it("should handle the addDomainMember.SUCCESS action", () => {
39
- const meta = { resource_id: 20 };
40
- expect(
41
- domainRedirect("foo", { type: addDomainMember.SUCCESS, payload, meta })
42
- ).toEqual("/domains/20/members");
43
- });
44
-
45
- it("should handle the updateDomainMember.SUCCESS action", () => {
46
- const payload = { data: { resource_id: 20 } };
47
- expect(
48
- domainRedirect("foo", { type: updateDomainMember.SUCCESS, payload })
49
- ).toEqual("/domains/20/members");
50
- });
51
-
52
33
  it("should ignore unknown actions", () => {
53
34
  expect(domainRedirect("foo", { type: "bar", payload })).toEqual("foo");
54
35
  });
@@ -1,13 +1,7 @@
1
1
  import _ from "lodash/fp";
2
2
  import { clearRedirect } from "@truedat/core/routines";
3
3
  import { linkTo } from "@truedat/core/routes";
4
- import {
5
- addDomainMember,
6
- createDomain,
7
- deleteDomain,
8
- updateDomain,
9
- updateDomainMember,
10
- } from "../routines";
4
+ import { createDomain, deleteDomain, updateDomain } from "../routines";
11
5
 
12
6
  const initialState = "";
13
7
 
@@ -22,14 +16,6 @@ export const domainRedirect = (
22
16
  return linkTo.DOMAIN(_.prop("data", payload));
23
17
  case updateDomain.SUCCESS:
24
18
  return linkTo.DOMAIN(_.prop("data", payload));
25
- case addDomainMember.SUCCESS: {
26
- const id = _.prop("resource_id")(meta);
27
- return linkTo.DOMAIN_MEMBERS({ id });
28
- }
29
- case updateDomainMember.SUCCESS: {
30
- const id = payload?.data?.resource_id;
31
- return linkTo.DOMAIN_MEMBERS({ id });
32
- }
33
19
  case deleteDomain.SUCCESS:
34
20
  const { redirectUrl } = meta;
35
21
  return redirectUrl;
@@ -2,13 +2,8 @@ import { domain } from "./domain";
2
2
  import { domainActions } from "./domainActions";
3
3
  import { domainCreating } from "./domainCreating";
4
4
  import { domainLoading } from "./domainLoading";
5
- import { domainMemberDeleting } from "./domainMemberDeleting";
6
- import { domainMemberSaving } from "./domainMemberSaving";
7
- import { domainMembers } from "./domainMembers";
8
5
  import { domainsConcept } from "./domainsConcept";
9
6
  import { domainsConceptLoading } from "./domainsConceptLoading";
10
- import { domainConceptChildren } from "./domainConceptChildren";
11
- import { domainConceptChildrenLoading } from "./domainConceptChildrenLoading";
12
7
  import { domainMembersActions } from "./domainMembersActions";
13
8
  import { domainMembersLoading } from "./domainMembersLoading";
14
9
  import { domainRedirect } from "./domainRedirect";
@@ -23,15 +18,10 @@ export {
23
18
  domainActions,
24
19
  domainCreating,
25
20
  domainLoading,
26
- domainMemberDeleting,
27
- domainMemberSaving,
28
21
  domainMembersActions,
29
- domainMembers,
30
22
  domainMembersLoading,
31
23
  domainsConcept,
32
24
  domainsConceptLoading,
33
- domainConceptChildren,
34
- domainConceptChildrenLoading,
35
25
  domainRedirect,
36
26
  domains,
37
27
  domainsActions,
@@ -5,17 +5,8 @@ export const fetchDomainsConcept = createRoutine("FETCH_CONCEPT_DOMAINS");
5
5
  export const clearDomainsConcept = createRoutine("CLEAR_DOMAINS");
6
6
  export const clearDomains = createRoutine("CLEAR_DOMAINS");
7
7
  export const filterDomains = createRoutine("FILTER_DOMAINS");
8
- export const clearDomainConceptChildren = createRoutine(
9
- "CLEAR_DOMAIN_CONCEPT_CHILDREN"
10
- );
11
- export const fetchDomainConceptChildren = createRoutine(
12
- "FETCH_DOMAIN_CONCEPT_CHILDREN"
13
- );
14
8
 
15
9
  export const fetchDomainMembers = createRoutine("FETCH_DOMAIN_MEMBERS");
16
- export const addDomainMember = createRoutine("ADD_DOMAIN_MEMBER");
17
- export const deleteDomainMember = createRoutine("DELETE_DOMAIN_MEMBER");
18
- export const updateDomainMember = createRoutine("UPDATE_DOMAIN_MEMBER");
19
10
 
20
11
  export const fetchDomain = createRoutine("FETCH_DOMAIN");
21
12
  export const createDomain = createRoutine("CREATE_DOMAIN");
@@ -1,39 +1,24 @@
1
- import { addDomainMemberRequestSaga } from "./addDomainMember";
2
1
  import { createDomainRequestSaga } from "./createDomain";
3
- import { deleteDomainMemberRequestSaga } from "./deleteDomainMember";
4
- import { updateDomainMemberRequestSaga } from "./updateDomainMember";
5
2
  import { updateDomainRequestSaga } from "./updateDomain";
6
3
  import { deleteDomainRequestSaga } from "./deleteDomain";
7
4
  import { fetchDomainsConceptRequestSaga } from "./fetchDomainsConcept";
8
- import { fetchDomainConceptChildrenRequestSaga } from "./fetchDomainConceptChildren";
9
- import { fetchDomainMembersRequestSaga } from "./fetchDomainMembers";
10
5
  import { fetchDomainRequestSaga } from "./fetchDomain";
11
6
  import { fetchDomainsRequestSaga } from "./fetchDomains";
12
7
 
13
8
  export {
14
- addDomainMemberRequestSaga,
15
9
  createDomainRequestSaga,
16
- deleteDomainMemberRequestSaga,
17
- updateDomainMemberRequestSaga,
18
10
  updateDomainRequestSaga,
19
11
  deleteDomainRequestSaga,
20
12
  fetchDomainsConceptRequestSaga,
21
- fetchDomainConceptChildrenRequestSaga,
22
- fetchDomainMembersRequestSaga,
23
13
  fetchDomainRequestSaga,
24
14
  fetchDomainsRequestSaga,
25
15
  };
26
16
 
27
17
  export default [
28
- addDomainMemberRequestSaga(),
29
18
  createDomainRequestSaga(),
30
- deleteDomainMemberRequestSaga(),
31
- updateDomainMemberRequestSaga(),
32
19
  updateDomainRequestSaga(),
33
20
  deleteDomainRequestSaga(),
34
21
  fetchDomainsConceptRequestSaga(),
35
- fetchDomainConceptChildrenRequestSaga(),
36
- fetchDomainMembersRequestSaga(),
37
22
  fetchDomainRequestSaga(),
38
23
  fetchDomainsRequestSaga(),
39
24
  ];
@@ -1,23 +0,0 @@
1
- import React from "react";
2
- import { Container, Header, Icon, Segment } from "semantic-ui-react";
3
- import { FormattedMessage } from "react-intl";
4
-
5
- import AddMemberForm from "./AddMemberForm";
6
- import DomainCrumbs from "./DomainCrumbs";
7
-
8
- export const AddMember = () => (
9
- <>
10
- <DomainCrumbs />
11
- <Container as={Segment} text>
12
- <Header as="h2">
13
- <Icon name="id card outline" />
14
- <Header.Content>
15
- <FormattedMessage id="domain.actions.add_member" />
16
- </Header.Content>
17
- </Header>
18
- <AddMemberForm />
19
- </Container>
20
- </>
21
- );
22
-
23
- export default AddMember;
@@ -1,187 +0,0 @@
1
- import _ from "lodash/fp";
2
- import React, { useState } from "react";
3
- import PropTypes from "prop-types";
4
- import { Button, Form } from "semantic-ui-react";
5
- import { useForm, Controller } from "react-hook-form";
6
- import { useIntl } from "react-intl";
7
- import { connect } from "react-redux";
8
- import {
9
- accentInsensitivePathOrder,
10
- lowerDeburrTrim,
11
- } from "@truedat/core/services/sort";
12
- import { HistoryBackButton } from "@truedat/core/components";
13
- import { getRecipients } from "@truedat/audit/selectors";
14
- import { addDomainMember } from "../routines";
15
-
16
- const UsersSearchLoader = React.lazy(() =>
17
- import("@truedat/auth/users/components/UsersSearchLoader")
18
- );
19
- const GroupsSearchLoader = React.lazy(() =>
20
- import("@truedat/auth/groups/components/GroupsSearchLoader")
21
- );
22
-
23
- const MIN_SEARCH_CHARACTERS = 2;
24
-
25
- const roleOption = ({ id, name }) => ({ key: id, text: name, value: name });
26
-
27
- const roleOptions = (roles) =>
28
- _.flow(
29
- _.uniqBy("name"),
30
- _.sortBy(accentInsensitivePathOrder("name")),
31
- _.map(roleOption)
32
- )(roles);
33
-
34
- export const AddMemberForm = ({
35
- domain,
36
- isSubmitting,
37
- roles,
38
- options,
39
- addDomainMember,
40
- }) => {
41
- const { formatMessage } = useIntl();
42
- const [usersGroupsQuery, setUsersGroupsQuery] = useState("");
43
- const { handleSubmit, control, formState } = useForm({
44
- mode: "all",
45
- defaultValues: { id: null, role: null, description: "" },
46
- });
47
- const onSubmit = ({ id, role, description }) => {
48
- const [principal_type, principal_id] = _.split("_")(id);
49
- const acl_entry = {
50
- role_name: role,
51
- resource_type: "domain",
52
- principal_type,
53
- principal_id: _.toNumber(principal_id),
54
- description,
55
- };
56
- addDomainMember({ resource_id: domain.id, acl_entry });
57
- };
58
- const { isDirty, isValid } = formState;
59
-
60
- const onSearch = (_currentOptions, { searchQuery }) =>
61
- setUsersGroupsQuery(lowerDeburrTrim(searchQuery));
62
-
63
- return (
64
- <Form onSubmit={handleSubmit(onSubmit)}>
65
- {_.size(usersGroupsQuery) >= MIN_SEARCH_CHARACTERS && (
66
- <>
67
- <UsersSearchLoader query={usersGroupsQuery} hideLoading />
68
- <GroupsSearchLoader query={usersGroupsQuery} hideLoading />
69
- </>
70
- )}
71
- <Controller
72
- control={control}
73
- name="id"
74
- rules={{ required: true }}
75
- render={({
76
- field: { onBlur, onChange, value },
77
- fieldState: { error },
78
- }) => (
79
- <Form.Dropdown
80
- placeholder={formatMessage({
81
- id: "domain.member",
82
- })}
83
- clearable
84
- onChange={(_e, { value }) => onChange(value)}
85
- deburr
86
- minCharacters={MIN_SEARCH_CHARACTERS}
87
- onSearchChange={onSearch}
88
- search={_.identity}
89
- selection
90
- options={options}
91
- required
92
- label={{
93
- children: formatMessage({ id: "domain.member" }),
94
- htmlFor: "principal",
95
- }}
96
- error={!!error}
97
- onBlur={onBlur}
98
- value={value}
99
- />
100
- )}
101
- />
102
- <Controller
103
- control={control}
104
- name="role"
105
- rules={{ required: true }}
106
- render={({
107
- field: { onBlur, onChange, value },
108
- fieldState: { error },
109
- }) => (
110
- <Form.Select
111
- basic
112
- clearable
113
- error={!!error}
114
- label={{
115
- children: formatMessage({ id: "domain.role" }),
116
- htmlFor: "role",
117
- }}
118
- onBlur={onBlur}
119
- onChange={(_e, { value }) => onChange(value)}
120
- options={roles}
121
- placeholder={formatMessage({ id: "domain.role" })}
122
- required
123
- search
124
- searchInput={{ id: "role" }}
125
- value={value}
126
- />
127
- )}
128
- />
129
- <Controller
130
- control={control}
131
- name="description"
132
- render={({
133
- field: { onBlur, onChange, value },
134
- fieldState: { error },
135
- }) => (
136
- <Form.Input
137
- autoComplete="off"
138
- error={!!error}
139
- id="description"
140
- label={formatMessage({ id: "domain.role.member.description" })}
141
- maxLength="120"
142
- onBlur={onBlur}
143
- onChange={(_e, { value }) => onChange(value)}
144
- placeholder={formatMessage({
145
- id: "domain.role.member.description",
146
- })}
147
- value={value}
148
- />
149
- )}
150
- />
151
- <div className="actions">
152
- <Button
153
- floated="right"
154
- type="submit"
155
- primary
156
- loading={isSubmitting}
157
- disabled={isSubmitting || !isDirty || !isValid}
158
- >
159
- {formatMessage({ id: "domain.actions.add_member" })}
160
- </Button>
161
- <HistoryBackButton
162
- content={formatMessage({ id: "actions.cancel" })}
163
- disabled={isSubmitting}
164
- />
165
- </div>
166
- </Form>
167
- );
168
- };
169
-
170
- AddMemberForm.propTypes = {
171
- domain: PropTypes.object,
172
- isSubmitting: PropTypes.bool,
173
- roles: PropTypes.array,
174
- options: PropTypes.array,
175
- addDomainMember: PropTypes.func.isRequired,
176
- };
177
-
178
- const mapStateToProps = (state) => ({
179
- domain: state.domain,
180
- roles: roleOptions(state.roles),
181
- options: getRecipients(state),
182
- isSubmitting: state.domainMemberSaving,
183
- });
184
-
185
- const mapDispatchToProps = { addDomainMember };
186
-
187
- export default connect(mapStateToProps, mapDispatchToProps)(AddMemberForm);
@@ -1,230 +0,0 @@
1
- import _ from "lodash/fp";
2
- import React, { useState } from "react";
3
- import { useIntl } from "react-intl";
4
- import { Card, Form, Icon, Button, Popup } from "semantic-ui-react";
5
- import { connect } from "react-redux";
6
- import PropTypes from "prop-types";
7
- import { fetchDomainConceptChildren, updateDomainMember } from "../routines";
8
-
9
- import ModalOnRoleDeletion from "./ModalOnRoleDeletion";
10
-
11
- const memberTypeToIcon = {
12
- group: "users",
13
- user: "user",
14
- };
15
-
16
- const memberTypeToPopup = {
17
- group: "Group",
18
- user: "User",
19
- };
20
-
21
- const retrieveNameFromMember = (principal_type, principal) => {
22
- switch (principal_type) {
23
- case "group":
24
- return null;
25
- case "user":
26
- return principal.user_name;
27
- }
28
- };
29
-
30
- const retrieveFullNameFromMember = (principal_type, principal) => {
31
- switch (principal_type) {
32
- case "group":
33
- return principal.name;
34
- case "user":
35
- return principal.full_name;
36
- }
37
- };
38
-
39
- const DescriptionInput = ({
40
- canUpdate,
41
- description: currentDescription,
42
- updateDescription,
43
- }) => {
44
- const { formatMessage } = useIntl();
45
-
46
- const [description, setDescription] = useState(currentDescription || "");
47
- const [editing, setEditing] = useState(false);
48
-
49
- const handleChange = (_, { value }) => setDescription(value);
50
-
51
- const handleSubmit = (e) => {
52
- setEditing(false);
53
- updateDescription(description);
54
- };
55
-
56
- const handleKeyDown = (e) => {
57
- if (e.key === "Escape") {
58
- setEditing(false);
59
- setDescription(currentDescription);
60
- }
61
- };
62
-
63
- return editing ? (
64
- <Form onSubmit={handleSubmit}>
65
- <Form.Group>
66
- <Form.Input
67
- autoComplete="off"
68
- name="description"
69
- value={description}
70
- onKeyDown={handleKeyDown}
71
- onChange={handleChange}
72
- focus
73
- inline
74
- action={{
75
- icon: "check",
76
- type: "submit",
77
- }}
78
- />
79
- </Form.Group>
80
- </Form>
81
- ) : (
82
- <>
83
- <span>{description}</span>{" "}
84
- {canUpdate && (
85
- <Popup
86
- content={formatMessage({
87
- id: "domain.member.update_description.tooltip",
88
- })}
89
- trigger={
90
- <Icon
91
- name="pencil alternate"
92
- link
93
- onClick={() => setEditing(true)}
94
- />
95
- }
96
- />
97
- )}
98
- </>
99
- );
100
- };
101
-
102
- DescriptionInput.propTypes = {
103
- canUpdate: PropTypes.bool,
104
- description: PropTypes.string,
105
- updateDescription: PropTypes.func,
106
- };
107
-
108
- export const DomainMember = ({
109
- description,
110
- role_name,
111
- domain_id,
112
- principal,
113
- principal_type,
114
- acl_entry_id,
115
- _links,
116
- fetchDomainConceptChildren,
117
- updateDomainMember,
118
- domainMemberDeleting,
119
- domainConceptChildrenLoading,
120
- }) => {
121
- const memberName = retrieveNameFromMember(principal_type, principal);
122
- const fullName = retrieveFullNameFromMember(principal_type, principal);
123
- const canDelete = _.flow(
124
- _.path("self.methods"),
125
- _.includes("DELETE")
126
- )(_links);
127
- const canUpdate = _.flow(
128
- _.path("self.methods"),
129
- _.includes("UPDATE")
130
- )(_links);
131
- return (
132
- <Card className="domain-member">
133
- <Card.Content className="domain-member__content">
134
- <Card.Header>
135
- <Popup
136
- key={role_name}
137
- trigger={<Icon name={memberTypeToIcon[principal_type]} />}
138
- content={memberTypeToPopup[principal_type]}
139
- />
140
- {fullName}
141
- </Card.Header>
142
- <Card.Description>{memberName}</Card.Description>
143
- </Card.Content>
144
- {canDelete && (
145
- <Card.Content
146
- extra
147
- className={
148
- description
149
- ? "domain-member__content-with-description"
150
- : "domain-member__content-without-description"
151
- }
152
- >
153
- <Card.Description className="domain-member__description">
154
- <DescriptionInput
155
- canUpdate={canUpdate}
156
- description={description}
157
- updateDescription={(description) =>
158
- updateDomainMember({
159
- id: acl_entry_id,
160
- acl_entry: { description },
161
- })
162
- }
163
- />
164
- </Card.Description>
165
-
166
- <ModalOnRoleDeletion
167
- acl_entry_id={acl_entry_id}
168
- domainConceptChildrenLoading={domainConceptChildrenLoading.includes(
169
- acl_entry_id
170
- )}
171
- trigger={
172
- <Button
173
- className={
174
- description
175
- ? "button-domain_delete_description"
176
- : "button-domain_delete_without_description"
177
- }
178
- basic
179
- onClick={() =>
180
- fetchDomainConceptChildren({
181
- domain_id,
182
- user_name: fullName,
183
- principal_type,
184
- acl_entry_id,
185
- })
186
- }
187
- floated="right"
188
- icon="trash"
189
- negative
190
- loading={
191
- domainMemberDeleting.includes(acl_entry_id) ||
192
- domainConceptChildrenLoading.includes(acl_entry_id)
193
- }
194
- />
195
- }
196
- />
197
- </Card.Content>
198
- )}
199
- </Card>
200
- );
201
- };
202
-
203
- DomainMember.propTypes = {
204
- _links: PropTypes.object,
205
- acl_entry_id: PropTypes.number,
206
- description: PropTypes.string,
207
- domainConceptChildrenLoading: PropTypes.array,
208
- domainMemberDeleting: PropTypes.array,
209
- domain_id: PropTypes.number,
210
- fetchDomainConceptChildren: PropTypes.func,
211
- updateDomainMember: PropTypes.func,
212
- principal: PropTypes.object,
213
- principal_type: PropTypes.string,
214
- role_name: PropTypes.string,
215
- };
216
-
217
- const mapStateToProps = ({
218
- domainMemberDeleting,
219
- domainConceptChildrenLoading,
220
- updateDomainMember,
221
- }) => ({
222
- domainMemberDeleting,
223
- domainConceptChildrenLoading,
224
- updateDomainMember,
225
- });
226
-
227
- export default connect(mapStateToProps, {
228
- fetchDomainConceptChildren,
229
- updateDomainMember,
230
- })(DomainMember);
@@ -1,32 +0,0 @@
1
- import _ from "lodash/fp";
2
- import React from "react";
3
- import PropTypes from "prop-types";
4
- import { Link } from "react-router-dom";
5
- import { Button } from "semantic-ui-react";
6
- import { connect } from "react-redux";
7
- import { FormattedMessage } from "react-intl";
8
- import { linkTo } from "@truedat/core/routes";
9
-
10
- export const DomainMembersActions = ({ domain, canCreate }) =>
11
- domain && canCreate ? (
12
- <Button
13
- floated="right"
14
- primary
15
- content={<FormattedMessage id="domain.actions.add_member" />}
16
- icon="add user"
17
- as={Link}
18
- to={linkTo.DOMAIN_MEMBERS_NEW({ id: domain.id })}
19
- />
20
- ) : null;
21
-
22
- DomainMembersActions.propTypes = {
23
- domain: PropTypes.object,
24
- canCreate: PropTypes.bool
25
- };
26
-
27
- const mapStateToProps = ({ domain, domainMembersActions }) => ({
28
- domain,
29
- canCreate: _.flow(_.prop("methods"), _.includes("POST"))(domainMembersActions)
30
- });
31
-
32
- export default connect(mapStateToProps)(DomainMembersActions);
@@ -1,77 +0,0 @@
1
- import _ from "lodash/fp";
2
- import React from "react";
3
- import PropTypes from "prop-types";
4
- import { useIntl } from "react-intl";
5
- import { connect } from "react-redux";
6
- import { ConfirmModal } from "@truedat/core/components";
7
- import { clearDomainConceptChildren, deleteDomainMember } from "../routines";
8
-
9
- const actions = (formatMessage) => [
10
- {
11
- key: "cancel",
12
- content: formatMessage({ id: "actions.cancel" }),
13
- color: "red",
14
- icon: "remove",
15
- },
16
- ];
17
-
18
- export const ModalOnRoleDeletion = ({
19
- acl_entry_id,
20
- clearDomainConceptChildren,
21
- deleteDomainMember,
22
- domainConceptChildren,
23
- domainConceptChildrenLoading,
24
- trigger,
25
- }) => {
26
- const { formatMessage } = useIntl();
27
- const conceptChildrenCount = _.prop("counter")(domainConceptChildren);
28
-
29
- const handleSubmit = () => {
30
- if (conceptChildrenCount == 0) {
31
- deleteDomainMember({ id: acl_entry_id });
32
- }
33
- clearDomainConceptChildren();
34
- };
35
-
36
- return (
37
- <ConfirmModal
38
- actions={conceptChildrenCount > 0 ? actions(formatMessage) : undefined}
39
- open={
40
- !domainConceptChildrenLoading &&
41
- !_.isNil(conceptChildrenCount) &&
42
- acl_entry_id == _.prop("acl_entry_id")(domainConceptChildren)
43
- }
44
- onClose={() => clearDomainConceptChildren()}
45
- header={formatMessage({ id: "domain.members.delete" })}
46
- content={
47
- conceptChildrenCount > 0
48
- ? formatMessage(
49
- { id: "domain.concept.children.count" },
50
- { counter: conceptChildrenCount }
51
- )
52
- : formatMessage({
53
- id: "domain.members.delete.question",
54
- })
55
- }
56
- onConfirm={handleSubmit}
57
- trigger={trigger}
58
- />
59
- );
60
- };
61
-
62
- ModalOnRoleDeletion.propTypes = {
63
- acl_entry_id: PropTypes.number,
64
- clearDomainConceptChildren: PropTypes.func.isRequired,
65
- domainConceptChildrenLoading: PropTypes.bool,
66
- deleteDomainMember: PropTypes.func.isRequired,
67
- domainConceptChildren: PropTypes.object,
68
- };
69
-
70
- const mapStateToProps = ({ domainConceptChildren }) => ({
71
- domainConceptChildren,
72
- });
73
-
74
- export default connect(mapStateToProps, {
75
- deleteDomainMember,
76
- clearDomainConceptChildren,
77
- })(ModalOnRoleDeletion);