@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@truedat/bg",
3
- "version": "6.3.0",
3
+ "version": "6.3.2",
4
4
  "description": "Truedat Web Business Glossary",
5
5
  "sideEffects": false,
6
6
  "jsnext:main": "src/index.js",
@@ -34,7 +34,7 @@
34
34
  "@testing-library/jest-dom": "^5.16.5",
35
35
  "@testing-library/react": "^12.0.0",
36
36
  "@testing-library/user-event": "^13.2.1",
37
- "@truedat/test": "6.2.3",
37
+ "@truedat/test": "6.3.2",
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",
@@ -86,9 +86,9 @@
86
86
  ]
87
87
  },
88
88
  "dependencies": {
89
- "@truedat/core": "6.3.0",
90
- "@truedat/df": "6.3.0",
91
- "@truedat/lm": "6.3.0",
89
+ "@truedat/core": "6.3.2",
90
+ "@truedat/df": "6.3.2",
91
+ "@truedat/lm": "6.3.2",
92
92
  "decode-uri-component": "^0.2.2",
93
93
  "file-saver": "^2.0.5",
94
94
  "moment": "^2.29.4",
@@ -111,5 +111,5 @@
111
111
  "react-dom": ">= 16.8.6 < 17",
112
112
  "semantic-ui-react": ">= 2.0.3 < 2.2"
113
113
  },
114
- "gitHead": "fadb5776768bcbaeac2ed35e6fdbef23c0a8263a"
114
+ "gitHead": "b9ccce69ebb729f62d28972e31b2865d74e9a0d6"
115
115
  }
@@ -52,7 +52,7 @@ const ConceptCreate = ({ action, conceptActionLoading, conceptAction }) => {
52
52
  _.keyBy("lang")
53
53
  )(locales);
54
54
 
55
- setI18nConcept(i18nConceptInit);
55
+ if (i18nConceptInit) setI18nConcept(i18nConceptInit);
56
56
  }
57
57
 
58
58
  const langs = formatLocales(locales);
@@ -1,18 +1,4 @@
1
- const API_ACL_ENTRY = "/api/acl_entries/:id";
2
1
  const API_DOMAIN = "/api/domains/:id";
3
- const API_DOMAIN_MEMBERS = "/api/acl_entries/domains/:id/";
4
- const API_DOMAIN_MEMBER = "/api/acl_entries/:id";
5
2
  const API_DOMAINS = "/api/domains";
6
- const API_DOMAIN_CONCEPT_CHILDREN =
7
- "/api/domains/:domain_id/business_concepts/:user_name/count";
8
- const API_RESOURCE_ACL_ENTRIES = "/api/acl_entries/domains/:resource_id";
9
3
 
10
- export {
11
- API_ACL_ENTRY,
12
- API_DOMAIN_CONCEPT_CHILDREN,
13
- API_DOMAIN_MEMBERS,
14
- API_DOMAIN_MEMBER,
15
- API_DOMAIN,
16
- API_DOMAINS,
17
- API_RESOURCE_ACL_ENTRIES,
18
- };
4
+ export { API_DOMAIN, API_DOMAINS };
@@ -0,0 +1,24 @@
1
+ import React from "react";
2
+ import PropTypes from "prop-types";
3
+ import { useHistory } from "react-router-dom";
4
+
5
+ import { linkTo } from "@truedat/core/routes";
6
+ import AddResourceMember from "@truedat/core/components/AddResourceMember";
7
+ import DomainCrumbs from "./DomainCrumbs";
8
+
9
+ const AddDomainMember = ({ id }) => {
10
+ const history = useHistory();
11
+ const onSuccess = () => history.push(linkTo.DOMAIN_MEMBERS({ id }));
12
+ return (
13
+ <>
14
+ <DomainCrumbs />
15
+ <AddResourceMember type="domain" id={`${id}`} onSuccess={onSuccess} />
16
+ </>
17
+ );
18
+ };
19
+
20
+ AddDomainMember.propTypes = {
21
+ id: PropTypes.number,
22
+ };
23
+
24
+ export default AddDomainMember;
@@ -1,107 +1,6 @@
1
- import _ from "lodash/fp";
2
- import React, { useState } from "react";
3
- import PropTypes from "prop-types";
4
- import { Card, Header, Input, Message, Grid } from "semantic-ui-react";
5
- import { connect } from "react-redux";
6
- import { useIntl } from "react-intl";
7
- import { accentInsensitivePathOrder } from "@truedat/core/services/sort";
8
- import { Loading } from "@truedat/core/components";
9
- import DomainMember from "./DomainMember";
10
- import DomainMembersActions from "./DomainMembersActions";
1
+ import React from "react";
2
+ import ResourceMembers from "@truedat/core/components/ResourceMembers";
11
3
 
12
- const toSearchable = _.flow(_.deburr, _.toLower, _.trim);
4
+ export const DomainMembers = () => <ResourceMembers type="domain" />;
13
5
 
14
- const matchesFilter = filter =>
15
- _.flow(
16
- _.at([
17
- "principal.user_name",
18
- "principal.full_name",
19
- "role_name",
20
- "principal.name"
21
- ]),
22
- _.map(toSearchable),
23
- _.some(_.includes(toSearchable(filter)))
24
- );
25
-
26
- const filterData = (filter, data) => {
27
- return _.filter(matchesFilter(filter))(data);
28
- };
29
-
30
- export const DomainMembers = ({
31
- domain,
32
- domainMembers,
33
- domainMembersLoading
34
- }) => {
35
- const { formatMessage } = useIntl();
36
- const [searchFilter, setSearchFilter] = useState("");
37
-
38
- const filteredDomainMembers = filterData(searchFilter, domainMembers);
39
- const groupedDomainMembers = _.flow(
40
- _.sortBy(accentInsensitivePathOrder("role_name")),
41
- _.groupBy("role_name"),
42
- _.toPairs
43
- )(filteredDomainMembers);
44
-
45
- const handleFilterUsers = (_e, { value }) => {
46
- setSearchFilter(value);
47
- };
48
- return (
49
- <>
50
- {!domainMembersLoading && (
51
- <Grid centered columns={1}>
52
- <Grid.Column>
53
- <Input
54
- onChange={handleFilterUsers}
55
- value={searchFilter}
56
- icon={{ name: "search", link: true }}
57
- placeholder={formatMessage({ id: "user.search.placeholder" })}
58
- />
59
- <DomainMembersActions />
60
- </Grid.Column>
61
- </Grid>
62
- )}
63
- {domainMembersLoading && <Loading inline="centered" />}
64
- {_.isEmpty(filteredDomainMembers) && !domainMembersLoading && (
65
- <Message
66
- icon="warning"
67
- header={formatMessage({ id: "domain.members.empty" })}
68
- />
69
- )}
70
- {groupedDomainMembers.map(([groupName, members], groupIndex) => {
71
- return (
72
- <React.Fragment key={`fragment_${groupIndex}`}>
73
- <Header as="h3" key={`group_${groupIndex}`} dividing>
74
- {groupName}
75
- </Header>
76
- <Card.Group key={`card_group_${groupIndex}`}>
77
- {_.sortBy(["principal.name", "principal.user_name"])(members).map(
78
- (m, i) => (
79
- <DomainMember
80
- key={`group_${groupIndex}.${i}`}
81
- domain_id={domain.id}
82
- {...m}
83
- />
84
- )
85
- )}
86
- </Card.Group>
87
- </React.Fragment>
88
- );
89
- })}
90
- </>
91
- );
92
- };
93
-
94
- DomainMembers.propTypes = {
95
- domain: PropTypes.object,
96
- domainMembers: PropTypes.array,
97
- domainMembersLoading: PropTypes.bool,
98
- intl: PropTypes.object
99
- };
100
-
101
- const mapStateToProps = ({ domain, domainMembers, domainMembersLoading }) => ({
102
- domain,
103
- domainMembers,
104
- domainMembersLoading
105
- });
106
-
107
- export default connect(mapStateToProps)(DomainMembers);
6
+ export default DomainMembers;
@@ -15,7 +15,6 @@ import {
15
15
  DOMAIN_NEW,
16
16
  DOMAIN_STRUCTURES,
17
17
  } from "@truedat/core/routes";
18
- import AddDomainMember from "./AddMember";
19
18
  import Domain from "./Domain";
20
19
  import DomainLoader from "./DomainLoader";
21
20
  import DomainMembersLoader from "./DomainMembersLoader";
@@ -23,6 +22,7 @@ import Domains from "./Domains";
23
22
  import DomainsLoader from "./DomainsLoader";
24
23
  import EditDomain from "./EditDomain";
25
24
  import NewDomain from "./NewDomain";
25
+ import AddDomainMember from "./AddDomainMember";
26
26
 
27
27
  const RolesLoader = React.lazy(() =>
28
28
  import("@truedat/auth/roles/components/RolesLoader")
@@ -41,10 +41,10 @@ const DomainRoutes = () => (
41
41
  <Route exact path={DOMAIN_NEW} component={NewDomain} />
42
42
  <Route
43
43
  path={DOMAIN_MEMBERS_NEW}
44
- render={() => (
44
+ render={({ match }) => (
45
45
  <>
46
- <Route component={RolesLoader} />
47
- <Route path={DOMAIN_MEMBERS_NEW} component={AddDomainMember} exact />
46
+ <RolesLoader />
47
+ <AddDomainMember id={parseInt(match?.params?.id)} />
48
48
  </>
49
49
  )}
50
50
  />
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ import { render } from "@truedat/test/render";
3
+ import AddDomainMember from "../AddDomainMember";
4
+
5
+ const props = { id: 1 };
6
+
7
+ describe("<AddDomainMember />", () => {
8
+ it("matches the latest snapshot", () => {
9
+ const { container } = render(<AddDomainMember {...props} />);
10
+ expect(container).toMatchSnapshot();
11
+ });
12
+ });
@@ -1,106 +1,23 @@
1
1
  import React from "react";
2
- import { shallow } from "enzyme";
2
+ import { render } from "@testing-library/react";
3
3
  import { intl } from "@truedat/test/intl-stub";
4
4
  import { DomainMembers } from "../DomainMembers";
5
5
 
6
6
  // workaround for enzyme issue with React.useContext
7
7
  // see https://github.com/airbnb/enzyme/issues/2176#issuecomment-532361526
8
8
  jest.spyOn(React, "useContext").mockImplementation(() => intl);
9
+ jest.mock("react-router-dom", () => ({
10
+ ...jest.requireActual("react-router-dom"),
11
+ useParams: jest.fn().mockReturnValue({ id: 1 }),
12
+ }));
9
13
 
10
14
  describe("<DomainMembers />", () => {
11
- const domainMembersLoading = false;
12
- const domainMembers = [
13
- {
14
- principal_type: "group",
15
- role_id: 2,
16
- role_name: "data_owner",
17
- principal: { description: "aaa bbb cc d", id: 2, name: "grupo1 " }
18
- },
19
- {
20
- principal: {
21
- email: "test@test.com",
22
- full_name: "Data Owner 2",
23
- id: 14,
24
- user_name: "data_owner2"
25
- },
26
- principal_type: "user",
27
- role_id: 2,
28
- role_name: "data_owner"
29
- },
30
- {
31
- principal: {
32
- email: "test@test.com",
33
- full_name: "Datos A",
34
- id: 1,
35
- user_name: "datos_a"
36
- },
37
- principal_type: "user",
38
- role_id: 3,
39
- role_name: "Datos A"
40
- },
41
- {
42
- principal: {
43
- email: "test@test.com",
44
- full_name: "Last U",
45
- id: 1,
46
- user_name: "last_u"
47
- },
48
- principal_type: "user",
49
- role_id: 6,
50
- role_name: "Last R"
51
- }
52
- ];
53
- const domain = { id: 1, name: "My Domain Name" };
54
- const props = { domain, domainMembers, domainMembersLoading };
15
+ const props = {
16
+ type: "domain",
17
+ };
55
18
 
56
19
  it("matches the latest snapshot", () => {
57
- const wrapper = shallow(<DomainMembers {...props} />);
58
- expect(wrapper).toMatchSnapshot();
59
- });
60
-
61
- it("filters users and groups according to search filter", () => {
62
- const wrapper = shallow(<DomainMembers {...props} />);
63
-
64
- wrapper.find("Input").simulate("change", {}, { value: "data" });
65
- expect(wrapper.findWhere(n => n.prop("domain_id"))).toHaveLength(2);
66
-
67
- wrapper.find("Input").simulate("change", {}, { value: "Data Owner 2" });
68
- expect(wrapper.findWhere(n => n.prop("domain_id"))).toHaveLength(1);
69
-
70
- wrapper.find("Input").simulate("change", {}, { value: "grupo" });
71
- expect(wrapper.findWhere(n => n.prop("domain_id"))).toHaveLength(1);
72
-
73
- wrapper.find("Input").simulate("change", {}, { value: "xx" });
74
- expect(wrapper.findWhere(n => n.prop("domain_id"))).toHaveLength(0);
75
- });
76
-
77
- it("renders users and groups grouped by role name", () => {
78
- const wrapper = shallow(<DomainMembers {...props} />);
79
-
80
- expect(
81
- wrapper
82
- .find("Header")
83
- .at(0)
84
- .props().children
85
- ).toEqual("data_owner");
86
- expect(
87
- wrapper
88
- .find("CardGroup")
89
- .at(0)
90
- .findWhere(n => n.prop("domain_id"))
91
- ).toHaveLength(2);
92
-
93
- expect(
94
- wrapper
95
- .find("Header")
96
- .at(2)
97
- .props().children
98
- ).toEqual("Last R");
99
- expect(
100
- wrapper
101
- .find("CardGroup")
102
- .at(2)
103
- .findWhere(n => n.prop("domain_id"))
104
- ).toHaveLength(1);
20
+ const { container } = render(<DomainMembers {...props} />);
21
+ expect(container).toMatchSnapshot();
105
22
  });
106
23
  });
@@ -0,0 +1,170 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`<AddDomainMember /> matches the latest snapshot 1`] = `
4
+ <div>
5
+ <div
6
+ class="ui breadcrumb"
7
+ >
8
+ <a
9
+ class="active section"
10
+ href="/domains"
11
+ >
12
+ Taxonomy
13
+ </a>
14
+ </div>
15
+ <div
16
+ class="ui segment ui text container"
17
+ >
18
+ <h2
19
+ class="ui header"
20
+ >
21
+ <i
22
+ aria-hidden="true"
23
+ class="id card outline icon"
24
+ />
25
+ <div
26
+ class="content"
27
+ >
28
+ Add
29
+ </div>
30
+ </h2>
31
+ <form
32
+ class="ui form"
33
+ >
34
+ <div
35
+ class="required field"
36
+ >
37
+ <label
38
+ for="principal"
39
+ >
40
+ Member
41
+ </label>
42
+ <div
43
+ aria-expanded="false"
44
+ class="ui search selection dropdown"
45
+ required=""
46
+ role="combobox"
47
+ >
48
+ <input
49
+ aria-autocomplete="list"
50
+ autocomplete="off"
51
+ class="search"
52
+ tabindex="0"
53
+ type="text"
54
+ value=""
55
+ />
56
+ <div
57
+ aria-atomic="true"
58
+ aria-live="polite"
59
+ class="divider default text"
60
+ role="alert"
61
+ >
62
+ Member
63
+ </div>
64
+ <i
65
+ aria-hidden="true"
66
+ class="dropdown icon"
67
+ />
68
+ <div
69
+ class="menu transition"
70
+ role="listbox"
71
+ >
72
+ <div
73
+ class="message"
74
+ >
75
+ No results found.
76
+ </div>
77
+ </div>
78
+ </div>
79
+ </div>
80
+ <div
81
+ class="required field"
82
+ >
83
+ <label
84
+ for="role"
85
+ >
86
+ Role
87
+ </label>
88
+ <div
89
+ aria-expanded="false"
90
+ class="ui basic search selection dropdown"
91
+ required=""
92
+ role="combobox"
93
+ >
94
+ <input
95
+ aria-autocomplete="list"
96
+ autocomplete="off"
97
+ class="search"
98
+ id="role"
99
+ tabindex="0"
100
+ type="text"
101
+ value=""
102
+ />
103
+ <div
104
+ aria-atomic="true"
105
+ aria-live="polite"
106
+ class="divider default text"
107
+ role="alert"
108
+ >
109
+ Role
110
+ </div>
111
+ <i
112
+ aria-hidden="true"
113
+ class="dropdown icon"
114
+ />
115
+ <div
116
+ class="menu transition"
117
+ role="listbox"
118
+ >
119
+ <div
120
+ class="message"
121
+ >
122
+ No results found.
123
+ </div>
124
+ </div>
125
+ </div>
126
+ </div>
127
+ <div
128
+ class="field"
129
+ >
130
+ <label
131
+ for="description"
132
+ >
133
+ Description
134
+ </label>
135
+ <div
136
+ class="ui input"
137
+ >
138
+ <input
139
+ autocomplete="off"
140
+ id="description"
141
+ maxlength="120"
142
+ placeholder="Description"
143
+ type="text"
144
+ value=""
145
+ />
146
+ </div>
147
+ </div>
148
+ <div
149
+ class="actions"
150
+ >
151
+ <button
152
+ class="ui primary disabled right floated button"
153
+ disabled=""
154
+ tabindex="-1"
155
+ type="submit"
156
+ >
157
+ Add
158
+ </button>
159
+ <a
160
+ class="ui secondary button"
161
+ href="/"
162
+ role="button"
163
+ >
164
+ Cancel
165
+ </a>
166
+ </div>
167
+ </form>
168
+ </div>
169
+ </div>
170
+ `;
@@ -1,118 +1,44 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
3
  exports[`<DomainMembers /> matches the latest snapshot 1`] = `
4
- <Fragment>
5
- <Grid
6
- centered={true}
7
- columns={1}
4
+ <div>
5
+ <div
6
+ class="ui centered one column grid"
8
7
  >
9
- <GridColumn>
10
- <Input
11
- icon={
12
- {
13
- "link": true,
14
- "name": "search",
15
- }
16
- }
17
- onChange={[Function]}
18
- placeholder="user.search.placeholder"
19
- type="text"
20
- value=""
21
- />
22
- <Connect(DomainMembersActions) />
23
- </GridColumn>
24
- </Grid>
25
- <Header
26
- as="h3"
27
- dividing={true}
28
- key="group_0"
8
+ <div
9
+ class="column"
10
+ >
11
+ <div
12
+ class="ui icon input"
13
+ >
14
+ <input
15
+ placeholder="user.search.placeholder"
16
+ type="text"
17
+ value=""
18
+ />
19
+ <i
20
+ aria-hidden="true"
21
+ class="search link icon"
22
+ />
23
+ </div>
24
+ </div>
25
+ </div>
26
+ <div
27
+ class="ui icon message"
29
28
  >
30
- data_owner
31
- </Header>
32
- <CardGroup
33
- key="card_group_0"
34
- >
35
- <Connect(DomainMember)
36
- domain_id={1}
37
- key="group_0.0"
38
- principal={
39
- {
40
- "description": "aaa bbb cc d",
41
- "id": 2,
42
- "name": "grupo1 ",
43
- }
44
- }
45
- principal_type="group"
46
- role_id={2}
47
- role_name="data_owner"
48
- />
49
- <Connect(DomainMember)
50
- domain_id={1}
51
- key="group_0.1"
52
- principal={
53
- {
54
- "email": "test@test.com",
55
- "full_name": "Data Owner 2",
56
- "id": 14,
57
- "user_name": "data_owner2",
58
- }
59
- }
60
- principal_type="user"
61
- role_id={2}
62
- role_name="data_owner"
63
- />
64
- </CardGroup>
65
- <Header
66
- as="h3"
67
- dividing={true}
68
- key="group_1"
69
- >
70
- Datos A
71
- </Header>
72
- <CardGroup
73
- key="card_group_1"
74
- >
75
- <Connect(DomainMember)
76
- domain_id={1}
77
- key="group_1.0"
78
- principal={
79
- {
80
- "email": "test@test.com",
81
- "full_name": "Datos A",
82
- "id": 1,
83
- "user_name": "datos_a",
84
- }
85
- }
86
- principal_type="user"
87
- role_id={3}
88
- role_name="Datos A"
89
- />
90
- </CardGroup>
91
- <Header
92
- as="h3"
93
- dividing={true}
94
- key="group_2"
95
- >
96
- Last R
97
- </Header>
98
- <CardGroup
99
- key="card_group_2"
100
- >
101
- <Connect(DomainMember)
102
- domain_id={1}
103
- key="group_2.0"
104
- principal={
105
- {
106
- "email": "test@test.com",
107
- "full_name": "Last U",
108
- "id": 1,
109
- "user_name": "last_u",
110
- }
111
- }
112
- principal_type="user"
113
- role_id={6}
114
- role_name="Last R"
29
+ <i
30
+ aria-hidden="true"
31
+ class="warning icon"
115
32
  />
116
- </CardGroup>
117
- </Fragment>
33
+ <div
34
+ class="content"
35
+ >
36
+ <div
37
+ class="header"
38
+ >
39
+ domain.members.empty
40
+ </div>
41
+ </div>
42
+ </div>
43
+ </div>
118
44
  `;