mai 03

Remoção de um item de datatable sem dar update no form inteiro no primefaces

Bom o título é grande mas o assunto é confuso. Contextualizando, imagine que você queira permitir ao seu usuário incluir vários campos de telefone, porém ele pode inserir N telefones, para isso você precisa que sejam campos dinâmicos.

No JSF  você pode fazer isso criando uma coleção no seu managedBean e utilizando o componente datatable. Assim ao inserir um novo telefone você chama um método que acrescenta um novo item a sua coleção e da update no datatable.

Porém digamos que o usuário adicionou acidentalmente um outro campo de telefone e queira removê-lo. Para isso é necessário um botão que faça tal ação, chamando um método do managedBean para remover o item desejado da lista.

Mas, porém, contudo, no entanto dentro de um datatable o update de um p:commandButton só funciona passando o parâmetro @form, que faz um refresh do formulário inteiro, o que nem sempre é desejado, pois somente queremos dar update no datatable.

Depois de muito discutir com amigos e pesquisar uma solução, descobri uma forma de fazer isso utilizando o componente p:remoteCommand, da seguinte maneira:

No botão de remover você faz:


<p:commandButton value="remover" type="button"
     onclick="removeRC({param:#{row}})" ></p:commandButton>

ATENÇÂO, a solução acima não se aplica para a versão 3.5+ do primefaces, caso esteja utilizando-a faça da seguinte maneira:


<p:commandButton value="remover" type="button"
     onclick="removeRC([{name:'param',value:#{row}}])" ></p:commandButton>

Onde row é o nome do atributo rowIndexVar do p:dataTable.

Aí fora da datatable vc usa um p:remoteCommand:


<p:remoteCommand name="removeRC" 
    update="datatableID" actionListener="#{MB.remove}">

</p:remoteCommand>

E pronto, é só agora fazer seu MB com os métodos como o exemplo abaixo e você conseguirá contornar esse bug do primefaces

@ManagedBean(name = "MB")
@ViewScoped
public class MB {

	private List<String> telefones;	

	public MB() {

		telefones = new ArrayList();
		for (int i = 0; i < 3; i++) {
			telefones.add(new String());
		}
	}		

	public void addList() {
		telefones.add(new String());
	}

	public void remove(ActionEvent event) {
		FacesContext context = FacesContext.getCurrentInstance();
		Map map = context.getExternalContext().getRequestParameterMap();		
		int row = Integer.parseInt(map.get("param"));
		telefones.remove(row);
	}

	public List getTelefones() {
		return telefones;
	}

	public void setTelefones(List telefones) {
		this.telefones = telefones;
	}
}

mai 03

Apps para quem gosta de viajar!

Ando meio sumido, mas esse ano tá pegando no trabalho, então tá meio difícil postar algo aqui.
Como agora estou entrando de férias vou postar algo que ajude a planejar férias pra quem tem smartphones android, mas alguns desses apps também tem para iphone.
O primeiro é o tourist eye, aqui você poderá encontrá-lo no google play, antigo market. Com ele você pode organizar suas viagens tanto no site quanto no smartphone, porém para incluir as atrações somente no site por enquanto.

página inicial do touristeye

Depois de criar seu itinerário no site você pode fazer o download dele no app, das cidades, incluindo os mapas e das atrações e restaurantes, para poder acessá-los a qualquer momento sem precisar de acesso a internet, pois ninguém é doido de ficar pagando 3g em roaming internacional.  É bem intuitivo e fácil de usar. No site também pode exportar o itinerário para PDF, para aqueles que ainda gostam do bom e velho papel é só imprimir, fica muito bom, com a descrição das atrações e pequenos mapas. E o melhor de tudo : é gratuito. Entra lá experimenta e qualquer coisa comenta aqui.

Outro que eu recomendo é um guia de cidade em formato de app, ele é do tripadvisor que é um famoso site de viagens. Ele possui o guia da cidade de algumas cidades mais famosas como Nova Iorque, Paris , Londres, Amsterdam, etc. Nele você baixa várias informações da cidade, como restaurantes, locais para visitar, hotéis, mapas, fotos, comentários.

Por hoje é isso aí, espero retomar o blog com mais informações e em breve com algumas dicas da minha viagem de férias.