@selfcommunity/react-ui 0.7.50-event.30 → 0.7.50-events.28

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.
@@ -3,7 +3,7 @@ import { CategoryFollowButtonProps } from '../CategoryFollowButton';
3
3
  import { WidgetProps } from '../Widget';
4
4
  export interface CategoryProps extends WidgetProps {
5
5
  /**
6
- * Category id
6
+ * Category Id
7
7
  * @default null
8
8
  */
9
9
  categoryId?: number;
@@ -72,7 +72,7 @@ function Category(inProps) {
72
72
  // CONTEXT
73
73
  const scRoutingContext = (0, react_core_1.useSCRouting)();
74
74
  // STATE
75
- const { scCategory } = (0, react_core_1.useSCFetchCategory)({ id: categoryId, category });
75
+ const { scCategory, setSCCategory } = (0, react_core_1.useSCFetchCategory)({ id: categoryId, category });
76
76
  // MEMO
77
77
  const _ButtonBaseProps = (0, react_1.useMemo)(() => (ButtonBaseProps ? ButtonBaseProps : { component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.CATEGORY_ROUTE_NAME, scCategory) }), [ButtonBaseProps, scRoutingContext, scCategory]);
78
78
  // HOOKS
@@ -128,7 +128,7 @@ function EventForm(inProps) {
128
128
  startTime: null,
129
129
  endDate: null,
130
130
  endTime: null,
131
- location: '',
131
+ location: types_1.SCEventLocationType.PERSON,
132
132
  geolocation: '',
133
133
  lat: null,
134
134
  lng: null,
@@ -146,6 +146,7 @@ function EventForm(inProps) {
146
146
  // PREFERENCES
147
147
  const scPreferences = (0, react_core_1.useSCPreferences)();
148
148
  const privateEnabled = (0, react_1.useMemo)(() => scPreferences.preferences[react_core_1.SCPreferences.CONFIGURATIONS_EVENTS_PRIVATE_ENABLED].value, [scPreferences.preferences]);
149
+ const visibilityEnabled = (0, react_1.useMemo)(() => scPreferences.preferences[react_core_1.SCPreferences.CONFIGURATIONS_EVENTS_VISIBILITY_ENABLED].value, [scPreferences.preferences]);
149
150
  const _backgroundCover = Object.assign({}, (field.imageOriginal
150
151
  ? { background: `url('${field.imageOriginal}') center / cover` }
151
152
  : { background: `url('${scPreferences.preferences[react_core_1.SCPreferences.IMAGES_USER_DEFAULT_COVER].value}') center / cover` }));
@@ -199,6 +200,9 @@ function EventForm(inProps) {
199
200
  if (privateEnabled) {
200
201
  formData.append('privacy', field.isPublic ? types_1.SCEventPrivacyType.PUBLIC : types_1.SCEventPrivacyType.PRIVATE);
201
202
  }
203
+ if (visibilityEnabled) {
204
+ formData.append('visible', true);
205
+ }
202
206
  formData.append('description', field.description);
203
207
  api_services_1.EventService.createEvent(formData, { headers: { 'Content-Type': 'multipart/form-data' } })
204
208
  .then((data) => {
@@ -207,7 +211,15 @@ function EventForm(inProps) {
207
211
  setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: false })));
208
212
  })
209
213
  .catch((e) => {
210
- setError(Object.assign(Object.assign({}, error), (0, api_services_1.formatHttpErrorCode)(e)));
214
+ const _error = (0, api_services_1.formatHttpErrorCode)(e);
215
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore,@typescript-eslint/ban-ts-comment
216
+ // @ts-ignore
217
+ if (Object.values(_error)[0].error === 'unique') {
218
+ setError(Object.assign(Object.assign({}, error), { ['nameError']: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.name.error.unique", defaultMessage: "ui.eventForm.name.error.unique" }) }));
219
+ }
220
+ else {
221
+ setError(Object.assign(Object.assign({}, error), _error));
222
+ }
211
223
  setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: false })));
212
224
  utils_1.Logger.error(Errors_1.SCOPE_SC_UI, e);
213
225
  });
@@ -233,7 +245,8 @@ function EventForm(inProps) {
233
245
  return (react_1.default.createElement(Root, Object.assign({ DialogContentProps: { dividers: false }, title: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.title", defaultMessage: "ui.eventForm.title" }), open: open, onClose: onClose, className: (0, classnames_1.default)(classes.root, className), actions: react_1.default.createElement(lab_1.LoadingButton, { loading: field.isSubmitting, disabled: !field.name ||
234
246
  (!field.startDate && !field.startTime) ||
235
247
  (field.location === types_1.SCEventLocationType.ONLINE && !field.link) ||
236
- ((field.recurring !== types_1.SCEventRecurrenceType.NEVER) && (!field.endDate && !field.endTime)) ||
248
+ (field.location === types_1.SCEventLocationType.PERSON && !field.geolocation) ||
249
+ (field.recurring !== types_1.SCEventRecurrenceType.NEVER && !field.endDate && !field.endTime) ||
237
250
  Object.keys(error).length !== 0 ||
238
251
  field.name.length > Event_1.EVENT_TITLE_MAX_LENGTH ||
239
252
  field.description.length > Event_1.EVENT_DESCRIPTION_MAX_LENGTH, variant: "contained", onClick: handleSubmit, color: "secondary" }, react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.button.create", defaultMessage: "ui.eventForm.button.create" })) }, rest),
@@ -243,7 +256,7 @@ function EventForm(inProps) {
243
256
  react_1.default.createElement(material_1.FormGroup, { className: classes.form },
244
257
  react_1.default.createElement(material_1.TextField, { required: true, className: classes.name, placeholder: `${intl.formatMessage(messages.name)}`, margin: "normal", value: field.name, name: "name", onChange: handleChange, InputProps: {
245
258
  endAdornment: react_1.default.createElement(material_1.Typography, { variant: "body2" }, Event_1.EVENT_TITLE_MAX_LENGTH - field.name.length)
246
- }, error: Boolean(((_a = field === null || field === void 0 ? void 0 : field.name) === null || _a === void 0 ? void 0 : _a.length) > Event_1.EVENT_TITLE_MAX_LENGTH), helperText: ((_b = field === null || field === void 0 ? void 0 : field.name) === null || _b === void 0 ? void 0 : _b.length) > Event_1.EVENT_TITLE_MAX_LENGTH ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.name.error.maxLength", defaultMessage: "ui.eventForm.name.error.maxLength" })) : null }),
259
+ }, error: Boolean(((_a = field === null || field === void 0 ? void 0 : field.name) === null || _a === void 0 ? void 0 : _a.length) > Event_1.EVENT_TITLE_MAX_LENGTH) || Boolean(error[`nameError`]), helperText: ((_b = field === null || field === void 0 ? void 0 : field.name) === null || _b === void 0 ? void 0 : _b.length) > Event_1.EVENT_TITLE_MAX_LENGTH ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.name.error.maxLength", defaultMessage: "ui.eventForm.name.error.maxLength" })) : error[`nameError`] ? (error[`nameError`]) : null }),
247
260
  react_1.default.createElement(material_1.Box, { className: classes.dateTime },
248
261
  react_1.default.createElement(x_date_pickers_1.LocalizationProvider, { dateAdapter: AdapterDateFns_1.AdapterDateFns, adapterLocale: scContext.settings.locale.default === 'it' ? it_1.default : en_US_1.default },
249
262
  react_1.default.createElement(x_date_pickers_1.MobileDatePicker, { className: classes.picker, disablePast: true, label: field.startDate && react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.date.placeholder", defaultMessage: "ui.eventForm.date.placeholder" }), value: field.startDate, slots: {
@@ -257,7 +270,7 @@ function EventForm(inProps) {
257
270
  toolbarTitle: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.date.title", defaultMessage: "ui.eventForm.date.title" })
258
271
  }
259
272
  }, onChange: (value) => handleChangeDateTime(value, 'startDate') }),
260
- react_1.default.createElement(x_date_pickers_1.MobileTimePicker, { className: classes.picker, label: field.startTime && react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.time.placeholder", defaultMessage: "ui.eventForm.time.placeholder" }), value: field.startTime, slots: {
273
+ react_1.default.createElement(x_date_pickers_1.MobileTimePicker, { className: classes.picker, disablePast: true, label: field.startTime && react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.time.placeholder", defaultMessage: "ui.eventForm.time.placeholder" }), value: field.startTime, slots: {
261
274
  textField: (params) => (react_1.default.createElement(material_1.TextField, Object.assign({}, params, { InputProps: Object.assign(Object.assign({}, params.InputProps), { placeholder: `${intl.formatMessage(messages.startTime)}`, startAdornment: (react_1.default.createElement(material_1.InputAdornment, { position: "start" },
262
275
  react_1.default.createElement(material_1.IconButton, null,
263
276
  react_1.default.createElement(material_1.Icon, null, "access_time")))) }) })))
@@ -286,12 +299,12 @@ function EventForm(inProps) {
286
299
  react_1.default.createElement(material_1.IconButton, null,
287
300
  react_1.default.createElement(material_1.Icon, null, "calendar_off")))) }) })))
288
301
  }, onChange: (value) => handleChangeDateTime(value, 'endDate') }),
289
- react_1.default.createElement(x_date_pickers_1.MobileTimePicker, { className: classes.picker, label: field.endTime && react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.time.end.placeholder", defaultMessage: "ui.eventForm.time.end.placeholder" }), value: field.endTime, slots: {
302
+ react_1.default.createElement(x_date_pickers_1.MobileTimePicker, { className: classes.picker, disablePast: true, label: field.endTime && react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.time.end.placeholder", defaultMessage: "ui.eventForm.time.end.placeholder" }), value: field.endTime, slots: {
290
303
  textField: (params) => (react_1.default.createElement(material_1.TextField, Object.assign({}, params, { InputProps: Object.assign(Object.assign({}, params.InputProps), { placeholder: `${intl.formatMessage(messages.endTime)}`, startAdornment: (react_1.default.createElement(material_1.InputAdornment, { position: "start" },
291
304
  react_1.default.createElement(material_1.IconButton, null,
292
305
  react_1.default.createElement(material_1.Icon, null, "access_time")))) }) })))
293
306
  }, onChange: (value) => handleChangeDateTime(value, 'endTime') })))),
294
- react_1.default.createElement(material_1.Button, { variant: "text", color: "secondary", onClick: () => setField((prev) => (Object.assign(Object.assign({}, prev), { ['showEndDateTime']: !field.showEndDateTime }))) },
307
+ react_1.default.createElement(material_1.Button, { variant: "text", color: "secondary", onClick: () => setField((prev) => (Object.assign(Object.assign({}, prev), { ['showEndDateTime']: !field.showEndDateTime }))), disabled: field.showEndDateTime && field.recurring !== types_1.SCEventRecurrenceType.NEVER },
295
308
  react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.dateTime.placeholder", defaultMessage: "ui.eventForm.dateTime.placeholder", values: { symbol: field.showEndDateTime ? '-' : '+' } })),
296
309
  react_1.default.createElement(EventAddress_1.default, { forwardGeolocationData: handleGeoData }),
297
310
  privateEnabled && (react_1.default.createElement(material_1.Box, { className: classes.privacySection },
@@ -1,4 +1,4 @@
1
- declare const prefetchedEvents: ({
1
+ export declare const prefetchedEvents: ({
2
2
  id: number;
3
3
  name: string;
4
4
  description: string;
@@ -1,4 +1,7 @@
1
- const prefetchedEvents = [
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prefetchedEvents = void 0;
4
+ exports.prefetchedEvents = [
2
5
  {
3
6
  id: 105,
4
7
  name: 'Evento di prova',
@@ -188,6 +188,7 @@ export interface FeedObjectProps extends CardProps, VirtualScrollerItemProps {
188
188
  |deleted|.SCFeedObject-deleted|Styles applied to the feed obj when is deleted (visible only for admin and moderator).|
189
189
  |header|.SCFeedObject-header|Styles applied to the header of the card.|
190
190
  |category|.SCFeedObject-category|Styles applied to the category element.|
191
+ |event|.SCFeedObject-event|Styles applied to the event element.|
191
192
  |group|.SCFeedObject-group|Styles applied to the group element.|
192
193
  |avatar|.SCFeedObject-avatar|Styles applied to the avatar element.|
193
194
  |username|.SCFeedObject-username|Styles applied to the username element.|
@@ -53,6 +53,7 @@ const classes = {
53
53
  deleted: `${constants_1.PREFIX}-deleted`,
54
54
  header: `${constants_1.PREFIX}-header`,
55
55
  category: `${constants_1.PREFIX}-category`,
56
+ event: `${constants_1.PREFIX}-event`,
56
57
  group: `${constants_1.PREFIX}-group`,
57
58
  avatar: `${constants_1.PREFIX}-avatar`,
58
59
  username: `${constants_1.PREFIX}-username`,
@@ -107,6 +108,7 @@ const Root = (0, styles_1.styled)(Widget_1.default, {
107
108
  |deleted|.SCFeedObject-deleted|Styles applied to the feed obj when is deleted (visible only for admin and moderator).|
108
109
  |header|.SCFeedObject-header|Styles applied to the header of the card.|
109
110
  |category|.SCFeedObject-category|Styles applied to the category element.|
111
+ |event|.SCFeedObject-event|Styles applied to the event element.|
110
112
  |group|.SCFeedObject-group|Styles applied to the group element.|
111
113
  |avatar|.SCFeedObject-avatar|Styles applied to the avatar element.|
112
114
  |username|.SCFeedObject-username|Styles applied to the username element.|
@@ -434,12 +436,17 @@ function FeedObject(inProps) {
434
436
  template === feedObject_1.SCFeedObjectTemplateType.SEARCH) {
435
437
  objElement = (react_1.default.createElement(react_1.default.Fragment, null, obj ? (react_1.default.createElement(material_1.Box, { className: (0, classnames_1.default)({ [classes.deleted]: obj && obj.deleted }) },
436
438
  obj.categories.length > 0 && (react_1.default.createElement("div", { className: classes.category },
437
- react_1.default.createElement(react_1.default.Fragment, null, obj.group && (react_1.default.createElement("div", { className: classes.group },
438
- react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.group.id, icon: react_1.default.createElement(Icon_1.default, null, "groups"), component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true })))),
439
+ react_1.default.createElement(react_1.default.Fragment, null,
440
+ obj.group && (react_1.default.createElement("div", { className: classes.group },
441
+ react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.group.id, icon: react_1.default.createElement(Icon_1.default, null, "groups"), component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true }))),
442
+ obj.event && (react_1.default.createElement("div", { className: classes.event },
443
+ react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.event.id, icon: react_1.default.createElement(Icon_1.default, null, "CalendarIcon"), component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.EVENT_ROUTE_NAME, obj.event), clickable: true })))),
439
444
  obj.categories.map((c) => (react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.CATEGORY_ROUTE_NAME, c), key: c.id },
440
445
  react_1.default.createElement(material_1.Typography, { variant: "overline" }, c.name)))))),
441
446
  obj.group && !obj.categories.length && (react_1.default.createElement("div", { className: classes.group },
442
447
  react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.group.id, icon: react_1.default.createElement(Icon_1.default, null, "groups"), label: obj.group.name, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true }))),
448
+ obj.event && !obj.categories.length && (react_1.default.createElement("div", { className: classes.event },
449
+ react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.event.id, icon: react_1.default.createElement(Icon_1.default, null, "CalendarIcon"), label: obj.event.name, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.EVENT_ROUTE_NAME, obj.event), clickable: true }))),
443
450
  react_1.default.createElement(material_1.CardHeader, { className: classes.header, avatar: react_1.default.createElement(react_core_1.Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null }),
444
451
  react_1.default.createElement(UserAvatar_1.default, { hide: !obj.author.community_badge },
445
452
  react_1.default.createElement(material_1.Avatar, { "aria-label": "recipe", src: obj.author.avatar, className: classes.avatar }, obj.author.username))), title: react_1.default.createElement(react_core_1.Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null, className: classes.username }), obj.author.username), subheader: react_1.default.createElement(react_1.default.Fragment, null,
@@ -482,12 +489,17 @@ function FeedObject(inProps) {
482
489
  else if (template === feedObject_1.SCFeedObjectTemplateType.SHARE) {
483
490
  objElement = (react_1.default.createElement(react_1.default.Fragment, null, obj ? (react_1.default.createElement(react_1.default.Fragment, null,
484
491
  obj.categories.length > 0 && (react_1.default.createElement("div", { className: classes.category },
485
- react_1.default.createElement(react_1.default.Fragment, null, obj.group && (react_1.default.createElement("div", { className: classes.group },
486
- react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.group.id, icon: react_1.default.createElement(Icon_1.default, null, "groups"), component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true })))),
492
+ react_1.default.createElement(react_1.default.Fragment, null,
493
+ obj.group && (react_1.default.createElement("div", { className: classes.group },
494
+ react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.group.id, icon: react_1.default.createElement(Icon_1.default, null, "groups"), component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true }))),
495
+ obj.event && (react_1.default.createElement("div", { className: classes.event },
496
+ react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.event.id, icon: react_1.default.createElement(Icon_1.default, null, "CalendarIcon"), component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.EVENT_ROUTE_NAME, obj.event), clickable: true })))),
487
497
  obj.categories.map((c) => (react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url(react_core_1.SCRoutes.CATEGORY_ROUTE_NAME, c), key: c.id },
488
498
  react_1.default.createElement(material_1.Typography, { variant: "overline" }, c.name)))))),
489
499
  obj.group && !obj.categories.length && (react_1.default.createElement("div", { className: classes.group },
490
500
  react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.group.id, icon: react_1.default.createElement(Icon_1.default, null, "groups"), label: obj.group.name, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true }))),
501
+ obj.event && !obj.categories.length && (react_1.default.createElement("div", { className: classes.event },
502
+ react_1.default.createElement(material_1.Chip, { color: "secondary", size: "small", key: obj.event.id, icon: react_1.default.createElement(Icon_1.default, null, "groups"), label: obj.event.name, component: react_core_1.Link, to: scRoutingContext.url(react_core_1.SCRoutes.EVENT_ROUTE_NAME, obj.event), clickable: true }))),
491
503
  react_1.default.createElement(material_1.CardHeader, { classes: { root: classes.header }, avatar: react_1.default.createElement(react_core_1.Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null, className: classes.username }),
492
504
  react_1.default.createElement(UserAvatar_1.default, { hide: !obj.author.community_badge },
493
505
  react_1.default.createElement(material_1.Avatar, { "aria-label": "recipe", src: obj.author.avatar, className: classes.avatar }, obj.author.username))), title: react_1.default.createElement(react_core_1.Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(react_core_1.SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null, className: classes.username }), obj.author.username), subheader: react_1.default.createElement(react_core_1.Link, { to: scRoutingContext.url((0, contribution_1.getContributionRouteName)(obj), (0, contribution_1.getRouteData)(obj)), className: classes.activityAt },
@@ -17,12 +17,6 @@ export declare enum SCGroupEventType {
17
17
  INVITE_MEMBER = "members.invite_member",
18
18
  REMOVE_MEMBER = "members.remove_member"
19
19
  }
20
- /**
21
- * Group event structure
22
- */
23
- export interface SCGroupChangeEventType {
24
- group: SCGroupType;
25
- }
26
20
  export interface SCGroupMembersEventType {
27
21
  group: SCGroupType;
28
22
  user?: SCUserType;
@@ -3,7 +3,7 @@ import { CategoryFollowButtonProps } from '../CategoryFollowButton';
3
3
  import { WidgetProps } from '../Widget';
4
4
  export interface CategoryProps extends WidgetProps {
5
5
  /**
6
- * Category id
6
+ * Category Id
7
7
  * @default null
8
8
  */
9
9
  categoryId?: number;
@@ -70,7 +70,7 @@ export default function Category(inProps) {
70
70
  // CONTEXT
71
71
  const scRoutingContext = useSCRouting();
72
72
  // STATE
73
- const { scCategory } = useSCFetchCategory({ id: categoryId, category });
73
+ const { scCategory, setSCCategory } = useSCFetchCategory({ id: categoryId, category });
74
74
  // MEMO
75
75
  const _ButtonBaseProps = useMemo(() => (ButtonBaseProps ? ButtonBaseProps : { component: Link, to: scRoutingContext.url(SCRoutes.CATEGORY_ROUTE_NAME, scCategory) }), [ButtonBaseProps, scRoutingContext, scCategory]);
76
76
  // HOOKS
@@ -126,7 +126,7 @@ export default function EventForm(inProps) {
126
126
  startTime: null,
127
127
  endDate: null,
128
128
  endTime: null,
129
- location: '',
129
+ location: SCEventLocationType.PERSON,
130
130
  geolocation: '',
131
131
  lat: null,
132
132
  lng: null,
@@ -144,6 +144,7 @@ export default function EventForm(inProps) {
144
144
  // PREFERENCES
145
145
  const scPreferences = useSCPreferences();
146
146
  const privateEnabled = useMemo(() => scPreferences.preferences[SCPreferences.CONFIGURATIONS_EVENTS_PRIVATE_ENABLED].value, [scPreferences.preferences]);
147
+ const visibilityEnabled = useMemo(() => scPreferences.preferences[SCPreferences.CONFIGURATIONS_EVENTS_VISIBILITY_ENABLED].value, [scPreferences.preferences]);
147
148
  const _backgroundCover = Object.assign({}, (field.imageOriginal
148
149
  ? { background: `url('${field.imageOriginal}') center / cover` }
149
150
  : { background: `url('${scPreferences.preferences[SCPreferences.IMAGES_USER_DEFAULT_COVER].value}') center / cover` }));
@@ -197,6 +198,9 @@ export default function EventForm(inProps) {
197
198
  if (privateEnabled) {
198
199
  formData.append('privacy', field.isPublic ? SCEventPrivacyType.PUBLIC : SCEventPrivacyType.PRIVATE);
199
200
  }
201
+ if (visibilityEnabled) {
202
+ formData.append('visible', true);
203
+ }
200
204
  formData.append('description', field.description);
201
205
  EventService.createEvent(formData, { headers: { 'Content-Type': 'multipart/form-data' } })
202
206
  .then((data) => {
@@ -205,7 +209,15 @@ export default function EventForm(inProps) {
205
209
  setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: false })));
206
210
  })
207
211
  .catch((e) => {
208
- setError(Object.assign(Object.assign({}, error), formatHttpErrorCode(e)));
212
+ const _error = formatHttpErrorCode(e);
213
+ // eslint-disable-next-line @typescript-eslint/ban-ts-ignore,@typescript-eslint/ban-ts-comment
214
+ // @ts-ignore
215
+ if (Object.values(_error)[0].error === 'unique') {
216
+ setError(Object.assign(Object.assign({}, error), { ['nameError']: React.createElement(FormattedMessage, { id: "ui.eventForm.name.error.unique", defaultMessage: "ui.eventForm.name.error.unique" }) }));
217
+ }
218
+ else {
219
+ setError(Object.assign(Object.assign({}, error), _error));
220
+ }
209
221
  setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: false })));
210
222
  Logger.error(SCOPE_SC_UI, e);
211
223
  });
@@ -231,7 +243,8 @@ export default function EventForm(inProps) {
231
243
  return (React.createElement(Root, Object.assign({ DialogContentProps: { dividers: false }, title: React.createElement(FormattedMessage, { id: "ui.eventForm.title", defaultMessage: "ui.eventForm.title" }), open: open, onClose: onClose, className: classNames(classes.root, className), actions: React.createElement(LoadingButton, { loading: field.isSubmitting, disabled: !field.name ||
232
244
  (!field.startDate && !field.startTime) ||
233
245
  (field.location === SCEventLocationType.ONLINE && !field.link) ||
234
- ((field.recurring !== SCEventRecurrenceType.NEVER) && (!field.endDate && !field.endTime)) ||
246
+ (field.location === SCEventLocationType.PERSON && !field.geolocation) ||
247
+ (field.recurring !== SCEventRecurrenceType.NEVER && !field.endDate && !field.endTime) ||
235
248
  Object.keys(error).length !== 0 ||
236
249
  field.name.length > EVENT_TITLE_MAX_LENGTH ||
237
250
  field.description.length > EVENT_DESCRIPTION_MAX_LENGTH, variant: "contained", onClick: handleSubmit, color: "secondary" }, React.createElement(FormattedMessage, { id: "ui.eventForm.button.create", defaultMessage: "ui.eventForm.button.create" })) }, rest),
@@ -241,7 +254,7 @@ export default function EventForm(inProps) {
241
254
  React.createElement(FormGroup, { className: classes.form },
242
255
  React.createElement(TextField, { required: true, className: classes.name, placeholder: `${intl.formatMessage(messages.name)}`, margin: "normal", value: field.name, name: "name", onChange: handleChange, InputProps: {
243
256
  endAdornment: React.createElement(Typography, { variant: "body2" }, EVENT_TITLE_MAX_LENGTH - field.name.length)
244
- }, error: Boolean(((_a = field === null || field === void 0 ? void 0 : field.name) === null || _a === void 0 ? void 0 : _a.length) > EVENT_TITLE_MAX_LENGTH), helperText: ((_b = field === null || field === void 0 ? void 0 : field.name) === null || _b === void 0 ? void 0 : _b.length) > EVENT_TITLE_MAX_LENGTH ? (React.createElement(FormattedMessage, { id: "ui.eventForm.name.error.maxLength", defaultMessage: "ui.eventForm.name.error.maxLength" })) : null }),
257
+ }, error: Boolean(((_a = field === null || field === void 0 ? void 0 : field.name) === null || _a === void 0 ? void 0 : _a.length) > EVENT_TITLE_MAX_LENGTH) || Boolean(error[`nameError`]), helperText: ((_b = field === null || field === void 0 ? void 0 : field.name) === null || _b === void 0 ? void 0 : _b.length) > EVENT_TITLE_MAX_LENGTH ? (React.createElement(FormattedMessage, { id: "ui.eventForm.name.error.maxLength", defaultMessage: "ui.eventForm.name.error.maxLength" })) : error[`nameError`] ? (error[`nameError`]) : null }),
245
258
  React.createElement(Box, { className: classes.dateTime },
246
259
  React.createElement(LocalizationProvider, { dateAdapter: AdapterDateFns, adapterLocale: scContext.settings.locale.default === 'it' ? itLocale : enLocale },
247
260
  React.createElement(MobileDatePicker, { className: classes.picker, disablePast: true, label: field.startDate && React.createElement(FormattedMessage, { id: "ui.eventForm.date.placeholder", defaultMessage: "ui.eventForm.date.placeholder" }), value: field.startDate, slots: {
@@ -255,7 +268,7 @@ export default function EventForm(inProps) {
255
268
  toolbarTitle: React.createElement(FormattedMessage, { id: "ui.eventForm.date.title", defaultMessage: "ui.eventForm.date.title" })
256
269
  }
257
270
  }, onChange: (value) => handleChangeDateTime(value, 'startDate') }),
258
- React.createElement(MobileTimePicker, { className: classes.picker, label: field.startTime && React.createElement(FormattedMessage, { id: "ui.eventForm.time.placeholder", defaultMessage: "ui.eventForm.time.placeholder" }), value: field.startTime, slots: {
271
+ React.createElement(MobileTimePicker, { className: classes.picker, disablePast: true, label: field.startTime && React.createElement(FormattedMessage, { id: "ui.eventForm.time.placeholder", defaultMessage: "ui.eventForm.time.placeholder" }), value: field.startTime, slots: {
259
272
  textField: (params) => (React.createElement(TextField, Object.assign({}, params, { InputProps: Object.assign(Object.assign({}, params.InputProps), { placeholder: `${intl.formatMessage(messages.startTime)}`, startAdornment: (React.createElement(InputAdornment, { position: "start" },
260
273
  React.createElement(IconButton, null,
261
274
  React.createElement(Icon, null, "access_time")))) }) })))
@@ -284,12 +297,12 @@ export default function EventForm(inProps) {
284
297
  React.createElement(IconButton, null,
285
298
  React.createElement(Icon, null, "calendar_off")))) }) })))
286
299
  }, onChange: (value) => handleChangeDateTime(value, 'endDate') }),
287
- React.createElement(MobileTimePicker, { className: classes.picker, label: field.endTime && React.createElement(FormattedMessage, { id: "ui.eventForm.time.end.placeholder", defaultMessage: "ui.eventForm.time.end.placeholder" }), value: field.endTime, slots: {
300
+ React.createElement(MobileTimePicker, { className: classes.picker, disablePast: true, label: field.endTime && React.createElement(FormattedMessage, { id: "ui.eventForm.time.end.placeholder", defaultMessage: "ui.eventForm.time.end.placeholder" }), value: field.endTime, slots: {
288
301
  textField: (params) => (React.createElement(TextField, Object.assign({}, params, { InputProps: Object.assign(Object.assign({}, params.InputProps), { placeholder: `${intl.formatMessage(messages.endTime)}`, startAdornment: (React.createElement(InputAdornment, { position: "start" },
289
302
  React.createElement(IconButton, null,
290
303
  React.createElement(Icon, null, "access_time")))) }) })))
291
304
  }, onChange: (value) => handleChangeDateTime(value, 'endTime') })))),
292
- React.createElement(Button, { variant: "text", color: "secondary", onClick: () => setField((prev) => (Object.assign(Object.assign({}, prev), { ['showEndDateTime']: !field.showEndDateTime }))) },
305
+ React.createElement(Button, { variant: "text", color: "secondary", onClick: () => setField((prev) => (Object.assign(Object.assign({}, prev), { ['showEndDateTime']: !field.showEndDateTime }))), disabled: field.showEndDateTime && field.recurring !== SCEventRecurrenceType.NEVER },
293
306
  React.createElement(FormattedMessage, { id: "ui.eventForm.dateTime.placeholder", defaultMessage: "ui.eventForm.dateTime.placeholder", values: { symbol: field.showEndDateTime ? '-' : '+' } })),
294
307
  React.createElement(EventAddress, { forwardGeolocationData: handleGeoData }),
295
308
  privateEnabled && (React.createElement(Box, { className: classes.privacySection },
@@ -1,4 +1,4 @@
1
- declare const prefetchedEvents: ({
1
+ export declare const prefetchedEvents: ({
2
2
  id: number;
3
3
  name: string;
4
4
  description: string;
@@ -1,4 +1,4 @@
1
- const prefetchedEvents = [
1
+ export const prefetchedEvents = [
2
2
  {
3
3
  id: 105,
4
4
  name: 'Evento di prova',
@@ -188,6 +188,7 @@ export interface FeedObjectProps extends CardProps, VirtualScrollerItemProps {
188
188
  |deleted|.SCFeedObject-deleted|Styles applied to the feed obj when is deleted (visible only for admin and moderator).|
189
189
  |header|.SCFeedObject-header|Styles applied to the header of the card.|
190
190
  |category|.SCFeedObject-category|Styles applied to the category element.|
191
+ |event|.SCFeedObject-event|Styles applied to the event element.|
191
192
  |group|.SCFeedObject-group|Styles applied to the group element.|
192
193
  |avatar|.SCFeedObject-avatar|Styles applied to the avatar element.|
193
194
  |username|.SCFeedObject-username|Styles applied to the username element.|
@@ -51,6 +51,7 @@ const classes = {
51
51
  deleted: `${PREFIX}-deleted`,
52
52
  header: `${PREFIX}-header`,
53
53
  category: `${PREFIX}-category`,
54
+ event: `${PREFIX}-event`,
54
55
  group: `${PREFIX}-group`,
55
56
  avatar: `${PREFIX}-avatar`,
56
57
  username: `${PREFIX}-username`,
@@ -105,6 +106,7 @@ const Root = styled(Widget, {
105
106
  |deleted|.SCFeedObject-deleted|Styles applied to the feed obj when is deleted (visible only for admin and moderator).|
106
107
  |header|.SCFeedObject-header|Styles applied to the header of the card.|
107
108
  |category|.SCFeedObject-category|Styles applied to the category element.|
109
+ |event|.SCFeedObject-event|Styles applied to the event element.|
108
110
  |group|.SCFeedObject-group|Styles applied to the group element.|
109
111
  |avatar|.SCFeedObject-avatar|Styles applied to the avatar element.|
110
112
  |username|.SCFeedObject-username|Styles applied to the username element.|
@@ -432,12 +434,17 @@ export default function FeedObject(inProps) {
432
434
  template === SCFeedObjectTemplateType.SEARCH) {
433
435
  objElement = (React.createElement(React.Fragment, null, obj ? (React.createElement(Box, { className: classNames({ [classes.deleted]: obj && obj.deleted }) },
434
436
  obj.categories.length > 0 && (React.createElement("div", { className: classes.category },
435
- React.createElement(React.Fragment, null, obj.group && (React.createElement("div", { className: classes.group },
436
- React.createElement(Chip, { color: "secondary", size: "small", key: obj.group.id, icon: React.createElement(Icon, null, "groups"), component: Link, to: scRoutingContext.url(SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true })))),
437
+ React.createElement(React.Fragment, null,
438
+ obj.group && (React.createElement("div", { className: classes.group },
439
+ React.createElement(Chip, { color: "secondary", size: "small", key: obj.group.id, icon: React.createElement(Icon, null, "groups"), component: Link, to: scRoutingContext.url(SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true }))),
440
+ obj.event && (React.createElement("div", { className: classes.event },
441
+ React.createElement(Chip, { color: "secondary", size: "small", key: obj.event.id, icon: React.createElement(Icon, null, "CalendarIcon"), component: Link, to: scRoutingContext.url(SCRoutes.EVENT_ROUTE_NAME, obj.event), clickable: true })))),
437
442
  obj.categories.map((c) => (React.createElement(Link, { to: scRoutingContext.url(SCRoutes.CATEGORY_ROUTE_NAME, c), key: c.id },
438
443
  React.createElement(Typography, { variant: "overline" }, c.name)))))),
439
444
  obj.group && !obj.categories.length && (React.createElement("div", { className: classes.group },
440
445
  React.createElement(Chip, { color: "secondary", size: "small", key: obj.group.id, icon: React.createElement(Icon, null, "groups"), label: obj.group.name, component: Link, to: scRoutingContext.url(SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true }))),
446
+ obj.event && !obj.categories.length && (React.createElement("div", { className: classes.event },
447
+ React.createElement(Chip, { color: "secondary", size: "small", key: obj.event.id, icon: React.createElement(Icon, null, "CalendarIcon"), label: obj.event.name, component: Link, to: scRoutingContext.url(SCRoutes.EVENT_ROUTE_NAME, obj.event), clickable: true }))),
441
448
  React.createElement(CardHeader, { className: classes.header, avatar: React.createElement(Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null }),
442
449
  React.createElement(UserAvatar, { hide: !obj.author.community_badge },
443
450
  React.createElement(Avatar, { "aria-label": "recipe", src: obj.author.avatar, className: classes.avatar }, obj.author.username))), title: React.createElement(Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null, className: classes.username }), obj.author.username), subheader: React.createElement(React.Fragment, null,
@@ -480,12 +487,17 @@ export default function FeedObject(inProps) {
480
487
  else if (template === SCFeedObjectTemplateType.SHARE) {
481
488
  objElement = (React.createElement(React.Fragment, null, obj ? (React.createElement(React.Fragment, null,
482
489
  obj.categories.length > 0 && (React.createElement("div", { className: classes.category },
483
- React.createElement(React.Fragment, null, obj.group && (React.createElement("div", { className: classes.group },
484
- React.createElement(Chip, { color: "secondary", size: "small", key: obj.group.id, icon: React.createElement(Icon, null, "groups"), component: Link, to: scRoutingContext.url(SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true })))),
490
+ React.createElement(React.Fragment, null,
491
+ obj.group && (React.createElement("div", { className: classes.group },
492
+ React.createElement(Chip, { color: "secondary", size: "small", key: obj.group.id, icon: React.createElement(Icon, null, "groups"), component: Link, to: scRoutingContext.url(SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true }))),
493
+ obj.event && (React.createElement("div", { className: classes.event },
494
+ React.createElement(Chip, { color: "secondary", size: "small", key: obj.event.id, icon: React.createElement(Icon, null, "CalendarIcon"), component: Link, to: scRoutingContext.url(SCRoutes.EVENT_ROUTE_NAME, obj.event), clickable: true })))),
485
495
  obj.categories.map((c) => (React.createElement(Link, { to: scRoutingContext.url(SCRoutes.CATEGORY_ROUTE_NAME, c), key: c.id },
486
496
  React.createElement(Typography, { variant: "overline" }, c.name)))))),
487
497
  obj.group && !obj.categories.length && (React.createElement("div", { className: classes.group },
488
498
  React.createElement(Chip, { color: "secondary", size: "small", key: obj.group.id, icon: React.createElement(Icon, null, "groups"), label: obj.group.name, component: Link, to: scRoutingContext.url(SCRoutes.GROUP_ROUTE_NAME, obj.group), clickable: true }))),
499
+ obj.event && !obj.categories.length && (React.createElement("div", { className: classes.event },
500
+ React.createElement(Chip, { color: "secondary", size: "small", key: obj.event.id, icon: React.createElement(Icon, null, "groups"), label: obj.event.name, component: Link, to: scRoutingContext.url(SCRoutes.EVENT_ROUTE_NAME, obj.event), clickable: true }))),
489
501
  React.createElement(CardHeader, { classes: { root: classes.header }, avatar: React.createElement(Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null, className: classes.username }),
490
502
  React.createElement(UserAvatar, { hide: !obj.author.community_badge },
491
503
  React.createElement(Avatar, { "aria-label": "recipe", src: obj.author.avatar, className: classes.avatar }, obj.author.username))), title: React.createElement(Link, Object.assign({}, (!obj.author.deleted && { to: scRoutingContext.url(SCRoutes.USER_PROFILE_ROUTE_NAME, obj.author) }), { onClick: obj.author.deleted ? () => setOpenAlert(true) : null, className: classes.username }), obj.author.username), subheader: React.createElement(Link, { to: scRoutingContext.url(getContributionRouteName(obj), getRouteData(obj)), className: classes.activityAt },
@@ -17,12 +17,6 @@ export declare enum SCGroupEventType {
17
17
  INVITE_MEMBER = "members.invite_member",
18
18
  REMOVE_MEMBER = "members.remove_member"
19
19
  }
20
- /**
21
- * Group event structure
22
- */
23
- export interface SCGroupChangeEventType {
24
- group: SCGroupType;
25
- }
26
20
  export interface SCGroupMembersEventType {
27
21
  group: SCGroupType;
28
22
  user?: SCUserType;