all repos — caroster @ 82a6b00ced5640055e8caff7e67636e5746cc112

[Octree] Group carpool to your event https://caroster.io

feat: ✨ Add description field to event

#234
Simon Mulquin simon@octree.ch
Tue, 01 Feb 2022 13:55:02 +0000
commit

82a6b00ced5640055e8caff7e67636e5746cc112

parent

124dfa21a7100f628775f5a0f49841048f8584ea

M backend/api/event/models/event.settings.jsonbackend/api/event/models/event.settings.json

@@ -49,6 +49,10 @@ },

"travels": { "via": "event", "collection": "travel" + }, + "description": { + "type": "text", + "maxLength": 250 } } }
M backend/api/event/services/event.jsbackend/api/event/services/event.js

@@ -7,6 +7,7 @@ const PUBLIC_FIELDS = [

'id', 'uuid', 'name', + 'description', 'email', 'id', 'date',
M backend/api/travel/models/travel.settings.jsonbackend/api/travel/models/travel.settings.json

@@ -26,8 +26,8 @@ "repeatable": true,

"component": "passenger.passenger" }, "event": { - "model": "event", - "via": "travels" + "via": "travels", + "model": "event" }, "vehicle": { "via": "travels",
M frontend/containers/CreateEvent/Step2.jsfrontend/containers/CreateEvent/Step2.tsx

@@ -18,6 +18,7 @@

// States const [date, setDate] = useState(null); const [address, setAddress] = useState(event.address ?? ''); + const [description, setDescription] = useState(event.description ?? ''); const [loading, setLoading] = useState(false); const onCreate = async evt => {

@@ -27,6 +28,7 @@ setLoading(true);

const eventData = { date: !date ? null : moment(date).format('YYYY-MM-DD'), address, + description, }; addToEvent(eventData); const result = await createEvent(eventData);

@@ -61,6 +63,22 @@ onChange={e => setAddress(e.target.value)}

name="address" id="NewEventAddress" /> + <TextField + label={t('event.creation.description')} + fullWidth + multiline + rowsMax={4} + inputProps={{maxLength: 250}} + helperText={ + description.length === 0 + ? t('event.creation.description_helper') + : `${description.length}/250` + } + value={description} + onChange={e => setDescription(e.target.value)} + name="address" + id="NewEventDescription" + /> <Button disabled={loading} className={classes.button}

@@ -71,11 +89,7 @@ type="submit"

id="NewEventSubmit" > {loading ? ( - <CircularProgress - className={classes.loader} - size={20} - color="primary" - /> + <CircularProgress size={20} color="primary" /> ) : ( t('generic.create') )}
M frontend/containers/EventDetails/index.jsfrontend/containers/EventDetails/index.js

@@ -98,6 +98,27 @@ )}

</Typography> )} </div> + <div className={classes.section}> + <Typography variant="h6">{t('event.fields.description')}</Typography> + {isEditing ? ( + <TextField + fullWidth + multiline + rowsMax={4} + inputProps={{maxLength: 250}} + helperText={`${event.description.length}/250`} + defaultValue={event.description} + value={event.description} + onChange={e => setEventUpdate({description: e.target.value})} + id={`${idPrefix}Description`} + name="description" + /> + ) : ( + <Typography variant="body1" id={`${idPrefix}Description`}> + {event.description ?? t('event.fields.empty')} + </Typography> + )} + </div> <Typography variant="h6">{t('event.fields.link')}</Typography> <Typography>{t('event.fields.link_desc')}</Typography> <TextField
M frontend/generated/graphql.tsxfrontend/generated/graphql.tsx

@@ -46,7 +46,6 @@ phone_number?: Maybe<Scalars['String']>;

details?: Maybe<Scalars['String']>; event?: Maybe<Event>; passengers?: Maybe<Array<Maybe<ComponentPassengerPassenger>>>; - user?: Maybe<UsersPermissionsUser>; }; export type CarAggregator = {

@@ -146,12 +145,6 @@ key?: Maybe<Scalars['DateTime']>;

connection?: Maybe<CarConnection>; }; -export type CarConnectionUser = { - __typename?: 'CarConnectionUser'; - key?: Maybe<Scalars['ID']>; - connection?: Maybe<CarConnection>; -}; - export type CarGroupBy = { __typename?: 'CarGroupBy'; id?: Maybe<Array<Maybe<CarConnectionId>>>;

@@ -164,7 +157,6 @@ departure?: Maybe<Array<Maybe<CarConnectionDeparture>>>;

phone_number?: Maybe<Array<Maybe<CarConnectionPhone_Number>>>; details?: Maybe<Array<Maybe<CarConnectionDetails>>>; event?: Maybe<Array<Maybe<CarConnectionEvent>>>; - user?: Maybe<Array<Maybe<CarConnectionUser>>>; }; export type CarInput = {

@@ -176,7 +168,6 @@ phone_number?: Maybe<Scalars['String']>;

details?: Maybe<Scalars['String']>; event?: Maybe<Scalars['ID']>; passengers?: Maybe<Array<Maybe<ComponentPassengerPassengerInput>>>; - user?: Maybe<Scalars['ID']>; created_by?: Maybe<Scalars['ID']>; updated_by?: Maybe<Scalars['ID']>; };

@@ -254,6 +245,7 @@ address?: Maybe<Scalars['String']>;

position?: Maybe<Scalars['JSON']>; uuid?: Maybe<Scalars['String']>; waitingList?: Maybe<Array<Maybe<ComponentPassengerPassenger>>>; + description?: Maybe<Scalars['String']>; cars?: Maybe<Array<Maybe<Car>>>; users?: Maybe<Array<Maybe<UsersPermissionsUser>>>; travels?: Maybe<Array<Maybe<Travel>>>;

@@ -314,6 +306,12 @@ key?: Maybe<Scalars['ID']>;

connection?: Maybe<EventConnection>; }; +export type EventConnectionDescription = { + __typename?: 'EventConnectionDescription'; + key?: Maybe<Scalars['String']>; + connection?: Maybe<EventConnection>; +}; + export type EventConnectionEmail = { __typename?: 'EventConnectionEmail'; key?: Maybe<Scalars['String']>;

@@ -361,6 +359,7 @@ date?: Maybe<Array<Maybe<EventConnectionDate>>>;

address?: Maybe<Array<Maybe<EventConnectionAddress>>>; position?: Maybe<Array<Maybe<EventConnectionPosition>>>; uuid?: Maybe<Array<Maybe<EventConnectionUuid>>>; + description?: Maybe<Array<Maybe<EventConnectionDescription>>>; }; export type EventInput = {

@@ -374,6 +373,7 @@ users?: Maybe<Array<Maybe<Scalars['ID']>>>;

uuid?: Maybe<Scalars['String']>; waitingList?: Maybe<Array<Maybe<ComponentPassengerPassengerInput>>>; travels?: Maybe<Array<Maybe<Scalars['ID']>>>; + description?: Maybe<Scalars['String']>; created_by?: Maybe<Scalars['ID']>; updated_by?: Maybe<Scalars['ID']>; newsletter?: Maybe<Scalars['Boolean']>;

@@ -433,7 +433,7 @@ };

-export type Morph = Dependency | Info | UsersPermissionsMe | UsersPermissionsMeRole | UsersPermissionsLoginPayload | UserPermissionsPasswordPayload | Car | CarConnection | CarAggregator | CarAggregatorSum | CarAggregatorAvg | CarAggregatorMin | CarAggregatorMax | CarGroupBy | CarConnectionId | CarConnectionCreated_At | CarConnectionUpdated_At | CarConnectionName | CarConnectionSeats | CarConnectionMeeting | CarConnectionDeparture | CarConnectionPhone_Number | CarConnectionDetails | CarConnectionEvent | CarConnectionUser | CreateCarPayload | UpdateCarPayload | DeleteCarPayload | Event | EventConnection | EventAggregator | EventGroupBy | EventConnectionId | EventConnectionCreated_At | EventConnectionUpdated_At | EventConnectionName | EventConnectionEmail | EventConnectionDate | EventConnectionAddress | EventConnectionPosition | EventConnectionUuid | CreateEventPayload | UpdateEventPayload | DeleteEventPayload | Page | PageConnection | PageAggregator | PageGroupBy | PageConnectionId | PageConnectionCreated_At | PageConnectionUpdated_At | PageConnectionName | PageConnectionContent | PageConnectionType | CreatePagePayload | UpdatePagePayload | DeletePagePayload | Settings | UpdateSettingPayload | DeleteSettingPayload | Travel | TravelConnection | TravelAggregator | TravelGroupBy | TravelConnectionId | TravelConnectionCreated_At | TravelConnectionUpdated_At | TravelConnectionMeeting | TravelConnectionDeparture | TravelConnectionDetails | TravelConnectionEvent | TravelConnectionVehicle | CreateTravelPayload | UpdateTravelPayload | DeleteTravelPayload | Vehicle | VehicleConnection | VehicleAggregator | VehicleAggregatorSum | VehicleAggregatorAvg | VehicleAggregatorMin | VehicleAggregatorMax | VehicleGroupBy | VehicleConnectionId | VehicleConnectionCreated_At | VehicleConnectionUpdated_At | VehicleConnectionName | VehicleConnectionSeats | VehicleConnectionUser | VehicleConnectionPhone_Number | CreateVehiclePayload | UpdateVehiclePayload | DeleteVehiclePayload | EmailDesignerEmailTemplate | UploadFile | UploadFileConnection | UploadFileAggregator | UploadFileAggregatorSum | UploadFileAggregatorAvg | UploadFileAggregatorMin | UploadFileAggregatorMax | UploadFileGroupBy | UploadFileConnectionId | UploadFileConnectionCreated_At | UploadFileConnectionUpdated_At | UploadFileConnectionName | UploadFileConnectionAlternativeText | UploadFileConnectionCaption | UploadFileConnectionWidth | UploadFileConnectionHeight | UploadFileConnectionFormats | UploadFileConnectionHash | UploadFileConnectionExt | UploadFileConnectionMime | UploadFileConnectionSize | UploadFileConnectionUrl | UploadFileConnectionPreviewUrl | UploadFileConnectionProvider | UploadFileConnectionProvider_Metadata | DeleteFilePayload | UsersPermissionsPermission | UsersPermissionsRole | UsersPermissionsRoleConnection | UsersPermissionsRoleAggregator | UsersPermissionsRoleGroupBy | UsersPermissionsRoleConnectionId | UsersPermissionsRoleConnectionName | UsersPermissionsRoleConnectionDescription | UsersPermissionsRoleConnectionType | CreateRolePayload | UpdateRolePayload | DeleteRolePayload | UsersPermissionsUser | UsersPermissionsUserConnection | UsersPermissionsUserAggregator | UsersPermissionsUserGroupBy | UsersPermissionsUserConnectionId | UsersPermissionsUserConnectionCreated_At | UsersPermissionsUserConnectionUpdated_At | UsersPermissionsUserConnectionUsername | UsersPermissionsUserConnectionFirstName | UsersPermissionsUserConnectionLastName | UsersPermissionsUserConnectionEmail | UsersPermissionsUserConnectionProvider | UsersPermissionsUserConnectionConfirmed | UsersPermissionsUserConnectionBlocked | UsersPermissionsUserConnectionRole | UsersPermissionsUserConnectionOnboardingUser | UsersPermissionsUserConnectionOnboardingCreator | UsersPermissionsUserConnectionLang | CreateUserPayload | UpdateUserPayload | DeleteUserPayload | ComponentPassengerPassenger; +export type Morph = Dependency | Info | UsersPermissionsMe | UsersPermissionsMeRole | UsersPermissionsLoginPayload | UserPermissionsPasswordPayload | Car | CarConnection | CarAggregator | CarAggregatorSum | CarAggregatorAvg | CarAggregatorMin | CarAggregatorMax | CarGroupBy | CarConnectionId | CarConnectionCreated_At | CarConnectionUpdated_At | CarConnectionName | CarConnectionSeats | CarConnectionMeeting | CarConnectionDeparture | CarConnectionPhone_Number | CarConnectionDetails | CarConnectionEvent | CreateCarPayload | UpdateCarPayload | DeleteCarPayload | Event | EventConnection | EventAggregator | EventGroupBy | EventConnectionId | EventConnectionCreated_At | EventConnectionUpdated_At | EventConnectionName | EventConnectionEmail | EventConnectionDate | EventConnectionAddress | EventConnectionPosition | EventConnectionUuid | EventConnectionDescription | CreateEventPayload | UpdateEventPayload | DeleteEventPayload | Page | PageConnection | PageAggregator | PageGroupBy | PageConnectionId | PageConnectionCreated_At | PageConnectionUpdated_At | PageConnectionName | PageConnectionContent | PageConnectionType | CreatePagePayload | UpdatePagePayload | DeletePagePayload | Settings | UpdateSettingPayload | DeleteSettingPayload | Travel | TravelConnection | TravelAggregator | TravelGroupBy | TravelConnectionId | TravelConnectionCreated_At | TravelConnectionUpdated_At | TravelConnectionMeeting | TravelConnectionDeparture | TravelConnectionDetails | TravelConnectionEvent | TravelConnectionVehicle | CreateTravelPayload | UpdateTravelPayload | DeleteTravelPayload | Vehicle | VehicleConnection | VehicleAggregator | VehicleAggregatorSum | VehicleAggregatorAvg | VehicleAggregatorMin | VehicleAggregatorMax | VehicleGroupBy | VehicleConnectionId | VehicleConnectionCreated_At | VehicleConnectionUpdated_At | VehicleConnectionName | VehicleConnectionSeats | VehicleConnectionPhone_Number | VehicleConnectionUser | CreateVehiclePayload | UpdateVehiclePayload | DeleteVehiclePayload | EmailDesignerEmailTemplate | UploadFile | UploadFileConnection | UploadFileAggregator | UploadFileAggregatorSum | UploadFileAggregatorAvg | UploadFileAggregatorMin | UploadFileAggregatorMax | UploadFileGroupBy | UploadFileConnectionId | UploadFileConnectionCreated_At | UploadFileConnectionUpdated_At | UploadFileConnectionName | UploadFileConnectionAlternativeText | UploadFileConnectionCaption | UploadFileConnectionWidth | UploadFileConnectionHeight | UploadFileConnectionFormats | UploadFileConnectionHash | UploadFileConnectionExt | UploadFileConnectionMime | UploadFileConnectionSize | UploadFileConnectionUrl | UploadFileConnectionPreviewUrl | UploadFileConnectionProvider | UploadFileConnectionProvider_Metadata | DeleteFilePayload | UsersPermissionsPermission | UsersPermissionsRole | UsersPermissionsRoleConnection | UsersPermissionsRoleAggregator | UsersPermissionsRoleGroupBy | UsersPermissionsRoleConnectionId | UsersPermissionsRoleConnectionName | UsersPermissionsRoleConnectionDescription | UsersPermissionsRoleConnectionType | CreateRolePayload | UpdateRolePayload | DeleteRolePayload | UsersPermissionsUser | UsersPermissionsUserConnection | UsersPermissionsUserAggregator | UsersPermissionsUserGroupBy | UsersPermissionsUserConnectionId | UsersPermissionsUserConnectionCreated_At | UsersPermissionsUserConnectionUpdated_At | UsersPermissionsUserConnectionUsername | UsersPermissionsUserConnectionFirstName | UsersPermissionsUserConnectionLastName | UsersPermissionsUserConnectionEmail | UsersPermissionsUserConnectionProvider | UsersPermissionsUserConnectionConfirmed | UsersPermissionsUserConnectionBlocked | UsersPermissionsUserConnectionRole | UsersPermissionsUserConnectionOnboardingUser | UsersPermissionsUserConnectionOnboardingCreator | UsersPermissionsUserConnectionLang | CreateUserPayload | UpdateUserPayload | DeleteUserPayload | ComponentPassengerPassenger; export type Mutation = { __typename?: 'Mutation';

@@ -1298,7 +1298,6 @@ events?: Maybe<Array<Maybe<Scalars['ID']>>>;

onboardingUser?: Maybe<Scalars['Boolean']>; onboardingCreator?: Maybe<Scalars['Boolean']>; lang?: Maybe<Enum_Userspermissionsuser_Lang>; - cars?: Maybe<Array<Maybe<Scalars['ID']>>>; vehicles?: Maybe<Array<Maybe<Scalars['ID']>>>; created_by?: Maybe<Scalars['ID']>; updated_by?: Maybe<Scalars['ID']>;

@@ -1448,7 +1447,6 @@ onboardingUser?: Maybe<Scalars['Boolean']>;

onboardingCreator?: Maybe<Scalars['Boolean']>; lang?: Maybe<Enum_Userspermissionsuser_Lang>; events?: Maybe<Array<Maybe<Event>>>; - cars?: Maybe<Array<Maybe<Car>>>; vehicles?: Maybe<Array<Maybe<Vehicle>>>; };

@@ -1461,14 +1459,6 @@ where?: Maybe<Scalars['JSON']>;

}; -export type UsersPermissionsUserCarsArgs = { - sort?: Maybe<Scalars['String']>; - limit?: Maybe<Scalars['Int']>; - start?: Maybe<Scalars['Int']>; - where?: Maybe<Scalars['JSON']>; -}; - - export type UsersPermissionsUserVehiclesArgs = { sort?: Maybe<Scalars['String']>; limit?: Maybe<Scalars['Int']>;

@@ -1598,8 +1588,8 @@ created_at: Scalars['DateTime'];

updated_at: Scalars['DateTime']; name: Scalars['String']; seats?: Maybe<Scalars['Int']>; - user?: Maybe<UsersPermissionsUser>; phone_number?: Maybe<Scalars['String']>; + user?: Maybe<UsersPermissionsUser>; travels?: Maybe<Array<Maybe<Travel>>>; };

@@ -1697,16 +1687,16 @@ created_at?: Maybe<Array<Maybe<VehicleConnectionCreated_At>>>;

updated_at?: Maybe<Array<Maybe<VehicleConnectionUpdated_At>>>; name?: Maybe<Array<Maybe<VehicleConnectionName>>>; seats?: Maybe<Array<Maybe<VehicleConnectionSeats>>>; - user?: Maybe<Array<Maybe<VehicleConnectionUser>>>; phone_number?: Maybe<Array<Maybe<VehicleConnectionPhone_Number>>>; + user?: Maybe<Array<Maybe<VehicleConnectionUser>>>; }; export type VehicleInput = { name: Scalars['String']; seats?: Maybe<Scalars['Int']>; - user?: Maybe<Scalars['ID']>; travels?: Maybe<Array<Maybe<Scalars['ID']>>>; phone_number?: Maybe<Scalars['String']>; + user?: Maybe<Scalars['ID']>; created_by?: Maybe<Scalars['ID']>; updated_by?: Maybe<Scalars['ID']>; };

@@ -1860,7 +1850,6 @@ phone_number?: Maybe<Scalars['String']>;

details?: Maybe<Scalars['String']>; event?: Maybe<Scalars['ID']>; passengers?: Maybe<Array<Maybe<EditComponentPassengerPassengerInput>>>; - user?: Maybe<Scalars['ID']>; created_by?: Maybe<Scalars['ID']>; updated_by?: Maybe<Scalars['ID']>; };

@@ -1897,6 +1886,7 @@ users?: Maybe<Array<Maybe<Scalars['ID']>>>;

uuid?: Maybe<Scalars['String']>; waitingList?: Maybe<Array<Maybe<EditComponentPassengerPassengerInput>>>; travels?: Maybe<Array<Maybe<Scalars['ID']>>>; + description?: Maybe<Scalars['String']>; created_by?: Maybe<Scalars['ID']>; updated_by?: Maybe<Scalars['ID']>; };

@@ -1973,7 +1963,6 @@ events?: Maybe<Array<Maybe<Scalars['ID']>>>;

onboardingUser?: Maybe<Scalars['Boolean']>; onboardingCreator?: Maybe<Scalars['Boolean']>; lang?: Maybe<Enum_Userspermissionsuser_Lang>; - cars?: Maybe<Array<Maybe<Scalars['ID']>>>; vehicles?: Maybe<Array<Maybe<Scalars['ID']>>>; created_by?: Maybe<Scalars['ID']>; updated_by?: Maybe<Scalars['ID']>;

@@ -1983,9 +1972,9 @@

export type EditVehicleInput = { name?: Maybe<Scalars['String']>; seats?: Maybe<Scalars['Int']>; - user?: Maybe<Scalars['ID']>; travels?: Maybe<Array<Maybe<Scalars['ID']>>>; phone_number?: Maybe<Scalars['String']>; + user?: Maybe<Scalars['ID']>; created_by?: Maybe<Scalars['ID']>; updated_by?: Maybe<Scalars['ID']>; };

@@ -2148,7 +2137,7 @@ );

export type EventFieldsFragment = ( { __typename?: 'Event' } - & Pick<Event, 'id' | 'uuid' | 'name' | 'email' | 'date' | 'address' | 'position'> + & Pick<Event, 'id' | 'uuid' | 'name' | 'description' | 'email' | 'date' | 'address' | 'position'> & { waitingList?: Maybe<Array<Maybe<( { __typename?: 'ComponentPassengerPassenger' } & Pick<ComponentPassengerPassenger, 'id' | 'name' | 'location'>

@@ -2178,6 +2167,7 @@ name: Scalars['String'];

email: Scalars['String']; date?: Maybe<Scalars['Date']>; address?: Maybe<Scalars['String']>; + description?: Maybe<Scalars['String']>; newsletter?: Maybe<Scalars['Boolean']>; }>;

@@ -2406,6 +2396,7 @@ fragment EventFields on Event {

id uuid name + description email date address

@@ -2641,9 +2632,9 @@ export type ResetPasswordMutationHookResult = ReturnType<typeof useResetPasswordMutation>;

export type ResetPasswordMutationResult = Apollo.MutationResult<ResetPasswordMutation>; export type ResetPasswordMutationOptions = Apollo.BaseMutationOptions<ResetPasswordMutation, ResetPasswordMutationVariables>; export const CreateEventDocument = gql` - mutation createEvent($name: String!, $email: String!, $date: Date, $address: String, $newsletter: Boolean) { + mutation createEvent($name: String!, $email: String!, $date: Date, $address: String, $description: String, $newsletter: Boolean) { createEvent( - input: {data: {name: $name, email: $email, date: $date, address: $address, newsletter: $newsletter}} + input: {data: {name: $name, email: $email, date: $date, address: $address, description: $description, newsletter: $newsletter}} ) { event { ...EventFields

@@ -2670,6 +2661,7 @@ * name: // value for 'name'

* email: // value for 'email' * date: // value for 'date' * address: // value for 'address' + * description: // value for 'description' * newsletter: // value for 'newsletter' * }, * });
M frontend/graphql/event.gqlfrontend/graphql/event.gql

@@ -2,6 +2,7 @@ fragment EventFields on Event {

id uuid name + description email date address

@@ -45,6 +46,7 @@ $name: String!

$email: String! $date: Date $address: String + $description: String $newsletter: Boolean ) { createEvent(

@@ -54,6 +56,7 @@ name: $name

email: $email date: $date address: $address + description: $description newsletter: $newsletter } }
M frontend/locales/en.jsonfrontend/locales/en.json

@@ -70,6 +70,7 @@ "fields": {

"name": "Name of the event", "date": "Event date", "date_placeholder": "DD/MM/YYYY", + "description": "Description", "address": "Event address", "empty": "Not specified", "link": "Share link",

@@ -80,6 +81,8 @@ "creation": {

"title": "New event", "name": "Event name", "date": "Date of the event", + "description": "Description", + "description_helper": "Optionnal", "address": "Address of the event", "creator_email": "Your e-mail", "next": "Next",
M frontend/locales/fr.jsonfrontend/locales/fr.json

@@ -70,6 +70,7 @@ "fields": {

"name": "Nom de l'événement", "date": "Date de l'événement", "date_placeholder": "DD/MM/YYYY", + "description": "Description", "address": "Adresse de l'événement", "empty": "Non précisé", "link": "Lien de partage",

@@ -80,6 +81,8 @@ "creation": {

"title": "Nouvel évènement", "name": "Nom de l'événement", "date": "Date de l'événement", + "description": "Description", + "description_helper": "Optionnel", "address": "Adresse de l'événement", "creator_email": "Votre e-mail", "next": "Suivant",