@selfcommunity/react-ui 0.7.9-alpha.49 → 0.7.9-alpha.50
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/lib/cjs/components/GroupInviteButton/GroupInviteButton.js +13 -39
- package/lib/cjs/components/GroupInvitedWidget/GroupInvitedWidget.js +5 -5
- package/lib/cjs/components/Groups/Groups.d.ts +1 -7
- package/lib/cjs/components/Groups/Groups.js +11 -14
- package/lib/cjs/components/Groups/Skeleton.d.ts +4 -0
- package/lib/cjs/components/Groups/Skeleton.js +2 -2
- package/lib/esm/components/GroupInviteButton/GroupInviteButton.js +13 -39
- package/lib/esm/components/GroupInvitedWidget/GroupInvitedWidget.js +5 -5
- package/lib/esm/components/Groups/Groups.d.ts +1 -7
- package/lib/esm/components/Groups/Groups.js +11 -14
- package/lib/esm/components/Groups/Skeleton.d.ts +4 -0
- package/lib/esm/components/Groups/Skeleton.js +2 -2
- package/lib/umd/react-ui.js +1 -1
- package/package.json +4 -4
|
@@ -88,7 +88,6 @@ function GroupInviteButton(inProps) {
|
|
|
88
88
|
const [open, setOpen] = (0, react_1.useState)(false);
|
|
89
89
|
const [isSending, setIsSending] = (0, react_1.useState)(false);
|
|
90
90
|
const [value, setValue] = (0, react_1.useState)('');
|
|
91
|
-
const [suggested, setSuggested] = (0, react_1.useState)([]);
|
|
92
91
|
const [list, setList] = (0, react_1.useState)([]);
|
|
93
92
|
const [loading, setLoading] = (0, react_1.useState)(false);
|
|
94
93
|
const [invited, setInvited] = (0, react_1.useState)([]);
|
|
@@ -127,22 +126,17 @@ function GroupInviteButton(inProps) {
|
|
|
127
126
|
const intl = (0, react_intl_1.useIntl)();
|
|
128
127
|
function fetchResults() {
|
|
129
128
|
setLoading(true);
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
function fetchGeneralResults() {
|
|
141
|
-
setLoading(true);
|
|
142
|
-
api_services_1.GroupService.getGroupsSuggestedUsers(value)
|
|
129
|
+
let service;
|
|
130
|
+
if (scGroup) {
|
|
131
|
+
service = api_services_1.GroupService.getGroupSuggestedUsers(scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, value);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
service = api_services_1.GroupService.getGroupsSuggestedUsers(value);
|
|
135
|
+
}
|
|
136
|
+
service
|
|
143
137
|
.then((data) => {
|
|
144
138
|
setLoading(false);
|
|
145
|
-
|
|
139
|
+
setList(data.results);
|
|
146
140
|
})
|
|
147
141
|
.catch((error) => {
|
|
148
142
|
setLoading(false);
|
|
@@ -150,28 +144,8 @@ function GroupInviteButton(inProps) {
|
|
|
150
144
|
});
|
|
151
145
|
}
|
|
152
146
|
(0, react_1.useEffect)(() => {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
setLoading(false);
|
|
156
|
-
setList(data.results);
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
api_services_1.GroupService.getGroupsSuggestedUsers(value).then((data) => {
|
|
161
|
-
setLoading(false);
|
|
162
|
-
setList(data.results);
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
}, [scGroup === null || scGroup === void 0 ? void 0 : scGroup.id]);
|
|
166
|
-
/**
|
|
167
|
-
* If a value is entered in new message field, it fetches user suggested
|
|
168
|
-
*/
|
|
169
|
-
(0, react_1.useEffect)(() => {
|
|
170
|
-
if (value && !handleInvitations) {
|
|
171
|
-
fetchResults();
|
|
172
|
-
}
|
|
173
|
-
fetchGeneralResults();
|
|
174
|
-
}, [value, handleInvitations]);
|
|
147
|
+
fetchResults();
|
|
148
|
+
}, [scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, value]);
|
|
175
149
|
/**
|
|
176
150
|
* Handles dialog close
|
|
177
151
|
*/
|
|
@@ -208,7 +182,7 @@ function GroupInviteButton(inProps) {
|
|
|
208
182
|
switch (reason) {
|
|
209
183
|
case 'input':
|
|
210
184
|
setValue(value);
|
|
211
|
-
!value &&
|
|
185
|
+
!value && setList([]);
|
|
212
186
|
break;
|
|
213
187
|
case 'reset':
|
|
214
188
|
setValue(value);
|
|
@@ -258,7 +232,7 @@ function GroupInviteButton(inProps) {
|
|
|
258
232
|
react_1.default.createElement(lab_1.LoadingButton, { size: "small", color: "secondary", variant: "contained", onClick: handleSendInvitations, loading: isSending, disabled: !invited.length },
|
|
259
233
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInviteButton.dialog.button.end", defaultMessage: "ui.groupInviteButton.dialog.button.end" }))) },
|
|
260
234
|
react_1.default.createElement(material_1.Box, { className: classes.dialogContent },
|
|
261
|
-
react_1.default.createElement(Autocomplete_1.default, { className: classes.autocomplete, loading: loading, size: "small", multiple: true, freeSolo: true, disableClearable: true, options:
|
|
235
|
+
react_1.default.createElement(Autocomplete_1.default, { className: classes.autocomplete, loading: loading, size: "small", multiple: true, freeSolo: true, disableClearable: true, options: list, onChange: handleChange, onInputChange: handleInputChange, inputValue: value, value: invited, getOptionLabel: (option) => (option ? option.username : '...'), isOptionEqualToValue: (option, value) => (option ? value.id === option.id : false), renderTags: () => null, renderOption: (props, option) => (react_1.default.createElement(material_1.Box, Object.assign({ component: "li" }, props),
|
|
262
236
|
react_1.default.createElement(material_1.Avatar, { alt: option.username, src: option.avatar }),
|
|
263
237
|
react_1.default.createElement(material_1.Typography, { ml: 1 }, option.username))), renderInput: (params) => (react_1.default.createElement(material_1.TextField, Object.assign({}, params, { variant: "outlined", placeholder: `${intl.formatMessage(messages.placeholder)}`, InputProps: Object.assign(Object.assign({}, params.InputProps), { className: classes.input, startAdornment: (react_1.default.createElement(react_1.default.Fragment, null,
|
|
264
238
|
react_1.default.createElement(material_1.InputAdornment, { position: "start" },
|
|
@@ -70,7 +70,7 @@ const DialogRoot = (0, styles_1.styled)(BaseDialog_1.default, {
|
|
|
70
70
|
* @param inProps
|
|
71
71
|
*/
|
|
72
72
|
function GroupInvitedWidget(inProps) {
|
|
73
|
-
var _a;
|
|
73
|
+
var _a, _b;
|
|
74
74
|
// PROPS
|
|
75
75
|
const props = (0, system_1.useThemeProps)({
|
|
76
76
|
props: inProps,
|
|
@@ -165,7 +165,7 @@ function GroupInvitedWidget(inProps) {
|
|
|
165
165
|
const onChangeGroupHandler = (0, react_1.useCallback)((_msg, newInvited) => {
|
|
166
166
|
dispatch({
|
|
167
167
|
type: widget_1.actionWidgetTypes.SET_RESULTS,
|
|
168
|
-
payload: { results: [...state.results, ...newInvited] }
|
|
168
|
+
payload: { results: [...state.results, ...newInvited], count: state.count + newInvited.length }
|
|
169
169
|
});
|
|
170
170
|
}, [scGroup, dispatch, state.results]);
|
|
171
171
|
/**
|
|
@@ -206,15 +206,15 @@ function GroupInvitedWidget(inProps) {
|
|
|
206
206
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInvitedWidget.title", defaultMessage: "ui.groupInvitedWidget.title" })),
|
|
207
207
|
react_1.default.createElement(react_1.default.Fragment, null,
|
|
208
208
|
react_1.default.createElement(List_1.default, null, state.results.slice(0, state.visibleItems).map((user) => (react_1.default.createElement(material_1.ListItem, { key: user.id },
|
|
209
|
-
react_1.default.createElement(User_1.default, { elevation: 0, actions: react_1.default.createElement(material_1.Button, { disabled: true,
|
|
209
|
+
react_1.default.createElement(User_1.default, { elevation: 0, actions: react_1.default.createElement(material_1.Button, { disabled: true, size: "small" },
|
|
210
210
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInvitedWidget.status", defaultMessage: "ui.groupInvitedWidget.status" })), user: user, userId: user.id }))))),
|
|
211
211
|
state.count > state.visibleItems && (react_1.default.createElement(material_1.Button, { className: classes.showMore, onClick: handleToggleDialogOpen },
|
|
212
212
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInvitedWidget.button.showMore", defaultMessage: "ui.groupInvitedWidget.button.showMore" })))),
|
|
213
|
-
openDialog && (react_1.default.createElement(DialogRoot, Object.assign({ className: classes.dialogRoot, title: react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.groupInvitedWidget.dialogTitle", id: "ui.groupInvitedWidget.dialogTitle", values: { total:
|
|
213
|
+
openDialog && (react_1.default.createElement(DialogRoot, Object.assign({ className: classes.dialogRoot, title: react_1.default.createElement(react_intl_1.FormattedMessage, { defaultMessage: "ui.groupInvitedWidget.dialogTitle", id: "ui.groupInvitedWidget.dialogTitle", values: { total: (_b = state === null || state === void 0 ? void 0 : state.results) === null || _b === void 0 ? void 0 : _b.length } }), onClose: handleToggleDialogOpen, open: openDialog }, DialogProps),
|
|
214
214
|
react_1.default.createElement(InfiniteScroll_1.default, { dataLength: state.results.length, next: handleNext, hasMoreNext: Boolean(state.next), loaderNext: react_1.default.createElement(User_1.UserSkeleton, Object.assign({ elevation: 0 }, UserProps)), height: isMobile ? '100%' : 400, endMessage: react_1.default.createElement(material_1.Typography, { className: classes.endMessage },
|
|
215
215
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInvitedWidget.noMoreResults", defaultMessage: "ui.groupInvitedWidget.noMoreResults" })) },
|
|
216
216
|
react_1.default.createElement(List_1.default, null, state.results.map((user) => (react_1.default.createElement(material_1.ListItem, { key: user.id },
|
|
217
|
-
react_1.default.createElement(User_1.default, { elevation: 0, actions: react_1.default.createElement(material_1.Button, { disabled: true,
|
|
217
|
+
react_1.default.createElement(User_1.default, { elevation: 0, actions: react_1.default.createElement(material_1.Button, { disabled: true, size: "small" },
|
|
218
218
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groupInvitedWidget.status", defaultMessage: "ui.groupInvitedWidget.status" })), user: user, userId: user.id }))))))))));
|
|
219
219
|
return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className) }, rest), content));
|
|
220
220
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { SCGroupType } from '@selfcommunity/types';
|
|
2
1
|
import { GroupProps } from '../Group';
|
|
3
2
|
export interface GroupsProps {
|
|
4
3
|
/**
|
|
@@ -19,17 +18,12 @@ export interface GroupsProps {
|
|
|
19
18
|
/** If true, it means that the endpoint fetches all groups available
|
|
20
19
|
* @default true
|
|
21
20
|
*/
|
|
22
|
-
general
|
|
21
|
+
general?: boolean;
|
|
23
22
|
/**
|
|
24
23
|
* Show/Hide filters
|
|
25
24
|
* @default false
|
|
26
25
|
*/
|
|
27
26
|
showFilters?: boolean;
|
|
28
|
-
/**
|
|
29
|
-
* Override filter func
|
|
30
|
-
* @default null
|
|
31
|
-
*/
|
|
32
|
-
handleFilterGroups?: (groups: SCGroupType[]) => SCGroupType[];
|
|
33
27
|
/**
|
|
34
28
|
* Filters component
|
|
35
29
|
* @param props
|
|
@@ -14,7 +14,7 @@ const Errors_1 = require("../../constants/Errors");
|
|
|
14
14
|
const system_1 = require("@mui/system");
|
|
15
15
|
const HiddenPlaceholder_1 = tslib_1.__importDefault(require("../../shared/HiddenPlaceholder"));
|
|
16
16
|
const constants_1 = require("./constants");
|
|
17
|
-
const Group_1 = tslib_1.
|
|
17
|
+
const Group_1 = tslib_1.__importDefault(require("../Group"));
|
|
18
18
|
const Pagination_1 = require("../../constants/Pagination");
|
|
19
19
|
const InfiniteScroll_1 = tslib_1.__importDefault(require("../../shared/InfiniteScroll"));
|
|
20
20
|
const classes = {
|
|
@@ -67,12 +67,12 @@ function Groups(inProps) {
|
|
|
67
67
|
props: inProps,
|
|
68
68
|
name: constants_1.PREFIX
|
|
69
69
|
});
|
|
70
|
-
const { endpointQueryParams = { limit: Pagination_1.DEFAULT_PAGINATION_LIMIT, offset: Pagination_1.DEFAULT_PAGINATION_OFFSET }, className, GroupComponentProps = { variant: 'outlined', ButtonBaseProps: { disableRipple: true, component: material_1.Box } }, showFilters = false, filters,
|
|
70
|
+
const { endpointQueryParams = { limit: Pagination_1.DEFAULT_PAGINATION_LIMIT, offset: Pagination_1.DEFAULT_PAGINATION_OFFSET }, className, GroupComponentProps = { variant: 'outlined', ButtonBaseProps: { disableRipple: true, component: material_1.Box } }, showFilters = false, filters, general = true } = props, rest = tslib_1.__rest(props, ["endpointQueryParams", "className", "GroupComponentProps", "showFilters", "filters", "general"]);
|
|
71
71
|
// STATE
|
|
72
72
|
const [groups, setGroups] = (0, react_1.useState)([]);
|
|
73
73
|
const [loading, setLoading] = (0, react_1.useState)(true);
|
|
74
74
|
const [next, setNext] = (0, react_1.useState)(null);
|
|
75
|
-
const [
|
|
75
|
+
const [search, setSearch] = (0, react_1.useState)('');
|
|
76
76
|
// CONTEXT
|
|
77
77
|
const scUserContext = (0, react_core_1.useSCUser)();
|
|
78
78
|
const scPreferencesContext = (0, react_core_1.useSCPreferences)();
|
|
@@ -91,10 +91,10 @@ function Groups(inProps) {
|
|
|
91
91
|
const fetchGroups = () => {
|
|
92
92
|
let groupService;
|
|
93
93
|
if (general) {
|
|
94
|
-
groupService = api_services_1.GroupService.searchGroups(endpointQueryParams);
|
|
94
|
+
groupService = api_services_1.GroupService.searchGroups(Object.assign(Object.assign({}, endpointQueryParams), (search !== '' && { search: search })));
|
|
95
95
|
}
|
|
96
96
|
else {
|
|
97
|
-
groupService = api_services_1.GroupService.getUserGroups(endpointQueryParams);
|
|
97
|
+
groupService = api_services_1.GroupService.getUserGroups(Object.assign(Object.assign({}, endpointQueryParams), (search !== '' && { search: search })));
|
|
98
98
|
}
|
|
99
99
|
groupService
|
|
100
100
|
.then((res) => {
|
|
@@ -116,7 +116,7 @@ function Groups(inProps) {
|
|
|
116
116
|
else {
|
|
117
117
|
fetchGroups();
|
|
118
118
|
}
|
|
119
|
-
}, [contentAvailability, authUserId]);
|
|
119
|
+
}, [contentAvailability, authUserId, search]);
|
|
120
120
|
const handleSubscribe = (group) => {
|
|
121
121
|
if (!general) {
|
|
122
122
|
const newGroups = [...groups];
|
|
@@ -144,11 +144,8 @@ function Groups(inProps) {
|
|
|
144
144
|
* Get groups filtered
|
|
145
145
|
*/
|
|
146
146
|
const getFilteredGroups = () => {
|
|
147
|
-
if (
|
|
148
|
-
return
|
|
149
|
-
}
|
|
150
|
-
if (filterName) {
|
|
151
|
-
return groups.filter((g) => g.name.toLowerCase().includes(filterName.toLowerCase()));
|
|
147
|
+
if (search) {
|
|
148
|
+
return groups.filter((g) => g.name.toLowerCase().includes(search.toLowerCase()));
|
|
152
149
|
}
|
|
153
150
|
return groups;
|
|
154
151
|
};
|
|
@@ -157,7 +154,7 @@ function Groups(inProps) {
|
|
|
157
154
|
* @param event
|
|
158
155
|
*/
|
|
159
156
|
const handleOnChangeFilterName = (event) => {
|
|
160
|
-
|
|
157
|
+
setSearch(event.target.value);
|
|
161
158
|
};
|
|
162
159
|
/**
|
|
163
160
|
* Renders groups list
|
|
@@ -165,12 +162,12 @@ function Groups(inProps) {
|
|
|
165
162
|
const filteredGroups = (0, utils_1.sortByAttr)(getFilteredGroups(), 'order');
|
|
166
163
|
const content = (react_1.default.createElement(react_1.default.Fragment, null,
|
|
167
164
|
showFilters && (react_1.default.createElement(material_1.Grid, { container: true, direction: "row", justifyContent: "center", alignItems: "center", className: classes.filters }, filters ? (filters) : (react_1.default.createElement(material_1.Grid, { item: true, xs: 12, md: 6 },
|
|
168
|
-
react_1.default.createElement(material_1.TextField, { fullWidth: true, value:
|
|
165
|
+
react_1.default.createElement(material_1.TextField, { fullWidth: true, value: search, label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groups.filterByName", defaultMessage: "ui.groups.filterByName" }), variant: "outlined", onChange: handleOnChangeFilterName, disabled: loading }))))),
|
|
169
166
|
react_1.default.createElement(react_1.default.Fragment, null, !groups.length ? (react_1.default.createElement(material_1.Box, { className: classes.noResults },
|
|
170
167
|
react_1.default.createElement(material_1.Typography, { variant: "h4" },
|
|
171
168
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groups.noGroups.title", defaultMessage: "ui.groups.noGroups.title" })),
|
|
172
169
|
react_1.default.createElement(material_1.Typography, { variant: "body1" },
|
|
173
|
-
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groups.noGroups.subtitle", defaultMessage: "ui.groups.noGroups.subtitle" })))) : (react_1.default.createElement(InfiniteScroll_1.default, { dataLength: groups.length, next: handleNext, hasMoreNext: Boolean(next), loaderNext: react_1.default.createElement(
|
|
170
|
+
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groups.noGroups.subtitle", defaultMessage: "ui.groups.noGroups.subtitle" })))) : (react_1.default.createElement(InfiniteScroll_1.default, { dataLength: groups.length, next: handleNext, hasMoreNext: Boolean(next), loaderNext: react_1.default.createElement(Skeleton_1.default, { groupsNumber: 2 }), endMessage: react_1.default.createElement(material_1.Typography, { component: "div", className: classes.endMessage },
|
|
174
171
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groups.endMessage", defaultMessage: "ui.groups.endMessage", values: {
|
|
175
172
|
button: (chunk) => (react_1.default.createElement(material_1.Button, { color: "secondary", variant: "text", onClick: handleScrollUp }, chunk))
|
|
176
173
|
} })) },
|
|
@@ -9,6 +9,10 @@ export interface GroupsSkeletonProps {
|
|
|
9
9
|
* @default null
|
|
10
10
|
*/
|
|
11
11
|
GroupSkeletonProps?: any;
|
|
12
|
+
/**
|
|
13
|
+
* @default 10
|
|
14
|
+
*/
|
|
15
|
+
groupsNumber?: number;
|
|
12
16
|
}
|
|
13
17
|
/**
|
|
14
18
|
* > API documentation for the Community-JS Groups Skeleton component. Learn about the available props and the CSS API.
|
|
@@ -37,9 +37,9 @@ const Root = (0, styles_1.styled)(material_1.Box, {
|
|
|
37
37
|
*
|
|
38
38
|
*/
|
|
39
39
|
function GroupsSkeleton(inProps) {
|
|
40
|
-
const { className, GroupSkeletonProps = {} } = inProps, rest = tslib_1.__rest(inProps, ["className", "GroupSkeletonProps"]);
|
|
40
|
+
const { className, GroupSkeletonProps = {}, groupsNumber = 10 } = inProps, rest = tslib_1.__rest(inProps, ["className", "GroupSkeletonProps", "groupsNumber"]);
|
|
41
41
|
return (react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className) }, rest),
|
|
42
|
-
react_1.default.createElement(material_1.Grid, { container: true, spacing: { xs: 3 }, className: classes.groups }, [...Array(
|
|
42
|
+
react_1.default.createElement(material_1.Grid, { container: true, spacing: { xs: 3 }, className: classes.groups }, [...Array(groupsNumber)].map((category, index) => (react_1.default.createElement(material_1.Grid, { item: true, xs: 12, sm: 8, md: 6, key: index },
|
|
43
43
|
react_1.default.createElement(Group_1.GroupSkeleton, Object.assign({ elevation: 0, variant: 'outlined' }, GroupSkeletonProps))))))));
|
|
44
44
|
}
|
|
45
45
|
exports.default = GroupsSkeleton;
|
|
@@ -86,7 +86,6 @@ export default function GroupInviteButton(inProps) {
|
|
|
86
86
|
const [open, setOpen] = useState(false);
|
|
87
87
|
const [isSending, setIsSending] = useState(false);
|
|
88
88
|
const [value, setValue] = useState('');
|
|
89
|
-
const [suggested, setSuggested] = useState([]);
|
|
90
89
|
const [list, setList] = useState([]);
|
|
91
90
|
const [loading, setLoading] = useState(false);
|
|
92
91
|
const [invited, setInvited] = useState([]);
|
|
@@ -125,22 +124,17 @@ export default function GroupInviteButton(inProps) {
|
|
|
125
124
|
const intl = useIntl();
|
|
126
125
|
function fetchResults() {
|
|
127
126
|
setLoading(true);
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
.
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
function fetchGeneralResults() {
|
|
139
|
-
setLoading(true);
|
|
140
|
-
GroupService.getGroupsSuggestedUsers(value)
|
|
127
|
+
let service;
|
|
128
|
+
if (scGroup) {
|
|
129
|
+
service = GroupService.getGroupSuggestedUsers(scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, value);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
service = GroupService.getGroupsSuggestedUsers(value);
|
|
133
|
+
}
|
|
134
|
+
service
|
|
141
135
|
.then((data) => {
|
|
142
136
|
setLoading(false);
|
|
143
|
-
|
|
137
|
+
setList(data.results);
|
|
144
138
|
})
|
|
145
139
|
.catch((error) => {
|
|
146
140
|
setLoading(false);
|
|
@@ -148,28 +142,8 @@ export default function GroupInviteButton(inProps) {
|
|
|
148
142
|
});
|
|
149
143
|
}
|
|
150
144
|
useEffect(() => {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
setLoading(false);
|
|
154
|
-
setList(data.results);
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
GroupService.getGroupsSuggestedUsers(value).then((data) => {
|
|
159
|
-
setLoading(false);
|
|
160
|
-
setList(data.results);
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
}, [scGroup === null || scGroup === void 0 ? void 0 : scGroup.id]);
|
|
164
|
-
/**
|
|
165
|
-
* If a value is entered in new message field, it fetches user suggested
|
|
166
|
-
*/
|
|
167
|
-
useEffect(() => {
|
|
168
|
-
if (value && !handleInvitations) {
|
|
169
|
-
fetchResults();
|
|
170
|
-
}
|
|
171
|
-
fetchGeneralResults();
|
|
172
|
-
}, [value, handleInvitations]);
|
|
145
|
+
fetchResults();
|
|
146
|
+
}, [scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, value]);
|
|
173
147
|
/**
|
|
174
148
|
* Handles dialog close
|
|
175
149
|
*/
|
|
@@ -206,7 +180,7 @@ export default function GroupInviteButton(inProps) {
|
|
|
206
180
|
switch (reason) {
|
|
207
181
|
case 'input':
|
|
208
182
|
setValue(value);
|
|
209
|
-
!value &&
|
|
183
|
+
!value && setList([]);
|
|
210
184
|
break;
|
|
211
185
|
case 'reset':
|
|
212
186
|
setValue(value);
|
|
@@ -256,7 +230,7 @@ export default function GroupInviteButton(inProps) {
|
|
|
256
230
|
React.createElement(LoadingButton, { size: "small", color: "secondary", variant: "contained", onClick: handleSendInvitations, loading: isSending, disabled: !invited.length },
|
|
257
231
|
React.createElement(FormattedMessage, { id: "ui.groupInviteButton.dialog.button.end", defaultMessage: "ui.groupInviteButton.dialog.button.end" }))) },
|
|
258
232
|
React.createElement(Box, { className: classes.dialogContent },
|
|
259
|
-
React.createElement(Autocomplete, { className: classes.autocomplete, loading: loading, size: "small", multiple: true, freeSolo: true, disableClearable: true, options:
|
|
233
|
+
React.createElement(Autocomplete, { className: classes.autocomplete, loading: loading, size: "small", multiple: true, freeSolo: true, disableClearable: true, options: list, onChange: handleChange, onInputChange: handleInputChange, inputValue: value, value: invited, getOptionLabel: (option) => (option ? option.username : '...'), isOptionEqualToValue: (option, value) => (option ? value.id === option.id : false), renderTags: () => null, renderOption: (props, option) => (React.createElement(Box, Object.assign({ component: "li" }, props),
|
|
260
234
|
React.createElement(Avatar, { alt: option.username, src: option.avatar }),
|
|
261
235
|
React.createElement(Typography, { ml: 1 }, option.username))), renderInput: (params) => (React.createElement(TextField, Object.assign({}, params, { variant: "outlined", placeholder: `${intl.formatMessage(messages.placeholder)}`, InputProps: Object.assign(Object.assign({}, params.InputProps), { className: classes.input, startAdornment: (React.createElement(React.Fragment, null,
|
|
262
236
|
React.createElement(InputAdornment, { position: "start" },
|
|
@@ -68,7 +68,7 @@ const DialogRoot = styled(BaseDialog, {
|
|
|
68
68
|
* @param inProps
|
|
69
69
|
*/
|
|
70
70
|
export default function GroupInvitedWidget(inProps) {
|
|
71
|
-
var _a;
|
|
71
|
+
var _a, _b;
|
|
72
72
|
// PROPS
|
|
73
73
|
const props = useThemeProps({
|
|
74
74
|
props: inProps,
|
|
@@ -163,7 +163,7 @@ export default function GroupInvitedWidget(inProps) {
|
|
|
163
163
|
const onChangeGroupHandler = useCallback((_msg, newInvited) => {
|
|
164
164
|
dispatch({
|
|
165
165
|
type: actionWidgetTypes.SET_RESULTS,
|
|
166
|
-
payload: { results: [...state.results, ...newInvited] }
|
|
166
|
+
payload: { results: [...state.results, ...newInvited], count: state.count + newInvited.length }
|
|
167
167
|
});
|
|
168
168
|
}, [scGroup, dispatch, state.results]);
|
|
169
169
|
/**
|
|
@@ -204,15 +204,15 @@ export default function GroupInvitedWidget(inProps) {
|
|
|
204
204
|
React.createElement(FormattedMessage, { id: "ui.groupInvitedWidget.title", defaultMessage: "ui.groupInvitedWidget.title" })),
|
|
205
205
|
React.createElement(React.Fragment, null,
|
|
206
206
|
React.createElement(List, null, state.results.slice(0, state.visibleItems).map((user) => (React.createElement(ListItem, { key: user.id },
|
|
207
|
-
React.createElement(User, { elevation: 0, actions: React.createElement(Button, { disabled: true,
|
|
207
|
+
React.createElement(User, { elevation: 0, actions: React.createElement(Button, { disabled: true, size: "small" },
|
|
208
208
|
React.createElement(FormattedMessage, { id: "ui.groupInvitedWidget.status", defaultMessage: "ui.groupInvitedWidget.status" })), user: user, userId: user.id }))))),
|
|
209
209
|
state.count > state.visibleItems && (React.createElement(Button, { className: classes.showMore, onClick: handleToggleDialogOpen },
|
|
210
210
|
React.createElement(FormattedMessage, { id: "ui.groupInvitedWidget.button.showMore", defaultMessage: "ui.groupInvitedWidget.button.showMore" })))),
|
|
211
|
-
openDialog && (React.createElement(DialogRoot, Object.assign({ className: classes.dialogRoot, title: React.createElement(FormattedMessage, { defaultMessage: "ui.groupInvitedWidget.dialogTitle", id: "ui.groupInvitedWidget.dialogTitle", values: { total:
|
|
211
|
+
openDialog && (React.createElement(DialogRoot, Object.assign({ className: classes.dialogRoot, title: React.createElement(FormattedMessage, { defaultMessage: "ui.groupInvitedWidget.dialogTitle", id: "ui.groupInvitedWidget.dialogTitle", values: { total: (_b = state === null || state === void 0 ? void 0 : state.results) === null || _b === void 0 ? void 0 : _b.length } }), onClose: handleToggleDialogOpen, open: openDialog }, DialogProps),
|
|
212
212
|
React.createElement(InfiniteScroll, { dataLength: state.results.length, next: handleNext, hasMoreNext: Boolean(state.next), loaderNext: React.createElement(UserSkeleton, Object.assign({ elevation: 0 }, UserProps)), height: isMobile ? '100%' : 400, endMessage: React.createElement(Typography, { className: classes.endMessage },
|
|
213
213
|
React.createElement(FormattedMessage, { id: "ui.groupInvitedWidget.noMoreResults", defaultMessage: "ui.groupInvitedWidget.noMoreResults" })) },
|
|
214
214
|
React.createElement(List, null, state.results.map((user) => (React.createElement(ListItem, { key: user.id },
|
|
215
|
-
React.createElement(User, { elevation: 0, actions: React.createElement(Button, { disabled: true,
|
|
215
|
+
React.createElement(User, { elevation: 0, actions: React.createElement(Button, { disabled: true, size: "small" },
|
|
216
216
|
React.createElement(FormattedMessage, { id: "ui.groupInvitedWidget.status", defaultMessage: "ui.groupInvitedWidget.status" })), user: user, userId: user.id }))))))))));
|
|
217
217
|
return (React.createElement(Root, Object.assign({ className: classNames(classes.root, className) }, rest), content));
|
|
218
218
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { SCGroupType } from '@selfcommunity/types';
|
|
2
1
|
import { GroupProps } from '../Group';
|
|
3
2
|
export interface GroupsProps {
|
|
4
3
|
/**
|
|
@@ -19,17 +18,12 @@ export interface GroupsProps {
|
|
|
19
18
|
/** If true, it means that the endpoint fetches all groups available
|
|
20
19
|
* @default true
|
|
21
20
|
*/
|
|
22
|
-
general
|
|
21
|
+
general?: boolean;
|
|
23
22
|
/**
|
|
24
23
|
* Show/Hide filters
|
|
25
24
|
* @default false
|
|
26
25
|
*/
|
|
27
26
|
showFilters?: boolean;
|
|
28
|
-
/**
|
|
29
|
-
* Override filter func
|
|
30
|
-
* @default null
|
|
31
|
-
*/
|
|
32
|
-
handleFilterGroups?: (groups: SCGroupType[]) => SCGroupType[];
|
|
33
27
|
/**
|
|
34
28
|
* Filters component
|
|
35
29
|
* @param props
|
|
@@ -12,7 +12,7 @@ import { SCOPE_SC_UI } from '../../constants/Errors';
|
|
|
12
12
|
import { useThemeProps } from '@mui/system';
|
|
13
13
|
import HiddenPlaceholder from '../../shared/HiddenPlaceholder';
|
|
14
14
|
import { PREFIX } from './constants';
|
|
15
|
-
import Group
|
|
15
|
+
import Group from '../Group';
|
|
16
16
|
import { DEFAULT_PAGINATION_LIMIT, DEFAULT_PAGINATION_OFFSET } from '../../constants/Pagination';
|
|
17
17
|
import InfiniteScroll from '../../shared/InfiniteScroll';
|
|
18
18
|
const classes = {
|
|
@@ -65,12 +65,12 @@ export default function Groups(inProps) {
|
|
|
65
65
|
props: inProps,
|
|
66
66
|
name: PREFIX
|
|
67
67
|
});
|
|
68
|
-
const { endpointQueryParams = { limit: DEFAULT_PAGINATION_LIMIT, offset: DEFAULT_PAGINATION_OFFSET }, className, GroupComponentProps = { variant: 'outlined', ButtonBaseProps: { disableRipple: true, component: Box } }, showFilters = false, filters,
|
|
68
|
+
const { endpointQueryParams = { limit: DEFAULT_PAGINATION_LIMIT, offset: DEFAULT_PAGINATION_OFFSET }, className, GroupComponentProps = { variant: 'outlined', ButtonBaseProps: { disableRipple: true, component: Box } }, showFilters = false, filters, general = true } = props, rest = __rest(props, ["endpointQueryParams", "className", "GroupComponentProps", "showFilters", "filters", "general"]);
|
|
69
69
|
// STATE
|
|
70
70
|
const [groups, setGroups] = useState([]);
|
|
71
71
|
const [loading, setLoading] = useState(true);
|
|
72
72
|
const [next, setNext] = useState(null);
|
|
73
|
-
const [
|
|
73
|
+
const [search, setSearch] = useState('');
|
|
74
74
|
// CONTEXT
|
|
75
75
|
const scUserContext = useSCUser();
|
|
76
76
|
const scPreferencesContext = useSCPreferences();
|
|
@@ -89,10 +89,10 @@ export default function Groups(inProps) {
|
|
|
89
89
|
const fetchGroups = () => {
|
|
90
90
|
let groupService;
|
|
91
91
|
if (general) {
|
|
92
|
-
groupService = GroupService.searchGroups(endpointQueryParams);
|
|
92
|
+
groupService = GroupService.searchGroups(Object.assign(Object.assign({}, endpointQueryParams), (search !== '' && { search: search })));
|
|
93
93
|
}
|
|
94
94
|
else {
|
|
95
|
-
groupService = GroupService.getUserGroups(endpointQueryParams);
|
|
95
|
+
groupService = GroupService.getUserGroups(Object.assign(Object.assign({}, endpointQueryParams), (search !== '' && { search: search })));
|
|
96
96
|
}
|
|
97
97
|
groupService
|
|
98
98
|
.then((res) => {
|
|
@@ -114,7 +114,7 @@ export default function Groups(inProps) {
|
|
|
114
114
|
else {
|
|
115
115
|
fetchGroups();
|
|
116
116
|
}
|
|
117
|
-
}, [contentAvailability, authUserId]);
|
|
117
|
+
}, [contentAvailability, authUserId, search]);
|
|
118
118
|
const handleSubscribe = (group) => {
|
|
119
119
|
if (!general) {
|
|
120
120
|
const newGroups = [...groups];
|
|
@@ -142,11 +142,8 @@ export default function Groups(inProps) {
|
|
|
142
142
|
* Get groups filtered
|
|
143
143
|
*/
|
|
144
144
|
const getFilteredGroups = () => {
|
|
145
|
-
if (
|
|
146
|
-
return
|
|
147
|
-
}
|
|
148
|
-
if (filterName) {
|
|
149
|
-
return groups.filter((g) => g.name.toLowerCase().includes(filterName.toLowerCase()));
|
|
145
|
+
if (search) {
|
|
146
|
+
return groups.filter((g) => g.name.toLowerCase().includes(search.toLowerCase()));
|
|
150
147
|
}
|
|
151
148
|
return groups;
|
|
152
149
|
};
|
|
@@ -155,7 +152,7 @@ export default function Groups(inProps) {
|
|
|
155
152
|
* @param event
|
|
156
153
|
*/
|
|
157
154
|
const handleOnChangeFilterName = (event) => {
|
|
158
|
-
|
|
155
|
+
setSearch(event.target.value);
|
|
159
156
|
};
|
|
160
157
|
/**
|
|
161
158
|
* Renders groups list
|
|
@@ -163,12 +160,12 @@ export default function Groups(inProps) {
|
|
|
163
160
|
const filteredGroups = sortByAttr(getFilteredGroups(), 'order');
|
|
164
161
|
const content = (React.createElement(React.Fragment, null,
|
|
165
162
|
showFilters && (React.createElement(Grid, { container: true, direction: "row", justifyContent: "center", alignItems: "center", className: classes.filters }, filters ? (filters) : (React.createElement(Grid, { item: true, xs: 12, md: 6 },
|
|
166
|
-
React.createElement(TextField, { fullWidth: true, value:
|
|
163
|
+
React.createElement(TextField, { fullWidth: true, value: search, label: React.createElement(FormattedMessage, { id: "ui.groups.filterByName", defaultMessage: "ui.groups.filterByName" }), variant: "outlined", onChange: handleOnChangeFilterName, disabled: loading }))))),
|
|
167
164
|
React.createElement(React.Fragment, null, !groups.length ? (React.createElement(Box, { className: classes.noResults },
|
|
168
165
|
React.createElement(Typography, { variant: "h4" },
|
|
169
166
|
React.createElement(FormattedMessage, { id: "ui.groups.noGroups.title", defaultMessage: "ui.groups.noGroups.title" })),
|
|
170
167
|
React.createElement(Typography, { variant: "body1" },
|
|
171
|
-
React.createElement(FormattedMessage, { id: "ui.groups.noGroups.subtitle", defaultMessage: "ui.groups.noGroups.subtitle" })))) : (React.createElement(InfiniteScroll, { dataLength: groups.length, next: handleNext, hasMoreNext: Boolean(next), loaderNext: React.createElement(
|
|
168
|
+
React.createElement(FormattedMessage, { id: "ui.groups.noGroups.subtitle", defaultMessage: "ui.groups.noGroups.subtitle" })))) : (React.createElement(InfiniteScroll, { dataLength: groups.length, next: handleNext, hasMoreNext: Boolean(next), loaderNext: React.createElement(Skeleton, { groupsNumber: 2 }), endMessage: React.createElement(Typography, { component: "div", className: classes.endMessage },
|
|
172
169
|
React.createElement(FormattedMessage, { id: "ui.groups.endMessage", defaultMessage: "ui.groups.endMessage", values: {
|
|
173
170
|
button: (chunk) => (React.createElement(Button, { color: "secondary", variant: "text", onClick: handleScrollUp }, chunk))
|
|
174
171
|
} })) },
|
|
@@ -9,6 +9,10 @@ export interface GroupsSkeletonProps {
|
|
|
9
9
|
* @default null
|
|
10
10
|
*/
|
|
11
11
|
GroupSkeletonProps?: any;
|
|
12
|
+
/**
|
|
13
|
+
* @default 10
|
|
14
|
+
*/
|
|
15
|
+
groupsNumber?: number;
|
|
12
16
|
}
|
|
13
17
|
/**
|
|
14
18
|
* > API documentation for the Community-JS Groups Skeleton component. Learn about the available props and the CSS API.
|
|
@@ -35,8 +35,8 @@ const Root = styled(Box, {
|
|
|
35
35
|
*
|
|
36
36
|
*/
|
|
37
37
|
export default function GroupsSkeleton(inProps) {
|
|
38
|
-
const { className, GroupSkeletonProps = {} } = inProps, rest = __rest(inProps, ["className", "GroupSkeletonProps"]);
|
|
38
|
+
const { className, GroupSkeletonProps = {}, groupsNumber = 10 } = inProps, rest = __rest(inProps, ["className", "GroupSkeletonProps", "groupsNumber"]);
|
|
39
39
|
return (React.createElement(Root, Object.assign({ className: classNames(classes.root, className) }, rest),
|
|
40
|
-
React.createElement(Grid, { container: true, spacing: { xs: 3 }, className: classes.groups }, [...Array(
|
|
40
|
+
React.createElement(Grid, { container: true, spacing: { xs: 3 }, className: classes.groups }, [...Array(groupsNumber)].map((category, index) => (React.createElement(Grid, { item: true, xs: 12, sm: 8, md: 6, key: index },
|
|
41
41
|
React.createElement(GroupSkeleton, Object.assign({ elevation: 0, variant: 'outlined' }, GroupSkeletonProps))))))));
|
|
42
42
|
}
|