# Formulari Astrovet · prova de flux

**Maqueta interactiva, no aplicació clínica. Només dades clíniques fictícies; la ubicació pot ser real.** No necessita comptes, API operativa, instal·lació, build ni connexió amb Dart-Lab. No envia les respostes al gestor. El feedback només es comparteix quan descarregues el fitxer i el retornes al coordinador. OpenStreetMap rep IP i àrea consultada si actives el mapa.

## Obrir i compartir

Obre `index.html` directament al navegador. Per a un enllaç local estable, des de l'arrel del repositori:

```powershell
python -m http.server 8093 --bind 127.0.0.1 --directory frontend-lab/astrovet-form
```

Obre **http://127.0.0.1:8093/**. Això només serveix fitxers estàtics; no arrenca l'API. No usar el port/origen del gestor operatiu. Per a proves remotes, aquesta maqueta s'ha publicat separadament amb Docker i Tailscale Funnel; consulta [`DEPLOYMENT.md`](DEPLOYMENT.md). El PC ha d'estar encès i connectat. No hi ha recepció centralitzada de comentaris.

Per enviar un paquet: comprimeix **només** `index.html`, `style.css`, `logo.css`, `favicon.svg`, `dart-lab-logo.png`, `settings.js`, `catalog.js`, `model.js`, `feedback.js`, `exports.js`, `location.js`, `app.js`, `photo-demo.svg`, `README.md`, `COVERAGE.md`. No incloure perfils del navegador, fitxers exportats pels participants ni dades de la plataforma. Descomprimir abans d'obrir `index.html`.

Paquet preparat: [`astrovet-form-mockup.zip`](astrovet-form-mockup.zip), amb SHA-256 al fitxer `.zip.sha256` adjacent. Per regenerar-lo després de canvis: `python frontend-lab/astrovet-form/package.py` des de l'arrel. El paquet usa una llista tancada de fitxers, no recorre dades ni carpetes.

## Guia d'una pàgina per a Astrovet

### Distribució compacta · revisió mòbil

Els camps relacionats s'agrupen visualment (coordenades, horaris, recomptes,
edat/unitat i pesos); continuen sent valors independents a les exportacions.
Les fitxes d'animals tenen blocs identificables, sense ocultar camps ni inferir
que una secció estigui completa. Els textos llargs ocupen tota l'amplada.
En mòbil, les parelles curtes comparteixen fila a partir de 360 px; per sota
s'apilen. Els botons «＋» de cada camp obren el mateix comentari contextual,
amb nom accessible i àrea tàctil de 44 px. El botó general de comentaris queda
al final, sense tapar camps ni les accions. Exportacions i recuperació també
queden després del formulari, deixant la preparació al principi.

Es vol validar si això redueix desplaçaments i facilita relacionar els valors,
sense dificultar descobrir el feedback ni distingir estimacions i mesures.
Les proves Chromium de 320, 390, 768 i 1440 px en clar/fosc no substitueixen
la prova amb teclat virtual, GPS i dispositius físics d'Astrovet.

En obrir o recarregar la pàgina apareix un diàleg que explica com comentar,
exportar el feedback i reenviar els fitxers en resposta al mateix correu o conversa
on s'ha compartit la maqueta. No hi ha enviament automàtic. Prem **Entesos,
comencem** o Esc per continuar; **Com retornar el feedback** permet reobrir-lo
sense perdre dades. No es mostra si el mòdul de feedback està desactivat.

1. Tria un escenari i prem **Carrega / reinicia escenari**. Pots començar en blanc. Les mostres són inventades; si comparteixes GPS hi haurà una ubicació real.
2. Prova el registre **Al lloc de l'actuació**. Navega endavant i enrere; pots deixar dades pendents. Els camps «Proposta per validar» encara necessiten el vostre criteri.
3. Afegeix dues fitxes individuals, una mostra i una administració. Prova els vincles. Observats i fitxes no han de coincidir necessàriament.
4. Prem **Revisa**. El resum inclou tots els camps, també els incomplets o ocults. «Edita» torna al camp. Els avisos no corregeixen res automàticament.
5. **Desa la prova** conserva un esborrany incomplet; **Confirma registre de prova** demana corregir els errors, però no bloqueja pels avisos. No s'envia res. La primera confirmació de camp conserva una referència fictícia de comparació.
6. Obre **Completa després** per afegir mesures i resultats vinculats a una mostra. El desplegable de canvis compara amb el primer registre de camp; no és un historial clínic real.
7. Quan et falti alguna cosa o et resulti confús, prem **Comenta** al camp o **Comenta aquest punt**. Explica què volies fer, què esperaves, què ha passat i, si vols, com t'ha fet sentir. També interessa allò que funciona bé.
8. Al final, prem **Exporta feedback JSON** i **Exporta resum llegible**. Retorna'ls a qui coordina la prova pel canal acordat. El text «guardat» NO vol dir «compartit».

### Exportar les respostes

- **Exporta respostes Excel** descarrega un `.xlsx` real, amb fulls d'actuació, animals, mostres, administracions, intervencions, incidències, laboratori, revisió, metadades i canvis. Inclou zeros, camps pendents, propostes i files conservades en col·leccions inactives; en mostra l'estat. IDs i camps retirats conservats també hi apareixen. No executa text com a fórmules.
- **Exporta informe llegible** descarrega HTML autònom amb totes les respostes, estats i avisos. Obre'l al navegador; pots imprimir-lo o desar-lo com a PDF amb el diàleg d'impressió. No és un informe clínic i no inclou feedback.
- El feedback té exportacions pròpies JSON, Excel i resum Markdown. Així no es barregen comentaris dels participants amb dades del formulari. Les captures autoritzades només s'inclouen al JSON.
- Els fitxers del formulari inclouen la ubicació desada, que pot ser real. Revisa'ls abans de compartir. La generació és local i funciona també sense connexió.

### Ubicació: tres vies equivalents

1. Escriu **latitud i longitud (EPSG:4326)** o les dues **UTM EPSG:25831**. En sortir del camp es sincronitza l'altra parella quan es pot convertir. Si canvies de sistema no es deixa una altra parella obsoleta. Fora del fus 31N es conserven les geogràfiques, sense inventar UTM. La conversió és aproximada, sense transformació de datum/època de precisió topogràfica.
2. Prem **Marca un punt al mapa** després de llegir l'avís de privadesa (també pots prémer **Activa el mapa OpenStreetMap** o el botó central del mapa). El mapa s'activa i rep el focus. Mou-lo arrossegant o amb fletxes, apropa/allunya i prem el lloc exacte; amb teclat, Retorn marca el centre. El marcador visible i el text «Punt seleccionat» confirmen el punt; prem-ne un altre per canviar-lo. Latitud/longitud i UTM compatibles s'actualitzen i es desen. L'activació, zoom i vista es mantenen quan canvies opcions o passos dins de la mateixa prova. Després de recarregar, el punt continua desat però cal tornar a activar la cartografia. Arrossegar mou el mapa, no canvia la ubicació fins que marques un altre punt. Atribució OSM sempre visible. No descarreguem ni precarguem àrees offline.
3. Marca **Compartir ubicació actual**, dins de la finestra del mapa. El navegador demanarà permís; només fem una lectura, no seguiment continu. Es desa l'origen, l'instant i la precisió proporcionada pel dispositiu. La casella es desmarca en acabar i mai es reactiva sola en recarregar. Desmarcar-la cancel·la l'acceptació d'una resposta pendent, però no esborra una ubicació ja desada; usa **Esborra punt**.

Els controls queden superposats **dins del mapa**: **＋ / −** a dalt a l'esquerra; **Torna al punt** i **Esborra punt** a dalt a la dreta; **Marca un punt al mapa** i la casella d'ubicació actual a baix. Els botons de punt es desactiven quan no hi ha una selecció pertinent; fer zoom o prémer un control no marca un punt accidentalment. En mòbil els controls inferiors s'apilen, amb àrees tàctils àmplies. L'atribució OSM sempre queda visible.

GPS requereix HTTPS o localhost i permisos del navegador/sistema. Per provar-lo en mòbil cal un allotjament HTTPS separat; `file://` depèn del navegador i pot no funcionar. Si es denega el permís, hi ha timeout o fallen els tiles, pots continuar amb coordenades. Sense xarxa no es promet cartografia; el formulari descarregat i les coordenades continuen editables. El model general continua sent de prova (`simulated`), però l'origen de la ubicació diferencia mapa/manual/GPS.

### Escenaris

- **Visita sense animals:** verifica que no s'obliguin fitxes ni fotos.
- **Grup amb fitxes parcials:** cinc observats, una fitxa; la diferència s'explica, no es rebutja.
- **Captura i alliberament:** captura explícita encara que després s'alliberi. Treu la foto fictícia i comprova l'error.
- **Servei no executat:** motiu condicional. Canvia el resultat i torna-hi: el text no ha de desaparèixer.
- **Compleció amb laboratori:** afegeix pes mesurat i resultat amb mostra, unitat, data i font. Un buit no esdevé un resultat negatiu.
- **En blanc:** prova si saps començar sense ajuda.

## Conservació, privadesa i feedback

- `localStorage`: prova `dartlab_astrovet_mock_trial_v1`; feedback `dartlab_astrovet_mock_feedback_v1`. Cap clau operativa. A `file://` el desament depèn del navegador i del camí del fitxer; usar sempre la mateixa URL facilita recuperar-lo.
- Errors de quota, emmagatzematge denegat o dades malmeses: s'avisa, es manté el treball en memòria i es recomana exportar. Un desament malmès no es sobreescriu fins a esborrar-lo explícitament. No és una còpia de seguretat. No hi ha xifrat propi.
- Reiniciar/carregar escenaris elimina la prova actual amb confirmació, **no els comentaris**. Esborrar prova i esborrar feedback són accions diferents. Exporta abans.
- El comentari captura versió, sessió aleatòria, escenari, fase, pas, IDs estables, etiquetes, ajuda, opcions, avisos visibles, idioma i dimensions. No copia respostes del formulari, fotos ni gravacions. No fa seguiment ocult.
- Als selectors de vincles es conserven els IDs dels registres disponibles, no les etiquetes creades amb l'espècie o referència escrita pel participant; així no es copien respostes indirectament.
- Captura opcional triada manualment (PNG/JPEG/WebP, màxim 512 KiB): previsualitza-la i autoritza expressament incloure-la. No adjuntar dades reals. El JSON inclou la imatge; el resum llegible n'indica l'existència.
- Pots editar, eliminar i recuperar feedback exportat. Els imports fusionen IDs nous sense sobreescriure comentaris existents. El context d'un comentari no canvia en editar-lo, reiniciar la prova o eliminar l'animal original.
- `settings.js`: `feedbackEnabled:false` amaga el mòdul i evita obrir/carregar feedback. Aquesta funcionalitat és exclusiva del prototip; no afegir-la al model clínic.
- Excepció explícita d'aquesta maqueta: tiles d'OpenStreetMap i GPS opt-in. Cap API operativa, càrrega real de fotografies, analytics, cookies, IndexedDB ni service worker. Obrir la carpeta descarregada funciona sense xarxa, excepte cartografia/GPS segons dispositiu; **no** es promet que una URL remota torni a obrir offline.

## Camps nous, retirats i versions

`catalog.js` és la font de camps de maqueta: ID estable, entitat, tipus, unitat, opcions/codis, ajuda, fase/secció, condició declarativa, estat i versió. `labels.ca` prepara etiquetes localitzables; aquesta versió de prova té **interfície en català**, no una traducció completa en tres idiomes.

Afegir un camp opcional a `fields` o `collections.<entitat>.fields` el fa aparèixer al formulari, al resum i a l'exportació, sense tocar serialitzadors. Les condicions admeten `equals` / `includes`, no expressions executables. Les regles transversals són explícites a `model.js`, no un editor no-code ni un motor clínic. Exemple:

```js
{id:'access_notes',label:'Observacions d’accés',labels:{ca:'Observacions d’accés'},
 type:'textarea',step:'location',status:'proposal',help:'Només fets observats.',
 introducedIn:'astrovet-form-1'}
```

No reutilitzar IDs per canviar-ne el significat. Retirar un camp del catàleg no elimina el seu valor dels fitxers de prova/exportacions; si ha de continuar visible al resum, mantenir-ne la definició i marcar-la explícitament com a retirada. Una ruptura de tipus/esquema necessita versió nova i migració explícita. No convertir aquests camps en nous camps API sense contracte i encàrrec separat.

## Verificació

Des de l'arrel:

```powershell
node --test frontend-lab/astrovet-form/tests/model.test.cjs frontend-lab/astrovet-form/tests/exports-location.test.cjs frontend-lab/tests/model.test.cjs
.\.venv\Scripts\python.exe -m pytest frontend-lab/astrovet-form/tests/test_astrovet_browser.py -q
```

Les proves cobreixen obertura per fitxer, mòbil/escriptori Chromium, resum, compleció, vincles, recuperació, fallada d'emmagatzematge, exportacions OOXML/HTML, conversió UTM i opt-in GPS amb callbacks simulats. Els tiles es bloquegen a les proves; no acrediten disponibilitat d'OSM, permisos/GPS reals ni Safari/iPhone físic. Cal provar-ho amb dispositius reals d'Astrovet.
