From ec4d3e738a7f57962d0165a47807d8b7d005d4cc Mon Sep 17 00:00:00 2001 From: chamikaJ Date: Wed, 7 May 2025 13:50:34 +0530 Subject: [PATCH] Enhance team member role management and localization updates - Added a new SQL field to indicate pending invitations for team members, improving role management logic. - Updated the settings drawer component to display tooltips for roles that cannot be changed, enhancing user experience. - Introduced new localization entries for pending invitations and role change restrictions in English, Spanish, and Portuguese, ensuring consistency across languages. --- .../controllers/admin-center-controller.ts | 6 +++- .../public/locales/en/admin-center/teams.json | 4 ++- .../public/locales/es/admin-center/teams.json | 4 ++- .../public/locales/pt/admin-center/teams.json | 4 ++- .../teams/settings-drawer/settings-drawer.tsx | 34 ++++++++++++++----- .../types/admin-center/admin-center.types.ts | 1 + 6 files changed, 40 insertions(+), 13 deletions(-) diff --git a/worklenz-backend/src/controllers/admin-center-controller.ts b/worklenz-backend/src/controllers/admin-center-controller.ts index 6b2f5362..be334aff 100644 --- a/worklenz-backend/src/controllers/admin-center-controller.ts +++ b/worklenz-backend/src/controllers/admin-center-controller.ts @@ -232,7 +232,11 @@ export default class AdminCenterController extends WorklenzControllerBase { FROM team_member_info_view WHERE team_member_info_view.team_member_id = tm.id), role_id, - r.name AS role_name + r.name AS role_name, + EXISTS(SELECT email + FROM email_invitations + WHERE team_member_id = tm.id + AND email_invitations.team_id = tm.team_id) AS pending_invitation FROM team_members tm LEFT JOIN users u on tm.user_id = u.id LEFT JOIN roles r on tm.role_id = r.id diff --git a/worklenz-frontend/public/locales/en/admin-center/teams.json b/worklenz-frontend/public/locales/en/admin-center/teams.json index e03f8515..bf829a87 100644 --- a/worklenz-frontend/public/locales/en/admin-center/teams.json +++ b/worklenz-frontend/public/locales/en/admin-center/teams.json @@ -29,5 +29,7 @@ "role": "Role", "owner": "Owner", "admin": "Admin", - "member": "Member" + "member": "Member", + "cannotChangeOwnerRole": "Owner role cannot be changed", + "pendingInvitation": "Pending invitation" } diff --git a/worklenz-frontend/public/locales/es/admin-center/teams.json b/worklenz-frontend/public/locales/es/admin-center/teams.json index 98e3b188..13453656 100644 --- a/worklenz-frontend/public/locales/es/admin-center/teams.json +++ b/worklenz-frontend/public/locales/es/admin-center/teams.json @@ -29,5 +29,7 @@ "role": "Rol", "owner": "Propietario", "admin": "Administrador", - "member": "Miembro" + "member": "Miembro", + "cannotChangeOwnerRole": "El rol de Propietario no puede ser cambiado", + "pendingInvitation": "Invitación pendiente" } diff --git a/worklenz-frontend/public/locales/pt/admin-center/teams.json b/worklenz-frontend/public/locales/pt/admin-center/teams.json index fea4c874..6a71b491 100644 --- a/worklenz-frontend/public/locales/pt/admin-center/teams.json +++ b/worklenz-frontend/public/locales/pt/admin-center/teams.json @@ -29,5 +29,7 @@ "role": "Rol", "owner": "Propietario", "admin": "Administrador", - "member": "Miembro" + "member": "Miembro", + "cannotChangeOwnerRole": "A função de Proprietário não pode ser alterada", + "pendingInvitation": "Convite pendente" } diff --git a/worklenz-frontend/src/components/admin-center/teams/settings-drawer/settings-drawer.tsx b/worklenz-frontend/src/components/admin-center/teams/settings-drawer/settings-drawer.tsx index b08cee23..ed2d850f 100644 --- a/worklenz-frontend/src/components/admin-center/teams/settings-drawer/settings-drawer.tsx +++ b/worklenz-frontend/src/components/admin-center/teams/settings-drawer/settings-drawer.tsx @@ -10,6 +10,7 @@ import { Table, TableProps, Typography, + Tooltip, } from 'antd'; import React, { useState } from 'react'; import { useAppDispatch } from '@/hooks/useAppDispatch'; @@ -22,8 +23,6 @@ import { } from '@/types/admin-center/admin-center.types'; import SingleAvatar from '@/components/common/single-avatar/single-avatar'; import { useTranslation } from 'react-i18next'; -import { API_BASE_URL } from '@/shared/constants'; -import apiClient from '@/api/api-client'; interface SettingTeamDrawerProps { teamId: string; @@ -126,15 +125,32 @@ const SettingTeamDrawer: React.FC = ({ } }; + const isDisabled = record.role_name === 'Owner' || record.pending_invitation; + const tooltipTitle = record.role_name === 'Owner' + ? t('cannotChangeOwnerRole') + : record.pending_invitation + ? t('pendingInvitation') + : ''; + + const selectComponent = ( + + {isDisabled ? ( + + {selectComponent} + + ) : ( + selectComponent + )} ); }, diff --git a/worklenz-frontend/src/types/admin-center/admin-center.types.ts b/worklenz-frontend/src/types/admin-center/admin-center.types.ts index d2e29012..e9eba701 100644 --- a/worklenz-frontend/src/types/admin-center/admin-center.types.ts +++ b/worklenz-frontend/src/types/admin-center/admin-center.types.ts @@ -35,6 +35,7 @@ export interface IOrganizationTeamMember { role_id?: string; role_name?: string; created_at?: string; + pending_invitation?: boolean; } export interface IOrganizationTeam {