all repos — caroster @ a9547860ccc77ad9735f07bda93f9234d41251f1

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

🐛 Fixes after UX review on trip alerts and user profile
Maylie maylie@octree.ch
Wed, 21 Feb 2024 13:02:08 +0000
commit

a9547860ccc77ad9735f07bda93f9234d41251f1

parent

9c60f22177be092c6ff394254db592cb09737543

M backend/src/api/passenger/policies/check-creation.tsbackend/src/api/passenger/policies/check-creation.ts

@@ -7,8 +7,7 @@ const event = await strapi.entityService.findOne("api::event.event", eventId);

if (!event) throw new errors.NotFoundError(`Event not found`); - if (event.enabled_modules?.includes("caroster-plus")) { - if (user) policyContext.args.data.user = user.id; - else throw new errors.ForbiddenError(); - } + if (event.enabled_modules?.includes("caroster-plus") && !user) + throw new errors.ForbiddenError(); + else if (user) policyContext.args.data.user = user.id; };
M backend/types/generated/contentTypes.d.tsbackend/types/generated/contentTypes.d.ts

@@ -1,19 +1,19 @@

-import type { Schema, Attribute } from '@strapi/strapi'; +import type { Schema, Attribute } from "@strapi/strapi"; export interface AdminPermission extends Schema.CollectionType { - collectionName: 'admin_permissions'; + collectionName: "admin_permissions"; info: { - name: 'Permission'; - description: ''; - singularName: 'permission'; - pluralName: 'permissions'; - displayName: 'Permission'; + name: "Permission"; + description: ""; + singularName: "permission"; + pluralName: "permissions"; + displayName: "Permission"; }; pluginOptions: { - 'content-manager': { + "content-manager": { visible: false; }; - 'content-type-builder': { + "content-type-builder": { visible: false; }; };

@@ -30,38 +30,38 @@ minLength: 1;

}>; properties: Attribute.JSON & Attribute.DefaultTo<{}>; conditions: Attribute.JSON & Attribute.DefaultTo<[]>; - role: Attribute.Relation<'admin::permission', 'manyToOne', 'admin::role'>; + role: Attribute.Relation<"admin::permission", "manyToOne", "admin::role">; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'admin::permission', - 'oneToOne', - 'admin::user' + "admin::permission", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'admin::permission', - 'oneToOne', - 'admin::user' + "admin::permission", + "oneToOne", + "admin::user" > & Attribute.Private; }; } export interface AdminUser extends Schema.CollectionType { - collectionName: 'admin_users'; + collectionName: "admin_users"; info: { - name: 'User'; - description: ''; - singularName: 'user'; - pluralName: 'users'; - displayName: 'User'; + name: "User"; + description: ""; + singularName: "user"; + pluralName: "users"; + displayName: "User"; }; pluginOptions: { - 'content-manager': { + "content-manager": { visible: false; }; - 'content-type-builder': { + "content-type-builder": { visible: false; }; };

@@ -92,33 +92,33 @@ registrationToken: Attribute.String & Attribute.Private;

isActive: Attribute.Boolean & Attribute.Private & Attribute.DefaultTo<false>; - roles: Attribute.Relation<'admin::user', 'manyToMany', 'admin::role'> & + roles: Attribute.Relation<"admin::user", "manyToMany", "admin::role"> & Attribute.Private; blocked: Attribute.Boolean & Attribute.Private & Attribute.DefaultTo<false>; preferedLanguage: Attribute.String; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; - createdBy: Attribute.Relation<'admin::user', 'oneToOne', 'admin::user'> & + createdBy: Attribute.Relation<"admin::user", "oneToOne", "admin::user"> & Attribute.Private; - updatedBy: Attribute.Relation<'admin::user', 'oneToOne', 'admin::user'> & + updatedBy: Attribute.Relation<"admin::user", "oneToOne", "admin::user"> & Attribute.Private; }; } export interface AdminRole extends Schema.CollectionType { - collectionName: 'admin_roles'; + collectionName: "admin_roles"; info: { - name: 'Role'; - description: ''; - singularName: 'role'; - pluralName: 'roles'; - displayName: 'Role'; + name: "Role"; + description: ""; + singularName: "role"; + pluralName: "roles"; + displayName: "Role"; }; pluginOptions: { - 'content-manager': { + "content-manager": { visible: false; }; - 'content-type-builder': { + "content-type-builder": { visible: false; }; };

@@ -136,35 +136,35 @@ Attribute.SetMinMaxLength<{

minLength: 1; }>; description: Attribute.String; - users: Attribute.Relation<'admin::role', 'manyToMany', 'admin::user'>; + users: Attribute.Relation<"admin::role", "manyToMany", "admin::user">; permissions: Attribute.Relation< - 'admin::role', - 'oneToMany', - 'admin::permission' + "admin::role", + "oneToMany", + "admin::permission" >; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; - createdBy: Attribute.Relation<'admin::role', 'oneToOne', 'admin::user'> & + createdBy: Attribute.Relation<"admin::role", "oneToOne", "admin::user"> & Attribute.Private; - updatedBy: Attribute.Relation<'admin::role', 'oneToOne', 'admin::user'> & + updatedBy: Attribute.Relation<"admin::role", "oneToOne", "admin::user"> & Attribute.Private; }; } export interface AdminApiToken extends Schema.CollectionType { - collectionName: 'strapi_api_tokens'; + collectionName: "strapi_api_tokens"; info: { - name: 'Api Token'; - singularName: 'api-token'; - pluralName: 'api-tokens'; - displayName: 'Api Token'; - description: ''; + name: "Api Token"; + singularName: "api-token"; + pluralName: "api-tokens"; + displayName: "Api Token"; + description: ""; }; pluginOptions: { - 'content-manager': { + "content-manager": { visible: false; }; - 'content-type-builder': { + "content-type-builder": { visible: false; }; };

@@ -179,10 +179,10 @@ description: Attribute.String &

Attribute.SetMinMaxLength<{ minLength: 1; }> & - Attribute.DefaultTo<''>; - type: Attribute.Enumeration<['read-only', 'full-access', 'custom']> & + Attribute.DefaultTo<"">; + type: Attribute.Enumeration<["read-only", "full-access", "custom"]> & Attribute.Required & - Attribute.DefaultTo<'read-only'>; + Attribute.DefaultTo<"read-only">; accessKey: Attribute.String & Attribute.Required & Attribute.SetMinMaxLength<{

@@ -190,43 +190,43 @@ minLength: 1;

}>; lastUsedAt: Attribute.DateTime; permissions: Attribute.Relation< - 'admin::api-token', - 'oneToMany', - 'admin::api-token-permission' + "admin::api-token", + "oneToMany", + "admin::api-token-permission" >; expiresAt: Attribute.DateTime; lifespan: Attribute.BigInteger; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'admin::api-token', - 'oneToOne', - 'admin::user' + "admin::api-token", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'admin::api-token', - 'oneToOne', - 'admin::user' + "admin::api-token", + "oneToOne", + "admin::user" > & Attribute.Private; }; } export interface AdminApiTokenPermission extends Schema.CollectionType { - collectionName: 'strapi_api_token_permissions'; + collectionName: "strapi_api_token_permissions"; info: { - name: 'API Token Permission'; - description: ''; - singularName: 'api-token-permission'; - pluralName: 'api-token-permissions'; - displayName: 'API Token Permission'; + name: "API Token Permission"; + description: ""; + singularName: "api-token-permission"; + pluralName: "api-token-permissions"; + displayName: "API Token Permission"; }; pluginOptions: { - 'content-manager': { + "content-manager": { visible: false; }; - 'content-type-builder': { + "content-type-builder": { visible: false; }; };

@@ -237,41 +237,41 @@ Attribute.SetMinMaxLength<{

minLength: 1; }>; token: Attribute.Relation< - 'admin::api-token-permission', - 'manyToOne', - 'admin::api-token' + "admin::api-token-permission", + "manyToOne", + "admin::api-token" >; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'admin::api-token-permission', - 'oneToOne', - 'admin::user' + "admin::api-token-permission", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'admin::api-token-permission', - 'oneToOne', - 'admin::user' + "admin::api-token-permission", + "oneToOne", + "admin::user" > & Attribute.Private; }; } export interface AdminTransferToken extends Schema.CollectionType { - collectionName: 'strapi_transfer_tokens'; + collectionName: "strapi_transfer_tokens"; info: { - name: 'Transfer Token'; - singularName: 'transfer-token'; - pluralName: 'transfer-tokens'; - displayName: 'Transfer Token'; - description: ''; + name: "Transfer Token"; + singularName: "transfer-token"; + pluralName: "transfer-tokens"; + displayName: "Transfer Token"; + description: ""; }; pluginOptions: { - 'content-manager': { + "content-manager": { visible: false; }; - 'content-type-builder': { + "content-type-builder": { visible: false; }; };

@@ -286,7 +286,7 @@ description: Attribute.String &

Attribute.SetMinMaxLength<{ minLength: 1; }> & - Attribute.DefaultTo<''>; + Attribute.DefaultTo<"">; accessKey: Attribute.String & Attribute.Required & Attribute.SetMinMaxLength<{

@@ -294,43 +294,43 @@ minLength: 1;

}>; lastUsedAt: Attribute.DateTime; permissions: Attribute.Relation< - 'admin::transfer-token', - 'oneToMany', - 'admin::transfer-token-permission' + "admin::transfer-token", + "oneToMany", + "admin::transfer-token-permission" >; expiresAt: Attribute.DateTime; lifespan: Attribute.BigInteger; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'admin::transfer-token', - 'oneToOne', - 'admin::user' + "admin::transfer-token", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'admin::transfer-token', - 'oneToOne', - 'admin::user' + "admin::transfer-token", + "oneToOne", + "admin::user" > & Attribute.Private; }; } export interface AdminTransferTokenPermission extends Schema.CollectionType { - collectionName: 'strapi_transfer_token_permissions'; + collectionName: "strapi_transfer_token_permissions"; info: { - name: 'Transfer Token Permission'; - description: ''; - singularName: 'transfer-token-permission'; - pluralName: 'transfer-token-permissions'; - displayName: 'Transfer Token Permission'; + name: "Transfer Token Permission"; + description: ""; + singularName: "transfer-token-permission"; + pluralName: "transfer-token-permissions"; + displayName: "Transfer Token Permission"; }; pluginOptions: { - 'content-manager': { + "content-manager": { visible: false; }; - 'content-type-builder': { + "content-type-builder": { visible: false; }; };

@@ -341,40 +341,40 @@ Attribute.SetMinMaxLength<{

minLength: 1; }>; token: Attribute.Relation< - 'admin::transfer-token-permission', - 'manyToOne', - 'admin::transfer-token' + "admin::transfer-token-permission", + "manyToOne", + "admin::transfer-token" >; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'admin::transfer-token-permission', - 'oneToOne', - 'admin::user' + "admin::transfer-token-permission", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'admin::transfer-token-permission', - 'oneToOne', - 'admin::user' + "admin::transfer-token-permission", + "oneToOne", + "admin::user" > & Attribute.Private; }; } export interface PluginUploadFile extends Schema.CollectionType { - collectionName: 'files'; + collectionName: "files"; info: { - singularName: 'file'; - pluralName: 'files'; - displayName: 'File'; - description: ''; + singularName: "file"; + pluralName: "files"; + displayName: "File"; + description: ""; }; pluginOptions: { - 'content-manager': { + "content-manager": { visible: false; }; - 'content-type-builder': { + "content-type-builder": { visible: false; }; };

@@ -393,11 +393,11 @@ url: Attribute.String & Attribute.Required;

previewUrl: Attribute.String; provider: Attribute.String & Attribute.Required; provider_metadata: Attribute.JSON; - related: Attribute.Relation<'plugin::upload.file', 'morphToMany'>; + related: Attribute.Relation<"plugin::upload.file", "morphToMany">; folder: Attribute.Relation< - 'plugin::upload.file', - 'manyToOne', - 'plugin::upload.folder' + "plugin::upload.file", + "manyToOne", + "plugin::upload.folder" > & Attribute.Private; folderPath: Attribute.String &

@@ -409,32 +409,32 @@ }>;

createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'plugin::upload.file', - 'oneToOne', - 'admin::user' + "plugin::upload.file", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'plugin::upload.file', - 'oneToOne', - 'admin::user' + "plugin::upload.file", + "oneToOne", + "admin::user" > & Attribute.Private; }; } export interface PluginUploadFolder extends Schema.CollectionType { - collectionName: 'upload_folders'; + collectionName: "upload_folders"; info: { - singularName: 'folder'; - pluralName: 'folders'; - displayName: 'Folder'; + singularName: "folder"; + pluralName: "folders"; + displayName: "Folder"; }; pluginOptions: { - 'content-manager': { + "content-manager": { visible: false; }; - 'content-type-builder': { + "content-type-builder": { visible: false; }; };

@@ -446,19 +446,19 @@ min: 1;

}>; pathId: Attribute.Integer & Attribute.Required & Attribute.Unique; parent: Attribute.Relation< - 'plugin::upload.folder', - 'manyToOne', - 'plugin::upload.folder' + "plugin::upload.folder", + "manyToOne", + "plugin::upload.folder" >; children: Attribute.Relation< - 'plugin::upload.folder', - 'oneToMany', - 'plugin::upload.folder' + "plugin::upload.folder", + "oneToMany", + "plugin::upload.folder" >; files: Attribute.Relation< - 'plugin::upload.folder', - 'oneToMany', - 'plugin::upload.file' + "plugin::upload.folder", + "oneToMany", + "plugin::upload.file" >; path: Attribute.String & Attribute.Required &

@@ -468,35 +468,35 @@ }>;

createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'plugin::upload.folder', - 'oneToOne', - 'admin::user' + "plugin::upload.folder", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'plugin::upload.folder', - 'oneToOne', - 'admin::user' + "plugin::upload.folder", + "oneToOne", + "admin::user" > & Attribute.Private; }; } export interface PluginContentReleasesRelease extends Schema.CollectionType { - collectionName: 'strapi_releases'; + collectionName: "strapi_releases"; info: { - singularName: 'release'; - pluralName: 'releases'; - displayName: 'Release'; + singularName: "release"; + pluralName: "releases"; + displayName: "Release"; }; options: { draftAndPublish: false; }; pluginOptions: { - 'content-manager': { + "content-manager": { visible: false; }; - 'content-type-builder': { + "content-type-builder": { visible: false; }; };

@@ -504,22 +504,22 @@ attributes: {

name: Attribute.String & Attribute.Required; releasedAt: Attribute.DateTime; actions: Attribute.Relation< - 'plugin::content-releases.release', - 'oneToMany', - 'plugin::content-releases.release-action' + "plugin::content-releases.release", + "oneToMany", + "plugin::content-releases.release-action" >; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'plugin::content-releases.release', - 'oneToOne', - 'admin::user' + "plugin::content-releases.release", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'plugin::content-releases.release', - 'oneToOne', - 'admin::user' + "plugin::content-releases.release", + "oneToOne", + "admin::user" > & Attribute.Private; };

@@ -527,69 +527,69 @@ }

export interface PluginContentReleasesReleaseAction extends Schema.CollectionType { - collectionName: 'strapi_release_actions'; + collectionName: "strapi_release_actions"; info: { - singularName: 'release-action'; - pluralName: 'release-actions'; - displayName: 'Release Action'; + singularName: "release-action"; + pluralName: "release-actions"; + displayName: "Release Action"; }; options: { draftAndPublish: false; }; pluginOptions: { - 'content-manager': { + "content-manager": { visible: false; }; - 'content-type-builder': { + "content-type-builder": { visible: false; }; }; attributes: { - type: Attribute.Enumeration<['publish', 'unpublish']> & Attribute.Required; + type: Attribute.Enumeration<["publish", "unpublish"]> & Attribute.Required; entry: Attribute.Relation< - 'plugin::content-releases.release-action', - 'morphToOne' + "plugin::content-releases.release-action", + "morphToOne" >; contentType: Attribute.String & Attribute.Required; release: Attribute.Relation< - 'plugin::content-releases.release-action', - 'manyToOne', - 'plugin::content-releases.release' + "plugin::content-releases.release-action", + "manyToOne", + "plugin::content-releases.release" >; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'plugin::content-releases.release-action', - 'oneToOne', - 'admin::user' + "plugin::content-releases.release-action", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'plugin::content-releases.release-action', - 'oneToOne', - 'admin::user' + "plugin::content-releases.release-action", + "oneToOne", + "admin::user" > & Attribute.Private; }; } export interface PluginI18NLocale extends Schema.CollectionType { - collectionName: 'i18n_locale'; + collectionName: "i18n_locale"; info: { - singularName: 'locale'; - pluralName: 'locales'; - collectionName: 'locales'; - displayName: 'Locale'; - description: ''; + singularName: "locale"; + pluralName: "locales"; + collectionName: "locales"; + displayName: "Locale"; + description: ""; }; options: { draftAndPublish: false; }; pluginOptions: { - 'content-manager': { + "content-manager": { visible: false; }; - 'content-type-builder': { + "content-type-builder": { visible: false; }; };

@@ -603,15 +603,15 @@ code: Attribute.String & Attribute.Unique;

createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'plugin::i18n.locale', - 'oneToOne', - 'admin::user' + "plugin::i18n.locale", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'plugin::i18n.locale', - 'oneToOne', - 'admin::user' + "plugin::i18n.locale", + "oneToOne", + "admin::user" > & Attribute.Private; };

@@ -619,60 +619,60 @@ }

export interface PluginUsersPermissionsPermission extends Schema.CollectionType { - collectionName: 'up_permissions'; + collectionName: "up_permissions"; info: { - name: 'permission'; - description: ''; - singularName: 'permission'; - pluralName: 'permissions'; - displayName: 'Permission'; + name: "permission"; + description: ""; + singularName: "permission"; + pluralName: "permissions"; + displayName: "Permission"; }; pluginOptions: { - 'content-manager': { + "content-manager": { visible: false; }; - 'content-type-builder': { + "content-type-builder": { visible: false; }; }; attributes: { action: Attribute.String & Attribute.Required; role: Attribute.Relation< - 'plugin::users-permissions.permission', - 'manyToOne', - 'plugin::users-permissions.role' + "plugin::users-permissions.permission", + "manyToOne", + "plugin::users-permissions.role" >; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'plugin::users-permissions.permission', - 'oneToOne', - 'admin::user' + "plugin::users-permissions.permission", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'plugin::users-permissions.permission', - 'oneToOne', - 'admin::user' + "plugin::users-permissions.permission", + "oneToOne", + "admin::user" > & Attribute.Private; }; } export interface PluginUsersPermissionsRole extends Schema.CollectionType { - collectionName: 'up_roles'; + collectionName: "up_roles"; info: { - name: 'role'; - description: ''; - singularName: 'role'; - pluralName: 'roles'; - displayName: 'Role'; + name: "role"; + description: ""; + singularName: "role"; + pluralName: "roles"; + displayName: "Role"; }; pluginOptions: { - 'content-manager': { + "content-manager": { visible: false; }; - 'content-type-builder': { + "content-type-builder": { visible: false; }; };

@@ -685,40 +685,40 @@ }>;

description: Attribute.String; type: Attribute.String & Attribute.Unique; permissions: Attribute.Relation< - 'plugin::users-permissions.role', - 'oneToMany', - 'plugin::users-permissions.permission' + "plugin::users-permissions.role", + "oneToMany", + "plugin::users-permissions.permission" >; users: Attribute.Relation< - 'plugin::users-permissions.role', - 'oneToMany', - 'plugin::users-permissions.user' + "plugin::users-permissions.role", + "oneToMany", + "plugin::users-permissions.user" >; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'plugin::users-permissions.role', - 'oneToOne', - 'admin::user' + "plugin::users-permissions.role", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'plugin::users-permissions.role', - 'oneToOne', - 'admin::user' + "plugin::users-permissions.role", + "oneToOne", + "admin::user" > & Attribute.Private; }; } export interface PluginUsersPermissionsUser extends Schema.CollectionType { - collectionName: 'up_users'; + collectionName: "up_users"; info: { - name: 'user'; - description: ''; - singularName: 'user'; - pluralName: 'users'; - displayName: 'User'; + name: "user"; + description: ""; + singularName: "user"; + pluralName: "users"; + displayName: "User"; }; options: { draftAndPublish: false;

@@ -746,64 +746,64 @@ confirmationToken: Attribute.String & Attribute.Private;

confirmed: Attribute.Boolean & Attribute.DefaultTo<false>; blocked: Attribute.Boolean & Attribute.Private & Attribute.DefaultTo<false>; role: Attribute.Relation< - 'plugin::users-permissions.user', - 'manyToOne', - 'plugin::users-permissions.role' + "plugin::users-permissions.user", + "manyToOne", + "plugin::users-permissions.role" >; events: Attribute.Relation< - 'plugin::users-permissions.user', - 'manyToMany', - 'api::event.event' + "plugin::users-permissions.user", + "manyToMany", + "api::event.event" >; passengers: Attribute.Relation< - 'plugin::users-permissions.user', - 'oneToMany', - 'api::passenger.passenger' + "plugin::users-permissions.user", + "oneToMany", + "api::passenger.passenger" > & Attribute.Private; vehicles: Attribute.Relation< - 'plugin::users-permissions.user', - 'oneToMany', - 'api::vehicle.vehicle' + "plugin::users-permissions.user", + "oneToMany", + "api::vehicle.vehicle" >; firstName: Attribute.String; lastName: Attribute.String; onboardingUser: Attribute.Boolean & Attribute.DefaultTo<false>; onboardingCreator: Attribute.Boolean & Attribute.DefaultTo<false>; - lang: Attribute.Enumeration<['fr', 'en']> & Attribute.DefaultTo<'fr'>; + lang: Attribute.Enumeration<["fr", "en"]> & Attribute.DefaultTo<"fr">; newsletterConsent: Attribute.Boolean & Attribute.DefaultTo<false>; notificationEnabled: Attribute.Boolean & Attribute.DefaultTo<true>; notifications: Attribute.Relation< - 'plugin::users-permissions.user', - 'oneToMany', - 'api::notification.notification' + "plugin::users-permissions.user", + "oneToMany", + "api::notification.notification" >; tosAcceptationDate: Attribute.DateTime; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'plugin::users-permissions.user', - 'oneToOne', - 'admin::user' + "plugin::users-permissions.user", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'plugin::users-permissions.user', - 'oneToOne', - 'admin::user' + "plugin::users-permissions.user", + "oneToOne", + "admin::user" > & Attribute.Private; }; } export interface ApiEventEvent extends Schema.CollectionType { - collectionName: 'events'; + collectionName: "events"; info: { - name: 'event'; - description: ''; - singularName: 'event'; - pluralName: 'events'; - displayName: 'Event'; + name: "event"; + description: ""; + singularName: "event"; + pluralName: "events"; + displayName: "Event"; }; options: { draftAndPublish: false;

@@ -811,7 +811,7 @@ };

attributes: { name: Attribute.String & Attribute.Required; email: Attribute.String & Attribute.Required; - lang: Attribute.Enumeration<['fr', 'en']> & Attribute.DefaultTo<'en'>; + lang: Attribute.Enumeration<["fr", "en"]> & Attribute.DefaultTo<"en">; date: Attribute.Date; address: Attribute.Text; position: Attribute.JSON;

@@ -822,57 +822,57 @@ maxLength: 250;

}>; newsletter: Attribute.Boolean & Attribute.Private; users: Attribute.Relation< - 'api::event.event', - 'manyToMany', - 'plugin::users-permissions.user' + "api::event.event", + "manyToMany", + "plugin::users-permissions.user" >; travels: Attribute.Relation< - 'api::event.event', - 'oneToMany', - 'api::travel.travel' + "api::event.event", + "oneToMany", + "api::travel.travel" >; passengers: Attribute.Relation< - 'api::event.event', - 'oneToMany', - 'api::passenger.passenger' + "api::event.event", + "oneToMany", + "api::passenger.passenger" >; latitude: Attribute.Float; longitude: Attribute.Float; enabled_modules: Attribute.JSON & Attribute.CustomField< - 'plugin::multi-select.multi-select', - ['caroster-plus'] + "plugin::multi-select.multi-select", + ["caroster-plus"] >; administrators: Attribute.String; creator: Attribute.Relation< - 'api::event.event', - 'oneToOne', - 'plugin::users-permissions.user' + "api::event.event", + "oneToOne", + "plugin::users-permissions.user" >; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'api::event.event', - 'oneToOne', - 'admin::user' + "api::event.event", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'api::event.event', - 'oneToOne', - 'admin::user' + "api::event.event", + "oneToOne", + "admin::user" > & Attribute.Private; }; } export interface ApiModuleModule extends Schema.SingleType { - collectionName: 'modules'; + collectionName: "modules"; info: { - singularName: 'module'; - pluralName: 'modules'; - displayName: 'Modules'; - description: ''; + singularName: "module"; + pluralName: "modules"; + displayName: "Modules"; + description: ""; }; options: { draftAndPublish: false;

@@ -928,33 +928,33 @@ }>;

createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'api::module.module', - 'oneToOne', - 'admin::user' + "api::module.module", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'api::module.module', - 'oneToOne', - 'admin::user' + "api::module.module", + "oneToOne", + "admin::user" > & Attribute.Private; localizations: Attribute.Relation< - 'api::module.module', - 'oneToMany', - 'api::module.module' + "api::module.module", + "oneToMany", + "api::module.module" >; locale: Attribute.String; }; } export interface ApiNotificationNotification extends Schema.CollectionType { - collectionName: 'notifications'; + collectionName: "notifications"; info: { - singularName: 'notification'; - pluralName: 'notifications'; - displayName: 'Notification'; - description: ''; + singularName: "notification"; + pluralName: "notifications"; + displayName: "Notification"; + description: ""; }; options: { draftAndPublish: false;

@@ -962,56 +962,56 @@ };

attributes: { type: Attribute.Enumeration< [ - 'NewPassengerInYourTrip', - 'NewTrip', - 'DeletedTrip', - 'DeletedYourTrip', - 'AddedAsAdmin', - 'EventCreated', - 'EventEnded', - 'EventRecap', - 'PassengerJoinTrip', - 'ContactTripCreator', - 'EnabledCarosterPlus' + "NewPassengerInYourTrip", + "NewTrip", + "DeletedTrip", + "DeletedYourTrip", + "AddedAsAdmin", + "EventCreated", + "EventEnded", + "EventRecap", + "PassengerJoinTrip", + "ContactTripCreator", + "EnabledCarosterPlus" ] > & Attribute.Required; user: Attribute.Relation< - 'api::notification.notification', - 'manyToOne', - 'plugin::users-permissions.user' + "api::notification.notification", + "manyToOne", + "plugin::users-permissions.user" >; event: Attribute.Relation< - 'api::notification.notification', - 'oneToOne', - 'api::event.event' + "api::notification.notification", + "oneToOne", + "api::event.event" >; read: Attribute.Boolean & Attribute.DefaultTo<false>; payload: Attribute.JSON; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'api::notification.notification', - 'oneToOne', - 'admin::user' + "api::notification.notification", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'api::notification.notification', - 'oneToOne', - 'admin::user' + "api::notification.notification", + "oneToOne", + "admin::user" > & Attribute.Private; }; } export interface ApiPagePage extends Schema.CollectionType { - collectionName: 'pages'; + collectionName: "pages"; info: { - name: 'page'; - singularName: 'page'; - pluralName: 'pages'; - displayName: 'Page'; + name: "page"; + singularName: "page"; + pluralName: "pages"; + displayName: "Page"; }; options: { increments: true;

@@ -1020,24 +1020,24 @@ };

attributes: { name: Attribute.String & Attribute.Required; content: Attribute.RichText; - type: Attribute.Enumeration<['tos']>; + type: Attribute.Enumeration<["tos"]>; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; - createdBy: Attribute.Relation<'api::page.page', 'oneToOne', 'admin::user'> & + createdBy: Attribute.Relation<"api::page.page", "oneToOne", "admin::user"> & Attribute.Private; - updatedBy: Attribute.Relation<'api::page.page', 'oneToOne', 'admin::user'> & + updatedBy: Attribute.Relation<"api::page.page", "oneToOne", "admin::user"> & Attribute.Private; }; } export interface ApiPassengerPassenger extends Schema.CollectionType { - collectionName: 'passengers'; + collectionName: "passengers"; info: { - name: 'Passenger'; - description: ''; - singularName: 'passenger'; - pluralName: 'passengers'; - displayName: 'Passenger'; + name: "Passenger"; + description: ""; + singularName: "passenger"; + pluralName: "passengers"; + displayName: "Passenger"; }; options: { draftAndPublish: false;

@@ -1047,45 +1047,45 @@ name: Attribute.String & Attribute.Required;

email: Attribute.Email; location: Attribute.String; user: Attribute.Relation< - 'api::passenger.passenger', - 'manyToOne', - 'plugin::users-permissions.user' + "api::passenger.passenger", + "manyToOne", + "plugin::users-permissions.user" >; travel: Attribute.Relation< - 'api::passenger.passenger', - 'manyToOne', - 'api::travel.travel' + "api::passenger.passenger", + "manyToOne", + "api::travel.travel" >; event: Attribute.Relation< - 'api::passenger.passenger', - 'manyToOne', - 'api::event.event' + "api::passenger.passenger", + "manyToOne", + "api::event.event" >; phone: Attribute.String; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'api::passenger.passenger', - 'oneToOne', - 'admin::user' + "api::passenger.passenger", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'api::passenger.passenger', - 'oneToOne', - 'admin::user' + "api::passenger.passenger", + "oneToOne", + "admin::user" > & Attribute.Private; }; } export interface ApiSettingSetting extends Schema.SingleType { - collectionName: 'settings'; + collectionName: "settings"; info: { - singularName: 'setting'; - pluralName: 'settings'; - displayName: 'Settings'; - description: ''; + singularName: "setting"; + pluralName: "settings"; + displayName: "Settings"; + description: ""; }; options: { draftAndPublish: false;

@@ -1159,34 +1159,34 @@ }>;

createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'api::setting.setting', - 'oneToOne', - 'admin::user' + "api::setting.setting", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'api::setting.setting', - 'oneToOne', - 'admin::user' + "api::setting.setting", + "oneToOne", + "admin::user" > & Attribute.Private; localizations: Attribute.Relation< - 'api::setting.setting', - 'oneToMany', - 'api::setting.setting' + "api::setting.setting", + "oneToMany", + "api::setting.setting" >; locale: Attribute.String; }; } export interface ApiTravelTravel extends Schema.CollectionType { - collectionName: 'travels'; + collectionName: "travels"; info: { - name: 'travel'; - description: ''; - singularName: 'travel'; - pluralName: 'travels'; - displayName: 'Travel'; + name: "travel"; + description: ""; + singularName: "travel"; + pluralName: "travels"; + displayName: "Travel"; }; options: { draftAndPublish: false;

@@ -1203,60 +1203,60 @@ }> &

Attribute.DefaultTo<4>; phone_number: Attribute.String; event: Attribute.Relation< - 'api::travel.travel', - 'manyToOne', - 'api::event.event' + "api::travel.travel", + "manyToOne", + "api::event.event" >; passengers: Attribute.Relation< - 'api::travel.travel', - 'oneToMany', - 'api::passenger.passenger' + "api::travel.travel", + "oneToMany", + "api::passenger.passenger" >; meeting_latitude: Attribute.Float; meeting_longitude: Attribute.Float; user: Attribute.Relation< - 'api::travel.travel', - 'oneToOne', - 'plugin::users-permissions.user' + "api::travel.travel", + "oneToOne", + "plugin::users-permissions.user" >; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'api::travel.travel', - 'oneToOne', - 'admin::user' + "api::travel.travel", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'api::travel.travel', - 'oneToOne', - 'admin::user' + "api::travel.travel", + "oneToOne", + "admin::user" > & Attribute.Private; }; } export interface ApiTripAlertTripAlert extends Schema.CollectionType { - collectionName: 'trip_alerts'; + collectionName: "trip_alerts"; info: { - singularName: 'trip-alert'; - pluralName: 'trip-alerts'; - displayName: 'TripAlert'; - description: ''; + singularName: "trip-alert"; + pluralName: "trip-alerts"; + displayName: "TripAlert"; + description: ""; }; options: { draftAndPublish: false; }; attributes: { event: Attribute.Relation< - 'api::trip-alert.trip-alert', - 'oneToOne', - 'api::event.event' + "api::trip-alert.trip-alert", + "oneToOne", + "api::event.event" >; user: Attribute.Relation< - 'api::trip-alert.trip-alert', - 'oneToOne', - 'plugin::users-permissions.user' + "api::trip-alert.trip-alert", + "oneToOne", + "plugin::users-permissions.user" >; latitude: Attribute.Float; longitude: Attribute.Float;

@@ -1269,28 +1269,28 @@ }>;

createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'api::trip-alert.trip-alert', - 'oneToOne', - 'admin::user' + "api::trip-alert.trip-alert", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'api::trip-alert.trip-alert', - 'oneToOne', - 'admin::user' + "api::trip-alert.trip-alert", + "oneToOne", + "admin::user" > & Attribute.Private; }; } export interface ApiVehicleVehicle extends Schema.CollectionType { - collectionName: 'vehicles'; + collectionName: "vehicles"; info: { - name: 'vehicle'; - description: ''; - singularName: 'vehicle'; - pluralName: 'vehicles'; - displayName: 'Vehicle'; + name: "vehicle"; + description: ""; + singularName: "vehicle"; + pluralName: "vehicles"; + displayName: "Vehicle"; }; options: { increments: true;

@@ -1306,54 +1306,54 @@ }> &

Attribute.DefaultTo<4>; phone_number: Attribute.String; user: Attribute.Relation< - 'api::vehicle.vehicle', - 'manyToOne', - 'plugin::users-permissions.user' + "api::vehicle.vehicle", + "manyToOne", + "plugin::users-permissions.user" >; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation< - 'api::vehicle.vehicle', - 'oneToOne', - 'admin::user' + "api::vehicle.vehicle", + "oneToOne", + "admin::user" > & Attribute.Private; updatedBy: Attribute.Relation< - 'api::vehicle.vehicle', - 'oneToOne', - 'admin::user' + "api::vehicle.vehicle", + "oneToOne", + "admin::user" > & Attribute.Private; }; } -declare module '@strapi/types' { +declare module "@strapi/types" { export module Shared { export interface ContentTypes { - 'admin::permission': AdminPermission; - 'admin::user': AdminUser; - 'admin::role': AdminRole; - 'admin::api-token': AdminApiToken; - 'admin::api-token-permission': AdminApiTokenPermission; - 'admin::transfer-token': AdminTransferToken; - 'admin::transfer-token-permission': AdminTransferTokenPermission; - 'plugin::upload.file': PluginUploadFile; - 'plugin::upload.folder': PluginUploadFolder; - 'plugin::content-releases.release': PluginContentReleasesRelease; - 'plugin::content-releases.release-action': PluginContentReleasesReleaseAction; - 'plugin::i18n.locale': PluginI18NLocale; - 'plugin::users-permissions.permission': PluginUsersPermissionsPermission; - 'plugin::users-permissions.role': PluginUsersPermissionsRole; - 'plugin::users-permissions.user': PluginUsersPermissionsUser; - 'api::event.event': ApiEventEvent; - 'api::module.module': ApiModuleModule; - 'api::notification.notification': ApiNotificationNotification; - 'api::page.page': ApiPagePage; - 'api::passenger.passenger': ApiPassengerPassenger; - 'api::setting.setting': ApiSettingSetting; - 'api::travel.travel': ApiTravelTravel; - 'api::trip-alert.trip-alert': ApiTripAlertTripAlert; - 'api::vehicle.vehicle': ApiVehicleVehicle; + "admin::permission": AdminPermission; + "admin::user": AdminUser; + "admin::role": AdminRole; + "admin::api-token": AdminApiToken; + "admin::api-token-permission": AdminApiTokenPermission; + "admin::transfer-token": AdminTransferToken; + "admin::transfer-token-permission": AdminTransferTokenPermission; + "plugin::upload.file": PluginUploadFile; + "plugin::upload.folder": PluginUploadFolder; + "plugin::content-releases.release": PluginContentReleasesRelease; + "plugin::content-releases.release-action": PluginContentReleasesReleaseAction; + "plugin::i18n.locale": PluginI18NLocale; + "plugin::users-permissions.permission": PluginUsersPermissionsPermission; + "plugin::users-permissions.role": PluginUsersPermissionsRole; + "plugin::users-permissions.user": PluginUsersPermissionsUser; + "api::event.event": ApiEventEvent; + "api::module.module": ApiModuleModule; + "api::notification.notification": ApiNotificationNotification; + "api::page.page": ApiPagePage; + "api::passenger.passenger": ApiPassengerPassenger; + "api::setting.setting": ApiSettingSetting; + "api::travel.travel": ApiTravelTravel; + "api::trip-alert.trip-alert": ApiTripAlertTripAlert; + "api::vehicle.vehicle": ApiVehicleVehicle; } } }
M frontend/containers/Alerts/AlertsForm.tsxfrontend/containers/Alerts/AlertsForm.tsx

@@ -1,15 +1,17 @@

-import {Button, FormControl, TextField} from '@mui/material'; -import InputAdornment from '@mui/material/InputAdornment'; -import Stack from '@mui/material/Stack'; import React, {useState} from 'react'; -import PlaceInput from '../PlaceInput'; +import { + Button, + FormControl, + TextField, + InputAdornment, + Stack, +} from '@mui/material'; import {t} from 'i18next'; -import { - EventEntity, - TripAlertEntity, - useSetTripAlertMutation, -} from '../../generated/graphql'; -import useToastStore from '../../stores/useToastStore'; + +import {EventEntity, TripAlertEntity} from '../../generated/graphql'; + +import PlaceInput from '../PlaceInput'; +import useCreateTripAlert from './useCreateTripAlert'; interface Props { event: EventEntity;

@@ -28,26 +30,27 @@ const [latitude, setLatitude] = useState(

tripAlertEntity?.attributes.latitude || 0 ); const [radius, setRadius] = useState(tripAlertEntity?.attributes.radius || 0); - const handleRadiusChange = e => setRadius(Number(e.target.value)); - const addToast = useToastStore(s => s.addToast); - const [setTripAlertMutation] = useSetTripAlertMutation(); + const [formModified, setFormModified] = useState(false); + + const handleRadiusChange = e => { + setRadius(Number(e.target.value)); + setFormModified(true); + }; + + const disabledButton = disabled || !formModified; + const eventId = event.id; - const handleCreateTripAlert = async () => { - try { - await setTripAlertMutation({ - variables: { - eventId: event.id, - enabled: !disabled, - latitude: address ? latitude : 0, - longitude: address ? longitude : 0, - address: address, - radius: radius, - }, - }); - addToast(t('alert.create')); - } catch (error) { - addToast(t('alert.errors.cant_create')); - } + const handleCreateTripAlert = useCreateTripAlert(); + const handleCreateAlert = async () => { + await handleCreateTripAlert({ + eventId, + enabled: !disabled, + latitude: address ? latitude : 0, + longitude: address ? longitude : 0, + address, + radius, + }); + setFormModified(false); }; return (

@@ -63,6 +66,7 @@ onSelect={({place, latitude, longitude}) => {

setAddress(place); setLatitude(latitude); setLongitude(longitude); + setFormModified(true); }} disabled={disabled} />

@@ -82,7 +86,8 @@ <Button

variant="contained" color="primary" fullWidth - onClick={handleCreateTripAlert} + disabled={disabledButton} + onClick={handleCreateAlert} > {t('alert.button.label')} </Button>
M frontend/containers/Alerts/AlertsHead.tsxfrontend/containers/Alerts/AlertsHead.tsx

@@ -1,20 +1,42 @@

-import Box from '@mui/material/Box'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Typography from '@mui/material/Typography'; +import React, {useState} from 'react'; +import {Box, FormControlLabel, Typography} from '@mui/material'; import Toggle from '../../components/Toggle/index'; import {t} from 'i18next'; +import {EventEntity} from '../../generated/graphql'; +import useCreateTripAlert from './useCreateTripAlert'; interface Props { + event: EventEntity; + switchChecked: boolean; + disabled: boolean; handleToggle: () => void; - checked: boolean; } -const AlertsHeader = ({handleToggle, checked}: Props) => { +const AlertsHeader = ({ + event, + switchChecked, + disabled, + handleToggle, +}: Props) => { + const handleCreateTripAlert = useCreateTripAlert(); + + const eventId = event.id; + + const handleToggleClick = async () => { + await handleCreateTripAlert({ + eventId, + enabled: !disabled, + }); + handleToggle(); + }; + return ( <Box display="flex" alignItems="center" justifyContent="space-between"> <Typography variant="h5">{t('alert.title')}</Typography> <FormControlLabel - control={<Toggle activate={handleToggle} checked={checked} />} + control={ + <Toggle activate={handleToggleClick} checked={switchChecked} /> + } label="" sx={{m: 0}} />
M frontend/containers/Alerts/index.tsxfrontend/containers/Alerts/index.tsx

@@ -1,12 +1,10 @@

-import Box from '@mui/material/Box'; -import Container from '@mui/material/Container'; -import Paper from '@mui/material/Paper'; -import useMediaQuery from '@mui/material/useMediaQuery'; -import theme from '../../theme'; -import AlertsHead from './AlertsHead'; -import AlertsForm from './AlertsForm'; import {useReducer} from 'react'; +import {Box, Container, Paper, useMediaQuery} from '@mui/material'; +import theme from '../../theme'; import {EventEntity, TripAlertEntity} from '../../generated/graphql'; + +import AlertsHeader from './AlertsHead'; +import AlertsForm from './AlertsForm'; interface Props { event: EventEntity;

@@ -24,7 +22,12 @@ return (

<Container maxWidth="sm" sx={{mt: 11, mx: 0, px: isMobile ? 2 : 4}}> <Paper sx={{width: '480px', maxWidth: '100%', position: 'relative'}}> <Box p={2}> - <AlertsHead handleToggle={handleToggle} checked={switchChecked} /> + <AlertsHeader + event={event} + switchChecked={switchChecked} + handleToggle={handleToggle} + disabled={switchChecked} + /> <AlertsForm event={event} disabled={!switchChecked}
A frontend/containers/Alerts/useCreateTripAlert.tsx

@@ -0,0 +1,31 @@

+import {useCallback} from 'react'; +import { + SetTripAlertMutationVariables, + useSetTripAlertMutation, +} from '../../generated/graphql'; +import {t} from 'i18next'; +import useToastStore from '../../stores/useToastStore'; + +const useCreateTripAlert = () => { + const addToast = useToastStore(s => s.addToast); + const [setTripAlertMutation] = useSetTripAlertMutation(); + + const handleCreateTripAlert = useCallback( + async (variables: SetTripAlertMutationVariables) => { + try { + await setTripAlertMutation({ + variables, + }); + addToast(t('alert.create')); + } catch (error) { + addToast(t('alert.errors.cant_create')); + console.error(error); + } + }, + [addToast, setTripAlertMutation] + ); + + return handleCreateTripAlert; +}; + +export default useCreateTripAlert;
M frontend/containers/CarosterPlusOption/index.tsxfrontend/containers/CarosterPlusOption/index.tsx

@@ -40,7 +40,7 @@ <Card

sx={{ position: 'relative', maxWidth: '100%', - width: '350px', + width: '480px', }} > <Box
M frontend/containers/CarosterPlusSettings/index.tsxfrontend/containers/CarosterPlusSettings/index.tsx

@@ -24,6 +24,7 @@ Event as EventType,

useAddEventAdminMutation, useDeleteEventAdminMutation, } from '../../generated/graphql'; +import Tooltip from '@mui/material/Tooltip'; interface Props { event: EventType & {id: string};

@@ -34,6 +35,7 @@ const {t} = useTranslation();

const { userPermissions: {canEditEventOptions}, } = usePermissions(); + const {addToast} = useToastStore(); const [addAdminMutation] = useAddEventAdminMutation();

@@ -76,12 +78,14 @@ addToast(t('options.plus.deleteAdminError'));

} }; + const canEdit = canEditEventOptions(); + return ( <Card sx={{ position: 'relative', maxWidth: '100%', - width: '350px', + width: '480px', pb: 3, }} >

@@ -101,14 +105,23 @@ <Box p={2} display="flex" justifyContent="space-between" width="100%">

<Typography pt={1} variant="body2" color="GrayText"> {t('options.plus.admins')} </Typography> - <Button - variant="text" - disabled={!canEditEventOptions()} - endIcon={<AddIcon />} - onClick={toggleAddAdminDialog} - > - {t('generic.add')} - </Button> + {canEdit ? ( + <Button + variant="text" + endIcon={<AddIcon />} + onClick={toggleAddAdminDialog} + > + {t('generic.add')} + </Button> + ) : ( + <Tooltip title={t('options.plus.notRightForAddAdmin')}> + <div> + <Button variant="text" disabled endIcon={<AddIcon />}> + {t('generic.add')} + </Button> + </div> + </Tooltip> + )} </Box> <List disablePadding> <ListItem

@@ -139,7 +152,7 @@ </ListItem>

))} </List> <FormDialog - title={t("options.plus.addAdmin")} + title={t('options.plus.addAdmin')} open={addAdminDialogOpen} cancel={toggleAddAdminDialog} onSubmit={addAdmin}
M frontend/containers/EventBar/index.tsxfrontend/containers/EventBar/index.tsx

@@ -61,7 +61,7 @@ <Tooltip title={title || event.name || ''}>

<Typography variant="h6" noWrap - sx={{maxWidth: `calc(100vw - ${theme.spacing(18)})`}} + sx={{maxWidth: `calc(100vw - ${theme.spacing(28)})`}} > {title || event.name} </Typography>
M frontend/containers/Profile/ContentSwitch.tsxfrontend/containers/Profile/ContentSwitch.tsx

@@ -12,7 +12,7 @@ }) => {

return isEditing ? ( <Switch checked={checked} onChange={onChange} /> ) : ( - <Typography variant="h6"> + <Typography variant="h6" fontWeight="bold" py={1}> {checked ? t(trueLabel) : t(falseLabel)} </Typography> );
M frontend/containers/Profile/ManagingNotificationsField.tsxfrontend/containers/Profile/ManagingNotificationsField.tsx

@@ -22,12 +22,7 @@ const {t} = useTranslation();

return ( <Box px={2}> - <Box - display="flex" - alignItems="center" - justifyContent="space-between" - mb={1} - > + <Box display="flex" alignItems="center" justifyContent="space-between"> <Typography variant="h6">{t('profile.notification.label')}</Typography> <ContentSwitch isEditing={isEditing}

@@ -38,12 +33,7 @@ falseLabel="profile.notification.value.no"

t={t} /> </Box> - <Box - display="flex" - alignItems="center" - justifyContent="space-between" - mb={1} - > + <Box display="flex" alignItems="center" justifyContent="space-between"> <Typography variant="h6">{t('profile.newsletter.label')}</Typography> <ContentSwitch isEditing={isEditing}
M frontend/containers/Profile/ProfileField.tsxfrontend/containers/Profile/ProfileField.tsx

@@ -1,5 +1,6 @@

import Typography from '@mui/material/Typography'; import TextField, {TextFieldProps} from '@mui/material/TextField'; +import {Box} from '@mui/material'; type Props = TextFieldProps & { isEditing: boolean;

@@ -11,22 +12,22 @@ const {name, label, value, defaultValue = ''} = inputProps;

if (isEditing) { return ( - <TextField - fullWidth - margin="dense" - onChange={e => onChange(e.target.value)} - id={`Profile${name}`} - {...inputProps} - /> + <Box mb={1}> + <TextField + fullWidth + margin="dense" + onChange={e => onChange(e.target.value)} + id={`Profile${name}`} + {...inputProps} + /> + </Box> ); } return ( - <> - <Typography variant="h6">{label}</Typography> - <Typography variant="body1" gutterBottom> - {value || defaultValue} - </Typography> - </> + <Box mb={2}> + <Typography variant="caption">{label}</Typography> + <Typography variant="h6">{value || defaultValue}</Typography> + </Box> ); }; export default ProfileField;
M frontend/containers/Profile/index.tsxfrontend/containers/Profile/index.tsx

@@ -15,6 +15,7 @@ useUpdateMeMutation,

} from '../../generated/graphql'; import ManagingNotificationsField from './ManagingNotificationsField'; import StripeDashboardLink from './StripeDashboardLink'; +import {Box, Divider} from '@mui/material'; interface Props { profile: UsersPermissionsUser;

@@ -115,46 +116,52 @@ }}

> <Card sx={{width: '480px', maxWidth: '100%'}}> <CardContent> - <ProfileField - name="firstName" - value={firstName} - label={t('profile.firstName')} - defaultValue={t('profile.not_defined', { - field: '$t(profile.firstName)', - })} - onChange={setFirstName} - isEditing={isEditing} - /> - <ProfileField - name="lastName" - value={lastName} - label={t('profile.lastName')} - defaultValue={t('profile.not_defined', { - field: '$t(profile.lastName)', - })} - onChange={setLastName} - isEditing={isEditing} - /> - <ProfileField - name="email" - value={email} - label={t('profile.email')} - defaultValue={t('profile.not_defined', { - field: '$t(profile.email)', - })} - onChange={setEmail} + <Box> + <ProfileField + name="firstName" + value={firstName} + label={t('profile.firstName')} + defaultValue={t('profile.not_defined', { + field: '$t(profile.firstName)', + })} + onChange={setFirstName} + isEditing={isEditing} + /> + <ProfileField + name="lastName" + value={lastName} + label={t('profile.lastName')} + defaultValue={t('profile.not_defined', { + field: '$t(profile.lastName)', + })} + onChange={setLastName} + isEditing={isEditing} + /> + <ProfileField + name="email" + value={email} + label={t('profile.email')} + defaultValue={t('profile.not_defined', { + field: '$t(profile.email)', + })} + onChange={setEmail} + isEditing={isEditing} + disabled={!isStrapiUser} + /> + </Box> + </CardContent> + <Divider /> + <Box my={4}> + <ManagingNotificationsField isEditing={isEditing} - disabled={!isStrapiUser} + notificationChecked={notificationEnabled} + newsletterChecked={newsletterConsent} + toggleNotification={toggleNotification} + toggleNewsletter={toggleNewsletter} /> - </CardContent> - <ManagingNotificationsField - isEditing={isEditing} - notificationChecked={notificationEnabled} - newsletterChecked={newsletterConsent} - toggleNotification={toggleNotification} - toggleNewsletter={toggleNewsletter} - /> - <StripeDashboardLink /> + <StripeDashboardLink /> + </Box> + <Divider /> <CardActions sx={{justifyContent: 'flex-end'}}> {!isEditing && ( <>
M frontend/locales/en.jsonfrontend/locales/en.json

@@ -84,6 +84,7 @@ "options.plus.adminAdded": "The administrator has been invited",

"options.plus.addAdminError": "An error has occurred", "options.plus.adminDeleted": "The administrator has been deleted", "options.plus.deleteAdminError": "An error has occurred", + "options.plus.notRightForAddAdmin": "You are not authorized to add an administrator", "generic.access": "Access", "generic.add": "Add", "generic.cancel": "Cancel",
M frontend/locales/fr.jsonfrontend/locales/fr.json

@@ -84,6 +84,7 @@ "options.plus.adminAdded": "L'administrateur a été invité",

"options.plus.addAdminError": "Une erreur est survenue", "options.plus.adminDeleted": "L'administrateur a été supprimé", "options.plus.deleteAdminError": "Une erreur est survenue", + "options.plus.notRightForAddAdmin": "Vous n'avez pas les droits pour ajouter un administrateur", "generic.access": "Accéder", "generic.add": "Ajouter", "generic.cancel": "Annuler",
M frontend/pages/e/[uuid]/details.tsxfrontend/pages/e/[uuid]/details.tsx

@@ -128,7 +128,7 @@ <Card

sx={{ position: 'relative', maxWidth: '100%', - width: '350px', + width: '480px', p: 2, }} >