CreaRack-SL

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

CapacidadDetalle
Búsqueda libreFiltra por nombre, email, teléfono, empresa, cargo, NIF, ciudad, etiquetas, notas
Filtro por tipoTodos / Empresas / Personas con contadores en tiempo real
Vista splitPanel lista (tabla) + panel detalle lateral
CRUD completoCrear, editar (modal), eliminar con confirmación
Export vCardDescarga individual en formato vCard 3.0 (.vcf), sin dependencias externas
Import CSVParser propio con preview de errores; soporte subida de archivo o pegado directo
Soft-deleteArchivado vía campo archived_at (reversible)
AvatarIniciales + color hash determinista desde el nombre
Activity logCrea, actualiza y elimina registros en el log de actividad vía logActivity

Arquitectura técnica

Backend — CF Pages Functions

ArchivoMétodoDescripción
functions/api/directions/index.tsGETLista activa; filtra por ?type=person|company y ?archived=1
functions/api/directions/index.tsPOSTCrea nueva dirección; valida type y name
functions/api/directions/[id].tsGETObtiene una dirección por ID
functions/api/directions/[id].tsPUTActualización parcial por lista de campos editables (EDITABLE_FIELDS)
functions/api/directions/[id].tsDELETEEliminació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

ComponenteResponsabilidad
src/pages/tools/directions/index.astroPágina Astro con BaseLayout; ruta /tools/directions
src/components/directions/DirectionsPage.tsxOrchestrator: estado global, fetch, filtros, split-view
src/components/directions/DirectionEditModal.tsxModal crear/editar con todos los campos; Esc cierra, Cmd+Enter guarda
src/components/directions/ImportCsvModal.tsxModal de importación CSV: upload de archivo o textarea, preview de errores
src/components/directions/Avatar.tsxAvatar circular con iniciales y color hash (paleta de 8 colores)
src/components/directions/vcard.tstoVCard() (export vCard 3.0) + parseCsv() (parser sin deps externas)
src/styles/tools.cssEstilos .directions-* y .dir-*
  • src/lib/navigation.ts → entrada “Direcciones” añadida en sección Tools.
  • src/components/shell/Sidebar.tsx → NAV_TOOLS hardcoded 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,
  • type debe ser person o company (en minúsculas).
  • tags es 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]] — logActivity llamado en cada mutación CRUD

Nota: feature--workspace--navigation, concept--workspace--cloudflare-pages-functions y feature--workspace--activity-log son slugs candidatos que no existen aún en la wiki — se incluyen como relacionados sugeridos para cuando se creen.