Aplicacion PWA offline para captura y gestion de contactos, orientada a uso interno en Android Chrome.
- Funciona offline (despues de la primera carga) con
Service Worker. - Almacenamiento local en
IndexedDB(sin backend). - Formulario principal simplificado: usa placeholders en lugar de labels visibles.
- Todos los campos son obligatorios en captura y edicion.
- Campo default
DNI(8 digitos) incluido en la configuracion inicial. - Chips rapidos de email (
Gmail,Outlook,Hotmail,Yahoo) para completar dominios. - Dos perfiles:
Operador: carga de nuevos registros.Administrador: listado, busqueda, edicion, eliminacion, exportacion CSV, configuracion de campos y cambio de PIN.
- Panel admin con menu por secciones:
Registros,Exportacion,Campos,PIN. - Header visual con logos laterales y footer de copyright.
- UI escalada para tablet/desktop, manteniendo tamano base en celular.
- Acceso admin por PIN local hasheado (
PBKDF2 + SHA-256). - Bloqueo anti fuerza bruta: 5 intentos fallidos -> 5 minutos.
- Exportacion CSV con formato compatible RFC 4180.
- Compartir CSV por Web Share API (si esta disponible) o descarga local como fallback.
HTML + CSS + JavaScript(sin framework)IndexedDBService Worker(cache-first)Web Crypto APIpara hashing de PINWeb Share APIpara compartir exportacionesmanifest.jsonpara instalacion PWA
Mas detalle en docs/adr/0001-frontend-stack.md.
4rmoff/
index.html
styles.css
app.js
manifest.json
sw.js
ico/
src/
db/indexeddb.js
auth/pin-auth.js
fields/fields-config.js
records/records-service.js
export/csv-export.js
ui/router.js
docs/
adr/0001-frontend-stack.md
acceptance-checklist-v1.1.md
- Navegador moderno (objetivo principal: Android + Chrome).
- Servir por
http://localhostohttps://...(no abrir confile://).
- Publica esta carpeta como sitio estatico en Apache.
- Asegurate de poder acceder a
http://localhost/.../index.html(o dominio HTTPS). - Verifica en DevTools que:
manifest.jsoncarga bien.sw.jsse registra sin errores.
No necesitas Python para ejecutar la app.
Desde la raiz del proyecto:
python3 -m http.server 8080Luego abre:
http://localhost:8080
- Abre la app.
- Veras modo
Operadorpor defecto. - Usa el acceso discreto
...para ingresar a admin. - PIN inicial de fabrica:
1234. - Cambia el PIN inmediatamente desde "Cambiar PIN admin".
- Completa el formulario dinamico.
- Para email, puede escribir solo alias y tocar un chip de dominio.
- Guarda registro.
- El formulario se limpia automaticamente.
- Accede por PIN.
- Gestiona campos (agregar/editar/reordenar/eliminar; siempre obligatorios).
- Consulta listado, busca y ordena.
- Edita o elimina registros.
- Exporta CSV (todos o filtrados).
- Cierra sesion admin cuando termina.
- Datos en
IndexedDBlocal del navegador. - No hay sincronizacion entre dispositivos.
- PIN almacenado como hash, nunca en texto plano.
- Lockout temporal tras multiples intentos fallidos.
- Nombre de archivo:
contactos_YYYY-MM-DD.csv. - Incluye encabezados y columnas segun configuracion de campos.
- Escapa comillas, comas y saltos de linea para compatibilidad.
- Abre la app por HTTP/HTTPS.
- Menu de Chrome -> "Agregar a pantalla principal" o "Instalar app".
- Ejecuta en modo standalone desde el icono.
Usa la checklist:
docs/acceptance-checklist-v1.1.md
- Sin backend.
- Sin sincronizacion entre dispositivos.
- Sin multiples admins con PIN distintos.
- Sin importacion CSV.
- Sin exportacion a Excel/PDF nativa.
- Si no funciona offline:
- recarga una vez online,
- verifica registro del Service Worker,
- limpia cache del sitio y vuelve a abrir.
- Si
icons/*da 404 en Apache:- esta app usa carpeta
ico/para evitar conflicto con alias/icons/en servidores con autoindex.
- esta app usa carpeta
- Si no aparece opcion de compartir CSV:
- el navegador/dispositivo puede no soportar compartir archivos por Web Share API,
- se usara descarga como fallback.