DepartamentoHome editar arquivo

0:00 / 0:00

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.

CÓDIGO COMPLETO
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.

A convenção do MID — número do guichê

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.

MIDEntidadeSignificado
0Recepção / sidebar aberta
1ProdutoSetor de listagem de Produto aberto
(futuro) 2PessoaSetor de Pessoa aberto
(futuro) 3PerfilSetor 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.

As 3 edições — o que cada uma faz
  1. MenuInicial — m.add(true, "Produtos", link(MenuItem.class).putInteger(MID, 1).ajax(), null)
    Adiciona o item "Produtos" no sidebar lateral. Quando clicado, dispara um Ajax pra MenuItem passando MID=1. O true no primeiro parâmetro diz "está ativo/visível". O último parâmetro (null) é um ícone — neste caso sem ícone.
  2. MenuItem — case 1: eval(preAjax(DepartamentoProdutoList.class).modalMax()); break;
    Quando o MID é 1, dispara a abertura da DepartamentoProdutoList via preAjax + modalMax. O preAjax é um helper que chama um setor preparando pra modal; o modalMax diz "abra em tela cheia".
  3. Title — case 1: line.col().setStyle("padding: 0 5 0 5;").setContent(ui().btTitleActive("Produto", "")); break;
    Quando o MID é 1, adiciona o letreiro "Produto" no breadcrumb depois de "DEPARTAMENTO". Fica tipo "DEPARTAMENTO > Produto".
Fluxo completo — do clique até a listagem
  1. Usuário clica em "Produtos" no sidebar
  2. Dispara Ajax pra MenuItem com MID=1
  3. Entra no caminho mid > 0:
    1. Dispara Title com MID=1 → atualiza breadcrumb (DEPARTAMENTO > Produto)
    2. Entra no switch, case 1: eval(preAjax(DepartamentoProdutoList.class).modalMax()) → abre a lista em tela cheia
    3. Dispara Title com MID=1 via ajax(false) → confirma o breadcrumb
  4. A DepartamentoProdutoList monta a ListView e devolve o recorte HTML
  5. O browser cola o recorte por cima da recepção — agora o usuário vê a lista
Como plugar uma entidade NOVA no futuro

Digamos que o módulo ganhe uma entidade "Pessoa". O aluno vai voltar aqui e adicionar:

  1. Import: import br.xt.app.departamento.pessoa.DepartamentoPessoaList;
  2. MenuInicial: m.add(true, "Pessoas", link(MenuItem.class).putInteger(MID, 2).ajax(), null);
  3. MenuItem: case 2: eval(preAjax(DepartamentoPessoaList.class).modalMax()); break;
  4. Title: 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.

Partes já existentes (da sequência Novo Módulo)

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.

Partes adicionadas nesta fase CRUD READ

4 linhas específicas ao plugar a primeira entidade (Produto):

  1. 1 import da DepartamentoProdutoList
  2. 1 m.add na MenuInicial
  3. 1 case 1 no switch do MenuItem
  4. 1 case 1 no switch do Title