Autor |
Mensagem |
|
Você consegue rodar os exemplos com qualquer plugin...
|
 |
|
Recapitulando as alterações feitas nos templates.
No EntradaTag.jsp foram adicionados os dois javascripts :
Code:
<script type="text/javascript">
function verificaLista(obj){
if (obj.length == 1){
document.getElementById("msg."+obj.name).style.display = "";
document.getElementById("msg."+obj.name).innerHTML = "Nenhum registro encontrado";
} else {
document.getElementById("msg."+obj.name).style.display = "none";
}
}
/*
* Essa função limpa os subItens que por acaso possam estar com a mensagem Nenhum registro encontrado
*/
function verificaSubItem(obj){
var partes = obj.name.split('.');
partes.length = partes.length - 2;
for(var i = 0; i < partes.length; i++){
var msg = 'msg';
for(var j = 0; j < partes.length - i; j++){
msg += '.'+partes[j];
}
document.getElementById(msg).style.display = "none";
}
}
</script>
No PropertyTag.jsp foram adionados dois SPANs (ou 3 se desejar a mensagem quando for um dataGrid)
Code:
<span id="msg.${Tproperty.name}"></span>
Linhas 28,61 e 75
Ainda no inicio do PropertyTag.jsp foi adicionado o seguinte bloco:
Code:
<c:if test="${Tproperty.useAjax}">
<c:set target="${Tproperty}" property="onLoadItens" value="verificaLista(this);${Tproperty.onLoadItens}"/>
<c:set target="${Tproperty.dynamicAttributesMap}" property="onchange" value="verificaSubItem(this);${Tproperty.dynamicAttributesMap['onchange']}"/>
</c:if>
Obs: É diferente configurar o onLoadItens do onchange porque o onLoadItens é uma propriedade da tag Property. O onchange não. Mas é possível adicionar um atributo onchange através de dynamic Attributes (presente em todas as tags). Esses dynamicAttributes são acessados através de um mapa chamado dynamicAttributesMap
Atenção: Por causa dessa modificação sempre utilize o atributo onchange com letras minúsculas na sua aplicação. Caso contrário terá que ser feita uma consistencia melhor para a propriedade onchange.
|
 |
|
E finalmente, você pode adicionar
Code:
<c:if test="${Tproperty.useAjax}">
<c:set target="${Tproperty}" property="onLoadItens" value="verificaLista(this);${Tproperty.onLoadItens}"/>
<c:set target="${Tproperty.dynamicAttributesMap}" property="onchange" value="verificaSubItem(this);${Tproperty.dynamicAttributesMap['onchange']}"/>
</c:if>
Ao inicio do arquivo PropertyTag.jsp (logo após a declaração das taglibs)
E então o seu JSP de entrada fica original denovo:
Code:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="n" uri="neo"%>
<%@ taglib prefix="t" uri="template"%>
<t:entrada>
<t:janelaEntrada>
<t:tabelaEntrada>
<t:property name="id"/>
<n:comboReloadGroup useAjax="true">
<t:property name="piezometro.estrutura.area.projeto" />
<t:property name="piezometro.estrutura.area" />
<t:property name="piezometro.estrutura" />
<t:property name="piezometro" />
</n:comboReloadGroup>
<t:property name="data" />
</t:tabelaEntrada>
</t:janelaEntrada>
</t:entrada>
E você passa a ganhar essa funcionalidade para todas as páginas, sem ter que mecher em nenhuma outra página.
Como eu costumo brincar: E isso tudo sai pra você de graça
|
 |
|
Se desejar que dataGrids que forem do modo input também exibam a mensagem adicione o SPAN também na linha 28 do PropertyTag.jsp
|
 |
|
Se você adicionar a seguinte linha:
Code:
<span id="msg.${Tproperty.name}"></span>
No arquivo PropertyTag.jsp, em baixo das tags n:input como no exemplo:
br/com/linkcom/neo/view/template/PropertyTag.jsp
Code:
......
<c:if test="${Tproperty.mode == 'input'}">
<n:input pattern="${Tproperty.pattern}" selectOnePathParameters="${Tproperty.selectOnePathParameters}" insertPath="${Tproperty.insertPath}" holdValue="${Tproperty.holdValue}" showRemoverButton="${Tproperty.showRemoverButton}" optionalParams="${Tproperty.optionalParams}" transientFile="${Tproperty.transientFile}" autoSugestUniqueItem="${Tproperty.autoSugestUniqueItem}" onLoadItens="${Tproperty.onLoadItens}" useAjax="${Tproperty.useAjax}" showLabel="${Tproperty.showLabel}" type="${Tproperty.type}" reloadOnChange="${Tproperty.reloadOnChange}" trueFalseNullLabels="${Tproperty.trueFalseNullLabels}" selectOnePath="${Tproperty.selectOnePath}" itens="${Tproperty.itens}"
label="${Tproperty.label}" selectLabelProperty="${Tproperty.selectLabelProperty}" includeBlank="${Tproperty.includeBlank}" blankLabel="${Tproperty.blankLabel}" cols="${Tproperty.cols}" rows="${Tproperty.rows}" write="${Tproperty.write}" dynamicAttributesMap="${Tproperty.dynamicAttributesMap}">
<n:doBody />
</n:input>
<span id="msg.${Tproperty.name}"></span>
</c:if>
.....
Você deve adicionar o SPAN logo abaixo de </n:input> (linhas 61 e 75)
E, jogando os scripts para o inicio do arquivo br/com/linkcom/neo/view/template/EntradaTag.jsp
O JSP de entrada poderia ficar assim:
Code:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="n" uri="neo"%>
<%@ taglib prefix="t" uri="template"%>
<t:entrada>
<t:janelaEntrada>
<t:tabelaEntrada>
<t:property name="id"/>
<n:comboReloadGroup useAjax="true">
<t:property name="piezometro.estrutura.area.projeto" onLoadItens="verificaLista(this)" onchange="verificaSubItem(this)"/>
<t:property name="piezometro.estrutura.area" onLoadItens="verificaLista(this)" onchange="verificaSubItem(this)"/>
<t:property name="piezometro.estrutura" onLoadItens="verificaLista(this)" onchange="verificaSubItem(this)"/>
<t:property name="piezometro" onLoadItens="verificaLista(this)" onchange="verificaSubItem(this)"/>
</n:comboReloadGroup>
<t:property name="data" />
</t:tabelaEntrada>
</t:janelaEntrada>
</t:entrada>
Essas alterações nos templates não causam efeito colateral!!
|
 |
|
Guilherme, acho que o que você está querendo fazer é isso:
Code:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="n" uri="neo"%>
<%@ taglib prefix="t" uri="template"%>
<script type="text/javascript">
function verificaLista(obj){
if (obj.length == 1){
document.getElementById("msg."+obj.name).style.display = "";
document.getElementById("msg."+obj.name).innerHTML = "Nenhum registro encontrado";
} else {
document.getElementById("msg."+obj.name).style.display = "none";
}
}
/*
* Essa função limpa os subItens que por acaso possam estar com a mensagem Nenhum registro encontrado
*/
function verificaSubItem(obj){
var partes = obj.name.split('.');
partes.length = partes.length - 2;
for(var i = 0; i < partes.length; i++){
var msg = 'msg';
for(var j = 0; j < partes.length - i; j++){
msg += '.'+partes[j];
}
document.getElementById(msg).style.display = "none";
}
}
</script>
<t:entrada>
<t:janelaEntrada>
<t:tabelaEntrada>
<t:property name="id"/>
<n:comboReloadGroup useAjax="true">
<n:panel>Projeto</n:panel>
<n:panel>
<t:property name="piezometro.estrutura.area.projeto" onLoadItens="verificaLista(this)" onchange="verificaSubItem(this)"/>
<span id="msg.piezometro.estrutura.area.projeto"></span>
</n:panel>
<n:panel>Área</n:panel>
<n:panel>
<t:property name="piezometro.estrutura.area" onLoadItens="verificaLista(this)" onchange="verificaSubItem(this)"/>
<span id="msg.piezometro.estrutura.area"></span>
</n:panel>
<n:panel>Estrutura</n:panel>
<n:panel>
<t:property name="piezometro.estrutura" onLoadItens="verificaLista(this)" onchange="verificaSubItem(this)"/>
<span id="msg.piezometro.estrutura"></span>
</n:panel>
<n:panel>Piezometro</n:panel>
<n:panel>
<t:property name="piezometro" onLoadItens="verificaLista(this)" onchange="verificaSubItem(this)"/>
<span id="msg.piezometro"></span>
</n:panel>
</n:comboReloadGroup>
<t:property name="data" />
</t:tabelaEntrada>
</t:janelaEntrada>
</t:entrada>
A função verificaLista é a mesma que vc já tinha passado.
A função verificaSubItem é importante para a seguinte situação. Suponha que piezometro está com a mensagem nenhum item encontrado, se trocarmos o projeto, essa mensagem tem que ser limpa. É isso que essa função faz.
A tag tabelaEntrada coloca um panelGrid com 2 colunas. Então, se desejar que um property e um outro componente fiquem na mesma TD, eles devem ser englobados por um panel. Foi criado um panel para o label, porque como incluimos o property dentro de um panel, nós perdemos o panel do label. Também é possível fazer com 3 colunas, mas a mensagem ficaria alinhada a terceira coluna e nao ao lado do combo.
Se desejar fazer com 3 colunas me fale que eu faço o exemplo.
Nesse exemplo que te passei cada n:panel representa um TD dentro da tabela.
Veja se é isso mesmo, e me fale se ainda restar alguma dúvida..
Esse comportamento será o padrão do seu sistema? Porque se for, é mais fácil adicionar essa funcionalidade aos templates...
|
 |
|
funciona de qualquer jeito
|
 |
|
Você pode utilizar um command que possua uma propriedade projeto tb.
Exemplo:
Code:
public class Bean {
Projeto projeto;
.. getters e setters...
}
Code:
public ModelAndView action(WebRequestContext request, Bean bean){
Projeto projeto = bean.getProjeto();
}
Assim você evita ter que manipular a string que veio no request.
Se chegar na requisicao
projeto=br.com.geoexplore.geoenterprise.adm.bean.Projeto[id=3]
O campo projeto será criado no bean e o id atribuido.
|
 |
|
Túlio já temos suporte a formatação de java.util.Date, java.sql.Date, java.util.Calendar.
Colocaremos na próxima versão suporte para java.sql.Timestamp, boa sugestão.
|
 |
|
Você pode utilizar Javascript também..
Tem como até ficar automático
Modificando os templates da listagem...
Vou verificar como isso pode ser feito via javascript e assim que tiver um exemplo eu te mando o código...
Na sua empresa vc faz com reload da tela ou via javascript?
|
 |
|
Você pode criar um campo do tipo combo, e setar o valor do atributo reloadOnChange para true.
Isso fará com que toda vez que o combo for modificado seja feito um reload da tela.
No JSP você pode utilizar a tag c:if para determinar quais campos devem ser mostrados.
|
 |
|
Pedro, WebRoot só existe se você estiver utilizando MyEclipse
|
 |
|
Suponha que / é a raiz da aplicação..
Então você vai ter
/css/default.css
/WEB-INF/web.xml
etc...
|
 |
|
Valew vinicius..
Bem. Se você se refere ao default.css que vem no diretorio sample. Não é necessário colocá-lo na aplicação. A não ser que deseje sobrescrevê-lo.
Se desejar sobrescrever o default.css que vem no neo. Você pode colocá-lo no diretório /css da sua aplicação.
Qualquer arquivo *.css dentro do /css será incluido no header da página.
Qualquer arquivo *.js dentro do /js será includi no header da página.
|
 |
|
A documentação do NEO foi atualizada e agora possui um capítulo chamado CRUD.
Mas, para criar um filtro na listagem você pode fazer o seguinte:
Primeiro você deve criar a classe do filtro, no caso do CRUD, ela deve extender FiltroListagem.
Code:
public class MeuFiltro extends FiltroListagem {
String nome;
Municipio municipio;
... getters e setters...
}
o segundo passo é atualizar o controller para possui o filtro:
Code:
@Controller(.....)
public class AlunoCrud extends CrudController<MeuFiltro, Aluno, Aluno> {
......
}
o terceiro passo é atualizar a query no dao. Voce pode utilizar o método updateListagemQuery.
Code:
public class AlunoDAO extends GenericDAO<Aluno> {
public updateListagemQuery(QueryBuilder<BEAN> query, FiltroListagem _filtro){
MeuFiltro filtro = (MeuFiltro) _filtro;
query
.whereLike("aluno.nome", filtro.getNome())
.where("aluno.municipio = ?", filtro.getMunicipio());
}
}
e finalmente alterar o JSP de listagem:
Code:
<t:listagem>
<t:janelaFiltro>
<t:tabelaFiltro>
<t:property name="nome"/>
<t:property name="municipio"/> <%-- Se municipio for uma entidade isso será um combo --%>
</t:tabelaFiltro>
</t:janelaFiltro>
<t:janelaResultados>
......
</t:janelaResultados>
</t:listagem>
É isso...
|
 |
|