@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.
@@ -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
- api_services_1.GroupService.getGroupSuggestedUsers(scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, value)
131
- .then((data) => {
132
- setLoading(false);
133
- setSuggested(data.results);
134
- })
135
- .catch((error) => {
136
- setLoading(false);
137
- utils_1.Logger.error(Errors_1.SCOPE_SC_UI, error);
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
- setSuggested(data.results);
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
- if (scGroup === null || scGroup === void 0 ? void 0 : scGroup.id) {
154
- api_services_1.GroupService.getGroupSuggestedUsers(scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, value).then((data) => {
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 && setSuggested([]);
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: suggested, 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),
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, variant: "outlined", size: "small" },
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: scGroup.subscribers_counter } }), onClose: handleToggleDialogOpen, open: openDialog }, DialogProps),
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, variant: "outlined", size: "small" },
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: boolean;
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.__importStar(require("../Group"));
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, handleFilterGroups, general = true } = props, rest = tslib_1.__rest(props, ["endpointQueryParams", "className", "GroupComponentProps", "showFilters", "filters", "handleFilterGroups", "general"]);
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 [filterName, setFilterName] = (0, react_1.useState)('');
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 (handleFilterGroups) {
148
- return handleFilterGroups(groups);
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
- setFilterName(event.target.value);
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: filterName, label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.groups.filterByName", defaultMessage: "ui.groups.filterByName" }), variant: "outlined", onChange: handleOnChangeFilterName, disabled: loading }))))),
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(Group_1.GroupSkeleton, null), endMessage: react_1.default.createElement(material_1.Typography, { component: "div", className: classes.endMessage },
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(15)].map((category, index) => (react_1.default.createElement(material_1.Grid, { item: true, xs: 12, sm: 8, md: 6, key: index },
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
- GroupService.getGroupSuggestedUsers(scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, value)
129
- .then((data) => {
130
- setLoading(false);
131
- setSuggested(data.results);
132
- })
133
- .catch((error) => {
134
- setLoading(false);
135
- Logger.error(SCOPE_SC_UI, error);
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
- setSuggested(data.results);
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
- if (scGroup === null || scGroup === void 0 ? void 0 : scGroup.id) {
152
- GroupService.getGroupSuggestedUsers(scGroup === null || scGroup === void 0 ? void 0 : scGroup.id, value).then((data) => {
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 && setSuggested([]);
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: suggested, 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),
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, variant: "outlined", size: "small" },
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: scGroup.subscribers_counter } }), onClose: handleToggleDialogOpen, open: openDialog }, DialogProps),
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, variant: "outlined", size: "small" },
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: boolean;
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, { GroupSkeleton } from '../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, handleFilterGroups, general = true } = props, rest = __rest(props, ["endpointQueryParams", "className", "GroupComponentProps", "showFilters", "filters", "handleFilterGroups", "general"]);
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 [filterName, setFilterName] = useState('');
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 (handleFilterGroups) {
146
- return handleFilterGroups(groups);
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
- setFilterName(event.target.value);
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: filterName, label: React.createElement(FormattedMessage, { id: "ui.groups.filterByName", defaultMessage: "ui.groups.filterByName" }), variant: "outlined", onChange: handleOnChangeFilterName, disabled: loading }))))),
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(GroupSkeleton, null), endMessage: React.createElement(Typography, { component: "div", className: classes.endMessage },
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(15)].map((category, index) => (React.createElement(Grid, { item: true, xs: 12, sm: 8, md: 6, key: index },
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
  }