A recepção do Departamento — onde o usuário chega depois de clicar no card do módulo no saguão principal. Foi criada na sequência Novo Módulo com o esqueleto vazio: sidebar sem itens, MenuItem que só atende MID zero, Title que só mostra "DEPARTAMENTO". Agora a gente EDITA este arquivo pra plugar a primeira entidade: adicionar o item "Produtos" no sidebar, o case 1 no MenuItem (que abre a DepartamentoProdutoList), e o breadcrumb "Produto" no Title. Último passo da sequência CRUD READ.
Nota: esta é uma edição PEDAGÓGICA — na vida real, o aluno vai VOLTAR a este arquivo toda vez que uma nova entidade for plugada no módulo. Cada entidade adiciona seu próprio m.add, seu próprio case no MenuItem, e seu próprio case no Title.
package br.xt.app.departamento;
import br.jasap.core.Effect;
import br.jasap.effect.Response;
import br.jasap.gui.JasapPage;
import br.jasap.gui.SideMenu;
import br.jasap.gui.Table;
import br.jasap.gui.TableRow;
import br.jasap.util.Js;
import br.xt.AppsRootAction;
import br.xt.acore.view.XtPage;
import br.xt.app.departamento.produto.DepartamentoProdutoList;
public class DepartamentoHome extends AppsRootAction {
public static final String MID = "__DEPARTAMENTO_MID";
@Override
public Effect execute() throws Exception {
render();
return new Response();
}
public void render() throws Exception {
XtPage page = new XtPage(getManager());
if (isAjaxCall()) {
eval(Js.CLOSE_SUB_WINDOWS);
} else {
page.getBody().append(page.content("", "", false));
page.setWinTitle("Departamento");
page.getCommands().add(link(MenuItem.class).putInteger(MID, 0).ajax());
getOutput().write(this, page);
}
}
public static class Title extends DepartamentoHome {
@Override
public Effect execute() throws Exception {
int mid = getInput().getInteger(MID, 0);
Table aux = new Table(getManager());
TableRow line = aux.row();
if (mid == 0) {
line.col().setStyle("padding: 0 5 0 5;").setContent(ui().btTitleActive("DEPARTAMENTO", ""));
} else {
line.col().setStyle("padding: 0 5 0 5;").setContent(ui().btTitle("DEPARTAMENTO", link(Title.class).putInteger(MID, 0).ajax()));
switch (mid) {
case 1: line.col().setStyle("padding: 0 5 0 5;").setContent(ui().btTitleActive("Produto", "")); break;
}
}
update(JasapPage.DIV_HEADER_LEFT, aux);
update(JasapPage.DIV_HEADER_CENTER, "");
return new Response();
}
}
public static class MenuItem extends DepartamentoHome {
@Override
public Effect execute() throws Exception {
int mid = getInput().getInteger(MID, 0);
if (mid > 0) {
eval(link(Title.class).putInteger(MID, mid).ajax());
switch (mid) {
case 1: eval(preAjax(DepartamentoProdutoList.class).modalMax()); break;
}
eval(link(Title.class).putInteger(MID, mid).ajax(false));
} else {
eval(link(MenuInicial.class).ajax(false));
eval(link(Title.class).putInteger(MID, mid).ajax(false));
}
return new Response();
}
}
public static class MenuInicial extends DepartamentoHome {
@Override
public Effect execute() throws Exception {
SideMenu m = new SideMenu();
m.add(true, "Produtos", link(MenuItem.class).putInteger(MID, 1).ajax(), null);
update("sidebar", m.toHtml());
return new Response();
}
}
}
Mudanças nesta fase: 4 linhas destacadas em verde: 1 import, 1 case no Title (linha 51), 1 case no MenuItem (linha 71), e 1 m.add na MenuInicial (linha 82). O resto do arquivo já existia desde a sequência Novo Módulo.
MID é o "número do guichê" — um inteiro que identifica QUAL entidade do módulo o usuário está acessando. Zero = recepção (nenhuma entidade selecionada). Cada entidade nova ganha um número sequencial.
| MID | Entidade | Significado |
|---|---|---|
| 0 | — | Recepção / sidebar aberta |
| 1 | Produto | Setor de listagem de Produto aberto |
| (futuro) 2 | Pessoa | Setor de Pessoa aberto |
| (futuro) 3 | Perfil | Setor de Perfil aberto |
O MID viaja no input do request, é lido com getInput().getInteger(MID, 0), e serve como chave pro switch em MenuItem e Title.
m.add(true, "Produtos", link(MenuItem.class).putInteger(MID, 1).ajax(), null)true no primeiro parâmetro diz "está ativo/visível". O último parâmetro (null) é um ícone — neste caso sem ícone.case 1: eval(preAjax(DepartamentoProdutoList.class).modalMax()); break;preAjax é um helper que chama um setor preparando pra modal; o modalMax diz "abra em tela cheia".case 1: line.col().setStyle("padding: 0 5 0 5;").setContent(ui().btTitleActive("Produto", "")); break;MenuItem com MID=1mid > 0:
Title com MID=1 → atualiza breadcrumb (DEPARTAMENTO > Produto)switch, case 1: eval(preAjax(DepartamentoProdutoList.class).modalMax()) → abre a lista em tela cheiaTitle com MID=1 via ajax(false) → confirma o breadcrumbDepartamentoProdutoList monta a ListView e devolve o recorte HTMLDigamos que o módulo ganhe uma entidade "Pessoa". O aluno vai voltar aqui e adicionar:
import br.xt.app.departamento.pessoa.DepartamentoPessoaList;m.add(true, "Pessoas", link(MenuItem.class).putInteger(MID, 2).ajax(), null);case 2: eval(preAjax(DepartamentoPessoaList.class).modalMax()); break;case 2: line.col().setStyle("padding: 0 5 0 5;").setContent(ui().btTitleActive("Pessoa", "")); break;4 linhas novas pra plugar cada entidade adicional. O padrão repete.
A estrutura inteira do Home — a classe DepartamentoHome, os métodos execute e render, as inner classes Title, MenuItem e MenuInicial, a constante MID — já existia desde a sequência Novo Módulo. Só que vazia: o sidebar não tinha nenhum item, o switch do MenuItem estava vazio, o switch do Title também.
4 linhas específicas ao plugar a primeira entidade (Produto):
DepartamentoProdutoListm.add na MenuInicialcase 1 no switch do MenuItemcase 1 no switch do Title