maximus
maximus

Reputation: 2437

ExtJS toolbar not rendering correctly

I have a window where I'd like to add a toolbar at the top, and a panel for loading content in the remaining area. Unfortunately, the toolbar expands to a disproportionate size when I add the content panel. I've tried hardcoding the size, but that doesn't seem to work. What am I doing wrong?

Thanks in advance for responses:

  // Main application entry point
  Ext.onReady(function() {
    var loginWin;
    var mainWin;
    var content;

    var form = new Ext.form.FormPanel({
        baseCls: 'x-plain',
        labelWidth: 70,
        //url:'',
        defaultType: 'textfield',

        items: [{
            fieldLabel: ' User Name',
            name: 'username',
            anchor:'100%'  // anchor width by percentage
        },{
        inputType: 'password',
        fieldLabel: ' Password',
            name: 'password',
            anchor: '100%'  // anchor width by percentage
        }]
    });

    content = new Ext.Panel({
        baseCls: 'x-plain',
        layout:'fit',
        anchor:'90%',
        height: 500,
        items: [
           { 
               title: 'blah',
               html: '<div>hello</div>'
           }  
        ]    
    });

    var tb = new Ext.Toolbar({
        height: 100,
        //renderTo: mainWin
    });
    tb.render('toolbar');

    var toolbarPanel = new Ext.Panel({
        layout:'fit',
        anchor:'10%',
        width:100,
        items: tb
    });

    var menu = new Ext.menu.Menu({
        id: 'mainMenu',
        style: {
            overflow: 'visible'     // For the Combo popup
        },
        items: [
            { text: 'blah'
            },
            { text: 'blah2'
            }
        ]
    }); 

    tb.add(
        {
            text: 'Classes',
            iconCls: 'bmenu',  
            handler: function(){ alert('blah'); }
        },
        {
            text: 'GPA',
            iconCls: 'bmenu', 
            handler: function(){ alert('blah'); }
        },
        {
            text: 'Semester Schedule',
            iconCls: 'bmenu', 
            handler: function(){ 
            }
        },
        {
            text: 'Help',
            iconCls: 'bmenu',  // <-- icon
            handler: function(){ alert('blah'); }
        }
    );
    tb.doLayout();

    if(!mainWin){
        mainWin = new Ext.Window({
            applyTo:'main-win',
            resizable: false,
            modal: true,
            layout:'fit',
            width:'80%',
            height:'100%',
            y: 0,
            closeAction:'hide',
            plain: true,
            items: [ toolbarPanel, content ]
        });
    }

    if(!loginWin){
        loginWin = new Ext.Window({
            applyTo:'hello-win',
            closable:false,
            layout:'fit',
            width:300,
            height:130,
            closeAction:'hide',
            plain: true,

            items: form,

            buttons: [{
                text:'Login',
                    handler: function(){
                loginWin.hide();
                        mainWin.show();
            }
            },{
                text: 'Close',
                handler: function(){
                loginWin.hide();
            }
                }]
       });
       loginWin.show(this);
   }

  })

Upvotes: 5

Views: 8610

Answers (3)

JustBeingHelpful
JustBeingHelpful

Reputation: 18980

This is not your issue, but I had a problem with minified ExtJS code not rendering. The tbar had a spacer between items, even though the unminified toolbar rendered correctly. I think Sencha has a dedicated function for this, but it fixed it.

}, ' ', {

Upvotes: 0

btk
btk

Reputation: 3225

Note that Ext.Toolbar has a default minHeight value set ("2.6em", iirc) -- you may have to override this in your config.

Upvotes: 0

Sean Adkinson
Sean Adkinson

Reputation: 8605

Seems you are working with the toolbar improperly:

var toolbarPanel = new Ext.Panel({
    layout:'fit',
    anchor:'10%',
    width:100,
    items: tb
});

Here you are telling this panel, "Take your one item, and make it as big as me". That is what layout "fit" does. So naturally, it will takes the toolbar you give it in the items and expand it as big as the panel.

Ext.Panel objects have a tbar config property that is designed to hold your toolbar. You don't need a panel for a toolbar and another panel for your content. Instead, add the toolbar to your content panel. Also, don't worry about rendering the toolbar explicitly, or adding items after the fact. It is better and more clear to write the objects together where they will be initialized (if this is possible)

Here is how I would recommend creating your content panel:

content = new Ext.Panel({
    baseCls: 'x-plain',
    layout:'fit',
    tbar: [
    {
        text: 'Classes',
        iconCls: 'bmenu',  
        handler: function(){ alert('blah'); }
    },
    {
        text: 'GPA',
        iconCls: 'bmenu', 
        handler: function(){ alert('blah'); }
    },
    {
        text: 'Semester Schedule',
        iconCls: 'bmenu', 
        handler: function(){ 
        }
    },
    {
        text: 'Help',
        iconCls: 'bmenu',  // <-- icon
        handler: function(){ alert('blah'); }
    }],
    items: [
       { 
           title: 'blah',
           html: '<div>hello</div>'
       }  
    ]    
});

Note also that I took out your panel's height attribute, since it is being put in a window with layout "fit", so that window will do all the sizing (no need to specify on the panel itself).

    mainWin = new Ext.Window({
        applyTo:'main-win',
        resizable: false,
        modal: true,
        layout:'fit',
        width:'80%',
        height:'100%',
        y: 0,
        closeAction:'hide',
        plain: true,
        items: [ content ]
    });

Good luck!

Upvotes: 4

Related Questions