Direcciones — Agenda de contactos del workspace
Tool del workspace CreaRack que provee una agenda compartida de personas y empresas para el staff (Edu, Dani, Txell). Permite búsqueda libre, filtros, edición en modal, exportación a vCard 3.0 y importación masiva desde CSV. Es la PR 2 de 4 del plan workspace tools s52.
Descripción funcional
| Capacidad | Detalle |
|---|---|
| Búsqueda libre | Filtra por nombre, email, teléfono, empresa, cargo, NIF, ciudad, etiquetas, notas |
| Filtro por tipo | Todos / Empresas / Personas con contadores en tiempo real |
| Vista split | Panel lista (tabla) + panel detalle lateral |
| CRUD completo | Crear, editar (modal), eliminar con confirmación |
| Export vCard | Descarga individual en formato vCard 3.0 (.vcf), sin dependencias externas |
| Import CSV | Parser propio con preview de errores; soporte subida de archivo o pegado directo |
| Soft-delete | Archivado vía campo archived_at (reversible) |
| Avatar | Iniciales + color hash determinista desde el nombre |
| Activity log | Crea, actualiza y elimina registros en el log de actividad vía logActivity |
Arquitectura técnica
Backend — CF Pages Functions
| Archivo | Método | Descripción |
|---|---|---|
functions/api/directions/index.ts | GET | Lista activa; filtra por ?type=person|company y ?archived=1 |
functions/api/directions/index.ts | POST | Crea nueva dirección; valida type y name |
functions/api/directions/[id].ts | GET | Obtiene una dirección por ID |
functions/api/directions/[id].ts | PUT | Actualización parcial por lista de campos editables (EDITABLE_FIELDS) |
functions/api/directions/[id].ts | DELETE | Eliminación permanente; devuelve 204 |
Autenticación: CF Access — el email del usuario se extrae de cf-access-authenticated-user-email y se almacena en owner_id.
Campos editables (PUT parcial): type, name, nif, company, role, email, phone, linkedin, street, zip, city, province, country, tags, notes. El campo archived acepta true/false para gestionar archived_at.
Base de datos — D1
Tabla directions creada en migración 0020. Ver [[entity—workspace—table—directions]] para esquema completo.
Seed inicial (migración 0021): 3 personas del staff (Edu, Dani, Txell) + 5 proveedores conocidos (Hetzner, Cloudflare, Resend, Holded, GitHub).
Frontend — React / Astro
| Componente | Responsabilidad |
|---|---|
src/pages/tools/directions/index.astro | Página Astro con BaseLayout; ruta /tools/directions |
src/components/directions/DirectionsPage.tsx | Orchestrator: estado global, fetch, filtros, split-view |
src/components/directions/DirectionEditModal.tsx | Modal crear/editar con todos los campos; Esc cierra, Cmd+Enter guarda |
src/components/directions/ImportCsvModal.tsx | Modal de importación CSV: upload de archivo o textarea, preview de errores |
src/components/directions/Avatar.tsx | Avatar circular con iniciales y color hash (paleta de 8 colores) |
src/components/directions/vcard.ts | toVCard() (export vCard 3.0) + parseCsv() (parser sin deps externas) |
src/styles/tools.css | Estilos .directions-* y .dir-* |
Navegación
src/lib/navigation.ts→ entrada “Direcciones” añadida en sección Tools.src/components/shell/Sidebar.tsx→NAV_TOOLShardcoded actualizado.
Formato CSV para importación
La cabecera type,name es obligatoria. El resto de campos son opcionales:
type,name,nif,company,role,email,phone,linkedin,street,zip,city,province,country,tags,notes
person,Ana García,,Acme SL,Directora,ana@acme.com,+34600000001,,Calle Mayor 1,28001,Madrid,Madrid,España,cliente,VIP
company,Acme SL,B12345678,,,info@acme.com,,,,,Barcelona,,España,proveedor,
typedebe serpersonocompany(en minúsculas).tagses un CSV dentro del CSV (separado por comas, sin espacios).- Las filas con errores se muestran en el preview pero no se importan.
vCard 3.0
Función toVCard(direction: Direction): string genera el estándar RFC 2426:
FN/N→ nombre completo.ORG→ empresa.TITLE→ cargo.EMAIL/TEL/URL→ contacto.ADR→ dirección postal completa.NOTE→ notas + etiquetas.
La descarga se produce vía Blob + enlace temporal (sin backend).
Comportamiento en localhost
isLocalDev() desactiva los fetch a la API y el import CSV para evitar errores sin DB. La lista aparece vacía pero la UI es completamente navegable.
Fix de build incluido
Este commit corrige también src/content/wiki/workspace-tech--tecnico--tailnet-setup.md: el campo sources[] pasó de strings a objetos {type, ref} requeridos por el schema de content collections.
Véase también
- [[entity—workspace—table—directions]] — Esquema completo de la tabla D1
directions - [[feature—workspace—navigation]] — Sistema de navegación del workspace donde se integra esta tool
- [[concept—workspace—cloudflare-pages-functions]] — Patrón de CF Pages Functions usado por los endpoints
- [[feature—workspace—activity-log]] —
logActivityllamado en cada mutación CRUD
Nota:
feature--workspace--navigation,concept--workspace--cloudflare-pages-functionsyfeature--workspace--activity-logson slugs candidatos que no existen aún en la wiki — se incluyen como relacionados sugeridos para cuando se creen.