# Izrada aplikacije za bankarstvo, dio 2: Izrada obrasca za prijavu i registraciju
## Kviz prije predavanja
[Kviz prije predavanja](https://ff-quizzes.netlify.app/web/quiz/43)
Jeste li ikada ispunili obrazac online i doživjeli odbijanje zbog pogrešnog formata e-maila? Ili izgubili sve unesene podatke nakon što ste kliknuli na "Pošalji"? Svi smo se susreli s ovim frustrirajućim situacijama.
Obrasci su most između korisnika i funkcionalnosti vaše aplikacije. Kao što kontrolori zračnog prometa koriste pažljive protokole za sigurno vođenje aviona, dobro dizajnirani obrasci pružaju jasne povratne informacije i sprječavaju skupe pogreške. Loši obrasci, s druge strane, mogu odbiti korisnike brže nego nesporazum u prometnoj zračnoj luci.
U ovoj lekciji pretvorit ćemo vašu statičnu aplikaciju za bankarstvo u interaktivnu aplikaciju. Naučit ćete kako izraditi obrasce koji provjeravaju unos korisnika, komuniciraju s poslužiteljima i pružaju korisne povratne informacije. Zamislite to kao izradu kontrolnog sučelja koje omogućuje korisnicima navigaciju kroz značajke vaše aplikacije.
Na kraju, imat ćete kompletan sustav za prijavu i registraciju s validacijom koji vodi korisnike prema uspjehu, a ne frustraciji.
## Preduvjeti
Prije nego što počnemo izrađivati obrasce, provjerimo imate li sve ispravno postavljeno. Ova lekcija nastavlja tamo gdje smo stali u prethodnoj, pa ako ste preskočili, možda ćete se htjeti vratiti i prvo postaviti osnovne stvari.
### Potrebna postavka
| Komponenta | Status | Opis |
|------------|--------|------|
| [HTML predlošci](../1-template-route/README.md) | ✅ Obavezno | Osnovna struktura aplikacije za bankarstvo |
| [Node.js](https://nodejs.org) | ✅ Obavezno | JavaScript okruženje za poslužitelj |
| [Bank API poslužitelj](../api/README.md) | ✅ Obavezno | Pozadinska usluga za pohranu podataka |
> 💡 **Savjet za razvoj**: Pokretat ćete dva odvojena poslužitelja istovremeno – jedan za vašu aplikaciju za bankarstvo na klijentskoj strani i drugi za pozadinski API. Ova postavka odražava stvarni razvoj gdje klijentske i pozadinske usluge rade neovisno.
### Konfiguracija poslužitelja
**Vaše razvojno okruženje uključuje:**
- **Poslužitelj klijentske strane**: Poslužuje vašu aplikaciju za bankarstvo (obično port `3000`)
- **Pozadinski API poslužitelj**: Upravlja pohranom i dohvatom podataka (port `5000`)
- **Oba poslužitelja** mogu raditi istovremeno bez sukoba
**Testiranje veze s API-jem:**
```bash
curl http://localhost:5000/api
# Expected response: "Bank API v1.0.0"
```
**Ako vidite odgovor s verzijom API-ja, spremni ste za nastavak!**
---
## Razumijevanje HTML obrazaca i kontrola
HTML obrasci su način na koji korisnici komuniciraju s vašom web aplikacijom. Zamislite ih kao telegrafski sustav koji je povezivao udaljena mjesta u 19. stoljeću – oni su komunikacijski protokol između namjere korisnika i odgovora aplikacije. Kada su pažljivo dizajnirani, hvataju pogreške, vode formatiranje unosa i pružaju korisne prijedloge.
Moderni obrasci su znatno sofisticiraniji od osnovnih tekstualnih unosa. HTML5 je uveo specijalizirane vrste unosa koje automatski obrađuju validaciju e-maila, formatiranje brojeva i odabir datuma. Ova poboljšanja koriste i pristupačnosti i iskustvu mobilnih korisnika.
### Osnovni elementi obrazaca
**Osnovni elementi koje svaki obrazac treba:**
```html
```
**Što ovaj kod radi:**
- **Stvara** spremnik za obrazac s jedinstvenim identifikatorom
- **Određuje** HTTP metodu za slanje podataka
- **Povezuje** oznake s unosima radi pristupačnosti
- **Definira** gumb za slanje obrasca
### Moderne vrste unosa i atributi
| Vrsta unosa | Namjena | Primjer upotrebe |
|-------------|---------|------------------|
| `text` | Opći unos teksta | `` |
| `email` | Validacija e-maila | `` |
| `password` | Skriveni unos teksta | `` |
| `number` | Unos brojeva | `` |
| `tel` | Brojevi telefona | `` |
> 💡 **Prednost modernog HTML5**: Korištenje specifičnih vrsta unosa omogućuje automatsku validaciju, odgovarajuće tipkovnice na mobilnim uređajima i bolju podršku za pristupačnost bez dodatnog JavaScripta!
### Vrste gumba i ponašanje
```html
```
**Što svaka vrsta gumba radi:**
- **Gumbi za slanje**: Pokreću slanje obrasca i šalju podatke na određenu adresu
- **Gumbi za resetiranje**: Vraćaju sva polja obrasca na početno stanje
- **Obični gumbi**: Nemaju zadano ponašanje, zahtijevaju prilagođeni JavaScript za funkcionalnost
> ⚠️ **Važna napomena**: Element `` je samostalno zatvarajući i ne zahtijeva završni tag. Moderna najbolja praksa je pisanje `` bez kosog crte.
### Izrada obrasca za prijavu
Sada ćemo izraditi praktičan obrazac za prijavu koji demonstrira moderne prakse HTML obrazaca. Počet ćemo s osnovnom strukturom i postupno ga poboljšavati značajkama za pristupačnost i validaciju.
```html
Bank App
Login
```
**Razrada onoga što se ovdje događa:**
- **Strukturira** obrazac s semantičkim HTML5 elementima
- **Grupira** povezane elemente pomoću `div` spremnika s smislenim klasama
- **Povezuje** oznake s unosima pomoću atributa `for` i `id`
- **Uključuje** moderne atribute poput `autocomplete` i `placeholder` za bolji UX
- **Dodaje** `novalidate` za rukovanje validacijom pomoću JavaScripta umjesto zadane validacije preglednika
### Snaga pravilnih oznaka
**Zašto su oznake važne za moderni web razvoj:**
```mermaid
graph TD
A[Label Element] --> B[Screen Reader Support]
A --> C[Click Target Expansion]
A --> D[Form Validation]
A --> E[SEO Benefits]
B --> F[Accessible to all users]
C --> G[Better mobile experience]
D --> H[Clear error messaging]
E --> I[Better search ranking]
```
**Što pravilne oznake postižu:**
- **Omogućuju** čitačima ekrana da jasno najave polja obrasca
- **Proširuju** područje za klik (klik na oznaku fokusira unos)
- **Poboljšavaju** upotrebljivost na mobilnim uređajima s većim dodirnim ciljevima
- **Podržavaju** validaciju obrasca s smislenim porukama o pogrešci
- **Povećavaju** SEO pružanjem semantičkog značenja elementima obrasca
> 🎯 **Cilj pristupačnosti**: Svaki unos u obrascu trebao bi imati pridruženu oznaku. Ova jednostavna praksa čini vaše obrasce dostupnima svima, uključujući korisnike s invaliditetom, i poboljšava iskustvo za sve korisnike.
### Izrada obrasca za registraciju
Obrazac za registraciju zahtijeva detaljnije informacije za kreiranje kompletnog korisničkog računa. Izradimo ga s modernim značajkama HTML5 i poboljšanom pristupačnošću.
```html
Register
```
**U gornjem kodu smo:**
- **Organizirali** svako polje u spremnike div za bolji stil i izgled
- **Dodali** odgovarajuće atribute `autocomplete` za podršku automatskom popunjavanju preglednika
- **Uključili** korisni tekst za pomoć pri unosu
- **Postavili** razumne zadane vrijednosti pomoću atributa `value`
- **Primijenili** atribute za validaciju poput `required`, `maxlength` i `min`
- **Koristili** `type="number"` za polje stanja s podrškom za decimalne brojeve
### Istraživanje vrsta unosa i ponašanja
**Moderne vrste unosa pružaju poboljšanu funkcionalnost:**
| Značajka | Prednost | Primjer |
|----------|----------|---------|
| `type="number"` | Numerička tipkovnica na mobilnim uređajima | Lakši unos stanja |
| `step="0.01"` | Kontrola preciznosti decimala | Omogućuje unos centi u valuti |
| `autocomplete` | Automatsko popunjavanje preglednika | Brže ispunjavanje obrasca |
| `placeholder` | Kontekstualni savjeti | Vodi očekivanja korisnika |
> 🎯 **Izazov pristupačnosti**: Pokušajte navigirati kroz obrasce koristeći samo tipkovnicu! Koristite `Tab` za kretanje između polja, `Space` za označavanje okvira i `Enter` za slanje. Ovo iskustvo pomaže razumjeti kako korisnici čitača ekrana komuniciraju s vašim obrascima.
## Razumijevanje metoda slanja obrazaca
Kada netko ispuni vaš obrazac i klikne na "Pošalji", ti podaci moraju negdje otići – obično na poslužitelj koji ih može pohraniti. Postoji nekoliko različitih načina na koje se to može dogoditi, a poznavanje pravog može vas spasiti od glavobolje kasnije.
Pogledajmo što se zapravo događa kada netko klikne na gumb za slanje.
### Zadano ponašanje obrasca
Prvo, promatrajmo što se događa s osnovnim slanjem obrasca:
**Testirajte svoje trenutne obrasce:**
1. Kliknite na gumb *Registriraj se* u svom obrascu
2. Promatrajte promjene u adresnoj traci preglednika
3. Primijetite kako se stranica ponovno učitava i podaci se pojavljuju u URL-u

### Usporedba HTTP metoda
```mermaid
graph TD
A[Form Submission] --> B{HTTP Method}
B -->|GET| C[Data in URL]
B -->|POST| D[Data in Request Body]
C --> E[Visible in address bar]
C --> F[Limited data size]
C --> G[Bookmarkable]
D --> H[Hidden from URL]
D --> I[Large data capacity]
D --> J[More secure]
```
**Razumijevanje razlika:**
| Metoda | Namjena | Lokacija podataka | Razina sigurnosti | Ograničenje veličine |
|--------|---------|-------------------|-------------------|----------------------|
| `GET` | Pretraživanje, filtriranje | Parametri URL-a | Niska (vidljivo) | ~2000 znakova |
| `POST` | Korisnički računi, osjetljivi podaci | Tijelo zahtjeva | Viša (skriveno) | Nema praktičnog ograničenja |
**Razumijevanje temeljnih razlika:**
- **GET**: Dodaje podatke obrasca u URL kao parametre upita (prikladno za pretraživanje)
- **POST**: Uključuje podatke u tijelo zahtjeva (neophodno za osjetljive informacije)
- **Ograničenja GET-a**: Ograničenja veličine, vidljivi podaci, trajna povijest preglednika
- **Prednosti POST-a**: Veliki kapacitet podataka, zaštita privatnosti, podrška za prijenos datoteka
> 💡 **Najbolja praksa**: Koristite `GET` za obrasce za pretraživanje i filtriranje (dohvat podataka), koristite `POST` za registraciju korisnika, prijavu i kreiranje podataka.
### Konfiguriranje slanja obrasca
Konfigurirajmo vaš obrazac za registraciju kako bi ispravno komunicirao s pozadinskim API-jem koristeći metodu POST:
```html
```
**Razumijevanje poboljšane validacije:**
- **Kombinira** indikatore obaveznih polja s korisnim opisima
- **Uključuje** `pattern` atribute za validaciju formata
- **Pruža** `title` atribute za pristupačnost i savjete
- **Dodaje** pomoćni tekst za vođenje korisničkog unosa
- **Koristi** semantičku HTML strukturu za bolju pristupačnost
### Napredna pravila validacije
**Što svako pravilo validacije postiže:**
| Polje | Pravila validacije | Korisnička korist |
|-------|--------------------|-------------------|
| Korisničko ime | `required`, `minlength="3"`, `maxlength="20"`, `pattern="[a-zA-Z0-9_]+"` | Osigurava valjane, jedinstvene identifikatore |
| Valuta | `required`, `maxlength="3"`, `pattern="[A-Z$€£¥₹]+"` | Prihvaća uobičajene simbole valuta |
| Stanje | `min="0"`, `step="0.01"`, `type="number"` | Sprječava negativna stanja |
| Opis | `maxlength="100"` | Razumna ograničenja duljine |
### Testiranje ponašanja validacije
**Isprobajte ove scenarije validacije:**
1. **Pošaljite** obrazac s praznim obaveznim poljima
2. **Unesite** korisničko ime kraće od 3 znaka
3. **Pokušajte** unijeti posebne znakove u polje za korisničko ime
4. **Unesite** negativan iznos stanja

**Što ćete primijetiti:**
- **Preglednik prikazuje** poruke o greškama u validaciji
- **Promjene u stiliziranju** na temelju stanja `:valid` i `:invalid`
- **Slanje obrasca** je onemogućeno dok sve validacije ne prođu
- **Fokus automatski** prelazi na prvo neispravno polje
### Validacija na strani klijenta vs. na strani poslužitelja
```mermaid
graph LR
A[Client-Side Validation] --> B[Instant Feedback]
A --> C[Better UX]
A --> D[Reduced Server Load]
E[Server-Side Validation] --> F[Security]
E --> G[Data Integrity]
E --> H[Business Rules]
A -.-> I[Both Required]
E -.-> I
```
**Zašto su potrebna oba sloja:**
- **Validacija na strani klijenta**: Pruža trenutne povratne informacije i poboljšava korisničko iskustvo
- **Validacija na strani poslužitelja**: Osigurava sigurnost i obrađuje složena poslovna pravila
- **Kombinirani pristup**: Stvara robusne, korisnički prihvatljive i sigurne aplikacije
- **Progresivno poboljšanje**: Funkcionira čak i kada je JavaScript onemogućen
> 🛡️ **Sigurnosna napomena**: Nikada se ne oslanjajte samo na validaciju na strani klijenta! Zlonamjerni korisnici mogu zaobići provjere na strani klijenta, stoga je validacija na strani poslužitelja ključna za sigurnost i integritet podataka.
---
---
## Izazov GitHub Copilot Agent 🚀
Koristite Agent način rada za dovršavanje sljedećeg izazova:
**Opis:** Poboljšajte obrazac za registraciju sveobuhvatnom validacijom na strani klijenta i povratnim informacijama za korisnika. Ovaj izazov pomoći će vam da vježbate validaciju obrazaca, rukovanje greškama i poboljšanje korisničkog iskustva interaktivnim povratnim informacijama.
**Zadatak:** Kreirajte kompletan sustav validacije obrazaca za registraciju koji uključuje: 1) Povratne informacije o validaciji u stvarnom vremenu za svako polje dok korisnik unosi podatke, 2) Prilagođene poruke o greškama koje se pojavljuju ispod svakog polja za unos, 3) Polje za potvrdu lozinke s validacijom podudaranja, 4) Vizualne pokazatelje (poput zelenih kvačica za valjana polja i crvenih upozorenja za nevaljana), 5) Gumb za slanje koji postaje aktivan samo kada sve validacije prođu. Koristite HTML5 atribute za validaciju, CSS za stiliziranje stanja validacije i JavaScript za interaktivno ponašanje.
Saznajte više o [agent načinu rada](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) ovdje.
## 🚀 Izazov
Prikazati poruku o grešci u HTML-u ako korisnik već postoji.
Evo primjera kako bi konačna stranica za prijavu mogla izgledati nakon malo stiliziranja:

## Kviz nakon predavanja
[Kviz nakon predavanja](https://ff-quizzes.netlify.app/web/quiz/44)
## Pregled i samostalno učenje
Razvijatelji su postali vrlo kreativni u izradi obrazaca, posebno u vezi strategija validacije. Saznajte više o različitim tokovima obrazaca pregledavajući [CodePen](https://codepen.com); možete li pronaći neke zanimljive i inspirativne primjere obrazaca?
## Zadatak
[Stilizirajte svoju bankovnu aplikaciju](assignment.md)
---
**Izjava o odricanju odgovornosti**:
Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za nesporazume ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda.