+ {/* Header */}
+
+
+
+
+ Membros & Equipe
+
+
+ {activeOrg?.name || 'Workspace'}
+
+
+
+ Gerencie os colaboradores ativos, controle solicitações de ingresso e descubra outros workspaces.
+
+
+
+
+
+
+
+
+ {/* Feedback Alert */}
+ {feedbackMsg && (
+
+
+ {feedbackMsg.type === 'success' ? (
+
+ ) : (
+
+ )}
+
{feedbackMsg.text}
+
+
setFeedbackMsg(null)}
+ className="text-xs font-bold hover:opacity-80"
+ >
+ Fechar
+
+
+ )}
+
+ {/* Tabs Switcher */}
+
+ setActiveTab('members')}
+ className={`flex items-center gap-2 px-4 py-2.5 rounded-xl text-xs font-semibold transition-all whitespace-nowrap ${
+ activeTab === 'members'
+ ? 'bg-brand text-white shadow-xs'
+ : 'text-muted hover:text-foreground hover:bg-surface-raised'
+ }`}
+ >
+
+ Membros Ativos
+
+ {members.length}
+
+
+
+ {isOwner && (
+ setActiveTab('pending')}
+ className={`flex items-center gap-2 px-4 py-2.5 rounded-xl text-xs font-semibold transition-all whitespace-nowrap ${
+ activeTab === 'pending'
+ ? 'bg-amber-600 text-white shadow-xs'
+ : 'text-muted hover:text-foreground hover:bg-surface-raised'
+ }`}
+ >
+
+ Solicitações Pendentes
+ {pendingRequests.length > 0 && (
+
+ {pendingRequests.length}
+
+ )}
+
+ )}
+
+ setActiveTab('discover')}
+ className={`flex items-center gap-2 px-4 py-2.5 rounded-xl text-xs font-semibold transition-all whitespace-nowrap ${
+ activeTab === 'discover'
+ ? 'bg-brand text-white shadow-xs'
+ : 'text-muted hover:text-foreground hover:bg-surface-raised'
+ }`}
+ >
+
+ Ingressar em Outros Workspaces
+
+
+
+ {/* Tab 1: Membros Ativos */}
+ {activeTab === 'members' && (
+
+ {/* Member Search Bar */}
+
+
+
+ setMemberSearchTerm(e.target.value)}
+ placeholder="Filtrar por nome ou e-mail..."
+ className="w-full pl-9 pr-3 py-2 rounded-xl border border-border bg-surface-raised text-xs text-foreground placeholder-muted/60 focus:outline-none focus:ring-2 focus:ring-brand/40 focus:border-brand"
+ />
+
+
+ {filteredMembers.length} {filteredMembers.length === 1 ? 'membro' : 'membros'}
+
+
+
+ {loading ? (
+
+ {[1, 2, 3].map((i) => (
+
+ ))}
+
+ ) : filteredMembers.length === 0 ? (
+
+
+
Nenhum membro encontrado com este termo.
+
+ ) : (
+
+ {filteredMembers.map((member) => {
+ const isCurrentUser = member.userEmail === user?.email
+ return (
+
+
+
+ {member.userName ? member.userName.charAt(0) : member.userEmail.charAt(0)}
+
+
+
+
+ {member.userName}
+
+ {isCurrentUser && (
+
+ Você
+
+ )}
+
+
+
+ {member.userEmail}
+
+
+
+
+
+
+
+ Ativo
+
+
+
+ )
+ })}
+
+ )}
+
+ )}
+
+ {/* Tab 2: Solicitações Pendentes (Owner Only) */}
+ {activeTab === 'pending' && isOwner && (
+
+
+
+
+
Painel de Aprovação do Proprietário
+
+ Apenas proprietários podem aprovar novos membros para acessar as tarefas e projetos deste workspace.
+
+
+
+
+ {pendingRequests.length === 0 ? (
+
+
+
Tudo limpo!
+
Não há solicitações pendentes de aprovação no momento.
+
+ ) : (
+
+ {pendingRequests.map((req) => (
+
+
+
+ {req.name ? req.name.charAt(0) : req.email.charAt(0)}
+
+
+
{req.name}
+
{req.email}
+
+
+
+
+ handleReject(req.userId)}
+ className="p-2 rounded-xl border border-rose-500/30 text-rose-400 hover:bg-rose-500/15 transition-colors"
+ title="Rejeitar"
+ >
+
+
+ handleApprove(req.userId)}
+ className="flex items-center gap-1.5 px-3 py-1.5 rounded-xl bg-brand text-white text-xs font-bold hover:bg-brand-hover shadow-xs transition-colors"
+ >
+ {actionLoadingId === req.userId ? (
+
+ ) : (
+
+ )}
+ Aprovar
+
+
+
+ ))}
+
+ )}
+
+ )}
+
+ {/* Tab 3: Descobrir e Solicitar Ingresso */}
+ {activeTab === 'discover' && (
+
+ {/* Search other organizations */}
+
+
+
+
+
+
+
+ Buscar Organizações
+
+
+ Procure por empresas parceiras ou squads para solicitar acesso.
+
+
+
+
+
+
+ {/* Results */}
+ {searchResults.length > 0 && (
+
+
+ Resultados da Busca
+
+
+ {searchResults.map((org) => {
+ const alreadyRequested = myRequests.some(
+ (r) => r.organizationId === org.id
+ )
+ return (
+
+
+
{org.name}
+
ID #{org.id}
+
+
+ {alreadyRequested ? (
+
+ Solicitado
+
+ ) : (
+
handleRequestJoin(org.id)}
+ className="flex items-center gap-1 px-3 py-1.5 rounded-lg bg-brand text-white text-xs font-semibold hover:bg-brand-hover transition-colors"
+ >
+ {actionLoadingId === org.id ? (
+
+ ) : (
+
+ )}
+ Solicitar
+
+ )}
+
+ )
+ })}
+
+
+ )}
+
+
+ {/* Minhas solicitações enviadas */}
+
+
+ Minhas Solicitações de Ingresso
+
+
+ {myRequests.length === 0 ? (
+
Você ainda não solicitou entrada em outras organizações.
+ ) : (
+
+ {myRequests.map((req, idx) => (
+
+
+
{req.organizationName}
+
ID #{req.organizationId}
+
+
+ {req.status === 'APPROVED'
+ ? 'Aprovado'
+ : req.status === 'REJECTED'
+ ? 'Recusado'
+ : 'Pendente'}
+
+
+ ))}
+
+ )}
+
+
+ )}
+
+ )
+}
diff --git a/new-frontend/src/pages/OrganizationSettingsPage.tsx b/new-frontend/src/pages/OrganizationSettingsPage.tsx
new file mode 100644
index 0000000..8a45f8d
--- /dev/null
+++ b/new-frontend/src/pages/OrganizationSettingsPage.tsx
@@ -0,0 +1,169 @@
+import React from 'react'
+import { useNavigate } from 'react-router-dom'
+import {
+ Building2,
+ Shield,
+ Users,
+ FolderKanban,
+ ExternalLink,
+ Info,
+ CheckCircle2,
+} from 'lucide-react'
+import { useAuth } from '../contexts/AuthContext'
+
+export const OrganizationSettingsPage: React.FC = () => {
+ const { activeOrg, user } = useAuth()
+ const navigate = useNavigate()
+
+ if (!activeOrg) {
+ return (
+
+ {/* Header */}
+
+
+
+ Configurações do Workspace
+
+
+ {activeOrg.name}
+
+
+
+ Informações gerais, permissões e detalhes estruturais do seu espaço de trabalho.
+
+
+
+ {/* Main Settings Card */}
+
+
+
+
+ {activeOrg.name.slice(0, 2).toUpperCase()}
+
+
+
{activeOrg.name}
+
Identificador Único: #{activeOrg.id}
+
+
+
+
+
+ {isOwner ? 'Proprietário (Owner)' : 'Colaborador (Member)'}
+
+
+
+ {/* Workspace Details List */}
+
+
+
+ Nome da Organização
+
+ {activeOrg.name}
+
+
+
+
+ Seu Perfil Conectado
+
+
+ {user?.name} ({user?.email})
+
+
+
+
+
+ Permissões Ativas
+
+
+ {activeOrg.roles.map((r) => (
+
+ {r}
+
+ ))}
+
+
+
+
+
+ Status da Conexão
+
+
+
+ Sincronizado com Quarkus API
+
+
+
+
+ {/* Quick Links */}
+
+
+ Ações Rápidas do Workspace
+
+
+
navigate('/members')}
+ className="p-3.5 rounded-xl border border-border bg-surface-raised hover:border-brand transition-colors text-left flex items-center justify-between"
+ >
+
+
+ Gerenciar Membros
+
+
+
+
+
navigate('/projects')}
+ className="p-3.5 rounded-xl border border-border bg-surface-raised hover:border-brand transition-colors text-left flex items-center justify-between"
+ >
+
+
+ Projetos do Time
+
+
+
+
+
navigate('/organizations')}
+ className="p-3.5 rounded-xl border border-border bg-surface-raised hover:border-brand transition-colors text-left flex items-center justify-between"
+ >
+
+
+ Trocar de Workspace
+
+
+
+
+
+
+ {/* Security Note */}
+
+
+
+ As alterações nos dados cadastrais da organização respeitam a política de isolamento multi-tenant do BeeTask. Apenas os usuários autenticados e aprovados têm acesso aos dados deste workspace.
+
+
+
+
+ )
+}
diff --git a/new-frontend/src/services/organizationService.ts b/new-frontend/src/services/organizationService.ts
index 8d03bd8..22d446a 100644
--- a/new-frontend/src/services/organizationService.ts
+++ b/new-frontend/src/services/organizationService.ts
@@ -25,6 +25,13 @@ export type OrganizationMember = {
userPhoto?: string
}
+export type PendingJoinRequest = {
+ userId: number
+ name: string
+ email: string
+ photo?: string
+}
+
export const organizationService = {
async create(name: string): Promise