@selfcommunity/react-ui 0.7.50-events.36 → 0.7.50-events.39
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/CreateEventButton/CreateEventButton.js +1 -1
- package/lib/cjs/components/EditEventButton/EditEventButton.d.ts +43 -0
- package/lib/cjs/components/EditEventButton/EditEventButton.js +61 -0
- package/lib/cjs/components/EditEventButton/index.d.ts +3 -0
- package/lib/cjs/components/EditEventButton/index.js +5 -0
- package/lib/cjs/components/EventForm/EventAddress.d.ts +2 -1
- package/lib/cjs/components/EventForm/EventAddress.js +4 -4
- package/lib/cjs/components/EventForm/EventForm.d.ts +6 -0
- package/lib/cjs/components/EventForm/EventForm.js +51 -25
- package/lib/cjs/components/EventForm/UploadEventCover.d.ts +10 -0
- package/lib/cjs/components/EventForm/UploadEventCover.js +34 -7
- package/lib/cjs/components/EventHeader/EventHeader.d.ts +67 -0
- package/lib/cjs/components/EventHeader/EventHeader.js +175 -0
- package/lib/cjs/components/EventHeader/Skeleton.d.ts +25 -0
- package/lib/cjs/components/EventHeader/Skeleton.js +56 -0
- package/lib/cjs/components/EventHeader/constants.d.ts +1 -0
- package/lib/cjs/components/EventHeader/constants.js +4 -0
- package/lib/cjs/components/EventHeader/index.d.ts +4 -0
- package/lib/cjs/components/EventHeader/index.js +8 -0
- package/lib/cjs/components/EventLocationWidget/EventLocationWidget.js +1 -0
- package/lib/cjs/components/EventSubscribeButton/EventSubscribeButton.d.ts +56 -0
- package/lib/cjs/components/EventSubscribeButton/EventSubscribeButton.js +193 -0
- package/lib/cjs/components/EventSubscribeButton/index.d.ts +3 -0
- package/lib/cjs/components/EventSubscribeButton/index.js +5 -0
- package/lib/cjs/components/Events/Events.js +3 -2
- package/lib/cjs/components/FeedObject/FeedObject.js +1 -1
- package/lib/cjs/constants/PubSub.d.ts +5 -1
- package/lib/cjs/index.d.ts +4 -1
- package/lib/cjs/index.js +9 -2
- package/lib/esm/components/CreateEventButton/CreateEventButton.js +1 -1
- package/lib/esm/components/EditEventButton/EditEventButton.d.ts +43 -0
- package/lib/esm/components/EditEventButton/EditEventButton.js +58 -0
- package/lib/esm/components/EditEventButton/index.d.ts +3 -0
- package/lib/esm/components/EditEventButton/index.js +2 -0
- package/lib/esm/components/EventForm/EventAddress.d.ts +2 -1
- package/lib/esm/components/EventForm/EventAddress.js +4 -4
- package/lib/esm/components/EventForm/EventForm.d.ts +6 -0
- package/lib/esm/components/EventForm/EventForm.js +51 -25
- package/lib/esm/components/EventForm/UploadEventCover.d.ts +10 -0
- package/lib/esm/components/EventForm/UploadEventCover.js +34 -7
- package/lib/esm/components/EventHeader/EventHeader.d.ts +67 -0
- package/lib/esm/components/EventHeader/EventHeader.js +172 -0
- package/lib/esm/components/EventHeader/Skeleton.d.ts +25 -0
- package/lib/esm/components/EventHeader/Skeleton.js +53 -0
- package/lib/esm/components/EventHeader/constants.d.ts +1 -0
- package/lib/esm/components/EventHeader/constants.js +1 -0
- package/lib/esm/components/EventHeader/index.d.ts +4 -0
- package/lib/esm/components/EventHeader/index.js +4 -0
- package/lib/esm/components/EventLocationWidget/EventLocationWidget.js +1 -0
- package/lib/esm/components/EventSubscribeButton/EventSubscribeButton.d.ts +56 -0
- package/lib/esm/components/EventSubscribeButton/EventSubscribeButton.js +190 -0
- package/lib/esm/components/EventSubscribeButton/index.d.ts +3 -0
- package/lib/esm/components/EventSubscribeButton/index.js +2 -0
- package/lib/esm/components/Events/Events.js +3 -2
- package/lib/esm/components/FeedObject/FeedObject.js +1 -1
- package/lib/esm/constants/PubSub.d.ts +5 -1
- package/lib/esm/index.d.ts +4 -1
- package/lib/esm/index.js +5 -2
- package/lib/umd/react-ui.js +1 -1
- package/package.json +7 -7
|
@@ -73,7 +73,7 @@ function CreateEventButton(inProps) {
|
|
|
73
73
|
* Renders root object
|
|
74
74
|
*/
|
|
75
75
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
76
|
-
react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className), onClick: handleClick, variant: "contained", color: "secondary", startIcon: react_1.default.createElement(material_1.Icon, { fontSize: "small" }, "add") }, rest), children !== null && children !== void 0 ? children : react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.createEventButton", defaultMessage: "ui.createEventButton" })),
|
|
76
|
+
react_1.default.createElement(Root, Object.assign({ className: (0, classnames_1.default)(classes.root, className), onClick: handleClick, variant: "contained", color: "secondary", startIcon: !EventFormProps.event && react_1.default.createElement(material_1.Icon, { fontSize: "small" }, "add") }, rest), children !== null && children !== void 0 ? children : react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.createEventButton", defaultMessage: "ui.createEventButton" })),
|
|
77
77
|
open && react_1.default.createElement(EventForm_1.default, Object.assign({}, EventFormProps, { open: true, onClose: handleClick }))));
|
|
78
78
|
}
|
|
79
79
|
exports.default = CreateEventButton;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { CreateEventButtonProps } from '../CreateEventButton';
|
|
2
|
+
import { SCEventType } from '@selfcommunity/types';
|
|
3
|
+
export interface EditEventButtonProps extends CreateEventButtonProps {
|
|
4
|
+
/**
|
|
5
|
+
* Event Object
|
|
6
|
+
* @default null
|
|
7
|
+
*/
|
|
8
|
+
event?: SCEventType;
|
|
9
|
+
/**
|
|
10
|
+
* Id of the event
|
|
11
|
+
* @default null
|
|
12
|
+
*/
|
|
13
|
+
eventId?: number | string;
|
|
14
|
+
/**
|
|
15
|
+
* On edit success callback function
|
|
16
|
+
* @default null
|
|
17
|
+
*/
|
|
18
|
+
onEditSuccess?: (data: SCEventType) => void;
|
|
19
|
+
/**
|
|
20
|
+
* Any other properties
|
|
21
|
+
*/
|
|
22
|
+
[p: string]: any;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
*> API documentation for the Community-JS Create Event Button component. Learn about the available props and the CSS API.
|
|
26
|
+
*
|
|
27
|
+
#### Import
|
|
28
|
+
```jsx
|
|
29
|
+
import {CreateEventButton} from '@selfcommunity/react-ui';
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
#### Component Name
|
|
33
|
+
The name `SCEditEventButton` can be used when providing style overrides in the theme.
|
|
34
|
+
|
|
35
|
+
#### CSS
|
|
36
|
+
|
|
37
|
+
|Rule Name|Global class|Description|
|
|
38
|
+
|---|---|---|
|
|
39
|
+
|root|.SCEditEventButton-root|Styles applied to the root element.|
|
|
40
|
+
|
|
41
|
+
* @param inProps
|
|
42
|
+
*/
|
|
43
|
+
export default function EditEventButton(inProps: EditEventButtonProps): JSX.Element;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const react_1 = tslib_1.__importDefault(require("react"));
|
|
5
|
+
const system_1 = require("@mui/system");
|
|
6
|
+
const styles_1 = require("@mui/material/styles");
|
|
7
|
+
const react_intl_1 = require("react-intl");
|
|
8
|
+
const react_core_1 = require("@selfcommunity/react-core");
|
|
9
|
+
const classnames_1 = tslib_1.__importDefault(require("classnames"));
|
|
10
|
+
const CreateEventButton_1 = tslib_1.__importDefault(require("../CreateEventButton"));
|
|
11
|
+
const PREFIX = 'SCEditEventButton';
|
|
12
|
+
const classes = {
|
|
13
|
+
root: `${PREFIX}-root`
|
|
14
|
+
};
|
|
15
|
+
const Root = (0, styles_1.styled)(CreateEventButton_1.default, {
|
|
16
|
+
name: PREFIX,
|
|
17
|
+
slot: 'Root',
|
|
18
|
+
overridesResolver: (props, styles) => styles.root
|
|
19
|
+
})(({ theme }) => ({}));
|
|
20
|
+
/**
|
|
21
|
+
*> API documentation for the Community-JS Create Event Button component. Learn about the available props and the CSS API.
|
|
22
|
+
*
|
|
23
|
+
#### Import
|
|
24
|
+
```jsx
|
|
25
|
+
import {CreateEventButton} from '@selfcommunity/react-ui';
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
#### Component Name
|
|
29
|
+
The name `SCEditEventButton` can be used when providing style overrides in the theme.
|
|
30
|
+
|
|
31
|
+
#### CSS
|
|
32
|
+
|
|
33
|
+
|Rule Name|Global class|Description|
|
|
34
|
+
|---|---|---|
|
|
35
|
+
|root|.SCEditEventButton-root|Styles applied to the root element.|
|
|
36
|
+
|
|
37
|
+
* @param inProps
|
|
38
|
+
*/
|
|
39
|
+
function EditEventButton(inProps) {
|
|
40
|
+
//PROPS
|
|
41
|
+
const props = (0, system_1.useThemeProps)({
|
|
42
|
+
props: inProps,
|
|
43
|
+
name: PREFIX
|
|
44
|
+
});
|
|
45
|
+
const { className, eventId, event, onEditSuccess } = props, rest = tslib_1.__rest(props, ["className", "eventId", "event", "onEditSuccess"]);
|
|
46
|
+
const { scEvent, setSCEvent } = (0, react_core_1.useSCFetchEvent)({ id: eventId, event });
|
|
47
|
+
const scUserContext = (0, react_core_1.useSCUser)();
|
|
48
|
+
const handleSuccess = (data) => {
|
|
49
|
+
setSCEvent(data);
|
|
50
|
+
onEditSuccess && onEditSuccess(data);
|
|
51
|
+
};
|
|
52
|
+
if (!scUserContext.user) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Renders root object
|
|
57
|
+
*/
|
|
58
|
+
return (react_1.default.createElement(Root, Object.assign({ variant: "outlined", className: (0, classnames_1.default)(classes.root, className), EventFormProps: { event: scEvent, onSuccess: handleSuccess } }, rest),
|
|
59
|
+
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.editEventButton", defaultMessage: "ui.editEventButton" })));
|
|
60
|
+
}
|
|
61
|
+
exports.default = EditEventButton;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { SCEventLocationType } from '@selfcommunity/types';
|
|
1
|
+
import { SCEventLocationType, SCEventType } from '@selfcommunity/types';
|
|
2
2
|
export interface EventAddressProps {
|
|
3
|
+
event?: SCEventType;
|
|
3
4
|
forwardGeolocationData: (data: {
|
|
4
5
|
location: SCEventLocationType;
|
|
5
6
|
geolocation?: string;
|
|
@@ -40,10 +40,10 @@ function EventAddress(inProps) {
|
|
|
40
40
|
// INTL
|
|
41
41
|
const intl = (0, react_intl_1.useIntl)();
|
|
42
42
|
// PROPS
|
|
43
|
-
const { className, forwardGeolocationData } = props;
|
|
43
|
+
const { className, forwardGeolocationData, event } = props;
|
|
44
44
|
// STATE
|
|
45
|
-
const [location, setLocation] = (0, react_1.useState)(types_1.SCEventLocationType.PERSON);
|
|
46
|
-
const [geolocation, setGeoLocation] = (0, react_1.useState)(null);
|
|
45
|
+
const [location, setLocation] = (0, react_1.useState)(event ? event.location : types_1.SCEventLocationType.PERSON);
|
|
46
|
+
const [geolocation, setGeoLocation] = (0, react_1.useState)(event ? event.geolocation : null);
|
|
47
47
|
const [inputValue, setInputValue] = (0, react_1.useState)('');
|
|
48
48
|
const [suggestions, setSuggestions] = (0, react_1.useState)([]);
|
|
49
49
|
const [timeoutId, setTimeoutId] = (0, react_1.useState)(null);
|
|
@@ -118,7 +118,7 @@ function EventAddress(inProps) {
|
|
|
118
118
|
react_1.default.createElement(material_1.Tab, { value: types_1.SCEventLocationType.PERSON, classes: { root: classes.tab }, icon: react_1.default.createElement(Icon_1.default, null, "add_location_alt"), iconPosition: "start", label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.address.live.label", defaultMessage: "ui.eventForm.address.live.label" }) }),
|
|
119
119
|
react_1.default.createElement(material_1.Tab, { value: types_1.SCEventLocationType.ONLINE, classes: { root: classes.tab }, icon: react_1.default.createElement(Icon_1.default, null, "play_circle_outline"), iconPosition: "start", label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.address.online.label", defaultMessage: "ui.eventForm.address.online.label" }) })),
|
|
120
120
|
react_1.default.createElement(material_1.Box, { className: classes.tabContent },
|
|
121
|
-
location === types_1.SCEventLocationType.PERSON && (react_1.default.createElement(material_1.Autocomplete, { freeSolo: true, size: "small", value: geolocation, onChange: handleSelection, inputValue: inputValue, onInputChange: handleLocationChange, options: suggestions, getOptionLabel: (option) => option.description, noOptionsText: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.address.live.noResults", defaultMessage: "ui.eventForm.address.live.noResults" }), renderInput: (params) => (react_1.default.createElement(material_1.TextField, Object.assign({}, params, { label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.address.live.placeholder", defaultMessage: "ui.eventForm.address.live.placeholder" }), variant: "outlined", fullWidth: true, InputProps: Object.assign(Object.assign({}, params.InputProps), { endAdornment: (react_1.default.createElement(react_1.default.Fragment, null,
|
|
121
|
+
location === types_1.SCEventLocationType.PERSON && (react_1.default.createElement(material_1.Autocomplete, { freeSolo: true, size: "small", value: geolocation, onChange: handleSelection, inputValue: inputValue, onInputChange: handleLocationChange, options: suggestions, getOptionLabel: (option) => option.description || geolocation, noOptionsText: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.address.live.noResults", defaultMessage: "ui.eventForm.address.live.noResults" }), renderInput: (params) => (react_1.default.createElement(material_1.TextField, Object.assign({}, params, { label: react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.address.live.placeholder", defaultMessage: "ui.eventForm.address.live.placeholder" }), variant: "outlined", fullWidth: true, InputProps: Object.assign(Object.assign({}, params.InputProps), { endAdornment: (react_1.default.createElement(react_1.default.Fragment, null,
|
|
122
122
|
react_1.default.createElement(material_1.InputAdornment, { position: "start" },
|
|
123
123
|
react_1.default.createElement(Icon_1.default, null, "add_location_alt")),
|
|
124
124
|
params.InputProps.endAdornment)) }) }))) })),
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BaseDialogProps } from '../../shared/BaseDialog';
|
|
2
|
+
import { SCEventType } from '@selfcommunity/types';
|
|
2
3
|
export interface EventFormProps extends BaseDialogProps {
|
|
3
4
|
/**
|
|
4
5
|
* Overrides or extends the styles applied to the component.
|
|
@@ -15,6 +16,11 @@ export interface EventFormProps extends BaseDialogProps {
|
|
|
15
16
|
* @default null
|
|
16
17
|
*/
|
|
17
18
|
onClose?: () => void;
|
|
19
|
+
/**
|
|
20
|
+
* Event Object
|
|
21
|
+
* @default null
|
|
22
|
+
*/
|
|
23
|
+
event?: SCEventType;
|
|
18
24
|
/**
|
|
19
25
|
* On success callback function
|
|
20
26
|
* @default null
|
|
@@ -22,6 +22,8 @@ const AdapterDateFns_1 = require("@mui/x-date-pickers/AdapterDateFns");
|
|
|
22
22
|
const EventAddress_1 = tslib_1.__importDefault(require("./EventAddress"));
|
|
23
23
|
const it_1 = tslib_1.__importDefault(require("date-fns/locale/it"));
|
|
24
24
|
const en_US_1 = tslib_1.__importDefault(require("date-fns/locale/en-US"));
|
|
25
|
+
const PubSub_1 = require("../../constants/PubSub");
|
|
26
|
+
const pubsub_js_1 = tslib_1.__importDefault(require("pubsub-js"));
|
|
25
27
|
const messages = (0, react_intl_1.defineMessages)({
|
|
26
28
|
name: {
|
|
27
29
|
id: 'ui.eventForm.name.placeholder',
|
|
@@ -110,35 +112,35 @@ const Root = (0, styles_1.styled)(BaseDialog_1.default, {
|
|
|
110
112
|
* @param inProps
|
|
111
113
|
*/
|
|
112
114
|
function EventForm(inProps) {
|
|
113
|
-
var _a, _b, _c, _d, _e;
|
|
115
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
114
116
|
//PROPS
|
|
115
117
|
const props = (0, system_1.useThemeProps)({
|
|
116
118
|
props: inProps,
|
|
117
119
|
name: constants_1.PREFIX
|
|
118
120
|
});
|
|
119
|
-
const { className, open = true, onClose, onSuccess } = props, rest = tslib_1.__rest(props, ["className", "open", "onClose", "onSuccess"]);
|
|
121
|
+
const { className, open = true, onClose, onSuccess, event = null } = props, rest = tslib_1.__rest(props, ["className", "open", "onClose", "onSuccess", "event"]);
|
|
120
122
|
// CONTEXT
|
|
121
123
|
const scContext = (0, react_core_1.useSCContext)();
|
|
122
124
|
// INTL
|
|
123
125
|
const intl = (0, react_intl_1.useIntl)();
|
|
124
126
|
const initialFieldState = {
|
|
125
|
-
imageOriginal: '',
|
|
127
|
+
imageOriginal: event ? event.image_bigger : '',
|
|
126
128
|
imageOriginalFile: '',
|
|
127
|
-
startDate: null,
|
|
128
|
-
startTime: null,
|
|
129
|
-
endDate: null,
|
|
130
|
-
endTime: null,
|
|
131
|
-
location: types_1.SCEventLocationType.PERSON,
|
|
132
|
-
geolocation: '',
|
|
133
|
-
lat: null,
|
|
134
|
-
lng: null,
|
|
135
|
-
link: '',
|
|
136
|
-
recurring: types_1.SCEventRecurrenceType.NEVER,
|
|
137
|
-
name: '',
|
|
138
|
-
description: '',
|
|
139
|
-
isPublic: true,
|
|
129
|
+
startDate: event ? new Date(event.start_date) : null,
|
|
130
|
+
startTime: event ? new Date(event.start_date) : null,
|
|
131
|
+
endDate: event && event.end_date ? new Date(event.end_date) : null,
|
|
132
|
+
endTime: event && event.end_date ? new Date(event.end_date) : null,
|
|
133
|
+
location: event ? event.location : types_1.SCEventLocationType.PERSON,
|
|
134
|
+
geolocation: event ? event.geolocation : '',
|
|
135
|
+
lat: event ? event.geolocation_lat : null,
|
|
136
|
+
lng: event ? event.geolocation_lng : null,
|
|
137
|
+
link: event ? event.link : '',
|
|
138
|
+
recurring: event ? event.recurring : types_1.SCEventRecurrenceType.NEVER,
|
|
139
|
+
name: event ? event.name : '',
|
|
140
|
+
description: event ? event.description : '',
|
|
141
|
+
isPublic: (_a = (event && event.privacy === types_1.SCEventPrivacyType.PUBLIC)) !== null && _a !== void 0 ? _a : true,
|
|
140
142
|
isSubmitting: false,
|
|
141
|
-
showEndDateTime: false
|
|
143
|
+
showEndDateTime: (_b = (event && event.end_date)) !== null && _b !== void 0 ? _b : false
|
|
142
144
|
};
|
|
143
145
|
// STATE
|
|
144
146
|
const [field, setField] = (0, react_1.useState)(initialFieldState);
|
|
@@ -173,6 +175,22 @@ function EventForm(inProps) {
|
|
|
173
175
|
setError(error);
|
|
174
176
|
}
|
|
175
177
|
}
|
|
178
|
+
/**
|
|
179
|
+
* Notify when a group info changed
|
|
180
|
+
* @param data
|
|
181
|
+
*/
|
|
182
|
+
function notifyChanges(data) {
|
|
183
|
+
if (data) {
|
|
184
|
+
if (event) {
|
|
185
|
+
// Edit group
|
|
186
|
+
pubsub_js_1.default.publish(`${PubSub_1.SCTopicType.EVENT}.${PubSub_1.SCGroupEventType.EDIT}`, data);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// Create group
|
|
190
|
+
pubsub_js_1.default.publish(`${PubSub_1.SCTopicType.EVENT}.${PubSub_1.SCGroupEventType.CREATE}`, data);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
176
194
|
const handleGeoData = (data) => {
|
|
177
195
|
setField((prev) => (Object.assign(Object.assign({}, prev), data)));
|
|
178
196
|
};
|
|
@@ -204,9 +222,17 @@ function EventForm(inProps) {
|
|
|
204
222
|
formData.append('visible', true);
|
|
205
223
|
}
|
|
206
224
|
formData.append('description', field.description);
|
|
207
|
-
|
|
225
|
+
let eventService;
|
|
226
|
+
if (event) {
|
|
227
|
+
eventService = api_services_1.EventService.updateEvent(event.id, formData, { headers: { 'Content-Type': 'multipart/form-data' } });
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
eventService = api_services_1.EventService.createEvent(formData, { headers: { 'Content-Type': 'multipart/form-data' } });
|
|
231
|
+
}
|
|
232
|
+
eventService
|
|
208
233
|
.then((data) => {
|
|
209
234
|
onSuccess && onSuccess(data);
|
|
235
|
+
notifyChanges(data);
|
|
210
236
|
onClose && onClose();
|
|
211
237
|
setField((prev) => (Object.assign(Object.assign({}, prev), { ['isSubmitting']: false })));
|
|
212
238
|
})
|
|
@@ -242,21 +268,21 @@ function EventForm(inProps) {
|
|
|
242
268
|
/**
|
|
243
269
|
* Renders root object
|
|
244
270
|
*/
|
|
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 ||
|
|
271
|
+
return (react_1.default.createElement(Root, Object.assign({ DialogContentProps: { dividers: false }, title: event ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.title.edit", defaultMessage: "ui.eventForm.title.edit" })) : (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 ||
|
|
246
272
|
(!field.startDate && !field.startTime) ||
|
|
247
273
|
(field.location === types_1.SCEventLocationType.ONLINE && !field.link) ||
|
|
248
274
|
(field.location === types_1.SCEventLocationType.PERSON && !field.geolocation) ||
|
|
249
275
|
(field.recurring !== types_1.SCEventRecurrenceType.NEVER && !field.endDate && !field.endTime) ||
|
|
250
276
|
Object.keys(error).length !== 0 ||
|
|
251
277
|
field.name.length > Event_1.EVENT_TITLE_MAX_LENGTH ||
|
|
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),
|
|
278
|
+
field.description.length > Event_1.EVENT_DESCRIPTION_MAX_LENGTH, variant: "contained", onClick: handleSubmit, color: "secondary" }, event ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.button.edit", defaultMessage: "ui.eventForm.button.edit" })) : (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.button.create", defaultMessage: "ui.eventForm.button.create" }))) }, rest),
|
|
253
279
|
react_1.default.createElement(react_1.default.Fragment, null,
|
|
254
280
|
react_1.default.createElement(material_1.Paper, { style: _backgroundCover, classes: { root: classes.cover } },
|
|
255
|
-
react_1.default.createElement(UploadEventCover_1.default, { onChange: handleChangeCover })),
|
|
281
|
+
react_1.default.createElement(UploadEventCover_1.default, { isCreationMode: true, onChange: handleChangeCover })),
|
|
256
282
|
react_1.default.createElement(material_1.FormGroup, { className: classes.form },
|
|
257
283
|
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: {
|
|
258
284
|
endAdornment: react_1.default.createElement(material_1.Typography, { variant: "body2" }, Event_1.EVENT_TITLE_MAX_LENGTH - field.name.length)
|
|
259
|
-
}, error: Boolean(((
|
|
285
|
+
}, error: Boolean(((_c = field === null || field === void 0 ? void 0 : field.name) === null || _c === void 0 ? void 0 : _c.length) > Event_1.EVENT_TITLE_MAX_LENGTH) || Boolean(error[`nameError`]), helperText: ((_d = field === null || field === void 0 ? void 0 : field.name) === null || _d === void 0 ? void 0 : _d.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 }),
|
|
260
286
|
react_1.default.createElement(material_1.Box, { className: classes.dateTime },
|
|
261
287
|
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 },
|
|
262
288
|
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: {
|
|
@@ -306,7 +332,7 @@ function EventForm(inProps) {
|
|
|
306
332
|
}, onChange: (value) => handleChangeDateTime(value, 'endTime') })))),
|
|
307
333
|
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 },
|
|
308
334
|
react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.dateTime.placeholder", defaultMessage: "ui.eventForm.dateTime.placeholder", values: { symbol: field.showEndDateTime ? '-' : '+' } })),
|
|
309
|
-
react_1.default.createElement(EventAddress_1.default, { forwardGeolocationData: handleGeoData }),
|
|
335
|
+
react_1.default.createElement(EventAddress_1.default, { forwardGeolocationData: handleGeoData, event: event !== null && event !== void 0 ? event : null }),
|
|
310
336
|
privateEnabled && (react_1.default.createElement(material_1.Box, { className: classes.privacySection },
|
|
311
337
|
react_1.default.createElement(material_1.Stack, { direction: "row", spacing: 1, alignItems: "center", justifyContent: "center" },
|
|
312
338
|
react_1.default.createElement(material_1.Typography, { className: (0, classnames_1.default)(classes.switchLabel, { [classes.active]: !field.isPublic }) },
|
|
@@ -330,7 +356,7 @@ function EventForm(inProps) {
|
|
|
330
356
|
b: (chunks) => react_1.default.createElement("strong", null, chunks)
|
|
331
357
|
} }))))))),
|
|
332
358
|
react_1.default.createElement(material_1.TextField, { multiline: true, className: classes.description, placeholder: `${intl.formatMessage(messages.description)}`, margin: "normal", value: field.description, name: "description", onChange: handleChange, InputProps: {
|
|
333
|
-
endAdornment: (react_1.default.createElement(material_1.Typography, { variant: "body2" }, ((
|
|
334
|
-
}, error: Boolean(((
|
|
359
|
+
endAdornment: (react_1.default.createElement(material_1.Typography, { variant: "body2" }, ((_e = field.description) === null || _e === void 0 ? void 0 : _e.length) ? Event_1.EVENT_DESCRIPTION_MAX_LENGTH - field.description.length : Event_1.EVENT_DESCRIPTION_MAX_LENGTH))
|
|
360
|
+
}, error: Boolean(((_f = field.description) === null || _f === void 0 ? void 0 : _f.length) > Event_1.EVENT_DESCRIPTION_MAX_LENGTH), helperText: ((_g = field.description) === null || _g === void 0 ? void 0 : _g.length) > Event_1.EVENT_DESCRIPTION_MAX_LENGTH ? (react_1.default.createElement(react_intl_1.FormattedMessage, { id: "ui.eventForm.description.error.maxLength", defaultMessage: "ui.eventForm.description.error.maxLength" })) : null })))));
|
|
335
361
|
}
|
|
336
362
|
exports.default = EventForm;
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
export interface UploadEventCoverProps {
|
|
2
|
+
/**
|
|
3
|
+
* Id of the event. It is optional only for event creation modal.
|
|
4
|
+
* @default null
|
|
5
|
+
*/
|
|
6
|
+
eventId?: number;
|
|
2
7
|
/**
|
|
3
8
|
* On change function.
|
|
4
9
|
* @default null
|
|
@@ -9,6 +14,11 @@ export interface UploadEventCoverProps {
|
|
|
9
14
|
* @default null
|
|
10
15
|
*/
|
|
11
16
|
className?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Prop to handle cover loading in the create event modal.
|
|
19
|
+
* @default false
|
|
20
|
+
*/
|
|
21
|
+
isCreationMode?: boolean;
|
|
12
22
|
/**
|
|
13
23
|
* Any other properties
|
|
14
24
|
*/
|
|
@@ -10,6 +10,16 @@ const classnames_1 = tslib_1.__importDefault(require("classnames"));
|
|
|
10
10
|
const system_1 = require("@mui/system");
|
|
11
11
|
const constants_1 = require("./constants");
|
|
12
12
|
const lab_1 = require("@mui/lab");
|
|
13
|
+
const Errors_1 = require("../../constants/Errors");
|
|
14
|
+
const api_services_1 = require("@selfcommunity/api-services");
|
|
15
|
+
const utils_1 = require("@selfcommunity/utils");
|
|
16
|
+
const react_intl_1 = require("react-intl");
|
|
17
|
+
const messages = (0, react_intl_1.defineMessages)({
|
|
18
|
+
errorLoadImage: {
|
|
19
|
+
id: 'ui.changeGroupCover.button.change.alertErrorImage',
|
|
20
|
+
defaultMessage: 'ui.changeGroupCover.button.change.alertErrorImage'
|
|
21
|
+
}
|
|
22
|
+
});
|
|
13
23
|
const classes = {
|
|
14
24
|
root: `${constants_1.PREFIX}-upload-event-cover-root`
|
|
15
25
|
};
|
|
@@ -46,13 +56,15 @@ function UploadEventCover(inProps) {
|
|
|
46
56
|
props: inProps,
|
|
47
57
|
name: constants_1.PREFIX
|
|
48
58
|
});
|
|
49
|
-
const { onChange, className = false } = props, rest = tslib_1.__rest(props, ["onChange", "className"]);
|
|
59
|
+
const { eventId, onChange, className = false, isCreationMode = false } = props, rest = tslib_1.__rest(props, ["eventId", "onChange", "className", "isCreationMode"]);
|
|
50
60
|
//CONTEXT
|
|
51
61
|
const scUserContext = (0, react_1.useContext)(react_core_1.SCUserContext);
|
|
52
62
|
//STATE
|
|
53
63
|
let fileInput = (0, react_1.useRef)(null);
|
|
54
64
|
const [loading, setLoading] = (0, react_1.useState)(false);
|
|
55
65
|
const [alert, setAlert] = (0, react_1.useState)(null);
|
|
66
|
+
// INTL
|
|
67
|
+
const intl = (0, react_intl_1.useIntl)();
|
|
56
68
|
// Anonymous
|
|
57
69
|
if (!scUserContext.user) {
|
|
58
70
|
return null;
|
|
@@ -68,12 +80,7 @@ function UploadEventCover(inProps) {
|
|
|
68
80
|
reader.onload = (e) => {
|
|
69
81
|
const img = new Image();
|
|
70
82
|
img.onload = () => {
|
|
71
|
-
onChange && onChange(fileInput);
|
|
72
|
-
// if (img.width < 1920) {
|
|
73
|
-
// setAlert(intl.formatMessage(messages.errorImageSize));
|
|
74
|
-
// } else {
|
|
75
|
-
// isCreationMode ? onChange && onChange(fileInput) : handleSave();
|
|
76
|
-
// }
|
|
83
|
+
isCreationMode ? onChange && onChange(fileInput) : handleSave();
|
|
77
84
|
};
|
|
78
85
|
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
|
|
79
86
|
// @ts-ignore
|
|
@@ -84,6 +91,26 @@ function UploadEventCover(inProps) {
|
|
|
84
91
|
reader.readAsDataURL(fileInput);
|
|
85
92
|
}
|
|
86
93
|
};
|
|
94
|
+
/**
|
|
95
|
+
* Handles cover saving after upload action
|
|
96
|
+
*/
|
|
97
|
+
function handleSave() {
|
|
98
|
+
setLoading(true);
|
|
99
|
+
const formData = new FormData();
|
|
100
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
|
|
101
|
+
// @ts-ignore
|
|
102
|
+
formData.append('image_original', fileInput);
|
|
103
|
+
api_services_1.EventService.changeEventCover(eventId, formData, { headers: { 'Content-Type': 'multipart/form-data' } })
|
|
104
|
+
.then((data) => {
|
|
105
|
+
onChange && onChange(data.image_medium);
|
|
106
|
+
setLoading(false);
|
|
107
|
+
})
|
|
108
|
+
.catch((error) => {
|
|
109
|
+
utils_1.Logger.error(Errors_1.SCOPE_SC_UI, error);
|
|
110
|
+
setLoading(false);
|
|
111
|
+
setAlert(intl.formatMessage(messages.errorLoadImage));
|
|
112
|
+
});
|
|
113
|
+
}
|
|
87
114
|
/**
|
|
88
115
|
* If there is an error
|
|
89
116
|
*/
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { SCEventType } from '@selfcommunity/types';
|
|
2
|
+
import { EventSubscribeButtonProps } from '../EventSubscribeButton';
|
|
3
|
+
export interface EventHeaderProps {
|
|
4
|
+
/**
|
|
5
|
+
* Id of event object
|
|
6
|
+
* @default null
|
|
7
|
+
*/
|
|
8
|
+
id?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Overrides or extends the styles applied to the component.
|
|
11
|
+
* @default null
|
|
12
|
+
*/
|
|
13
|
+
className?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Event Object
|
|
16
|
+
* @default null
|
|
17
|
+
*/
|
|
18
|
+
event?: SCEventType;
|
|
19
|
+
/**
|
|
20
|
+
* Id of the event
|
|
21
|
+
* @default null
|
|
22
|
+
*/
|
|
23
|
+
eventId?: number;
|
|
24
|
+
/**
|
|
25
|
+
* Props to spread event button followed
|
|
26
|
+
* @default {}
|
|
27
|
+
*/
|
|
28
|
+
EventSubscribeButtonProps?: EventSubscribeButtonProps;
|
|
29
|
+
/**
|
|
30
|
+
* Any other properties
|
|
31
|
+
*/
|
|
32
|
+
[p: string]: any;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* > API documentation for the Community-JS Event Header component. Learn about the available props and the CSS API.
|
|
36
|
+
*
|
|
37
|
+
*
|
|
38
|
+
* This component renders the events top section.
|
|
39
|
+
|
|
40
|
+
#### Import
|
|
41
|
+
|
|
42
|
+
```jsx
|
|
43
|
+
import {UserProfileHeader} from '@selfcommunity/react-ui';
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
#### Component Name
|
|
47
|
+
|
|
48
|
+
The name `SCEventHeader` can be used when providing style overrides in the theme.
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
#### CSS
|
|
52
|
+
|
|
53
|
+
|Rule Name|Global class|Description|
|
|
54
|
+
|---|---|---|
|
|
55
|
+
|root|.SCEventHeader-root|Styles applied to the root element.|
|
|
56
|
+
|cover|.SCEventHeader-cover|Styles applied to the cover element.|
|
|
57
|
+
|time|.SCEventHeader-time|Styles applied to the time element.|
|
|
58
|
+
|calendar|.SCEventHeader-calendar|Styles applied to the calendar element.|
|
|
59
|
+
|info|SCEventHeader-info|Styles applied to the info section.|
|
|
60
|
+
|name|SCEventHeader-username|Styles applied to the username element.|
|
|
61
|
+
|visibility|SCEventHeader-visibility|Styles applied to the visibility section.|
|
|
62
|
+
|visibilityItem|SCEventHeader-visibility-item|Styles applied to the visibility element.|
|
|
63
|
+
|multiActions|SCEventHeader-multi-action|Styles applied to the multi actions section.|
|
|
64
|
+
|
|
65
|
+
* @param inProps
|
|
66
|
+
*/
|
|
67
|
+
export default function EventHeader(inProps: EventHeaderProps): JSX.Element;
|