Os ecrãs
As APIs de tabela que servem os dados e os quatro ecrãs da app — dashboard, lista de contas, ficha de conta e quadro de oportunidades.
Esta é a etapa mais longa do guia, e a que dá cara à app. No fim tens quatro ecrãs desenhados e a funcionar sobre os dados verdadeiros do modelo: um Início com indicadores e um gráfico, uma lista de Contas, uma Ficha de Conta que grava, e um quadro de Oportunidades com cartões arrastáveis.
Antes dos ecrãs, porém, há um passo curto que os torna possíveis.
Primeiro as APIs de tabela
Um ecrã não fala com a base de dados. Fala com datastores — os contentores de dados de cada ecrã — e os datastores leem e escrevem através das APIs de tabela da app. Uma API de tabela aponta a uma entidade do modelo e gera, sozinha, as operações de leitura e escrita.
Vamos criar três, uma por entidade:
- Escolhe o painel Código na barra lateral.
- Na linha APIs, clica no + (Nova API).
- Em Nome, escreve
contas. O nome é a base das operações (getContas,addContas,updateContas,deleteContas) — por isso não lhe ponhas prefixos comogetoulistar. - Clica em Criar API. O construtor abre no separador Construir.
- Na secção Pipeline, escolhe o bloco Tabela.
- No campo Tabela, escolhe
Dados CRM ▸ Contas. - Em Acções expostas, deixa Select, Insert, Update e Delete marcados — o CRM precisa dos quatro.
- Deixa Acesso público (sem sessão) todo desligado: esta app é para quem tem sessão iniciada.
- Em Campos incluídos, confirma que estão marcados os campos que os ecrãs vão usar. Para as contas, são todos.
- Liga o interruptor Publicada e clica em Gravar.

Repete para as outras duas:
| API | Entidade | Acções | Notas |
|---|---|---|---|
contas |
Contas | Select, Insert, Update, Delete | Todos os campos. |
contactos |
Contactos | Select, Insert, Update, Delete | Inclui o navigator conta (só o campo nome). |
oportunidades |
Oportunidades | Select, Insert, Update, Delete | Inclui o navigator conta (só o campo nome). |
Os navigators são o que permite mostrar o nome da conta ao lado de
uma oportunidade sem escrever uma linha de SQL: marca-os na lista de
campos incluídos, e o campo conta.nome passa a estar disponível nos
ecrãs.
Nota
Uma API em rascunho só é visível para quem constrói. Se te esqueceres de a publicar, os datastores dos ecrãs não a encontram — é a causa número um de "o ecrã não carrega nada". O capítulo O construtor de APIs trata das APIs a fundo.
Criar os quatro ecrãs
Os ecrãs vivem no painel UI, na secção Ecrãs.
- Escolhe o painel UI na barra lateral.
- Na linha Ecrãs, clica no botão Novo ecrã.
- Escreve o nome e confirma em Criar. O ecrã abre logo no espaço de trabalho.

Cria os quatro de uma vez, por esta ordem:
| Nome do ecrã | Rota | O que vai ser |
|---|---|---|
Início |
/inicio |
O painel comercial, com indicadores e gráfico. |
Contas |
/contas |
A lista de contas. |
Ficha de Conta |
/ficha-de-conta |
O formulário de uma conta. |
Oportunidades |
/oportunidades |
O quadro kanban. |
A Rota é derivada do nome e vê-se (e edita-se) no inspector, quando nenhum widget está seleccionado. Deixa-as como estão — o guia refere-se a elas mais à frente.
Dica
Trabalha sempre no dispositivo Web (1280px) ao longo deste guia. Os outros dois — Tablet e Mobile — têm desenho próprio e independente; tratam-se depois, quando o desenho de web estiver estável.
O ecrã Início — o painel comercial
Abre o ecrã Início. O desenho tem quatro peças: um título, uma faixa de indicadores, um gráfico e uma tabela.
O título
- Arrasta uma Etiqueta da palette para o topo do canvas.
- Na categoria Conteúdo do inspector, escreve o texto
Painel comercial. - Na categoria Aspecto, sobe o Tamanho do texto — é o título da página.
A faixa de indicadores
Quatro números lado a lado fazem-se com um widget KPI de quatro indicadores, não com quatro widgets: o alinhamento e o espaçamento ficam garantidos.
- Arrasta um KPI para baixo do título e estica-o a toda a largura.
- Na categoria Dados, a secção Indicadores começa com um. Usa Acrescentar indicador até teres quatro.
- Cada indicador tem um Rótulo, um ícone, um Conjunto de dados próprio (o datastore dele) e um valor com Agregação.
Configura-os assim:
| Rótulo | Datastore (API de tabela) | Filtro | Valor |
|---|---|---|---|
Contas ativas |
contas |
— | Contagem de id |
Oportunidades abertas |
oportunidades |
fase ≠ fechada_ganha e fase ≠ fechada_perdida |
Contagem de id |
Valor em pipeline |
oportunidades |
o mesmo filtro | Soma de valor |
Fechado este trimestre |
oportunidades |
fase = fechada_ganha |
Soma de valor |
Nos dois indicadores de dinheiro, abre o Formato e escolhe moeda EUR com zero decimais — 475.850 lê-se melhor do que 475850.
O gráfico
- Arrasta um Gráfico para a metade esquerda, por baixo do KPI.
- Na categoria Dados, cria o datastore de lista sobre a API
oportunidades. - Em Tipo de gráfico, escolhe Barras.
- Em Campo de categoria (eixo X / fatias), escolhe
fase. - Em Campos de valor, acrescenta
valor. - Na categoria Aspecto, liga Mostrar título e escreve
Pipeline por fase.
A tabela de próximos fechos
- Arrasta uma Tabela para a metade direita, ao lado do gráfico.
- Na categoria Dados, cria o datastore de lista sobre
oportunidades, com o filtro das fases abertas (o mesmo dos indicadores), ordenado pordata_fechoascendente e Por página a - Na categoria Dados, secção Colunas, define quatro colunas:
| Campo | Cabeçalho |
|---|---|
titulo |
Oportunidade |
conta.nome |
Conta |
valor |
Valor (€) |
data_fecho |
Fecho |
- Liga Mostrar título e escreve
Próximos fechos.

O ecrã Contas — a lista
Abre o ecrã Contas. São três widgets.
- Uma Etiqueta no topo, com o texto
Contas. - Um Botão no canto superior direito: na categoria Conteúdo,
texto
Nova contae íconeplus. - Uma Tabela ocupando o resto do ecrã. Na categoria Dados, cria o
datastore de lista sobre a API
contas, ordenado pornomeascendente, e define as colunas:
| Campo | Cabeçalho |
|---|---|
nome |
Nome |
sector |
Sector |
cidade |
Cidade |
telefone |
Telefone |
email |
Email |
estado |
Estado |
Falta ligar os dois gestos que fazem esta lista servir para alguma coisa. Ambos se escrevem na categoria Eventos, em TypeScript:
No Botão, no evento onClick — abrir a ficha em branco, para criar:
keplin.nav.go("/ficha-de-conta");
Na Tabela, no evento onRowClick — abrir a ficha da linha clicada:
keplin.nav.go("/ficha-de-conta/" + keplin.event.row.id);

Nota
keplin.event.row é a linha em que o utilizador clicou, com todos os
campos do datastore. É por isso que row.id chega para montar o
endereço da ficha.
O ecrã Ficha de Conta — o formulário
Este é o ecrã com mais peças, e o que mostra melhor como os dados funcionam. Abre o ecrã Ficha de Conta.
O parâmetro da rota
- Clica numa zona vazia do canvas — o inspector passa a mostrar o ecrã.
- Na secção Parâmetros de rota, clica em + adicionar parâmetro e
escreve
id. - Deixa Obrigatório desligado. Isto é deliberado: sem
ido ecrã abre em branco, e é assim que o mesmo formulário serve para criar uma conta nova.
A Rota passa a ser /ficha-de-conta/:id.

Os dois datastores do ecrã
Ainda com o ecrã seleccionado, na categoria Dados:
- Clica em + registo. Clica no datastore criado para abrir o modal Configurar datastore.
- Em Nome do datastore, escreve
conta. - Em API de tabela, escolhe
contas. - Em Que registo carregar (chave), clica em + campo da chave e
monta a condição: campo
id, operadoreq, valor Param ▸id. - Deixa Carregar automaticamente ligado e fecha em Concluído.

Agora o segundo, para os contactos da conta:
- Clica em + lista e abre-o.
- Nome
contactosConta, API de tabelacontactos. - Em Filtros (where), acrescenta: campo
conta_id, operadoreq, valor Param ▸id. - Ordena por
nomeascendente.
Dica
Sem condições na chave, um datastore de registo carrega um registo
novo, vazio. É esse comportamento que dispensa um segundo ecrã para
"criar conta": aberto sem id, o formulário começa em branco e a
gravação faz uma inserção.
O formulário
- Arrasta um Painel para a esquerda do canvas. Na categoria
Aspecto, liga Mostrar título e escreve
Dados da empresa. - Arrasta as Caixas de texto para dentro do painel — largar um
widget dentro de um painel torna-o filho dele. Para cada uma, na
categoria Conteúdo escreve a etiqueta e, na categoria Dados,
secção Ligação a dados, escolhe o datastore
contae o campo:
| Etiqueta | Campo | Obrigatório |
|---|---|---|
Nome |
nome |
sim |
NIF |
nif |
não |
Sector |
sector |
não |
Cidade |
cidade |
não |
Telefone |
telefone |
não |
Email |
email |
não |
- Para o estado, usa uma Lista em vez de uma caixa de texto:
etiqueta
Estado, ligada aconta▸estado, Obrigatório ligado, e opções estáticas:
| Valor | Etiqueta |
|---|---|
ativo |
Ativo |
prospeto |
Prospeto |
inativo |
Inativo |
- Arrasta uma Tabela para a direita do painel, ligada ao datastore
contactosConta, com as colunasnome(Nome),cargo(Cargo) etelefone(Telefone), e o títuloContactos desta conta.
Gravar e voltar
Dois Botões por baixo do painel, com o respectivo evento onClick:
Guardar (ícone save):
const ok = await keplin.data.store("conta").save();
if (ok) {
keplin.ui.toast("Conta guardada");
keplin.nav.go("/contas");
}
Voltar (ícone arrow-left):
keplin.nav.go("/contas");
save() valida primeiro — obrigatórios e regras — e só grava se tudo
passar; devolve true quando gravou. É por isso que o aviso e a
navegação estão dentro do if.
O ecrã Oportunidades — o quadro kanban
Abre o ecrã Oportunidades.
- Uma Etiqueta no topo, com o texto
Oportunidades. - Arrasta um Kanban para baixo dela, a toda a largura.
- Na categoria Dados, cria o datastore de lista sobre a API
oportunidades(sem filtro — o quadro mostra tudo), com Por página a 50. - Em Campo de estado (coluna), escolhe
fase. É este campo que diz em que coluna cada cartão vive — e é o que é escrito quando alguém arrasta um cartão. - Em Fonte das colunas, escolhe Estática e usa + adicionar coluna seis vezes:
| Valor | Etiqueta | Cor |
|---|---|---|
prospecao |
Prospeção |
cinzento |
qualificacao |
Qualificação |
azul |
proposta |
Proposta |
âmbar |
negociacao |
Negociação |
roxo |
fechada_ganha |
Ganha |
verde |
fechada_perdida |
Perdida |
vermelho |
- Liga Permitir arrastar cartões e Contagem de cartões; deixa Coluna para sem categoria desligada.
- Em Template do cartão, diz o que cada cartão mostra:
| Campo | Papel |
|---|---|
titulo |
Título |
conta.nome |
Legenda |
valor |
Valor |
- Por baixo do quadro, acrescenta uma Tabela com o título
Todas as oportunidades, ligada a um datastore de lista sobreoportunidades, com as colunastitulo,conta.nome,valor,fase,data_fechoeresponsavel.

Nota
Arrastar um cartão de coluna grava o novo valor de fase no registo,
através da API de tabela — por isso o arrasto só funciona se o
datastore tiver chave primária e a API tiver a acção Update activa.
Ver o resultado
Não há botão de gravar nos ecrãs: as alterações gravam-se sozinhas, e o canto superior direito diz em que pé estão (A gravar…, Gravado).
Para veres o ecrã a sério, clica em Pré-visualizar: a plataforma grava o que estiver pendente e abre o ecrã na app real, num separador novo do browser. Passas pelo login como qualquer utilizador — as contas que entram na app criam-se na etapa Publicar e usar, e até lá podes usar a que já existir.
Porque não…?
- Porque não aparece a minha API na lista de datastores? A API está em rascunho. Abre-a e liga Publicada.
- Porque abre sempre uma ficha vazia? O datastore de registo não tem
condições em Que registo carregar (chave), ou o parâmetro
idnão está a chegar na rota. Confirma que a rota é/ficha-de-conta/:id. - Porque não vejo a coluna
conta.nome? O navigator não está incluído nos Campos incluídos da API de tabela — ou o datastore foi configurado antes de o teres marcado. Reabre Configurar datastore e volta a escolher a API para refrescar o retrato dos campos. - Porque é que o kanban não deixa arrastar? Falta a chave primária no datastore, ou a acção Update na API de tabela.
- Porque é que o gráfico está vazio? O Campo de categoria ou os Campos de valor não estão escolhidos — ou o filtro do datastore não deixa passar nenhuma linha.
Os ecrãs existem, mas ainda não há como saltar entre eles. Próxima etapa: navegação e tema.