X-Git-Url: http://git.roojs.org/?p=roojs1;a=blobdiff_plain;f=Roo%2Fbootstrap%2FButton.js;h=3636c15633f81a2062a1aa6a8cf80568f2875a6a;hp=98d90c9df1a58dcf3be43f9bfa7bca912179cc4b;hb=9b0f74a5b20b5ab11c6d58a49a48d3dd1216fb9b;hpb=02500346eea7c14df39562c71d9571a7115ba922 diff --git a/Roo/bootstrap/Button.js b/Roo/bootstrap/Button.js index 98d90c9df1..3636c15633 100644 --- a/Roo/bootstrap/Button.js +++ b/Roo/bootstrap/Button.js @@ -10,23 +10,26 @@ * @extends Roo.bootstrap.Component * Bootstrap Button class * @cfg {String} html The button content - * @cfg {String} weight default (or empty) | primary | success | info | warning | danger | link - * @cfg {String} size empty | lg | sm | xs - * @cfg {String} tag empty | a | input | submit + * @cfg {String} weight (default|primary|secondary|success|info|warning|danger|link|light|dark) default + * @cfg {String} badge_weight (default|primary|secondary|success|info|warning|danger|link|light|dark) default (same as button) + * @cfg {Boolean} outline default false (except for weight=default which emulates old behaveiour with an outline) + * @cfg {String} size (lg|sm|xs) + * @cfg {String} tag (a|input|submit) * @cfg {String} href empty or href - * @cfg {Boolean} disabled false | true - * @cfg {Boolean} isClose false | true - * @cfg {String} glyphicon empty | adjust | align-center | align-justify | align-left | align-right | arrow-down | arrow-left | arrow-right | arrow-up | asterisk | backward | ban-circle | barcode | bell | bold | book | bookmark | briefcase | bullhorn | calendar | camera | certificate | check | chevron-down | chevron-left | chevron-right | chevron-up | circle-arrow-down | circle-arrow-left | circle-arrow-right | circle-arrow-up | cloud | cloud-download | cloud-upload | cog | collapse-down | collapse-up | comment | compressed | copyright-mark | credit-card | cutlery | dashboard | download | download-alt | earphone | edit | eject | envelope | euro | exclamation-sign | expand | export | eye-close | eye-open | facetime-video | fast-backward | fast-forward | file | film | filter | fire | flag | flash | floppy-disk | floppy-open | floppy-remove | floppy-save | floppy-saved | folder-close | folder-open | font | forward | fullscreen | gbp | gift | glass | globe | hand-down | hand-left | hand-right | hand-up | hd-video | hdd | header | headphones | heart | heart-empty | home | import | inbox | indent-left | indent-right | info-sign | italic | leaf | link | list | list-alt | lock | log-in | log-out | magnet | map-marker | minus | minus-sign | move | music | new-window | off | ok | ok-circle | ok-sign | open | paperclip | pause | pencil | phone | phone-alt | picture | plane | play | play-circle | plus | plus-sign | print | pushpin | qrcode | question-sign | random | record | refresh | registration-mark | remove | remove-circle | remove-sign | repeat | resize-full | resize-horizontal | resize-small | resize-vertical | retweet | road | save | saved | screenshot | sd-video | search | send | share | share-alt | shopping-cart | signal | sort | sort-by-alphabet | sort-by-alphabet-alt | sort-by-attributes | sort-by-attributes-alt | sort-by-order | sort-by-order-alt | sound-5-1 | sound-6-1 | sound-7-1 | sound-dolby | sound-stereo | star | star-empty | stats | step-backward | step-forward | stop | subtitles | tag | tags | tasks | text-height | text-width | th | th-large | th-list | thumbs-down | thumbs-up | time | tint | tower | transfer | trash | tree-conifer | tree-deciduous | unchecked | upload | usd | user | volume-down | volume-off | volume-up | warning-sign | wrench | zoom-in | zoom-out + * @cfg {Boolean} disabled default false; + * @cfg {Boolean} isClose default false; + * @cfg {String} glyphicon depricated - use fa + * @cfg {String} fa fontawesome icon - eg. 'comment' - without the fa/fas etc.. * @cfg {String} badge text for badge - * @cfg {String} theme default (or empty) | glow - * @cfg {Boolean} inverse false | true - * @cfg {Boolean} toggle false | true - * @cfg {String} ontext text for on toggle state - * @cfg {String} offtext text for off toggle state - * @cfg {Boolean} defaulton true | false - * @cfg {Boolean} preventDefault (true | false) default true - * @cfg {Boolean} removeClass true | false remove the standard class.. - * @cfg {String} target (_self|_blank|_parent|_top)target for a href. + * @cfg {String} theme (default|glow) + * @cfg {Boolean} inverse dark themed version + * @cfg {Boolean} toggle is it a slidy toggle button + * @cfg {Boolean} pressed  default null - if the button ahs active state + * @cfg {String} ontext text for on slidy toggle state + * @cfg {String} offtext text for off slidy toggle state + * @cfg {Boolean} preventDefault default true (stop click event triggering the URL if it's a link.) + * @cfg {Boolean} removeClass remove the standard class.. + * @cfg {String} target (_self|_blank|_parent|_top|other) target for a href. * * @constructor * Create a new button @@ -36,14 +39,24 @@ Roo.bootstrap.Button = function(config){ Roo.bootstrap.Button.superclass.constructor.call(this, config); + this.addEvents({ // raw events /** * @event click - * The raw click event for the entire grid. + * When a butotn is pressed + * @param {Roo.bootstrap.Button} btn + * @param {Roo.EventObject} e + */ + "click" : true, + /** + * @event toggle + * After the button has been toggles + * @param {Roo.bootstrap.Button} btn * @param {Roo.EventObject} e + * @param {boolean} pressed (also available as button.pressed) */ - "click" : true + "toggle" : true }); }; @@ -51,12 +64,15 @@ Roo.extend(Roo.bootstrap.Button, Roo.bootstrap.Component, { html: false, active: false, weight: '', + badge_weight: '', + outline : false, size: '', tag: 'button', href: '', disabled: false, isClose: false, glyphicon: '', + fa: '', badge: '', theme: 'default', inverse: false, @@ -69,6 +85,9 @@ Roo.extend(Roo.bootstrap.Button, Roo.bootstrap.Component, { removeClass: false, name: false, target: false, + + pressed : null, + getAutoCreate : function(){ @@ -84,9 +103,9 @@ Roo.extend(Roo.bootstrap.Button, Roo.bootstrap.Component, { } else { cfg.tag = this.tag; } - cfg.html = this.html || cfg.html; + cfg.html = '' + (this.html || cfg.html) + ''; - if (this.toggle===true) { + if (this.toggle == true) { cfg={ tag: 'div', cls: 'slider-frame roo-button', @@ -100,9 +119,9 @@ Roo.extend(Roo.bootstrap.Button, Roo.bootstrap.Component, { } ] }; - - if (['default', 'primary', 'success', 'info', 'warning', 'danger', 'link'].indexOf(this.weight) > -1) { - cfg.cls += ' '+this.weight; + // why are we validating the weights? + if (Roo.bootstrap.Button.weights.indexOf(this.weight) > -1) { + cfg.cls += ' ' + this.weight; } return cfg; @@ -117,24 +136,30 @@ Roo.extend(Roo.bootstrap.Button, Roo.bootstrap.Component, { return cfg; } + - if (this.theme==='default') { cfg.cls = 'btn roo-button'; - if (this.parentType != 'Navbar') { - this.weight = this.weight.length ? this.weight : 'default'; - } - if (['default', 'primary', 'success', 'info', 'warning', 'danger', 'link'].indexOf(this.weight) > -1) { + //if (this.parentType != 'Navbar') { + this.weight = this.weight.length ? this.weight : 'default'; + //} + if (Roo.bootstrap.Button.weights.indexOf(this.weight) > -1) { - cfg.cls += ' btn-' + this.weight; + var outline = this.outline || this.weight == 'default' ? 'outline-' : ''; + var weight = this.weight == 'default' ? 'secondary' : this.weight; + cfg.cls += ' btn-' + outline + weight; + if (this.weight == 'default') { + // BC + cfg.cls += ' btn-' + this.weight; + } } } else if (this.theme==='glow') { cfg.tag = 'a'; cfg.cls = 'btn-glow roo-button'; - if (['default', 'primary', 'success', 'info', 'warning', 'danger', 'link'].indexOf(this.weight) > -1) { + if (Roo.bootstrap.Button.weights.indexOf(this.weight) > -1) { cfg.cls += ' ' + this.weight; } @@ -146,7 +171,7 @@ Roo.extend(Roo.bootstrap.Button, Roo.bootstrap.Component, { } - if (this.active) { + if (this.active || this.pressed === true) { cfg.cls += ' active'; } @@ -158,12 +183,18 @@ Roo.extend(Roo.bootstrap.Button, Roo.bootstrap.Component, { Roo.log('changing to ul' ); cfg.tag = 'ul'; this.glyphicon = 'caret'; + if (Roo.bootstrap.version == 4) { + this.fa = 'caret-down'; + } + } cfg.cls += this.size.length ? (' btn-' + this.size) : ''; //gsRoo.log(this.parentType); - if (this.parentType === 'Navbar') { + if (this.parentType === 'Navbar' && !this.parent().bar) { + Roo.log('changing to li?'); + cfg.tag = 'li'; cfg.cls = ''; @@ -180,7 +211,9 @@ Roo.extend(Roo.bootstrap.Button, Roo.bootstrap.Component, { delete cfg.html; - } + } + + cfg.cls += this.parentType === 'Navbar' ? ' navbar-btn' : ''; if (this.glyphicon) { cfg.html = ' ' + cfg.html; @@ -192,6 +225,16 @@ Roo.extend(Roo.bootstrap.Button, Roo.bootstrap.Component, { } ]; } + if (this.fa) { + cfg.html = ' ' + cfg.html; + + cfg.cn = [ + { + tag: 'i', + cls: 'fa fas fa-' + this.fa + } + ]; + } if (this.badge) { cfg.html += ' '; @@ -206,18 +249,28 @@ Roo.extend(Roo.bootstrap.Button, Roo.bootstrap.Component, { if(this.glyphicon){ value = { - tag: 'span', - cls: 'glyphicon glyphicon-' + this.glyphicon, - html: this.html - }; - + tag: 'span', + cls: 'glyphicon glyphicon-' + this.glyphicon, + html: this.html + }; + } + if(this.fa){ + value = { + tag: 'i', + cls: 'fa fas fa-' + this.fa, + html: this.html + }; } + var bw = this.badge_weight.length ? this.badge_weight : + (this.weight.length ? this.weight : 'secondary'); + bw = bw == 'default' ? 'secondary' : bw; + cfg.cn = [ value, { tag: 'span', - cls: 'badge', + cls: 'badge badge-' + bw, html: this.badge } ]; @@ -227,7 +280,8 @@ Roo.extend(Roo.bootstrap.Button, Roo.bootstrap.Component, { if (this.menu) { cfg.cls += ' dropdown'; - cfg.html = typeof(cfg.html) != 'undefined' ? cfg.html + ' ' : ''; + cfg.html = typeof(cfg.html) != 'undefined' ? + cfg.html + ' ' : ''; } if (cfg.tag !== 'a' && this.href !== '') { @@ -249,26 +303,131 @@ Roo.extend(Roo.bootstrap.Button, Roo.bootstrap.Component, { initEvents: function() { // Roo.log('init events?'); // Roo.log(this.el.dom); + // add the menu... + + if (typeof (this.menu) != 'undefined') { + this.menu.parentType = this.xtype; + this.menu.triggerEl = this.el; + this.addxtype(Roo.apply({}, this.menu)); + } + + if (this.el.hasClass('roo-button')) { this.el.on('click', this.onClick, this); } else { this.el.select('.roo-button').on('click', this.onClick, this); } + if(this.removeClass){ + this.el.on('click', this.onClick, this); + } + this.el.enableDisplayMode(); }, onClick : function(e) { + if (this.disabled) { + return; + } + Roo.log('button on click '); if(this.preventDefault){ e.preventDefault(); } + if (this.pressed === true || this.pressed === false) { + this.toggleActive(e); + } + + this.fireEvent('click', this, e); + }, + + /** + * Enables this button + */ + enable : function() + { + this.disabled = false; + this.el.removeClass('disabled'); + }, + + /** + * Disable this button + */ + disable : function() + { + this.disabled = true; + this.el.addClass('disabled'); + }, + /** + * sets the active state on/off, + * @param {Boolean} state (optional) Force a particular state + */ + setActive : function(v) { + + this.el[v ? 'addClass' : 'removeClass']('active'); + this.pressed = v; + }, + /** + * toggles the current active state + */ + toggleActive : function(e) + { + this.setActive(!this.pressed); + this.fireEvent('toggle', this, e, !this.pressed); + }, + /** + * get the current active state + * @return {boolean} true if it's active + */ + isActive : function() + { + return this.el.hasClass('active'); + }, + /** + * set the text of the first selected button + */ + setText : function(str) + { + this.el.select('.roo-button-text',true).first().dom.innerHTML = str; + }, + /** + * get the text of the first selected button + */ + getText : function() + { + return this.el.select('.roo-button-text',true).first().dom.innerHTML; + }, + + setWeight : function(str) + { + this.el.removeClass(Roo.bootstrap.Button.weights.map(function(w) { return 'btn-' + w; } ) ); + this.el.removeClass(Roo.bootstrap.Button.weights.map(function(w) { return 'btn-outline-' + w; } ) ); + this.weight = str; + var outline = this.outline ? 'outline-' : ''; + if (str == 'default') { + this.el.addClass('btn-default btn-outline-secondary'); + return; + } + this.el.addClass('btn-' + outline + str); } }); +// fixme - this is probably generic bootstrap - should go in some kind of enum file.. - like sizes. - \ No newline at end of file +Roo.bootstrap.Button.weights = [ + 'default', + 'secondary' , + 'primary', + 'success', + 'info', + 'warning', + 'danger', + 'link', + 'light', + 'dark', + +]; \ No newline at end of file