Commit 444eeab0 authored by Nick Poulden's avatar Nick Poulden
Browse files

MVC updates

parent 281d41d1
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -8,12 +8,14 @@ Ext.application({
    appFolder: 'app',

    controllers: [
        'Classes'
        'Classes',
        'Search'
    ],
    
    autoCreateViewport: true,

    launch: function() {
        Docs.App = this;
        Ext.create('Docs.view.Viewport');
        Docs.History.init();
    }
});
+79 −11
Original line number Diff line number Diff line
@@ -5,11 +5,58 @@ Ext.define('Docs.controller.Search', {
        'search.Dropdown'
    ],

    stores: ['Search'],

    init: function() {

        this.control({
            '#treePanelCmp': {
                itemclick: this.treeItemClick
            '#quick-search': {
                itemclick: function(panel, item) {
                    this.handleClick(item);
                }
            },
            '#search-field': {
                keyup: function(el, ev) {

                    var panel = Ext.getCmp('quick-search');

                    if (ev.keyCode == 27 || el.value == '') {
                        panel.hide();
                        return;
                    }
                    else {
                        panel.show();
                    }

                    var curItem = panel.store.indexOf(panel.getSelectionModel().getLastSelected()),
                        lastItem = panel.store.data.length - 1,
                        selModel = panel.getSelectionModel();

                    // Up arrow
                    if (ev.keyCode == 38) {
                        if (curItem == undefined) {
                            selModel.select(0);
                        } else {
                            selModel.select(curItem == 0 ? lastItem : (curItem - 1));
                        }
                    }
                    // Down arrow
                    else if (ev.keyCode == 40) {
                        if (curItem == undefined) {
                            selModel.select(0);
                        } else {
                            selModel.select(curItem == lastItem ? 0 : curItem + 1);
                        }
                    }
                    // Enter key
                    else if (ev.keyCode == 13) {
                        ev.preventDefault();
                        // panel.handleClick();
                    }
                    else {
                        Docs.App.getController('Search').search(el.value)
                    }
                }
            }
        });
    },
@@ -20,14 +67,35 @@ Ext.define('Docs.controller.Search', {
        if (curItem.data.type != 'cls') {
            cls += '-' + curItem.data.type + '-' + curItem.data.member;
        }
        panel.hide();
        Docs.controller.Classes.loadClass(cls);
        Docs.App.getController('Classes').loadClass(cls);
    },

    search: function(term) {
        Docs.App.getStore('Search').loadData(this.filterMembers(term), false);
        Ext.getCmp('quick-search').alignTo('search-field', 'bl', [-23, 0])
    },

    filterMembers: function(text, n) {
        var results = [[], [], []];
        var safeText = Ext.escapeRe(text);
        var re0 = new RegExp("^" + safeText + "$", "i");
        var re1 = new RegExp("^" + safeText, "i");
        var re2 = new RegExp(safeText, "i");
        Ext.Array.forEach(Docs.membersData.data, function(r) {
            var member = r.cls;
            if (re0.test(member)) {
                results[0].push(r);
            }
            else if (re1.test(member)) {
                results[1].push(r);
            }
            else if (re2.test(member)) {
                results[2].push(r);
            }
        });

    // listeners: {
    //     itemclick: function(panel, item) {
    //         this.handleClick(item);
    //     }
    // }
        // flatten results array and returns first n results
        return Ext.Array.flatten(results).slice(0, n || 10);
    }

});
+11 −0
Original line number Diff line number Diff line
Ext.define('Docs.store.Search', {
    extend: 'Ext.data.Store',
    
    fields: ['cls', 'member', 'type', 'doc'],
    proxy: {
        type: 'memory',
        reader: {
            type: 'json'
        }
    }
});
 No newline at end of file
+13 −2
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ Ext.define('Docs.view.Viewport', {
                region:'west',
                width: 240,
                id: 'west-region-container',
                padding: '5 0 10 20',
                padding: '5 0 20 20',
                layout: 'vbox',
                defaults: {
                    xtype: 'container',
@@ -50,8 +50,19 @@ Ext.define('Docs.view.Viewport', {
                    },
                    {
                        cls: 'search',
                        id: 'search-container',
                        height: 40,
                        html: '<input type="text" id="search-field" />'
                        items: [
                            {
                                xtype: 'textfield',
                                emptyText: 'Search',
                                id: 'search-field',
                                enableKeyEvents: true
                            },
                            { 
                                xtype: 'searchdropdown'
                            }
                        ]
                    },
                    {
                        flex: 1,
+8 −140
Original line number Diff line number Diff line
Ext.define('Docs.view.search.Dropdown', {
    extend: 'Ext.view.View',
    alias: 'widget.searchdropdown',
    
    store: searchStore,
    floating: 'true',
    autoShow: true,
    autoRender: true,
    toFrontOnShow: true,
    
    store: 'Search',
    
    id: 'quick-search',
    overItemCls:'x-view-over',
@@ -18,141 +24,3 @@ Ext.define('Docs.view.search.Dropdown', {
        '</tpl>'
    )
});




// Search box
Ext.onReady(function() {
    
    var searchStore = new Ext.data.Store({
        fields: ['cls', 'member', 'type', 'doc'],
        proxy: {
            type: 'memory',
            reader: {
                type: 'json'
            }
        }
    });
    
    // This is the global object read from /output/members.js
    searchStore.loadData(Docs.membersData.data);
    var allRecords = searchStore.getRange();
    searchStore.removeAll();

    var panel = Ext.create('Ext.view.View', {
        store: searchStore,
        tpl: new Ext.XTemplate(
            '<tpl for=".">',
                '<div class="item {type}">',
                    '<div class="title">{member}</div>',
                    '<div class="class">{cls}</div>',
                '</div>',
            '</tpl>'
        ),
        id: 'quick-search',
        overItemCls:'x-view-over',
        trackOver: true,
        itemSelector:'div.item',
        singleSelect: true,

        handleClick: function(curItem) {
            curItem = curItem || panel.getSelectionModel().getLastSelected();
            var cls = curItem.data.cls;
            if (curItem.data.type != 'cls') {
                cls += '-' + curItem.data.type + '-' + curItem.data.member;
            }
            panel.hide();
            Docs.ClassLoader.load(cls);
        },
        listeners: {
            itemclick: function(panel, item) {
                this.handleClick(item);
            }
        }
    });

    panel.render('search-box');
    panel.hide();

    Ext.get('search-field').on('blur', function(ev, el) {
        setTimeout(function() {
            panel.hide();
        }, 100);
    });
    Ext.get('search-field').on('focus', function(ev, el) {
        panel.show();
    });

    // When a key is pressed in the search field, search for classes, methods, properties, configs, etc
    Ext.get('search-field').on('keyup', function(ev, el) {
        // Esc key
        if (ev.keyCode == 27 || el.value == '') {
            panel.hide();
            return;
        }
        else {
            panel.show();
        }

        var curItem = panel.store.indexOf(panel.getSelectionModel().getLastSelected()),
            lastItem = panel.store.data.length - 1,
            selModel = panel.getSelectionModel();

        // Up arrow
        if (ev.keyCode == 38) {
            if (curItem == undefined) {
                selModel.select(0);
            } else {
                selModel.select(curItem == 0 ? lastItem : (curItem - 1));
            }
        }
        // Down arrow
        else if (ev.keyCode == 40) {
            if (curItem == undefined) {
                selModel.select(0);
            } else {
                selModel.select(curItem == lastItem ? 0 : curItem + 1);
            }
        }
        // Enter key
        else if (ev.keyCode == 13) {
            ev.preventDefault();
            panel.handleClick();
        }
        else {
            searchExt(Ext.get(el).getValue());
        }
    });

    Ext.get(Ext.get('search-field').dom.parentNode).on('submit', function(ev, el) {
        ev.preventDefault();
    });

    var searchExt = function(term) {
        searchStore.loadData(filterMembers(term), false);
    };

    var filterMembers = function(text) {
        var results = [[], [], []];
        var safeText = Ext.escapeRe(text);
        var re0 = new RegExp("^" + safeText + "$", "i");
        var re1 = new RegExp("^" + safeText, "i");
        var re2 = new RegExp(safeText, "i");
        Ext.Array.forEach(allRecords, function(r) {
            var member = r.get("member");
            if (re0.test(member)) {
                results[0].push(r);
            }
            else if (re1.test(member)) {
                results[1].push(r);
            }
            else if (re2.test(member)) {
                results[2].push(r);
            }
        });
        // flatten results array and returns first n results
        return Ext.Array.flatten(results).slice(0, 10);
    };

});
Loading