# Gumawa ng Banking App Bahagi 2: Gumawa ng Login at Registration Form
## Pre-Lecture Quiz
[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/43)
Naranasan mo na bang mag-fill out ng form online at ma-reject ang email format mo? O kaya naman ay mawala ang lahat ng impormasyon mo pagkatapos mong mag-click ng submit? Lahat tayo ay nakaranas ng ganitong nakakainis na karanasan.
Ang mga form ay nagsisilbing tulay sa pagitan ng mga user at ng functionality ng iyong application. Tulad ng maingat na protocol na ginagamit ng mga air traffic controller para gabayan ang mga eroplano sa kanilang destinasyon, ang maayos na disenyo ng mga form ay nagbibigay ng malinaw na feedback at pumipigil sa mga mahal na pagkakamali. Ang mga hindi maayos na form, sa kabilang banda, ay maaaring magtulak sa mga user na umalis nang mas mabilis kaysa sa isang miscommunication sa abalang paliparan.
Sa araling ito, gagawin nating interactive ang iyong static banking app. Matututo kang gumawa ng mga form na nagva-validate ng user input, nakikipag-ugnayan sa mga server, at nagbibigay ng kapaki-pakinabang na feedback. Isipin mo ito bilang paggawa ng control interface na magpapahintulot sa mga user na mag-navigate sa mga feature ng iyong application.
Sa pagtatapos, magkakaroon ka ng kumpletong login at registration system na may validation na gagabay sa mga user patungo sa tagumpay sa halip na sa pagkabigo.
## Mga Kinakailangan
Bago tayo magsimula sa paggawa ng mga form, siguraduhin muna natin na maayos ang iyong setup. Ang araling ito ay magpapatuloy mula sa huling bahagi ng nakaraang aralin, kaya kung lumaktaw ka, maaaring gusto mong balikan muna ang mga pangunahing kaalaman.
### Kinakailangang Setup
| Komponent | Status | Deskripsyon |
|-----------|--------|-------------|
| [HTML Templates](../1-template-route/README.md) | โ Kinakailangan | Ang pangunahing istruktura ng banking app mo |
| [Node.js](https://nodejs.org) | โ Kinakailangan | JavaScript runtime para sa server |
| [Bank API Server](../api/README.md) | โ Kinakailangan | Backend service para sa data storage |
> ๐ก **Tip sa Pag-develop**: Magpapatakbo ka ng dalawang magkahiwalay na server nang sabay โ isa para sa iyong front-end banking app at isa pa para sa backend API. Ang setup na ito ay sumasalamin sa totoong mundo ng pag-develop kung saan ang mga frontend at backend service ay gumagana nang magkahiwalay.
### Konfigurasyon ng Server
**Ang iyong development environment ay maglalaman ng:**
- **Frontend server**: Nagse-serve sa iyong banking app (karaniwang port `3000`)
- **Backend API server**: Nagha-handle ng data storage at retrieval (port `5000`)
- **Parehong server** ay maaaring magpatakbo nang sabay-sabay nang walang conflict
**Pagsubok sa iyong API connection:**
```bash
curl http://localhost:5000/api
# Expected response: "Bank API v1.0.0"
```
**Kung makikita mo ang API version response, handa ka nang magpatuloy!**
---
## Pag-unawa sa HTML Forms at Controls
Ang HTML forms ang paraan kung paano nakikipag-ugnayan ang mga user sa iyong web application. Isipin mo ito bilang telegraph system na nag-uugnay sa mga malalayong lugar noong ika-19 na siglo โ ito ang communication protocol sa pagitan ng intensyon ng user at tugon ng application. Kapag maayos ang disenyo, nahuhuli nito ang mga error, ginagabayan ang input formatting, at nagbibigay ng kapaki-pakinabang na mungkahi.
Ang mga modernong form ay mas sopistikado kaysa sa mga simpleng text inputs. Ang HTML5 ay nagpakilala ng mga specialized input types na awtomatikong nagha-handle ng email validation, number formatting, at date selection. Ang mga improvement na ito ay kapaki-pakinabang para sa accessibility at mobile user experiences.
### Mahahalagang Elemento ng Form
**Mga building blocks na kailangan ng bawat form:**
```html
```
**Ang ginagawa ng code na ito:**
- **Gumagawa** ng form container na may natatanging identifier
- **Nagtatakda** ng HTTP method para sa data submission
- **Nag-a-associate** ng labels sa inputs para sa accessibility
- **Nagde-define** ng submit button para i-process ang form
### Mga Modernong Input Types at Attributes
| Input Type | Layunin | Halimbawa ng Paggamit |
|------------|---------|-----------------------|
| `text` | Pangkalahatang text input | `` |
| `email` | Email validation | `` |
| `password` | Nakatagong text entry | `` |
| `number` | Numeric input | `` |
| `tel` | Mga numero ng telepono | `` |
> ๐ก **Advantage ng Modern HTML5**: Ang paggamit ng specific input types ay nagbibigay ng automatic validation, angkop na mobile keyboards, at mas mahusay na accessibility support nang walang karagdagang JavaScript!
### Mga Uri ng Button at Kanilang Behavior
```html
```
**Ang ginagawa ng bawat uri ng button:**
- **Submit buttons**: Nagti-trigger ng form submission at nagpapadala ng data sa tinukoy na endpoint
- **Reset buttons**: Ibinabalik ang lahat ng form fields sa kanilang initial state
- **Regular buttons**: Walang default na behavior, nangangailangan ng custom na JavaScript para sa functionality
> โ ๏ธ **Mahalagang Paalala**: Ang `` element ay self-closing at hindi nangangailangan ng closing tag. Ang modernong best practice ay isulat ang `` nang walang slash.
### Paggawa ng Iyong Login Form
Ngayon, gagawa tayo ng praktikal na login form na nagpapakita ng mga modernong HTML form practices. Magsisimula tayo sa basic na istruktura at unti-unting i-enhance ito gamit ang accessibility features at validation.
```html
Bank App
Login
```
**Pagbubuo ng nangyayari dito:**
- **Istruktura** ang form gamit ang semantic HTML5 elements
- **I-group** ang mga related na elemento gamit ang `div` containers na may meaningful classes
- **I-associate** ang labels sa inputs gamit ang `for` at `id` attributes
- **Magdagdag** ng modernong attributes tulad ng `autocomplete` at `placeholder` para sa mas mahusay na UX
- **Magdagdag** ng `novalidate` para i-handle ang validation gamit ang JavaScript sa halip na default ng browser
### Ang Kapangyarihan ng Tamang Labels
**Bakit mahalaga ang labels para sa modernong web development:**
```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]
```
**Ang nagagawa ng tamang labels:**
- **Nagpapahintulot** sa screen readers na malinaw na i-announce ang mga form fields
- **Pinalalawak** ang clickable area (ang pag-click sa label ay nagfo-focus sa input)
- **Pinapabuti** ang mobile usability gamit ang mas malalaking touch targets
- **Sumusuporta** sa form validation gamit ang meaningful error messages
- **Pinapahusay** ang SEO sa pamamagitan ng pagbibigay ng semantic na kahulugan sa mga form elements
> ๐ฏ **Layunin ng Accessibility**: Ang bawat form input ay dapat may kaugnay na label. Ang simpleng practice na ito ay ginagawang magagamit ang iyong mga form ng lahat, kabilang ang mga user na may kapansanan, at pinapabuti ang karanasan para sa lahat ng user.
### Paggawa ng Registration Form
Ang registration form ay nangangailangan ng mas detalyadong impormasyon para makagawa ng kumpletong user account. Gagawa tayo nito gamit ang mga modernong HTML5 features at pinahusay na accessibility.
```html
Register
```
**Sa itaas, ginawa natin ang:**
- **Inorganisa** ang bawat field sa container divs para sa mas magandang styling at layout
- **Nagdagdag** ng angkop na `autocomplete` attributes para sa browser autofill support
- **Naglagay** ng kapaki-pakinabang na placeholder text para gabayan ang user input
- **Nagtakda** ng mga sensible defaults gamit ang `value` attribute
- **Nag-apply** ng validation attributes tulad ng `required`, `maxlength`, at `min`
- **Gumamit** ng `type="number"` para sa balance field na may decimal support
### Pag-explore ng Input Types at Behavior
**Ang mga modernong input types ay nagbibigay ng mas pinahusay na functionality:**
| Feature | Benepisyo | Halimbawa |
|---------|-----------|----------|
| `type="number"` | Numeric keypad sa mobile | Mas madaling pagpasok ng balance |
| `step="0.01"` | Kontrol sa decimal precision | Pinapayagan ang cents sa currency |
| `autocomplete` | Browser autofill | Mas mabilis na pag-fill out ng form |
| `placeholder` | Contextual hints | Gabay sa inaasahan ng user |
> ๐ฏ **Hamon sa Accessibility**: Subukang mag-navigate sa mga form gamit lamang ang iyong keyboard! Gamitin ang `Tab` para lumipat sa pagitan ng mga field, `Space` para mag-check ng mga checkbox, at `Enter` para mag-submit. Ang karanasang ito ay makakatulong sa iyong maunawaan kung paano nakikipag-ugnayan ang mga screen reader users sa iyong mga form.
## Pag-unawa sa Mga Paraan ng Pag-submit ng Form
Kapag may nag-fill out ng iyong form at nag-click ng submit, kailangang mapunta ang data sa isang lugar โ karaniwang sa isang server na maaaring mag-save nito. May ilang iba't ibang paraan kung paano ito mangyayari, at ang pag-alam kung alin ang gagamitin ay makakapagligtas sa iyo mula sa ilang sakit ng ulo sa hinaharap.
Tingnan natin kung ano ang talagang nangyayari kapag may nag-click ng submit button.
### Default na Behavior ng Form
Una, obserbahan natin kung ano ang nangyayari sa basic na form submission:
**Subukan ang iyong kasalukuyang mga form:**
1. I-click ang *Register* button sa iyong form
2. Obserbahan ang mga pagbabago sa address bar ng iyong browser
3. Pansinin kung paano nagre-reload ang page at lumalabas ang data sa URL

### Paghahambing ng HTTP Methods
```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]
```
**Pag-unawa sa mga pagkakaiba:**
| Method | Gamit | Lokasyon ng Data | Antas ng Seguridad | Limitasyon sa Laki |
|--------|-------|------------------|--------------------|--------------------|
| `GET` | Mga search query, filters | URL parameters | Mababa (visible) | ~2000 characters |
| `POST` | Mga user account, sensitibong data | Request body | Mas mataas (hidden) | Walang praktikal na limitasyon |
**Pag-unawa sa mga pangunahing pagkakaiba:**
- **GET**: Idinadagdag ang form data sa URL bilang query parameters (angkop para sa search operations)
- **POST**: Isinasama ang data sa request body (mahalaga para sa sensitibong impormasyon)
- **Limitasyon ng GET**: Mga size constraints, visible na data, persistent browser history
- **Mga Bentahe ng POST**: Malaking kapasidad ng data, proteksyon sa privacy, suporta sa file upload
> ๐ก **Pinakamainam na Practice**: Gamitin ang `GET` para sa mga search forms at filters (data retrieval), gamitin ang `POST` para sa user registration, login, at data creation.
### Pag-configure ng Form Submission
I-configure natin ang iyong registration form para maayos na makipag-ugnayan sa backend API gamit ang POST method:
```html
```
**Pag-unawa sa pinahusay na validation:**
- **Pinagsasama** ang mga indicator ng required field na may helpful na mga deskripsyon
- **Kasama** ang `pattern` attributes para sa format validation
- **Nagbibigay** ng `title` attributes para sa accessibility at tooltips
- **Nagdaragdag** ng helper text upang gabayan ang input ng user
- **Gumagamit** ng semantic HTML structure para sa mas mahusay na accessibility
### Advanced Validation Rules
**Ano ang nagagawa ng bawat validation rule:**
| Field | Validation Rules | Benepisyo sa User |
|-------|------------------|-------------------|
| Username | `required`, `minlength="3"`, `maxlength="20"`, `pattern="[a-zA-Z0-9_]+"` | Tinitiyak ang valid, unique na identifiers |
| Currency | `required`, `maxlength="3"`, `pattern="[A-Z$โฌยฃยฅโน]+"` | Tumatanggap ng karaniwang mga simbolo ng currency |
| Balance | `min="0"`, `step="0.01"`, `type="number"` | Pinipigilan ang negatibong balanse |
| Description | `maxlength="100"` | Makatuwirang limitasyon sa haba |
### Pagsubok sa Validation Behavior
**Subukan ang mga validation scenario na ito:**
1. **Isumite** ang form na may mga walang laman na required fields
2. **Maglagay** ng username na mas maikli sa 3 karakter
3. **Subukan** ang mga special characters sa username field
4. **Mag-input** ng negatibong halaga ng balanse

**Ano ang iyong mapapansin:**
- **Ipinapakita ng browser** ang mga native na validation messages
- **Nagbabago ang styling** batay sa `:valid` at `:invalid` states
- **Pinipigilan ang pagsusumite ng form** hanggang sa maipasa ang lahat ng validations
- **Awtomatikong lumilipat ang focus** sa unang invalid na field
### Client-Side vs Server-Side Validation
```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
```
**Bakit kailangan mo ng parehong layer:**
- **Client-side validation**: Nagbibigay ng agarang feedback at pinapabuti ang karanasan ng user
- **Server-side validation**: Tinitiyak ang seguridad at humahawak ng mga kumplikadong business rules
- **Pinagsamang diskarte**: Lumilikha ng matibay, user-friendly, at secure na mga aplikasyon
- **Progressive enhancement**: Gumagana kahit naka-disable ang JavaScript
> ๐ก๏ธ **Paalala sa Seguridad**: Huwag kailanman umasa sa client-side validation lamang! Maaaring i-bypass ng mga malisyosong user ang client-side checks, kaya't mahalaga ang server-side validation para sa seguridad at integridad ng data.
---
---
## Hamon ng GitHub Copilot Agent ๐
Gamitin ang Agent mode upang tapusin ang sumusunod na hamon:
**Deskripsyon:** Pagandahin ang registration form gamit ang komprehensibong client-side validation at user feedback. Ang hamon na ito ay makakatulong sa iyo na magsanay sa pag-validate ng form, paghawak ng error, at pagpapabuti ng karanasan ng user gamit ang interactive na feedback.
**Prompt:** Gumawa ng kumpletong sistema ng validation para sa registration form na naglalaman ng: 1) Real-time na validation feedback para sa bawat field habang nagta-type ang user, 2) Custom na validation messages na lumalabas sa ibaba ng bawat input field, 3) Isang password confirmation field na may matching validation, 4) Mga visual na indicator (tulad ng green checkmarks para sa valid fields at red warnings para sa invalid), 5) Isang submit button na nagiging enabled lamang kapag naipasa ang lahat ng validations. Gumamit ng HTML5 validation attributes, CSS para sa pag-style ng validation states, at JavaScript para sa interactive na behavior.
Matuto pa tungkol sa [agent mode](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) dito.
## ๐ Hamon
Magpakita ng error message sa HTML kung ang user ay umiiral na.
Narito ang isang halimbawa ng kung ano ang maaaring hitsura ng final login page pagkatapos ng kaunting pag-style:

## Quiz Pagkatapos ng Leksyon
[Quiz pagkatapos ng leksyon](https://ff-quizzes.netlify.app/web/quiz/44)
## Review at Sariling Pag-aaral
Ang mga developer ay naging napaka-malikhain sa kanilang mga pagsisikap sa paggawa ng form, lalo na sa mga validation strategies. Alamin ang iba't ibang daloy ng form sa pamamagitan ng pagtingin sa [CodePen](https://codepen.com); makakahanap ka ba ng mga kawili-wili at nakaka-inspire na mga form?
## Takdang-Aralin
[Style your bank app](assignment.md)
---
**Paunawa**:
Ang dokumentong ito ay isinalin gamit ang AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). Bagamat sinisikap naming maging tumpak, pakatandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi eksaktong salin. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na pinagmulan. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito.