From 2da0f0210dc0d434346c9891548aeacf98c24050 Mon Sep 17 00:00:00 2001 From: David Date: Sun, 30 Nov 2025 18:58:12 +0100 Subject: [PATCH] fix organisation --- .../src/application/auth/auth.service.ts | 16 +++- .../dashboard/settings/organization/page.tsx | 94 ++++++++++++------- 2 files changed, 74 insertions(+), 36 deletions(-) diff --git a/apps/backend/src/application/auth/auth.service.ts b/apps/backend/src/application/auth/auth.service.ts index e174d2f..62f2763 100644 --- a/apps/backend/src/application/auth/auth.service.ts +++ b/apps/backend/src/application/auth/auth.service.ts @@ -71,8 +71,20 @@ export class AuthService { // 3. Otherwise, use default organization const finalOrganizationId = await this.resolveOrganizationId(organizationId, organizationData); - // Determine role: use invitation role if provided, otherwise default to USER - const userRole = invitationRole ? (invitationRole as UserRole) : UserRole.USER; + // Determine role: + // - If invitation role is provided (invited user), use it + // - If organizationData is provided (new organization creator), make them MANAGER + // - Otherwise, default to USER + let userRole: UserRole; + if (invitationRole) { + userRole = invitationRole as UserRole; + } else if (organizationData) { + // User creating a new organization becomes MANAGER + userRole = UserRole.MANAGER; + } else { + // Default to USER for other cases + userRole = UserRole.USER; + } const user = User.create({ id: uuidv4(), diff --git a/apps/frontend/app/dashboard/settings/organization/page.tsx b/apps/frontend/app/dashboard/settings/organization/page.tsx index eb31743..ab006ee 100644 --- a/apps/frontend/app/dashboard/settings/organization/page.tsx +++ b/apps/frontend/app/dashboard/settings/organization/page.tsx @@ -39,6 +39,9 @@ export default function OrganizationSettingsPage() { const [error, setError] = useState(null); const [successMessage, setSuccessMessage] = useState(null); + // Check if user can edit organization (only ADMIN and MANAGER) + const canEdit = user?.role === 'ADMIN' || user?.role === 'MANAGER'; + useEffect(() => { if (user?.organizationId) { loadOrganization(); @@ -179,6 +182,18 @@ export default function OrganizationSettingsPage() { )} + {/* Read-only warning for USER role */} + {!canEdit && ( +
+
+ + + +

Mode lecture seule - Seuls les administrateurs et managers peuvent modifier l'organisation

+
+
+ )} + {/* Tabs */}
@@ -230,7 +245,8 @@ export default function OrganizationSettingsPage() { type="text" value={formData.name} onChange={e => handleChange('name', e.target.value)} - className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" + disabled={!canEdit} + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100 disabled:cursor-not-allowed" placeholder="Xpeditis" required /> @@ -246,7 +262,8 @@ export default function OrganizationSettingsPage() { type="text" value={formData.siren} onChange={e => handleChange('siren', e.target.value.replace(/\D/g, '').slice(0, 9))} - className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" + disabled={!canEdit} + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100 disabled:cursor-not-allowed" placeholder="123 456 789" maxLength={9} /> @@ -263,7 +280,8 @@ export default function OrganizationSettingsPage() { type="text" value={formData.eori} onChange={e => handleChange('eori', e.target.value.toUpperCase())} - className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" + disabled={!canEdit} + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100 disabled:cursor-not-allowed" placeholder="FR123456789" maxLength={17} /> @@ -277,7 +295,8 @@ export default function OrganizationSettingsPage() { type="tel" value={formData.contact_phone} onChange={e => handleChange('contact_phone', e.target.value)} - className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" + disabled={!canEdit} + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100 disabled:cursor-not-allowed" placeholder="+33 6 80 18 28 12" />
@@ -289,7 +308,8 @@ export default function OrganizationSettingsPage() { type="email" value={formData.contact_email} onChange={e => handleChange('contact_email', e.target.value)} - className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" + disabled={!canEdit} + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100 disabled:cursor-not-allowed" placeholder="contact@xpeditis.com" />
@@ -307,7 +327,8 @@ export default function OrganizationSettingsPage() { type="text" value={formData.address_street} onChange={e => handleChange('address_street', e.target.value)} - className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" + disabled={!canEdit} + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100 disabled:cursor-not-allowed" placeholder="123 Rue de la Paix" required /> @@ -323,7 +344,8 @@ export default function OrganizationSettingsPage() { type="text" value={formData.address_postal_code} onChange={e => handleChange('address_postal_code', e.target.value)} - className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" + disabled={!canEdit} + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100 disabled:cursor-not-allowed" placeholder="75001" required /> @@ -336,7 +358,8 @@ export default function OrganizationSettingsPage() { type="text" value={formData.address_city} onChange={e => handleChange('address_city', e.target.value)} - className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" + disabled={!canEdit} + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100 disabled:cursor-not-allowed" placeholder="Paris" required /> @@ -351,7 +374,8 @@ export default function OrganizationSettingsPage() {