Muitas aplicações se baseiam em um layout com links na esquerda e com um tabPanel ao centro. Depois de responder alguns posts no fórum brasileiro sobre como abrir itens de um menu em um tabPanel central, estou escrevendo sobre o assunto aqui no blog através de tutorial.
Primeiramente vamos criar uma subpasta abrirPaginaCentro dentro da pasta examples do Ext. Depois disso criar um arquivo index.html com o código abaixo e um arquivo abrirPaginaCentro.js, por enquanto em branco.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Abrindo páginas de menu no centro da aplicação - www.extdesenv.com.br</title>
<!--css-->
<link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css"/>
<link rel="stylesheet" type="text/css" href="../shared/examples.css" />
<link rel="stylesheet" type="text/css" href="../shared/icons/silk.css" />
<style type="text/css">
.no-icon {
display: none;
}
</style>
<!--js-->
<script type="text/javascript" src="../../adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="../../ext-all.js"></script>
<script type="text/javascript" src="abrirPaginaCentro.js"></script>
</meta></head>
<body>
</body>
</html>
Sua configuração deve estar assim:
- examples
- abrirPaginaCentro
- abrirPaginaCentro.js
- index.html
- abrirPaginaCentro
Então agora no arquivo JS vou criar definir uma nova classe AbrirPaginaCentro:
var AbrirPaginaCentro = Ext.extend(Ext.util.Observable,{
constructor: function(){
//..aqui vai toda definição dos componentes...
//super
AbrirPaginaCentro.superclass.constructor.apply(this,arguments);
}
});
Ext.onReady(function()
{
new AbrirPaginaCentro();
});
Feito esse esqueleto de classe vamos em 3 passos fazer tudo funcionar:
-
Crio os componentes: o tabPanel, o viewport para conter os itens, e o menu lateral formado de um painel accordion com treePanels. O seu menu lateral pode ser o que quiser, treePanels, labels, buttons…Não importa o componente, o que importa é que quando clicado dispare um evento.
//tabPanel this.tabPanelCentral = new Ext.TabPanel({ region : 'center', activeTab : 0, defaults : {closable: true}, items : [{ title : 'Portal', closable : false }] }); //criar layout new Ext.Viewport({ layout : 'border' ,items : [{ //menu lateral region : 'west' ,layout : 'accordion' ,defaultType : 'treepanel' ,width : 300 ,split : true ,layoutConfig : {fill: false, animate:true} ,defaults : { border : false ,rootVisible: false ,listeners:{ scope: this ,click: this.onNodeClick } } ,items : [{ title : 'Cadastros' ,iconCls: 'silk-add' ,root : { children: [ {text:'Atendentes' , leaf:true, iconCls:'no-icon'} ,{text:'Solicitantes' , leaf:true, iconCls:'no-icon'} ,{text:'Clientes' , leaf:true, iconCls:'no-icon'} ,{text:'Representantes' , leaf:true, iconCls:'no-icon'} ,{text:'Produtos' , leaf:true, iconCls:'no-icon'} ,{text:'Distribuidores' , leaf:true, iconCls:'no-icon'} ,{text:'Compromissos' , leaf:true, iconCls:'no-icon'} ] } },{ title : 'Configurações' ,iconCls: 'silk-cog' ,root : { children: [ {text:'Feriados' ,leaf:true,iconCls:'no-icon'} ,{text:'Permissões' ,leaf:true,iconCls:'no-icon'} ,{text:'Horários' ,leaf:true,iconCls:'no-icon'} ,{text:'Cargas' ,leaf:true,iconCls:'no-icon'} ,{text:'Acesso ao sistema',leaf:true,iconCls:'no-icon'} ] } },{ title : 'Relatórios' ,iconCls: 'silk-grid' ,root : { children: [ {text:'Tempo Trabalhado por Atendente',leaf:true,iconCls:'no-icon'} ,{text:'Vendas por Cliente' ,leaf:true,iconCls:'no-icon'} ,{text:'Rotas de Distribuição' ,leaf:true,iconCls:'no-icon'} ,{text:'Performance dos Representantes',leaf:true,iconCls:'no-icon'} ] } }] }, //tabpanel central this.tabPanelCentral] }); -
Perceba que pouco antes de definir os TreePanels eu associei uma função (listener) ao evento click a cada um deles. Essa função deve ser definida em nossa classe. A documentação do Ext nos diz quais os parâmetros receber nesse listener:
//... ,listeners:{ scope: this ,click: this.onNodeClick } //... ,onNodeClick: function( node ) { //aqui vai nossa rotina para criar as abas } -
Por fim, nessa função vou implementar uma regra de negócio. Nela vou tentar procurar uma aba com a mesma descrição do item de menu que foi clicado. Se não existir, eu crio com o método add, se existir eu somente ativo. Isso evita a criação de abas duplicadas.
,onNodeClick: function( node ) { var titulo = node.text; var novaAba = this.tabPanelCentral.items.find(function( aba ){ return aba.title === titulo; }); if(!novaAba) { novaAba = this.tabPanelCentral.add({ title : titulo ,html : 'nova aba:' + titulo }); } this.tabPanelCentral.activate(novaAba); }
E pronto! Temos aí links em um menu lateral abrindo novas abas no tabPanel central sem duplicar as abas. Não irei abordar como carregar conteúdo nas abas, mas no código fonte fiz algumas observações que podem guiá-lo nessa tarefa. Além disso temos exemplos mais completos no blog que podem também lhe ajudar, como por exemplo o Crud Avançado e Carregar códig Ext sob demanda
Forte abraço e até a próxima!
[...] um print do resultado final. A interface será baseada no outro tutorial meu chamado “Como abrir páginas de um menu no centro de sua aplicação“. O CRUD em si será formado de um grid de usuários, e ao usuário clicar em um registro uma [...]
Fala ai cara blz!
antes de mais nada quero te parabenizar pelo trabalho, e pela didática, estou começando com extjs e tem mais de 3 meses em que começo a estudar e desisto por não consegui fazer alguma coisa, e essa era justamente uma delas não conseguia de jeito nenhum fazer algo que parece ser tão simples, mas na verdade quando se parte do zero não é, consegui ontem depois de estudar detalhadamente todos os exemplos da própria EXT fazer o que queria, e hoje quando procurava sobre outro assunto achei este material, perfeito agora vou fazer desta maneira por que ficou muito mais organizado do que o meu rssssssss… Abração obrigado pelo ótimo tuto vou ficar acompanhando… ate mais!
Bruno primeiramente muito obrigado por todos os posts relacionados ao ExtJS é muito difícil encontrar tutoriais que além de tirar as dúvidas funcionar corretamente.
Venho também solicitar o arquivo deste post, pois o link passado não existe ou estou com dificuldades para acessar.
Bruno vc teria um exemplo de como carregar uma nova aba com conteúdo, pois tá osso, já tentei vários tuto e nada.
Novamente muito obrigado pela dedicação.
Abraços.
Legolas.
Olá Legolas,
fiz uma revisão completa no post e inclui os exemplos do servidor do extdesenv. Esse era um post do antigo extdesenv e seus arquivos estavam inacessíveis.
abraço!
Bruno, olhei na sessão de exemplos do seu BLOG e não consegui achar este tutorial para download.
[...] um print do resultado final. A interface será baseada no outro tutorial meu chamado “Como abrir páginas de um menu no centro de sua aplicação“. O CRUD em si será formado de um grid de usuários, e ao usuário clicar em um registro uma [...]
Caro Bruno,
Primeiramente parabéns pelo exemplo está me ajudando muito !!!
Gostaria apenas de fazer uma resalva, o demo online e o link para download estão quebrados.
Abs,
Flávio
Olá Flávio, bom saber que te ajuda! Na transição de servidor esqueci de fazer upload desse exemplo, agora está tudo ok, pode verificar!
Abs!
Boa tarde, estou com uma dúvida deste exemplo, ele funciona no menu dinâmico que tem no seu site tb, e no menu dinâmico de que pasta ele puxa os icones? revirei aqui mais não estou achando. seria da pasta resorce/images/default/tree? Agurado resposta. Obrigada
Olá Emmanuele! Apesar de eu não ter exemplificado, o código do “abrir páginas no centro” funciona com o “menu dinâmico” sim! Se você tiver algum problema poste lá no fórum que agente te ajuda! A respeito dos ícones, eles estão na pasta examples/shared/icons. Você pode encontrar mais desses ícones 16×16 no site do famfamfam.
Abs!
Colomo faco pra ele chamar a url?
Olá Paulo! Nesse tutorial eu só exemplifico como abrir a aba. Para carregar o seu conteúdo, o que você sugere que seja “Chamar a url”, você pode acompanhar o tutorial CRUD Avançado. Lá eu uso essa rotina de criar abas, e ainda carrego elas com conteúdo.
Abs!
Bruno,
Como chamar uma pagina aspx em vez de um arquivo js.
Pergunto isso porq a minha codificação EXT esta dentro de uma página ASPX e não em um JS separado, então para mostrar a tela vou precisar chamar uma pagina ASPX
Fico no aguardo
Olá Leandro! Não há problema em ter um arquivo ASPX ao invés de JS. O importante é que seu arquivo gere código Javascript válido. Se o seu arquivo aspx gera javascript válido, então você pode fazer isso <script type=”text/javascript” src=”fontes/clientes.aspx”></script>. O fonte aspx vai ser interpretado pelo servidor, mas no final ele só vai gerar javascript.
Talvez você deva dar uma olhada no tutorial “Crud Avançado” aqui mesmo no extdesenv, e também sobre “Carregamento dinâmico de javascript”. Abs!
olá Bruno, é possivel montar os itens deste menu com a leitura de um arquivo json? se sim como fazer? obrigado
Nesse tutorial é utilizado um TreePanel como menu, mas os itens são fixos, e no outro tutorial “Menu dinâmico em sete passos” também é utilizado um TreePanel mas com itens dinâmicos. Então o melhor a fazer é portar a solução do menu dinâmico para cá.
Abs!
Olá Bruno. Parabéns pelos posts!! Iniciei um pouco “tarde” na tecnologia, por isso pergunto: o exemplo acima “roda” no ExtJS 4? Não consigo “abrir” uma nova aba…
Leandro, o exemplo acima é de 2010, escrito com o Ext 3, não roda no 4 direto. Teríamos que fazer umas adaptações no modo que as classes são definidas, mvc e etc…
[...] um print do resultado final. A interface será baseada no outro tutorial meu chamado “Como abrir páginas de um menu no centro de sua aplicação“. O CRUD em si será formado de um grid de usuários, e ao usuário clicar em um registro uma [...]