A List ganha uma barra inferior com o botão "Novo Registro" que abre o Form em modal. Edição pontual: 3 imports novos, o método br() e uma linha extra no window().
package br.xt.app.departamento.produto;
import br.jasap.core.Effect;
import br.jasap.effect.Response;
import br.jasap.gui.JasapPage;
import br.jasap.gui.ListColumn;
import br.jasap.gui.ListLine;
import br.jasap.gui.ListView;
// ADICIONAR
import br.jasap.gui.Bar;
import br.jasap.gui.Button;
// FIM
import br.jasap.gui.Table;
import br.jasap.gui.Toast;
import br.jasap.util.JasapFunctions;
import br.jasap.util.Js;
// ADICIONAR
import br.jasap.util.ModalConfig;
// FIM
import br.jasap.util.exceptions.SQLConstraintException;
import br.xt.acore.view.IconButton;
import br.xt.acore.view.XtPage;
public class DepartamentoProdutoList extends DepartamentoProdutoAction {
@Override
public Effect execute() throws Exception {
render();
return new Response();
}
public void render() throws Exception {
XtPage page = new XtPage(getManager());
if (isAjaxCall()) {
update(JasapPage.DIV_WINDOW, page.content(window().toHtml()));
} else {
page.getTable()
.setBorder(4)
.rowC("100%")
.setContent(page.content(window().toHtml()))
.setStyle(ui().stretchBorder());
page.setWinTitle("Produtos");
getOutput().write(this, page);
}
}
public Table window() throws Exception {
Table w = new Table(getManager()).setSize("100%", "100%");
w.rowC("99%", JasapPage.DIV_WSPACE, lView());
w.rowC("1%", null, ui().line());
// ADICIONAR
w.rowC("1%", JasapPage.DIV_BOTTOM, br());
w.rowC("1%", null, ui().line());
// FIM
return w;
}
// ADICIONAR
public Bar br() throws Exception {
Button cmd_novo = ui().button(" Novo Registro ")
.setCss("btn btn-success btn-lg").setNoSize()
.setOnClick(link(DepartamentoProdutoForm.ShowInsert.class)
.modal(new ModalConfig().setWidth("750").setHeight("570")
.setOnCloseURL(url(DepartamentoProdutoList.class))));
return ui().bar()
.addRight(cmd_novo);
}
// FIM
private ListView lv = null;
public ListView lView() throws Exception {
// ... (sem alteração — mesmo código da sequência DELETE)
if (lv == null) {
lv = ui().lView();
lv.setOrderBy(DepartamentoProdutoBean.NOME_PRODUTO);
lv.setPageSize(9999);
lv.setFiltro(getFiltro());
getFactory().departamento().proModel().daoList(lv.getData());
ListColumn col_nome = lv.newColumn("Nome").setWidth(220).setPadding(";padding:10 8 10 8;");
ListColumn col_vl = lv.newColumn("Valor").setWidth(100).setPadding(";padding:10 8 10 8;").alignCenter();
ListColumn col_qtd = lv.newColumn("Qtd").setWidth(80).setPadding(";padding:10 8 10 8;").alignCenter();
ListColumn col_obs = lv.newColumn("Observação").setPadding(";padding:10 8 10 8;");
ListColumn col_del = lv.newColumn("").setWidth(50).setPadding(";padding:6 4 6 4;").alignCenter();
while (lv.hasNext()) {
DepartamentoProdutoBean bean = (DepartamentoProdutoBean) lv.next();
ListLine line = lv.createLine();
col_nome.setContent(bean.getNome_produto());
col_vl.setContent(bean.getVl_produto());
col_qtd.setContent(bean.getQtd_produto());
col_obs.setContent(bean.getObs_produto());
col_del.setHtmlData(new IconButton("trash")
.setColor("#d9534f")
.setTitle("Excluir")
.setOnclick(link(DeleteFromList.class).putInteger(DepartamentoProdutoBean.ID_PRODUTO, bean.getId_produto()).ajax())
.toHtml());
lv.addLine(line);
}
}
return lv;
}
// ... getFiltro(), DeleteFromList, constantes (sem alteração)
public static final String LIST = ROOT.concat("__LIST/");
public static final String FILTRO = LIST.concat("__FILTRO");
public static final String CONFIRM_LIST = LIST.concat("__CONFIRM_LIST");
}
Mudanças nesta sequência: 3 imports novos (Bar, Button, ModalConfig), 2 linhas no window(), e o método br() inteiro. Tudo o mais já existia das sequências READ e DELETE.
ModalConfig — abrindo o Form como modal
O botão "Novo Registro" usa link().modal(new ModalConfig()...) pra abrir o Form:
link(DepartamentoProdutoForm.ShowInsert.class)
.modal(new ModalConfig()
.setWidth("750")
.setHeight("570")
.setOnCloseURL(url(DepartamentoProdutoList.class)))
Três configurações:
setWidth / setHeight — dimensões fixas do modal (750×570 pixels). O Form aparece como janela flutuante centralizada sobre a lista.setOnCloseURL — URL executada automaticamente quando o modal fecha. Aponta pra própria DepartamentoProdutoList, que re-renderiza a lista inteira — assim o produto recém-criado aparece na tabela.Comparação com a List (que abre em tela cheia): a List é chamada via preAjax().modalMax() no DepartamentoHome. O Form é chamado via modal(new ModalConfig().setWidth().setHeight()) — modal com dimensões fixas, menor que a tela.
O botão "Novo Registro" fica na barra inferior (DIV_BOTTOM), abaixo da lista — mesmo padrão do Laboratório. A barra é montada pelo br() e posicionada no window():
w.rowC("99%", JasapPage.DIV_WSPACE, lView()); // lista ocupa quase tudo
w.rowC("1%", null, ui().line()); // separador
w.rowC("1%", JasapPage.DIV_BOTTOM, br()); // barra com botão
w.rowC("1%", null, ui().line()); // separador final
Quando a lista tiver paginação (episódio futuro), a navegação de páginas também vai entrar nessa barra — bar.addCenter(lv.nav(...)). O botão "Novo Registro" fica à direita, a navegação no centro.