| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 | Ext.require(['Ext.data.*', 'Ext.grid.*']);Ext.onReady(function() {    // wrapped in closure to prevent global vars.    Ext.define('Restaurant', {        extend: 'Ext.data.Model',        fields: ['name', 'cuisine']    });    var restaurants = Ext.create('Ext.data.Store', {        storeId: 'restaraunts',        model: 'Restaurant',        groupField: 'cuisine',        sorters: ['cuisine','name'],        data: [{            name: 'Cheesecake Factory',            cuisine: 'American'        },{            name: 'University Cafe',            cuisine: 'American'        },{            name: 'Slider Bar',            cuisine: 'American'        },{            name: 'Shokolaat',            cuisine: 'American'        },{            name: 'Gordon Biersch',            cuisine: 'American'        },{            name: 'Crepevine',            cuisine: 'American'        },{            name: 'Creamery',            cuisine: 'American'        },{            name: 'Old Pro',            cuisine: 'American'        },{            name: 'Nola\'s',            cuisine: 'Cajun'        },{            name: 'House of Bagels',            cuisine: 'Bagels'        },{            name: 'The Prolific Oven',            cuisine: 'Sandwiches'        },{            name: 'La Strada',            cuisine: 'Italian'        },{            name: 'Buca di Beppo',            cuisine: 'Italian'        },{            name: 'Pasta?',            cuisine: 'Italian'        },{            name: 'Madame Tam',            cuisine: 'Asian'        },{            name: 'Sprout Cafe',            cuisine: 'Salad'        },{            name: 'Pluto\'s',            cuisine: 'Salad'        },{            name: 'Junoon',            cuisine: 'Indian'        },{            name: 'Bistro Maxine',            cuisine: 'French'        },{            name: 'Three Seasons',            cuisine: 'Vietnamese'        },{            name: 'Sancho\'s Taquira',            cuisine: 'Mexican'        },{            name: 'Reposado',            cuisine: 'Mexican'        },{            name: 'Siam Royal',            cuisine: 'Thai'        },{            name: 'Krung Siam',            cuisine: 'Thai'        },{            name: 'Thaiphoon',            cuisine: 'Thai'        },{            name: 'Tamarine',            cuisine: 'Vietnamese'        },{            name: 'Joya',            cuisine: 'Tapas'        },{            name: 'Jing Jing',            cuisine: 'Chinese'        },{            name: 'Patxi\'s Pizza',            cuisine: 'Pizza'        },{            name: 'Evvia Estiatorio',            cuisine: 'Mediterranean'        },{            name: 'Cafe 220',            cuisine: 'Mediterranean'        },{            name: 'Cafe Renaissance',            cuisine: 'Mediterranean'        },{            name: 'Kan Zeman',            cuisine: 'Mediterranean'        },{            name: 'Gyros-Gyros',            cuisine: 'Mediterranean'        },{            name: 'Mango Caribbean Cafe',            cuisine: 'Caribbean'        },{            name: 'Coconuts Caribbean Restaurant & Bar',            cuisine: 'Caribbean'        },{            name: 'Rose & Crown',            cuisine: 'English'        },{            name: 'Baklava',            cuisine: 'Mediterranean'        },{            name: 'Mandarin Gourmet',            cuisine: 'Chinese'        },{            name: 'Bangkok Cuisine',            cuisine: 'Thai'        },{            name: 'Darbar Indian Cuisine',            cuisine: 'Indian'        },{            name: 'Mantra',            cuisine: 'Indian'        },{            name: 'Janta',            cuisine: 'Indian'        },{            name: 'Hyderabad House',            cuisine: 'Indian'        },{            name: 'Starbucks',            cuisine: 'Coffee'        },{            name: 'Peet\'s Coffee',            cuisine: 'Coffee'        },{            name: 'Coupa Cafe',            cuisine: 'Coffee'        },{            name: 'Lytton Coffee Company',            cuisine: 'Coffee'        },{            name: 'Il Fornaio',            cuisine: 'Italian'        },{            name: 'Lavanda',            cuisine: 'Mediterranean'        },{            name: 'MacArthur Park',            cuisine: 'American'        },{            name: 'St Michael\'s Alley',            cuisine: 'Californian'        },{            name: 'Osteria',            cuisine: 'Italian'        },{            name: 'Vero',            cuisine: 'Italian'        },{            name: 'Cafe Renzo',            cuisine: 'Italian'        },{            name: 'Miyake',            cuisine: 'Sushi'        },{            name: 'Sushi Tomo',            cuisine: 'Sushi'        },{            name: 'Kanpai',            cuisine: 'Sushi'        },{            name: 'Pizza My Heart',            cuisine: 'Pizza'        },{            name: 'New York Pizza',            cuisine: 'Pizza'        },{            name: 'California Pizza Kitchen',            cuisine: 'Pizza'        },{            name: 'Round Table',            cuisine: 'Pizza'        },{            name: 'Loving Hut',            cuisine: 'Vegan'        },{            name: 'Garden Fresh',            cuisine: 'Vegan'        },{            name: 'Cafe Epi',            cuisine: 'French'        },{            name: 'Tai Pan',            cuisine: 'Chinese'        }],        listeners: {            groupchange: function(store, groupers) {                var grouped = restaurants.isGrouped(),                    groupBy = groupers.items[0] ? groupers.items[0].property : '',                    toggleMenuItems, len, i = 0;                // Clear grouping button only valid if the store is grouped                grid.down('[text=Clear Grouping]').setDisabled(!grouped);                                // Sync state of group toggle checkboxes                if (grouped && groupBy === 'cuisine') {                    toggleMenuItems = grid.down('button[text=Toggle groups...]').menu.items.items;                    for (len = toggleMenuItems.length; i < len; i++) {                        toggleMenuItems[i].setChecked(groupingFeature.isExpanded(toggleMenuItems[i].text));                    }                    grid.down('[text=Toggle groups...]').enable();                } else {                    grid.down('[text=Toggle groups...]').disable();                }            }        }    });    var groupingFeature = Ext.create('Ext.grid.feature.Grouping', {            groupHeaderTpl: '{columnName}: {name} ({rows.length} Item{[values.rows.length > 1 ? "s" : ""]})',            hideGroupedHeader: true,            startCollapsed: true,            id: 'restaurantGrouping'        }),        groups = restaurants.getGroups(),        len = groups.length, i = 0,        toggleMenu = [],        toggleGroup = function(item) {            var groupName = item.text;            if (item.checked) {                groupingFeature.expand(groupName, true);            } else {                groupingFeature.collapse(groupName, true);            }        };    // Create checkbox menu items to toggle associated groupd    for (; i < len; i++) {        toggleMenu[i] = {            xtype: 'menucheckitem',            text: groups[i].name,            handler: toggleGroup        }    }    var grid = Ext.create('Ext.grid.Panel', {        renderTo: Ext.getBody(),        collapsible: true,        iconCls: 'icon-grid',        frame: true,        store: restaurants,        width: 600,        height: 400,        title: 'Restaurants',        resizable: true,        features: [groupingFeature],        tbar: ['->', {            text: 'Toggle groups...',            menu: toggleMenu        }],            // Keep checkbox menu items in sync with expand/collapse        viewConfig: {            listeners: {                groupcollapse: function(v, n, groupName) {                    if (!grid.down('[text=Toggle groups...]').disabled) {                        grid.down('menucheckitem[text=' + groupName + ']').setChecked(false, true);                    }                },                groupexpand: function(v, n, groupName) {                    if (!grid.down('[text=Toggle groups...]').disabled) {                        grid.down('menucheckitem[text=' + groupName + ']').setChecked(true, true);                    }                }            }        },        columns: [{            text: 'Name',            flex: 1,            dataIndex: 'name'        },{            text: 'Cuisine',            flex: 1,            dataIndex: 'cuisine'        }],        fbar  : ['->', {            text:'Clear Grouping',            iconCls: 'icon-clear-group',            handler : function() {                groupingFeature.disable();            }        }]    });});
 |