Última edição da sequência CREATE. Quatro linhas regAction no config() pra registrar o Form e suas inner classes. Sem essas linhas, o framework não enxerga os setores e qualquer clique no formulário daria "setor não encontrado".
package br.xt.app.departamento;
// ADICIONAR
import br.xt.app.departamento.produto.DepartamentoProdutoForm;
// FIM
import br.xt.app.departamento.produto.DepartamentoProdutoList;
import br.xt.app.painel.PnlManager;
public class DepartamentoManager extends PnlManager {
public static final String F_ACESSO_MODULO = "XT.PAINEL_CONTROLE.ACESSO_MODULO.DEPARTAMENTO";
@Override
public void config() throws Exception {
regFun("PAINEL DE CONTROLE", "Acesso ao Módulo", "DEPARTAMENTO", F_ACESSO_MODULO);
regAction(DepartamentoHome.class);
regAction(DepartamentoHome.Title.class);
regAction(DepartamentoHome.MenuItem.class);
regAction(DepartamentoHome.MenuInicial.class);
regAction(DepartamentoProdutoList.class);
regAction(DepartamentoProdutoList.DeleteFromList.class);
// ADICIONAR
regAction(DepartamentoProdutoForm.class);
regAction(DepartamentoProdutoForm.ShowInsert.class);
regAction(DepartamentoProdutoForm.Insert.class);
regAction(DepartamentoProdutoForm.Cancelar.class);
// FIM
}
}
Mudanças nesta sequência: 1 import novo e 4 linhas regAction (verde). Tudo o mais já existia das sequências anteriores.
regAction e não 1?
Cada inner class é, em runtime, uma classe Java separada. O framework não "descobre" automaticamente as inner classes de uma action — cada uma precisa da sua própria linha regAction:
regAction | Classe | Acionada quando |
|---|---|---|
| 1 | DepartamentoProdutoForm | Classe base (fallback, chamada direta) |
| 2 | ShowInsert | Clique em "Novo Registro" na lista |
| 3 | Insert | Clique em "Salvar" no form |
| 4 | Cancelar | Clique em "Cancelar" no form |
Se o regAction do Insert estivesse faltando, o usuário preencheria o form, clicaria Salvar, e receberia erro — o request chegaria mas o framework não encontraria o setor.
Observe como os regAction estão organizados por arquivo-fonte, com linha em branco separando cada grupo:
// DepartamentoHome (4 classes)
regAction(DepartamentoHome.class);
regAction(DepartamentoHome.Title.class);
regAction(DepartamentoHome.MenuItem.class);
regAction(DepartamentoHome.MenuInicial.class);
// DepartamentoProdutoList (2 classes)
regAction(DepartamentoProdutoList.class);
regAction(DepartamentoProdutoList.DeleteFromList.class);
// DepartamentoProdutoForm (4 classes)
regAction(DepartamentoProdutoForm.class);
regAction(DepartamentoProdutoForm.ShowInsert.class);
regAction(DepartamentoProdutoForm.Insert.class);
regAction(DepartamentoProdutoForm.Cancelar.class);
Essa organização facilita saber quantos setores cada arquivo contribuiu. Na sequência UPDATE, o bloco do Form vai crescer com ShowUpdate, Update e Delete.
Com estas linhas, a sequência CRUD CREATE está pronta:
| Arquivo | Tipo | Edição |
|---|---|---|
| DepartamentoProdutoDAO | editar | Método daoInsert (1 linha) |
| DepartamentoProdutoModel | editar | Wrapper insert(bean) (1 linha) |
| DepartamentoProdutoAction | editar | Método proBean() com getInstance |
| DepartamentoProdutoForm | novo | Formulário completo: 4 campos, 3 inner classes, render/window/form/br |
| DepartamentoProdutoList | editar | Botão "Novo Registro" + br() + ModalConfig |
| DepartamentoManager | editar | 1 import + 4 regAction |
Cinco arquivos editados, um arquivo novo. Resultado: a tela de listagem agora tem um botão que abre formulário de cadastro, salva no banco e atualiza a lista automaticamente.
Próxima sequência: CRUD UPDATE — editar produtos existentes e excluir pelo formulário.