HTML: o formulário e a tabela de clientes

Hoje o teu CRM ganha um menu, um formulário para escrever os dados de um cliente e uma tabela para ver a lista de clientes.

🎯 No fim desta aula vais conseguir

🧰 Antes de começar

  1. Abre a pasta meu-crm no VS Code (File → Open Folder…).
  2. Abre o index.html com o Live Server (botão direito → Open with Live Server).
  3. Confirma que vês o título do teu CRM com o nome da tua empresa (exercício E1 da aula 1).

😕 Faltaste à aula 1 ou perdeste a pasta? Descarrega o ponto de controlo da aula 1, descompacta-o para Documentos (botão direito → Extrair Tudo…) e trabalha a partir dele. Depois põe lá o nome da tua empresa.

Parte A — O menu (≈ 10 min)

1 O menu do topo

O menu fica dentro de uma etiqueta <nav> (de navigation, navegação). Cada opção do menu é uma ligação <a>, que já conheces da aula 1.

Repara no href="#clientes": o # quer dizer «vai para a parte desta página que tem o id="clientes"». É como o índice de um livro, que te manda para a página certa. Essa parte ainda não existe: vamos criá-la no passo 2.

Os comentários AULA 14, AULA 15 e AULA 16 marcam onde vão entrar as próximas opções do menu. Deixa-os ficar.

Grava (Ctrl+S) e olha para o browser.

✅ Deves ver: por baixo do slogan, uma ligação sublinhada a azul: Clientes. Ainda não tem cores nem aspeto de menu: isso é trabalho do CSS, na aula 3.

😕 Não aparece nada / aparece no sítio errado
  • O menu tem de ficar dentro do <header>, ou seja, antes da linha </header>. Procura o comentário AULA 2: COLAR AQUI O MENU e cola logo por baixo dele.
  • Confirma que gravaste o ficheiro (não pode haver um círculo branco no separador do VS Code).

Parte B — A secção de clientes (≈ 40 min)

2 Colar a secção de clientes

Agora vem o coração do CRM: a zona dos clientes. Pensa numa ficha de inscrição em papel (a de um ginásio, por exemplo) e numa folha de Excel com a lista de todos os inscritos. É exatamente isso que vamos fazer: um formulário e uma tabela.

⚠️ Atenção: este bloco é grande. Usa sempre o botão 📋 Copiar (não copies à mão nem selecionando com o rato, que é fácil deixar uma linha para trás). Cola-o dentro do <main>, por baixo do comentário AULA 2: COLAR AQUI A SECÇÃO DE CLIENTES e por cima do comentário AULA 13.

💡 Depois de colar, se o código ficar desalinhado, carrega Shift+Alt+F: o VS Code arruma a indentação (os espaços no início das linhas) sozinho.

✅ Deves ver: o título Clientes, as palavras Nome, Empresa, Email, Telefone, NIF, Estado e Notas, cada uma com uma caixa ao lado, e uma tabela com dois clientes (Ana Silva e Rui Costa). Está tudo “colado” e sem cores: é normal, ainda não há CSS.

😕 Não funciona?
  • A secção aparece em cima, junto ao título → colaste dentro do <header> em vez de dentro do <main>. Corta (Ctrl+X) e cola no sítio certo.
  • Desapareceu metade da página → provavelmente estragaste um comentário: um <!-- sem o seu --> esconde tudo o que vem a seguir. Desfaz com Ctrl+Z e volta a colar.
  • A tabela aparece toda numa linha / sem cabeçalho → o bloco ficou incompleto. Apaga o que colaste (desde <section id="clientes" até </section>) e volta a copiar com o botão.

3 Perceber o formulário

Não precisas de decorar nada: lê com calma e vai olhando para o código que colaste. Cada etiqueta tem uma função, tal como cada parte de uma ficha em papel.

EtiquetaO que éNa ficha em papel seria…
<section>Uma secção: uma zona da página com um tema. Esta é a dos clientes.Um capítulo do dossiê.
<form>O formulário: junta todos os campos que se preenchem.A própria ficha.
<label>O rótulo de um campo (o texto que diz o que se escreve). Se clicares no rótulo, o cursor salta para a caixa.O texto impresso «Nome: ______».
<input type="text">Uma caixa de texto de uma linha.O espaço em branco para escrever.
<input type="email">Caixa para um email. No telemóvel, aparece um teclado com @.«Email: ______@______».
<input type="tel">Caixa para um telefone. No telemóvel, aparece o teclado numérico.«Telefone: _________».
<select> e <option>Uma lista de escolha: o utilizador escolhe uma das opções.«Assinale uma opção: ☐ Lead ☐ Cliente ☐ Inativo».
<textarea>Uma caixa de texto grande, com várias linhas.O espaço das «Observações».

Algumas palavras do mundo das vendas: um Lead é um potencial cliente (alguém que mostrou interesse mas ainda não comprou); um Cliente já comprou; um Inativo deixou de comprar. O NIF é o número de contribuinte (9 algarismos): por isso o campo tem maxlength="9", que não deixa escrever mais de 9 carateres.

O atributo id: o “nome próprio” de cada elemento

Repara que cada caixa tem um id: id="nome", id="email", id="estado"… O id é como o número de aluno: é único e serve para encontrar aquele elemento sem confusões. Na aula 6, o JavaScript vai usar estes id para ler o que o utilizador escreveu («dá-me o que está escrito na caixa com o id nome»).

⚠️ Regras do id: não pode haver dois elementos com o mesmo id; escreve-se em minúsculas, sem espaços e sem acentos. Não mudes os id deste bloco: o código das próximas aulas conta com eles exatamente assim.

Há mais duas coisas que vão ser usadas mais tarde:

💡 Ainda não há botão Guardar: repara no comentário AULA 6: COLAR AQUI O BOTÃO GUARDAR. Um botão só faz sentido quando houver JavaScript para fazer alguma coisa quando se carrega nele (aula 6). Os outros comentários (AULA 9, AULA 10) também ficam: não os apagues.

4 Perceber a tabela

Uma tabela HTML é como uma folha de Excel: tem linhas e, em cada linha, células. A primeira linha (o cabeçalho) tem os títulos das colunas. Este esquema resume a estrutura (é só para ler, não o copies):

EtiquetaSignificaNo Excel seria…
<table>A tabela inteira.A folha.
<thead>O cabeçalho da tabela.A linha 1, com os títulos a negrito.
<tbody>O corpo: as linhas com os dados.As linhas 2, 3, 4…
<tr>Uma linha (table row).Uma linha.
<th>Uma célula de título (table header).Uma célula da linha 1.
<td>Uma célula de dados (table data).Uma célula normal.

⚠️ Regra de ouro das tabelas: cada linha <tr> deve ter tantas células quantas as colunas do cabeçalho. Agora há 5 títulos (Nome, Empresa, Email, Telefone, Estado), por isso cada cliente tem 5 <td>, pela mesma ordem.

O <tbody> tem o id="corpo-tabela" porque, na aula 7, o JavaScript vai preencher esta tabela sozinho, a partir da lista de clientes. Por isso a Ana Silva e o Rui Costa são clientes de exemplo, só para vermos como fica.

5 Testar

  1. Escreve um nome na caixa Nome e escolhe um Estado na lista.
  2. Clica na palavra «Telefone» (não na caixa). Para onde vai o cursor?
  3. Tenta escrever 12 algarismos no NIF.
  4. Sobe ao topo e clica em Clientes, no menu. Olha para o fim do endereço na barra do browser.

✅ Deves ver: clicar no rótulo põe o cursor na caixa; o NIF não aceita mais de 9 carateres; depois de clicar no menu, o endereço termina em #clientes (se a janela for grande e a página couber toda no ecrã, a página não precisa de se mexer).

🤔 Pensa: preenche o formulário com um cliente inventado. Ele aparece na tabela? Porquê? (Pista: quem é que ia pôr o cliente na tabela? O HTML só mostra coisas; fazer coisas vai ser trabalho do JavaScript, a partir da aula 6.)

🔎 Investiga

  1. No campo Email, troca type="email" por type="date" e grava. O que aparece no browser? Volta a pôr type="email".
  2. Que atributo impede que escrevas mais de 9 carateres no NIF? Apaga-o, grava e experimenta. Depois volta a pô-lo.
  3. Na linha da Ana Silva, apaga um </td> e grava. A tabela estragou-se? Porque achas que o browser não se queixa? Desfaz com Ctrl+Z.
  4. No VS Code, clica em cima de um <tr>. O que fica realçado? Para que te pode servir isto?

✍️ Exercícios (fazem parte do teu projeto)

Estes exercícios não têm o código pronto: usa o que aprendeste hoje.

E1 · O campo Cidade

Acrescenta ao CRM a Cidade do cliente:

  • no formulário, um campo «Cidade» logo a seguir ao NIF, com o id cidade;
  • na tabela, uma coluna «Cidade» a seguir à coluna Telefone;
  • nas linhas de exemplo, a cidade de cada cliente (por exemplo, Porto para a Ana Silva e Gaia para o Rui Costa).

⚠️ Guarda bem este campo: vais precisar dele na ficha da aula 12. O id tem de ser exatamente cidade (minúsculas, sem acento).

💡 Dica: copia o campo do NIF inteiro (desde <label>NIF até ao seu </label>), cola-o por baixo e adapta o texto e o id (o maxlength não faz falta numa cidade). Na tabela, lembra-te da regra de ouro: se acrescentas um <th>, cada linha precisa de mais um <td> na mesma posição.

E2 · Um terceiro cliente

Acrescenta à tabela um terceiro cliente de exemplo, inventado por ti, com todas as colunas preenchidas (incluindo a Cidade) e um estado diferente dos outros dois.

💡 Dica: uma linha da tabela vai de <tr> até </tr>. Onde é que as linhas dos clientes estão: no <thead> ou no <tbody>? Conta as células: tem de haver tantas quantos os títulos.

⭐ Desafio · Exemplos dentro das caixas

Faz com que cada caixa de texto do formulário mostre um exemplo a cinzento enquanto está vazia (por exemplo, Ex.: Ana Silva no Nome), que desaparece quando se começa a escrever.

💡 Dica: existe um atributo chamado placeholder. Escreve-se dentro da etiqueta de abrir, tal como o maxlength. Funciona nos <input> e na <textarea>. E no <select>, faz falta?

📦 O que mostrar ao professor

⏱️ Se sobrar tempo

🤖 Pedir ajuda à IA (opcional)

Se a tua tabela ficar desalinhada e não perceberes porquê, podes pedir a uma IA que te explique o problema, sem te dar a solução. Copia este pedido, troca o texto entre [ ] e cola-o na IA:

📖 Palavras novas

Menu (<nav>)
Zona da página com as ligações de navegação.
Âncora (href="#…")
Ligação para uma parte da mesma página, identificada pelo seu id.
Secção (<section>)
Zona da página dedicada a um tema.
Formulário (<form>)
Conjunto de campos que o utilizador preenche.
Campo
Cada caixa onde se escreve ou escolhe um dado (nome, email…).
Rótulo (<label>)
Texto que diz o que se escreve num campo.
Lista de escolha (<select>)
Campo onde se escolhe uma das opções (<option>).
Tabela, linha e célula
<table>, <tr> e <td> (ou <th> no cabeçalho).
id
Atributo que dá um nome único a um elemento, para o CSS e o JavaScript o encontrarem.
Lead
Potencial cliente: mostrou interesse, mas ainda não comprou.