roojs-bootstrap.js
[roojs1] / Roo / bootstrap / Container.js
index 5931707..4ce6886 100644 (file)
@@ -9,21 +9,25 @@
 /**
  * @class Roo.bootstrap.Container
  * @extends Roo.bootstrap.Component
+ * @children Roo.bootstrap.Component
+ * @parent builder
  * Bootstrap Container class
  * @cfg {Boolean} jumbotron is it a jumbotron element
  * @cfg {String} html content of element
  * @cfg {String} well (lg|sm|md) a well, large, small or medium.
- * @cfg {String} panel (primary|success|info|warning|danger) render as a panel.
+ * @cfg {String} panel (default|primary|success|info|warning|danger) render as panel  - type - primary/success.....
  * @cfg {String} header content of header (for panel)
  * @cfg {String} footer content of footer (for panel)
  * @cfg {String} sticky (footer|wrap|push) block to use as footer or body- needs css-bootstrap/sticky-footer.css
  * @cfg {String} tag (header|aside|section) type of HTML tag.
  * @cfg {String} alert (success|info|warning|danger) type alert (changes background / border...)
- * @cfg {String} fa (ban|check|...) font awesome icon
+ * @cfg {String} fa font awesome icon
  * @cfg {String} icon (info-sign|check|...) glyphicon name
  * @cfg {Boolean} hidden (true|false) hide the element
  * @cfg {Boolean} expandable (true|false) default false
+ * @cfg {Boolean} expanded (true|false) default true
  * @cfg {String} rheader contet on the right of header
+ * @cfg {Boolean} clickable (true|false) default false
 
  *     
  * @constructor
 
 Roo.bootstrap.Container = function(config){
     Roo.bootstrap.Container.superclass.constructor.call(this, config);
+    
+    this.addEvents({
+        // raw events
+         /**
+         * @event expand
+         * After the panel has been expand
+         * 
+         * @param {Roo.bootstrap.Container} this
+         */
+        "expand" : true,
+        /**
+         * @event collapse
+         * After the panel has been collapsed
+         * 
+         * @param {Roo.bootstrap.Container} this
+         */
+        "collapse" : true,
+        /**
+         * @event click
+         * When a element is chick
+         * @param {Roo.bootstrap.Container} this
+         * @param {Roo.EventObject} e
+         */
+        "click" : true
+    });
 };
 
 Roo.extend(Roo.bootstrap.Container, Roo.bootstrap.Component,  {
@@ -49,6 +78,8 @@ Roo.extend(Roo.bootstrap.Container, Roo.bootstrap.Component,  {
     icon : false,
     expandable : false,
     rheader : '',
+    expanded : true,
+    clickable: false,
   
      
     getChildContainer : function() {
@@ -126,28 +157,32 @@ Roo.extend(Roo.bootstrap.Container, Roo.bootstrap.Component,  {
                 var h = [];
                 
                 if(this.expandable){
+                    
+                    cfg.cls = cfg.cls + ' expandable';
+                    
                     h.push({
                         tag: 'i',
-                        cls: 'fa fa-minus'
+                        cls: (this.expanded ? 'fa fa-minus' : 'fa fa-plus') 
                     });
+                    
                 }
                 
-                h.push({
-                    tag: 'h3',
-                    cls : 'panel-title',
-                    html : this.header
-                });
-                
-                if(this.rheader){
-                    h.push({
+                h.push(
+                    {
+                        tag: 'span',
+                        cls : 'panel-title',
+                        html : (this.expandable ? ' ' : '') + this.header
+                    },
+                    {
                         tag: 'span',
                         cls: 'panel-header-right',
                         html: this.rheader
-                    });
-                }
+                    }
+                );
                 
                 cfg.cn.push({
                     cls : 'panel-heading',
+                    style : this.expandable ? 'cursor: pointer' : '',
                     cn : h
                 });
                 
@@ -155,7 +190,7 @@ Roo.extend(Roo.bootstrap.Container, Roo.bootstrap.Component,  {
             
             body = false;
             cfg.cn.push({
-                cls : 'panel-body',
+                cls : 'panel-body' + (this.expanded ? '' : ' hide'),
                 html : this.html
             });
             
@@ -189,6 +224,105 @@ Roo.extend(Roo.bootstrap.Container, Roo.bootstrap.Component,  {
         return cfg;
     },
     
+    initEvents: function() 
+    {
+        if(this.expandable){
+            var headerEl = this.headerEl();
+        
+            if(headerEl){
+                headerEl.on('click', this.onToggleClick, this);
+            }
+        }
+        
+        if(this.clickable){
+            this.el.on('click', this.onClick, this);
+        }
+        
+    },
+    
+    onToggleClick : function()
+    {
+        var headerEl = this.headerEl();
+        
+        if(!headerEl){
+            return;
+        }
+        
+        if(this.expanded){
+            this.collapse();
+            return;
+        }
+        
+        this.expand();
+    },
+    
+    expand : function()
+    {
+        if(this.fireEvent('expand', this)) {
+            
+            this.expanded = true;
+            
+            //this.el.select('.panel-body',true).first().setVisibilityMode(Roo.Element.DISPLAY).show();
+            
+            this.el.select('.panel-body',true).first().removeClass('hide');
+            
+            var toggleEl = this.toggleEl();
+
+            if(!toggleEl){
+                return;
+            }
+
+            toggleEl.removeClass(['fa-minus', 'fa-plus']).addClass(['fa-minus']);
+        }
+        
+    },
+    
+    collapse : function()
+    {
+        if(this.fireEvent('collapse', this)) {
+            
+            this.expanded = false;
+            
+            //this.el.select('.panel-body',true).first().setVisibilityMode(Roo.Element.DISPLAY).hide();
+            this.el.select('.panel-body',true).first().addClass('hide');
+        
+            var toggleEl = this.toggleEl();
+
+            if(!toggleEl){
+                return;
+            }
+
+            toggleEl.removeClass(['fa-minus', 'fa-plus']).addClass(['fa-plus']);
+        }
+    },
+    
+    toggleEl : function()
+    {
+        if(!this.el || !this.panel.length || !this.header.length || !this.expandable){
+            return;
+        }
+        
+        return this.el.select('.panel-heading .fa',true).first();
+    },
+    
+    headerEl : function()
+    {
+        if(!this.el || !this.panel.length || !this.header.length){
+            return;
+        }
+        
+        return this.el.select('.panel-heading',true).first()
+    },
+    
+    bodyEl : function()
+    {
+        if(!this.el || !this.panel.length){
+            return;
+        }
+        
+        return this.el.select('.panel-body',true).first()
+    },
+    
     titleEl : function()
     {
         if(!this.el || !this.panel.length || !this.header.length){
@@ -219,10 +353,25 @@ Roo.extend(Roo.bootstrap.Container, Roo.bootstrap.Component,  {
         }
         
         return titleEl.dom.innerHTML;
-    }
+    },
     
+    setRightTitle : function(v)
+    {
+        var t = this.el.select('.panel-header-right',true).first();
+        
+        if(!t){
+            return;
+        }
+        
+        t.dom.innerHTML = v;
+    },
     
-   
+    onClick : function(e)
+    {
+        e.preventDefault();
+        
+        this.fireEvent('click', this, e);
+    }
 });
 
  
\ No newline at end of file