VRaptor numerar itens de um List<Object> automaticamente, uma contribuição

Pessoal gostaria de contribuir com uma função em javascript/jquery que eu criei para numerar automaticamente itens do formulário

Quando temos vários inputs com o mesmo nome
ex:

[code]

[/code]

com a função podemos deixar sem a numeração
ex:

[code]

[/code]

no onsubmit do form chamamos a função
ex:

onsubmit=“prepareList(this);”

automaticamente os campos serão renomeados para

[code]

[/code]

então recebemos no java

public void salvar(List<Cliente> cliente){ ... }

function prepareList(form){ var objeto, atributo, arrObjeto=[]; $(form).find("*[name*='[].']").each(function(){ objeto = $(this).attr("name").split("[].")[0]; atributo = $(this).attr("name").split("[].")[1]; var i = 0; $(document.getElementsByName(objeto + "[]." + atributo)).each(function(){ $(this).attr("newName", objeto + "[" + i + "]." + atributo); i++; }); }); $("*[newName]").each(function(){ this.name = $(this).attr("newName"); $(this).removeAttr("newName"); }); }

quem quiser comentar, melhorar, criticar, elogiar fique a vontade

Um grande abraço…

olá rodrigo_web…

como vc tah gerando o código do formulario?

Esta função é útil quando se gera os inputs pelo javascript…
ex:

Um fomulário de Compromissos

[code]Data:

Compromissos

Descrição Inicio Fim
[/code]

vc pode guardar uma variável que tenha o número de compromissos até agora, e usar ele como indice dos arrays tb…

Mas se eu tiver outros itens além de compromissos num mesmo formulário, terei que guardar uma variável pra cada item…

atualmente da até para deixar um .js padrão em todos os formulários…

ex:

[code]$(document).ready(function(){

$("form").submit(function(){prepareList(this);});

});[/code]

qualquer campo de contenha no nome os colchetes [] a função vai indexar…

aí talvez a sua tela esteja fazendo coisas demais :wink:
mas enfim, sua solução é boa =)

o que a gente costuma fazer também em “formularios dinâmicos” desse tipo, é criar uma tela onde vc adiciona as linhas uma por uma por ajax, ou seja, no seu caso vc clicaria no link/botão pra adicionar uma linha de compromisso, e no final dela teria um botão que salvaria só essa linha por ajax, aí o usuario continuaria adicionando compromissos…

Tem razão, as telas que faço já chegou a ter uns 10 itens diferentes… :slight_smile:

Mas usando ajax+session como na apostila, não vai dar problema caso o usuário abra uma nova aba?

depende do browser…

mas vc não precisa fazer necessariamente usando a session, vc pode atualizar os compromissos passando o id da entidade que ele eh ligado…

Mas se o registro for novo eu não vou ter o id para sincronizar…

o problema do usuario abrir outra aba é só se o usuario tentar fazer o mesmo cadastro em duas abas diferentes…

pra resolver isso vc pode dar uma chave aleatória no inicio do processo, e usar essa chave toda vez que adicionar algo na sessão… daí cada aba teria uma chave diferente

Boa idéia essa da id aleatória…

Mas se ao invés do usuário abrir uma nova aba ele atualizar a tela, isso gerará uma nova id aleatoria e a session não poderá ser recuperada…

Certo é que não da pra deixar tudo perfeito, sempre tem furos para o usuário explorar

[youtube]http://www.youtube.com/watch?v=eZHQ8tEJe7U[/youtube] Neste sistema foi solicitado um layout com multiabas, até ai tudo bem, o problema foi o botão voltar
pois cada aba é um iframe e como o histórico é global quando usuário clica no voltar da aba 1 executava history.back() na aba 2…

A solução foi criar um histórico falso um array em javascript que é alimentado a cada onload da aba…funciona razoavelmente bem…

[quote=Lucas Cavalcanti][/quote]
Lucas, se eu receber uma lista da minha página JSP do tipo:

pessoa.enderecos[0].endereco
pessoa.enderecos[1].endereco

e no controller

public void pessoa (Pessoa pessoa)
...

classe pessoa:

public class Pessoa {
....
public Set<Endereco> enderecos ;
....
}

A questão é , dá certo com java.util.Set ? não estou conseguindo fazer funcionar com Set.

o VRaptor não suporta Set ainda… https://github.com/caelum/vraptor/issues/139

isso pq você não pode fazer meuSet.get(0), daí fica difícil popular os parâmetros na ordem certa…

[quote=Lucas Cavalcanti]o VRaptor não suporta Set ainda… https://github.com/caelum/vraptor/issues/139

isso pq você não pode fazer meuSet.get(0), daí fica difícil popular os parâmetros na ordem certa…
[/quote]

Muito Obrigado Lucas,

Sá mais uma perguntinha, na minha classe pessoa o meu atributo dataNascimento é do tipo JodaTime, mas não estou conseguindo enviar para controller.

@Type(type="org.joda.time.contrib.hibernate.PersistentDateTime")
private DateTime dataNascimento;

JSP:

<input name="pessoa.dataNascimento">

ele dá algum erro de conversão? ou vem nulo?

acabei de fazer um teste

Se eu digitar no input a data no formato: 2011-10-18 da certo,
mas se eu digitar no formato 18-10-2011 vai nulo.

O VRaptor tem um converter que leva em consideração o locale para decidir qual é o formato de data… O problema talvez seja que o VRaptor tem o converter para LocalDateTime, não DateTime…

tenta criar um converter igual a esse:

só que trocando de LocalDateTime para DateTime em todos os lugares

[quote=Lucas Cavalcanti]O VRaptor tem um converter que leva em consideração o locale para decidir qual é o formato de data… O problema talvez seja que o VRaptor tem o converter para LocalDateTime, não DateTime…

tenta criar um converter igual a esse:

só que trocando de LocalDateTime para DateTime em todos os lugares[/quote]

Valeu Lucas pela sua ajuda.

Resolvi o problema apenas colocando no meu projeto uma classe semelhante a essa que você me passou dessa forma:

import java.util.ResourceBundle;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import br.com.caelum.vraptor.Convert;
import br.com.caelum.vraptor.Converter;

@Convert(DateTime.class)
public class DataConvert implements Converter<DateTime> {	
	@Override  
    public DateTime convert(String value, Class<? extends DateTime> arg1, ResourceBundle arg2) {  
        // TODO Auto-generated method stub  
        try {  
        	DateTimeFormatter fmt = DateTimeFormat.forPattern("dd/MM/yyyy");
            return new DateTime(fmt.parseDateTime(value));  
        } catch (Exception e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
            return null;  
        }  
    }
}

Deus abençoe.