Equipos y el selector de equipos
Qué ve una persona después de iniciar sesión, cómo se crea, se entra, se configura, se abandona y se cierra un equipo.
Una persona inicia sesión una vez y trabaja dentro de un equipo a la vez. Esta guía sigue a esa persona desde el inicio de sesión hasta la pantalla de configuración del equipo, y dice qué clave de configuración cambia cada paso. Asume que la base ya corre; ve Ponlo a correr en el sitio de la base para eso.
El selector en /app
Después de iniciar sesión la persona llega a /app, el selector de equipos. Lista cada equipo al que pertenece, con su logo, y un botón para crear uno nuevo. Hacer clic en un equipo abre su espacio de trabajo en /team.
La elección se recuerda en dos lugares: una cookie team_id y la columna current_team_id del usuario. La siguiente visita a /app se salta la lista y abre ese equipo directamente, mientras la persona siga perteneciendo a él. Para ver la lista otra vez, la barra lateral del espacio de trabajo tiene un enlace Cambiar de equipo, que abre /app?redirect=false. Cerrar sesión olvida la cookie.
Cuando la persona no pertenece a ningún equipo, el selector muestra sólo el botón para crear uno.
Un equipo por persona
Pon APP_ENABLE_MULTI_TEAMS=false en .env y el selector desaparece de la vista: la persona es enviada al único equipo al que pertenece, y alguien sin equipo ve un error que le pide contactar al administrador en lugar de un botón de crear. Úsalo cuando tu producto crea el equipo para el cliente y el cliente nunca hace otro.
Crear un equipo
El botón Crear equipo abre /app/teams/create. El nombre es obligatorio, la descripción es opcional. Guardar hace el resto:
- La persona se vuelve propietaria del equipo, guardada como
creator_user_id, y su primer miembro. - Los roles de
config/app.php→team_rolesse crean dentro del equipo, y el rol de propietario nombrado enteam_owner_rolese crea con todos los permisos del equipo y se asigna a quien lo creó. Ve Roles y permisos del equipo. - El selector se abre con el equipo nuevo seleccionado.
Cuando los planes están encendidos, abrir el tablero del equipo pasa a un equipo sin plan al plan gratuito, así que un equipo sin tarjeta puede empezar a trabajar. Cuando no es posible, el equipo se queda sin plan y a sus miembros se les dice por qué. Ve Planes y cobros del equipo.
El espacio de trabajo en /team
Todo lo que está bajo /team corre dentro del equipo seleccionado, protegido por el middleware team: carga el equipo, comprueba que la persona siga siendo miembro y activa los permisos del equipo para la petición. Una persona eliminada del equipo es enviada de vuelta al selector en su siguiente clic. Ve El contexto del equipo para lo que eso significa en código.
| URL | Qué muestra | Quién llega |
|---|---|---|
/team |
El tablero: contadores de roles, miembros e invitaciones, y el uso de los límites del plan. | Cualquier miembro. |
/team/members |
Los miembros y las invitaciones pendientes. | Miembros con retrieve members. Quitar un miembro o una invitación requiere delete members, y cambiar el rol de un miembro requiere update members. |
/team/members/create |
El formulario para agregar un miembro. | Miembros con create members; en el límite del plan el botón hacia él sigue en la lista pero deshabilitado, y el formulario se niega al guardar. |
/team/roles |
Los roles del equipo. | Miembros con los permisos de roles. |
/team/media, /team/space |
Los archivos compartidos del equipo, y cuánto disco ocupan. | Miembros con manage media. |
/team/settings |
Nombre, descripción, logo, campos extra, importar y exportar los datos del equipo, y abandonar o cerrar el equipo. | Cualquier miembro. Sólo los miembros con edit settings pueden cambiar algo ahí. |
/team/plans, /team/add-ons, /team/billing, /team/payment-methods, /team/debt |
La suscripción del equipo y el saldo que debe. | El propietario y los miembros con manage plans; a cualquier otro se le regresa al tablero con un mensaje. |
El propietario pasa cada una de esas comprobaciones sin tener el permiso.
Las pantallas de miembros, roles, archivos y espacio piden cada una sólo su propio permiso. Que los planes estén encendidos o apagados, la suscripción o el saldo del equipo y manage plans no intervienen: el menú ofrece cada pantalla exactamente a los miembros que pueden abrirla, y a un miembro sin el permiso que abre su URL se le rechaza. Sólo las pantallas de cobros piden manage plans, y nunca exigen una suscripción, así que un equipo cuyo plan venció todavía llega a la página que lo arregla.
La configuración no pide ningún permiso para abrirse, a propósito: es donde un miembro abandona el equipo, así que todos los miembros llegan a ella y la ven en el menú, sin importar qué más puedan o no puedan hacer.
Enlaces que abren un equipo
Una dirección /team/... se abre con el equipo que la persona tiene activo, así que un enlace de un correo sobre un equipo, abierto mientras otro está activo, mostraría una pantalla donde el registro no existe. Un enlace puede nombrar su equipo, con ?team= y el id del equipo al final, como /team/members?team=12:
- Un miembro de ese equipo llega a la pantalla con ese equipo activo, igual que si lo hubiera elegido en el selector. La barra de direcciones termina sin
?team=, así que recargar la página o guardarla en favoritos no vuelve a cambiar de equipo. - Alguien que no es miembro, o un enlace a un equipo que ya no existe, llega al selector con el aviso No eres miembro de ese equipo, y su equipo activo no cambia. Con un equipo por persona, el aviso aparece en la pantalla a la que ese modo ya lleva.
- Alguien sin sesión iniciada inicia sesión primero y luego llega al mismo lugar.
Abrir un equipo de esta forma no concede nada: la pantalla sigue pidiendo su propio permiso. Un enlace sin ?team= funciona como siempre. Para construir estos enlaces desde tu propio código, ve El contexto del equipo.
Configuración del equipo
/team/settings edita lo que el equipo es:
- Nombre y descripción.
- Logo. Un archivo jpeg, png, gif, webp, heic, heif o avif de hasta 5 MB, guardado en la biblioteca de archivos del equipo y contado contra la cuota de espacio del equipo. Sube otro para reemplazarlo, quítaselo al equipo conservando el archivo, o borra el archivo de la biblioteca para devolver el espacio. Sin uno, el equipo muestra un avatar generado a partir de su nombre. Ve Archivos y espacio del equipo.
- Campos extra. Pares de clave y valor guardados en la columna json
extra_fields, para lo que tu producto necesita saber de un equipo y la base no: un RFC, una dirección, una industria. Léelos comoteam()->extra_fields['tax_id']. - Importar y exportar datos. Empaqueta los datos del equipo en un archivo, y lee uno de vuelta dentro del equipo. Ve Mueve los datos de un equipo entre entornos.
Abandonar o cerrar el equipo
La misma pantalla tiene el botón para abandonar el equipo y, para el propietario, para cerrarlo. Ambos piden a la persona escribir el nombre del equipo antes de que pase algo.
- Un miembro que confirma es eliminado del equipo y enviado al selector. Recibe la misma notificación que alguien eliminado por el propietario.
- El propietario que confirma cierra el equipo: se elimina con soft delete, cada miembro pierde el acceso y el propietario es enviado al selector. Los roles, la suscripción y los registros del equipo se quedan en la base de datos, así que un administrador puede restaurarlo desde el panel de administración.
No hay transferencia de propiedad en el kit: el propietario es la persona que creó el equipo, mientras el equipo exista.
Notificaciones que envía un equipo
| Qué pasó | A quién se le avisa | Cómo |
|---|---|---|
| Agregado a un equipo | El miembro nuevo | En la cuenta y por correo. |
| Eliminado de un equipo, o lo abandonó | El miembro | En la cuenta y por correo. |
| Invitado a un equipo en el que todavía no tiene cuenta | El correo invitado | Por correo, con un enlace para registrarse. |
| Se le creó una cuenta | El correo aprovisionado | Por correo, con un enlace para poner una contraseña. |
Las últimas dos se describen en Miembros e invitaciones.