Melhorando seu Grid ExtJS

grafico (1)

Olá pessoal tudo certo?

No artigo de hoje iremos apresentar o GridPlugins, vamos ver como eles podem melhorar o grid de sua aplicação ExtJS.

Introdução

O Grid Panel é um dos componentes mais poderosos do framework Ext JS. Ele tem muitos recursos e plugins integrados que permitem aos desenvolvedores exibir dados de várias maneiras.

Um recurso interessante do Grid Panel é o recurso Agrupamento. Esse recurso permite agrupar os dados da loja e exibir resumos por grupo e por loja; no entanto, é limitado a apenas um nível de agrupamento.

O plugin Filters é outro recurso interessante. Você pode adicionar entradas de menu aos cabeçalhos do Grid para que o usuário final possa filtrar os dados do Grid. Isso pode ser muito útil. Percebemos que às vezes os usuários querem resultados mais rápidos com o mínimo de cliques, o que explicarei nesta postagem do blog, incluindo como o agrupamento e a filtragem podem ser aprimorados.

O que é o GridPlugins?

mzSolutions , um parceiro da Sencha, cria poderosos componentes JavaScript para a estrutura Ext JS para ajudar a potencializar seus aplicativos de negócios da Web e móveis, incluindo GridPlugins.

O pacote GridPlugins contém plugins e funcionalidades que irão melhorar o painel Ext JS Grid (visite o site mzSolutions para saber como comprar GridPlugins).

Para usar o pacote no seu aplicativo, você precisa incluí-lo em seu arquivo app.json como este:

{ 
    "name" :  "YourApp" ,
 
    "requer" :  [ 
        "gridPlugins" 
    ] ,
 
    "id" :  "391a5ff6-2fd8-4e10-84d3-9114e1980e2d" 
}

Na versão atual, o pacote funciona apenas com o kit de ferramentas clássico em todas as versões 6.x do Ext JS. Uma versão moderna do kit de ferramentas estará disponível ainda este ano.

Recurso MultiGrouping

O recurso do Grid MultiGrouping permite que o Painel do Grid exiba os dados da Loja agrupados por vários agrupadores. Aqui está um exemplo do que parece:

dinamico

E esta é a definição de classe:

Ext. define ( 'KitchenSink.grid.Grouped' ,  { 
    estender :  'Ext.grid.Panel' , 
    xtype :  'k-grouped' ,
 
    requer :  [ 
        'KitchenSink.grid.GroupedController' , 
        'Ext.grid.feature.MultiGrouping' 
    ] ,
 
    título :  'Agrupamento básico' , 
    controlador :  'agrupado' ,
 
    store :  { 
        type :  'vendas' ,
 
        groupers :  [ 'pessoa' ,  'empresa' ] 
    } ,
 
    colunas :  [ 
        { texto :  'Empresa' ,   dataIndex :  'empresa' , editor :  'campo de texto ' , agrupável :  verdadeiro  } , 
        { texto :  'País' , dataIndex :  'país' , editor :  ' campo de texto ' , agrupável :  verdadeiro  } , 
        { text :  'Person' , dataIndex :  'person' , editor : 'textfield' , agrupável :  verdadeiro  } , 
        { text :  'Data' , dataIndex :  'date' , xtype :  'datecolumn' , formato :  'DMY'  } , 
        { text :  'Valor' , dataIndex :  'value' , xtype :  'numbercolumn' , editor :  'numberfield' , align :  'right'  } ,
        { text : 'Quantity' , dataIndex :  'quantity' , xtype :  'numercolumn' , editor :  'numberfield' , align :  'right'  } 
    ] ,
 
    recursos :  [{ 
        ftype :  'multigrouping' 
    }] ,
 
    // mais configs 
} ) ;

No exemplo acima, você pode ver que o armazenamento do Grid foi configurado com dois agrupadores e algumas colunas de Grid são configuradas com a configuração groupable definida como true. Para as colunas agrupáveis, o menu de cabeçalho é aprimorado para permitir que os usuários alterem o agrupamento em tempo real:

dinamico

Os usuários podem substituir o agrupamento completamente escolhendo “Agrupar por este campo” ou podem adicionar essa dimensão ao agrupamento existente escolhendo “Adicionar ao agrupamento”. Há também a possibilidade de expandir ou recolher todos os grupos existentes no Grid.

Recurso MultiGrounpingSummay

Resumos devem ser definidos no modelo Store como este:

Ext. define ( 'KitchenSink.model.Sale' ,  { 
    extend :  'KitchenSink.model.Base' ,
 
    requer :  [ 
        'Ext.data.summary. *' 
    ] ,
 
    campos :  [ 
        { name :  'company' ,    tipo :  'string' } , 
        { name :  'country' ,    tipo :  'string' , resumo :  'count' } , 
        { name :  'person' ,     tipo :  'string' } , 
        { name :  'date' ,       tipo :  'date' , dateFormat :  'c' } ,
        {nome :  'valor' ,      tipo :  'float' , resumo :  'sum' } , 
        { name :  'quantity' ,   tipo :  'float' , resumo :  'sum' } , 
        { 
            name :  'year' , 
            calcular :  function ( dados ) { 
                retornar parseInt ( Ext. data . formato ( dados. data , "Y" ) ,  10 ) ; 
            } 
        } , { 
            Nome :  'mês' , 
            calcular :  função ( de dados ) { 
                retornar parseInt ( Ext. Data . Formato ( dados. Data ,  "m" ) ,  10 )  -  1 ; 
            } 
        } 
    ] 
} ) ;
 
Se você quiser ter resumos na Grid para todos os grupos gerados , use este recurso da seguinte maneira :
 
Ext. define ( 'KitchenSink.grid.Summary' ,  { 
    estender :  'Ext.grid.Panel' , 
    xtype :  'k-summary' ,
 
    requer :  [ 
        'KitchenSink.grid.SummaryController' , 
        'Ext.grid.feature.MultiGroupingSummary' 
    ] ,
 
    título :  «Agrupamento e resumos» , 
    controlador :  «resumo» ,
 
    store :  { 
        type :  'vendas' ,
 
        groupers :  [ 'pessoa' ,  'empresa' ] 
    } ,
 
    colunas :  [ 
        { texto :  'Empresa' ,   dataIndex :  'empresa' , editor :  'campo de texto ' , agrupável :  verdadeiro  } , 
        { texto :  'País' , dataIndex :  'país' , editor :  ' campo de texto ' , agrupável :  verdadeiro  } , 
        { text :  'Person' , dataIndex :  'person' , editor : 'textfield' , agrupável :  verdadeiro  } , 
        { text :  'Data' , dataIndex :  'date' , xtype :  'datecolumn' , formato :  'DMY'  } , 
        { text :  'Valor' , dataIndex :  'value' , xtype :  'numbercolumn' , editor :  'numberfield' , align :  'right' , summaryFormatter : 'number ("0,000.00")'  } , 
        { text :  'Quantity' , dataIndex :  'quantidade' , xtype :  'numercolumn' , editor :  'numberfield' , align :  'right' , summaryFormatter :  'number ("0,000") '  } 
    ] ,
 
    recursos :  [ { 
        ftype :  'multigroupingsummary' , 
        groupSummaryPosition :  'bottom' , 
        summaryPosition :  'docked' 
    } ] ,
 
    // mais configs 
} ) ;

Como você pode ver, você pode definir a posição dos resumos dos grupos e do resumo geral e ficará assim:

dinamico

dinamico

Os resumos dos grupos podem ser exibidos na parte superior ou na parte inferior do grupo. O resumo geral pode ser o primeiro no Grid, o último no Grid ou encaixado na parte superior ou inferior do Grid.

Plugin GroupingPanel

Esse plug-in permite que seus usuários finais arrastem e soltem colunas do Grid na seção do painel de agrupamento que está visível acima do painel do Grid.

dinamico2

dinamico4

O usuário pode mover as dimensões no painel de agrupamento na ordem que deseja

Ext. define ( 'KitchenSink.plugin.GroupingPanel' ,  { 
    estender :  'Ext.grid.Panel' , 
    xtype :  'k-groupingpanel' ,
 
    requer :  [ 
        'KitchenSink.plugin.GroupingPanelController' , 
        'Ext.grid.feature.MultiGrouping' , 
        'Ext.grid.plugin.GroupingPanel' 
    ] ,
 
    recursos :  [ { 
        ftype :  'multigrouping' 
    } ] ,
 
    plugins :  { 
        groupingpanel :  true 
    } ,
 
    // mais configs 
} ) ;

Sumários de plugin

Este plugin permitirá que seus usuários finais alterem a função de resumo nas colunas do Grid.

colunasdinamico

As funções de resumo disponíveis em uma coluna do Grid são personalizáveis. Você precisa fornecer uma configuração para sua coluna do Grid, da seguinte maneira:

{ 
     xtype :  'coluna' , 
     resumos :  { 
         sum :  true , 
         average :  true , 
         count :  false 
     } 
 }

Se você quiser ter sua própria função de resumo usada nessa coluna, então você precisa configurá-la assim:

{ xtype : ‘column’ , summaries : { calculateSomething : true } }

Em seguida, implemente uma classe para sua própria função de resumo, assim:

 Ext. define ( 'Ext.data.summary.CalculateSomething' ,  { 
     estender :  'Ext.data.summary.Base' , 
     alias :  'data.summary.calculateSomething' ,
 
     texto :  'Calcular algo' ,
 
     calcule :  function  ( registros , propriedade , raiz , begin , end )  { 
         // faça seu próprio cálculo aqui 
     } 
 } ) ;
 

Plugin FilterBar

Este plug-in adicionará uma barra encaixada nos cabeçalhos da Grid e, dependendo da configuração das colunas do Grid, serão adicionados campos de filtro.

barrafiltro

Ext.define('KitchenSink.plugin.FilterBar', {
    extend: 'Ext.grid.Panel',
    xtype: 'k-filterbar',
 
    requires: [
        'KitchenSink.plugin.FilterBarController',
        'Ext.grid.plugin.FilterBar'
    ],
 
    title: 'Filter bar',
    controller: 'filterbar',
 
    store: {
        type: 'sales',
 
        groupers: ['person', 'company'],
        filters: [{
            property: 'country',
            operator: '==',
            value: 'Belgium'
        }]
    },
 
    columns: [
        { text: 'Company',  dataIndex: 'company', editor: 'textfield', groupable: true, flex: 1, filter: {type: 'string'} },
        { text: 'Country', dataIndex: 'country', editor: 'textfield', groupable: true, flex: 1, filter: {type: 'list'} },
        { text: 'Person', dataIndex: 'person', editor: 'textfield', groupable: true },
        { text: 'Date', dataIndex: 'date', xtype: 'datecolumn', format: 'd.m.Y', filter: {type: 'date'} },
        { text: 'Value', dataIndex: 'value', xtype: 'numbercolumn', editor: 'numberfield', align: 'right', filter: {type: 'number'} },
        { text: 'Quantity', dataIndex: 'quantity', xtype: 'numbercolumn', editor: 'numberfield', align: 'right' },
        { text: 'Confirmed', dataIndex: 'confirmed', xtype: 'booleancolumn', align: 'center', trueText: 'Yes', falseText: 'No', filter: {type: 'boolean'} }
    ],
 
    features: [{
        ftype: 'multigrouping'
    }],
 
    plugins: {
        gridfilterbar: true
    }
 
});

Recursos Adicionais

Se você quiser saber mais sobre o mzSolutions e seu produto comercial GridPlugins, siga estes links:

Exemplos do KitchenSink

Documentação do GridPlugins

Site da mz

Veja também:

Desenvolvimento de aplicativos mobile: o que é e por que é importante?

Desenvolvimento de aplicativos mobile: o que é e por que é importante?

Atualmente, é quase impossível imaginar nossa rotina sem os smartphones que se tornaram uma parte crucial de nossas vidas. Em uma pesquisa feita pela FGV, só o Brasil tem 424 milhões de dispositivos digitais em uso. E à medida que surgem mais novidades e utilidades para esses dispositivos, a busca por tecnologias mais avançadas e […]

Tecnologia sencha: por que ela é tão importante?

Tecnologia sencha: por que ela é tão importante?

Quando se trata de aprimorar a integração e o suporte de registro em sua aplicação, é fundamental concentrar-se na otimização dos testes de desenvolvimento e integração. Nesse contexto, a tecnologia sencha se destaca como uma ferramenta indispensável. Ao oferecer recursos abrangentes para o desenvolvimento e teste de aplicativos da web e móveis, a tecnologia sencha […]

Ateliê de software: por que investir nele ao invés de uma fábrica de software?

Ateliê de software: por que investir nele ao invés de uma fábrica de software?

Na busca pelo fornecedor ideal para impulsionar seu negócio, entender as melhores práticas e modelos que se alinham às necessidades específicas da sua empresa é crucial. Esse princípio é ainda mais relevante quando se trata do desenvolvimento de software intuitivo e personalizado. Muitos associam a ideia de desenvolvimento de software a uma fábrica de software, […]

O que é a metodologia ágil e como aplica-la em 5 passos?

O que é a metodologia ágil e como aplica-la em 5 passos?

Você sabia que a metodologia ágil é o que guia as ações das empresas para melhorar seus resultados e o aumento na produtividade? A utilização de uma metodologia ágil contribui na gestão e impulso à inovação nas companhias, a partir de um modelo de fácil implementação em projetos e processos. Este método prioriza a eficiência, […]

Daniel da Cunha Bueno

Daniel da Cunha Bueno

Atualmente como Sencha MVP Senior Software Enginer em aplicações web e mobile (#C,Sencha Ext JS, Xamarin).