2016-04-01 13:17:09 +00:00
|
|
|
/*
|
|
|
|
*
|
2017-01-17 14:58:08 +00:00
|
|
|
* (c) Copyright Ascensio System Limited 2010-2017
|
2016-04-01 13:17:09 +00:00
|
|
|
*
|
|
|
|
* This program is a free software product. You can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Affero General Public License (AGPL)
|
|
|
|
* version 3 as published by the Free Software Foundation. In accordance with
|
|
|
|
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
|
|
|
|
* that Ascensio System SIA expressly excludes the warranty of non-infringement
|
|
|
|
* of any third-party rights.
|
|
|
|
*
|
|
|
|
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
|
|
|
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
|
|
|
|
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
|
|
|
*
|
|
|
|
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
|
|
|
|
* EU, LV-1021.
|
|
|
|
*
|
|
|
|
* The interactive user interfaces in modified source and object code versions
|
|
|
|
* of the Program must display Appropriate Legal Notices, as required under
|
|
|
|
* Section 5 of the GNU AGPL version 3.
|
|
|
|
*
|
|
|
|
* Pursuant to Section 7(b) of the License you must retain the original Product
|
|
|
|
* logo when distributing the program. Pursuant to Section 7(e) we decline to
|
|
|
|
* grant you any rights under trademark law for use of our trademarks.
|
|
|
|
*
|
|
|
|
* All the Product's GUI elements, including illustrations and icon sets, as
|
|
|
|
* well as technical writing content are licensed under the terms of the
|
|
|
|
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
|
|
|
|
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
|
|
|
*
|
|
|
|
*/
|
2016-03-11 00:48:53 +00:00
|
|
|
/**
|
|
|
|
* Button.js
|
|
|
|
*
|
|
|
|
* Created by Alexander Yuzhin on 1/20/14
|
|
|
|
* Copyright (c) 2014 Ascensio System SIA. All rights reserved.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Using template
|
|
|
|
*
|
|
|
|
* A simple button with text:
|
|
|
|
* <button type="button" class="btn" id="id-button">Caption</button>
|
|
|
|
*
|
|
|
|
* A simple button with icon:
|
2017-03-13 16:14:26 +00:00
|
|
|
* <button type="button" class="btn" id="id-button"><span class="icon"> </span></button>
|
2016-03-11 00:48:53 +00:00
|
|
|
*
|
|
|
|
* A button with menu:
|
|
|
|
* <div class="btn-group" id="id-button">
|
|
|
|
* <button type="button" class="btn dropdown-toggle" data-toggle="dropdown">
|
2017-03-13 16:14:26 +00:00
|
|
|
* <span class="icon"> </span>
|
2016-03-11 00:48:53 +00:00
|
|
|
* <span class="caret"></span>
|
|
|
|
* </button>
|
|
|
|
* <ul class="dropdown-menu" role="menu">
|
|
|
|
* </ul>
|
|
|
|
* </div>
|
|
|
|
*
|
|
|
|
* A split button:
|
|
|
|
* <div class="btn-group split" id="id-button">
|
2017-03-13 16:14:26 +00:00
|
|
|
* <button type="button" class="btn"><span class="icon"> </span></button>
|
2016-03-11 00:48:53 +00:00
|
|
|
* <button type="button" class="btn dropdown-toggle" data-toggle="dropdown">
|
|
|
|
* <span class="caret"></span>
|
|
|
|
* <span class="sr-only"></span>
|
|
|
|
* </button>
|
|
|
|
* <ul class="dropdown-menu" role="menu">
|
|
|
|
* </ul>
|
|
|
|
* </div>
|
|
|
|
*
|
|
|
|
* A useful classes of button size
|
|
|
|
*
|
|
|
|
* - `'small'`
|
|
|
|
* - `'normal'`
|
|
|
|
* - `'large'`
|
|
|
|
* - `'huge'`
|
|
|
|
*
|
|
|
|
* A useful classes of button type
|
|
|
|
*
|
|
|
|
* - `'default'`
|
|
|
|
* - `'active'`
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* Buttons can also be toggled. To enable this, you simple set the {@link #enableToggle} property to `true`.
|
|
|
|
*
|
|
|
|
* Example usage:
|
|
|
|
* new Common.UI.Button({
|
|
|
|
* el: $('#id'),
|
|
|
|
* enableToggle: true
|
|
|
|
* });
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @property {Boolean} disabled
|
|
|
|
* True if this button is disabled. Read-only.
|
|
|
|
*
|
|
|
|
* disabled: false,
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @property {Boolean} pressed
|
|
|
|
* True if this button is pressed (only if enableToggle = true). Read-only.
|
|
|
|
*
|
|
|
|
* pressed: false,
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @cfg {Boolean} [allowDepress=true]
|
|
|
|
* False to not allow a pressed Button to be depressed. Only valid when {@link #enableToggle} is true.
|
|
|
|
*
|
|
|
|
* @cfg {String/Object} hint
|
|
|
|
* The tooltip for the button - can be a string to be used as bootstrap tooltip
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
if (Common === undefined)
|
|
|
|
var Common = {};
|
|
|
|
|
|
|
|
define([
|
|
|
|
'common/main/lib/component/BaseView',
|
|
|
|
'common/main/lib/component/ToggleManager'
|
|
|
|
], function () {
|
|
|
|
'use strict';
|
|
|
|
|
2017-03-09 08:58:19 +00:00
|
|
|
var templateHugeCaption =
|
2017-03-23 12:52:49 +00:00
|
|
|
'<button type="button" class="btn dropdown-toggle <%= cls %>" data-toggle="dropdown">' +
|
|
|
|
'<div class="inner-box-icon">' +
|
|
|
|
'<% if ( iconImg ) { %>' +
|
|
|
|
'<img src="<%= iconImg %>">' +
|
|
|
|
'<% } else { %>' +
|
|
|
|
'<i class="icon <%= iconCls %>"> </i>' +
|
|
|
|
'<% } %>' +
|
|
|
|
'</div>' +
|
|
|
|
'<span class="caption"><%= caption %></span>' +
|
2017-03-29 08:49:42 +00:00
|
|
|
'</button>';
|
2017-03-23 12:52:49 +00:00
|
|
|
|
|
|
|
var templateHugeMenuCaption =
|
2017-03-13 16:14:26 +00:00
|
|
|
'<div class="btn-group icon-top" id="<%= id %>" style="<%= style %>">' +
|
2017-03-09 08:58:19 +00:00
|
|
|
'<button type="button" class="btn dropdown-toggle <%= cls %>" data-toggle="dropdown">' +
|
2017-03-29 08:49:42 +00:00
|
|
|
'<div class="inner-box-icon">' +
|
2017-03-13 16:14:26 +00:00
|
|
|
'<% if ( iconImg ) { %>' +
|
|
|
|
'<img src="<%= iconImg %>">' +
|
|
|
|
'<% } else { %>' +
|
|
|
|
'<i class="icon <%= iconCls %>"> </i>' +
|
|
|
|
'<% } %>' +
|
2017-03-29 08:49:42 +00:00
|
|
|
'</div>' +
|
2017-03-09 08:58:19 +00:00
|
|
|
'<div class="inner-box-caption">' +
|
|
|
|
'<span class="caption"><%= caption %></span>' +
|
|
|
|
'<span class="caret img-commonctrl"></span>' +
|
|
|
|
'</div>' +
|
|
|
|
'</button>' +
|
|
|
|
'</div>';
|
|
|
|
|
|
|
|
var templateHugeSplitCaption =
|
|
|
|
'<div class="btn-group x-huge split icon-top" id="<%= id %>" style="<%= style %>">' +
|
|
|
|
'<button type="button" class="btn <%= cls %> inner-box-icon">' +
|
2017-03-29 08:49:42 +00:00
|
|
|
'<% if ( iconImg ) { %>' +
|
|
|
|
'<img src="<%= iconImg %>">' +
|
|
|
|
'<% } else { %>' +
|
|
|
|
'<i class="icon <%= iconCls %>"> </i>' +
|
|
|
|
'<% } %>' +
|
2017-03-09 08:58:19 +00:00
|
|
|
'</button>' +
|
|
|
|
'<button type="button" class="btn <%= cls %> inner-box-caption dropdown-toggle" data-toggle="dropdown">' +
|
|
|
|
'<span class="caption"><%= caption %></span>' +
|
|
|
|
'<span class="caret img-commonctrl"></span>' +
|
|
|
|
'</button>' +
|
|
|
|
'</div>';
|
|
|
|
|
2016-03-11 00:48:53 +00:00
|
|
|
Common.UI.Button = Common.UI.BaseView.extend({
|
|
|
|
options : {
|
|
|
|
id : null,
|
|
|
|
hint : false,
|
|
|
|
enableToggle : false,
|
|
|
|
allowDepress : true,
|
|
|
|
toggleGroup : null,
|
|
|
|
cls : '',
|
|
|
|
iconCls : '',
|
|
|
|
caption : '',
|
|
|
|
menu : null,
|
|
|
|
disabled : false,
|
|
|
|
pressed : false,
|
|
|
|
split : false
|
|
|
|
},
|
|
|
|
|
|
|
|
template: _.template([
|
2017-03-16 09:55:11 +00:00
|
|
|
'<% var applyicon = function() { %>',
|
2017-03-16 11:38:12 +00:00
|
|
|
'<% if (iconImg) { print(\'<img src=\"\' + iconImg + \'\">\'); } else { %>',
|
|
|
|
'<% if (iconCls != "") { print(\'<i class=\"icon \' + iconCls + \'\"> </i>\'); }} %>',
|
2017-03-16 09:55:11 +00:00
|
|
|
'<% } %>',
|
2017-03-13 16:14:26 +00:00
|
|
|
'<% if ( !menu ) { %>',
|
2016-03-11 00:48:53 +00:00
|
|
|
'<button type="button" class="btn <%= cls %>" id="<%= id %>" style="<%= style %>">',
|
2017-03-16 09:55:11 +00:00
|
|
|
'<% applyicon() %>',
|
2017-03-06 09:02:32 +00:00
|
|
|
'<span class="caption"><%= caption %></span>',
|
2016-03-11 00:48:53 +00:00
|
|
|
'</button>',
|
|
|
|
'<% } else if (split == false) {%>',
|
|
|
|
'<div class="btn-group" id="<%= id %>" style="<%= style %>">',
|
|
|
|
'<button type="button" class="btn dropdown-toggle <%= cls %>" data-toggle="dropdown">',
|
2017-03-16 09:55:11 +00:00
|
|
|
'<% applyicon() %>',
|
2017-03-06 09:02:32 +00:00
|
|
|
'<span class="caption"><%= caption %></span>',
|
2016-03-11 00:48:53 +00:00
|
|
|
'<span class="caret img-commonctrl"></span>',
|
|
|
|
'</button>',
|
|
|
|
'</div>',
|
|
|
|
'<% } else { %>',
|
|
|
|
'<div class="btn-group split" id="<%= id %>" style="<%= style %>">',
|
|
|
|
'<button type="button" class="btn <%= cls %>">',
|
2017-03-16 09:55:11 +00:00
|
|
|
'<% applyicon() %>',
|
2017-03-06 09:02:32 +00:00
|
|
|
'<span class="caption"><%= caption %></span>',
|
2016-03-11 00:48:53 +00:00
|
|
|
'</button>',
|
|
|
|
'<button type="button" class="btn <%= cls %> dropdown-toggle" data-toggle="dropdown">',
|
|
|
|
'<span class="caret img-commonctrl"></span>',
|
|
|
|
'<span class="sr-only"></span>',
|
|
|
|
'</button>',
|
|
|
|
'</div>',
|
|
|
|
'<% } %>'
|
|
|
|
].join('')),
|
|
|
|
|
|
|
|
initialize : function(options) {
|
|
|
|
Common.UI.BaseView.prototype.initialize.call(this, options);
|
|
|
|
|
|
|
|
var me = this;
|
|
|
|
|
|
|
|
me.id = me.options.id || Common.UI.getId();
|
|
|
|
me.hint = me.options.hint;
|
|
|
|
me.enableToggle = me.options.enableToggle;
|
|
|
|
me.allowDepress = me.options.allowDepress;
|
|
|
|
me.cls = me.options.cls;
|
|
|
|
me.iconCls = me.options.iconCls;
|
|
|
|
me.menu = me.options.menu;
|
|
|
|
me.split = me.options.split;
|
|
|
|
me.toggleGroup = me.options.toggleGroup;
|
|
|
|
me.disabled = me.options.disabled;
|
|
|
|
me.pressed = me.options.pressed;
|
|
|
|
me.caption = me.options.caption;
|
|
|
|
me.template = me.options.template || me.template;
|
|
|
|
me.style = me.options.style;
|
|
|
|
me.rendered = false;
|
|
|
|
|
|
|
|
if (me.options.el) {
|
|
|
|
me.render();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
render: function(parentEl) {
|
|
|
|
var me = this;
|
|
|
|
|
|
|
|
me.trigger('render:before', me);
|
|
|
|
|
|
|
|
me.cmpEl = $(me.el);
|
|
|
|
|
|
|
|
if (parentEl) {
|
|
|
|
me.setElement(parentEl, false);
|
|
|
|
|
|
|
|
if (!me.rendered) {
|
2017-03-09 08:58:19 +00:00
|
|
|
if ( /icon-top/.test(me.cls) && !!me.caption && /huge/.test(me.cls) ) {
|
|
|
|
if ( me.split === true ) {
|
|
|
|
!!me.cls && (me.cls = me.cls.replace(/\s?(?:x-huge|icon-top)/g, ''));
|
|
|
|
this.template = _.template(templateHugeSplitCaption);
|
|
|
|
} else
|
|
|
|
if ( !!me.menu ) {
|
2017-03-23 12:52:49 +00:00
|
|
|
this.template = _.template(templateHugeMenuCaption);
|
|
|
|
} else {
|
2017-03-09 08:58:19 +00:00
|
|
|
this.template = _.template(templateHugeCaption);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-03-11 00:48:53 +00:00
|
|
|
me.cmpEl = $(this.template({
|
|
|
|
id : me.id,
|
|
|
|
cls : me.cls,
|
|
|
|
iconCls : me.iconCls,
|
2017-03-16 09:55:11 +00:00
|
|
|
iconImg : me.options.iconImg,
|
2016-03-11 00:48:53 +00:00
|
|
|
menu : me.menu,
|
|
|
|
split : me.split,
|
|
|
|
disabled : me.disabled,
|
|
|
|
pressed : me.pressed,
|
|
|
|
caption : me.caption,
|
|
|
|
style : me.style
|
|
|
|
}));
|
|
|
|
|
2016-08-04 17:02:57 +00:00
|
|
|
if (me.menu && _.isObject(me.menu) && _.isFunction(me.menu.render))
|
2016-03-11 00:48:53 +00:00
|
|
|
me.menu.render(me.cmpEl);
|
|
|
|
|
|
|
|
parentEl.html(me.cmpEl);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!me.rendered) {
|
|
|
|
var el = me.cmpEl,
|
|
|
|
isGroup = el.hasClass('btn-group'),
|
|
|
|
isSplit = el.hasClass('split');
|
|
|
|
|
|
|
|
if (me.options.hint) {
|
|
|
|
var modalParents = me.cmpEl.closest('.asc-window');
|
|
|
|
|
|
|
|
me.cmpEl.attr('data-toggle', 'tooltip');
|
|
|
|
me.cmpEl.tooltip({
|
|
|
|
title : me.options.hint,
|
|
|
|
placement : me.options.hintAnchor||'cursor'
|
|
|
|
});
|
|
|
|
|
|
|
|
if (modalParents.length > 0) {
|
|
|
|
me.cmpEl.data('bs.tooltip').tip().css('z-index', parseInt(modalParents.css('z-index')) + 10);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_.isString(me.toggleGroup)) {
|
|
|
|
me.enableToggle = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
var buttonHandler = function(e) {
|
|
|
|
if (!me.disabled && e.which == 1) {
|
|
|
|
me.doToggle();
|
|
|
|
if (me.options.hint) {
|
|
|
|
var tip = me.cmpEl.data('bs.tooltip');
|
|
|
|
if (tip) {
|
|
|
|
if (tip.dontShow===undefined)
|
|
|
|
tip.dontShow = true;
|
|
|
|
|
|
|
|
tip.hide();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
me.trigger('click', me, e);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2017-03-23 13:00:24 +00:00
|
|
|
var doSplitSelect = function(select, element, e) {
|
2016-03-11 00:48:53 +00:00
|
|
|
if (!select) {
|
|
|
|
// Is mouse under button
|
|
|
|
var isUnderMouse = false;
|
|
|
|
|
2017-03-23 13:00:24 +00:00
|
|
|
$('button', el).each(function(index, button){
|
|
|
|
if ($(button).is(':hover')) {
|
2016-03-11 00:48:53 +00:00
|
|
|
isUnderMouse = true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
if (!isUnderMouse) {
|
|
|
|
el.removeClass('over');
|
|
|
|
$('button', el).removeClass('over');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-03-23 13:00:24 +00:00
|
|
|
if ( element == 'button') {
|
|
|
|
if (!select && (me.enableToggle && me.allowDepress && me.pressed))
|
|
|
|
return;
|
|
|
|
if (select && !isSplit && (me.enableToggle && me.allowDepress && !me.pressed)) { // to depress button with menu
|
|
|
|
e.preventDefault();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$('button:first', el).toggleClass('active', select);
|
|
|
|
} else
|
|
|
|
$('[data-toggle^=dropdown]', el).toggleClass('active', select);
|
2016-03-11 00:48:53 +00:00
|
|
|
|
|
|
|
el.toggleClass('active', select);
|
|
|
|
};
|
|
|
|
|
|
|
|
var menuHandler = function(e) {
|
|
|
|
if (!me.disabled && e.which == 1) {
|
|
|
|
if (isSplit) {
|
|
|
|
if (me.options.hint) {
|
|
|
|
var tip = me.cmpEl.data('bs.tooltip');
|
|
|
|
if (tip) {
|
|
|
|
if (tip.dontShow===undefined)
|
|
|
|
tip.dontShow = true;
|
|
|
|
|
|
|
|
tip.hide();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var isOpen = el.hasClass('open');
|
2017-03-23 13:00:24 +00:00
|
|
|
doSplitSelect(!isOpen, 'arrow', e);
|
2016-03-11 00:48:53 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
var doSetActiveState = function(e, state) {
|
|
|
|
if (isSplit) {
|
2017-03-23 13:00:24 +00:00
|
|
|
doSplitSelect(state, 'button', e);
|
2016-03-11 00:48:53 +00:00
|
|
|
} else {
|
|
|
|
el.toggleClass('active', state);
|
|
|
|
$('button', el).toggleClass('active', state);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2017-03-23 13:00:24 +00:00
|
|
|
var splitElement;
|
2016-03-11 00:48:53 +00:00
|
|
|
var onMouseDown = function (e) {
|
2017-03-23 13:00:24 +00:00
|
|
|
splitElement = e.currentTarget.className.match(/dropdown/) ? 'arrow' : 'button';
|
|
|
|
doSplitSelect(true, splitElement, e);
|
2016-03-11 00:48:53 +00:00
|
|
|
$(document).on('mouseup', onMouseUp);
|
|
|
|
};
|
|
|
|
|
|
|
|
var onMouseUp = function (e) {
|
2017-03-23 13:00:24 +00:00
|
|
|
doSplitSelect(false, splitElement, e);
|
2016-03-11 00:48:53 +00:00
|
|
|
$(document).off('mouseup', onMouseUp);
|
|
|
|
};
|
|
|
|
|
|
|
|
var onAfterHideMenu = function(e) {
|
|
|
|
me.cmpEl.find('.dropdown-toggle').blur();
|
|
|
|
if (me.cmpEl.hasClass('active') !== me.pressed)
|
|
|
|
me.cmpEl.trigger('button.internal.active', [me.pressed]);
|
|
|
|
};
|
|
|
|
|
|
|
|
if (isGroup) {
|
|
|
|
if (isSplit) {
|
|
|
|
$('[data-toggle^=dropdown]', el).on('mousedown', _.bind(menuHandler, this));
|
|
|
|
$('button', el).on('mousedown', _.bind(onMouseDown, this));
|
|
|
|
}
|
|
|
|
|
2017-03-23 13:00:24 +00:00
|
|
|
el.on('hide.bs.dropdown', _.bind(doSplitSelect, me, false, 'arrow'));
|
|
|
|
el.on('show.bs.dropdown', _.bind(doSplitSelect, me, true, 'arrow'));
|
2016-03-11 00:48:53 +00:00
|
|
|
el.on('hidden.bs.dropdown', _.bind(onAfterHideMenu, me));
|
|
|
|
|
|
|
|
$('button:first', el).on('click', buttonHandler);
|
|
|
|
} else {
|
|
|
|
el.on('click', buttonHandler);
|
|
|
|
}
|
|
|
|
|
|
|
|
el.on('button.internal.active', _.bind(doSetActiveState, me));
|
|
|
|
|
|
|
|
el.on('mouseover', function(e) {
|
|
|
|
if (!me.disabled) {
|
|
|
|
me.cmpEl.addClass('over');
|
|
|
|
me.trigger('mouseover', me, e);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
el.on('mouseout', function(e) {
|
|
|
|
if (!me.disabled) {
|
|
|
|
me.cmpEl.removeClass('over');
|
|
|
|
me.trigger('mouseout', me, e);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Register the button in the toggle manager
|
|
|
|
Common.UI.ToggleManager.register(me);
|
|
|
|
}
|
|
|
|
|
|
|
|
me.rendered = true;
|
|
|
|
|
|
|
|
if (me.pressed) {
|
|
|
|
me.toggle(me.pressed, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (me.disabled) {
|
2016-08-05 09:58:30 +00:00
|
|
|
me.setDisabled(!(me.disabled=false));
|
2016-03-11 00:48:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
me.trigger('render:after', me);
|
|
|
|
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
|
|
|
|
doToggle: function(){
|
|
|
|
var me = this;
|
|
|
|
if (me.enableToggle && (me.allowDepress !== false || !me.pressed)) {
|
|
|
|
me.toggle();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
toggle: function(toggle, suppressEvent) {
|
|
|
|
var state = toggle === undefined ? !this.pressed : !!toggle;
|
|
|
|
|
|
|
|
this.pressed = state;
|
|
|
|
|
|
|
|
if (this.cmpEl)
|
|
|
|
this.cmpEl.trigger('button.internal.active', [state]);
|
|
|
|
|
|
|
|
if (!suppressEvent)
|
|
|
|
this.trigger('toggle', this, state);
|
|
|
|
},
|
|
|
|
|
|
|
|
isActive: function() {
|
|
|
|
if (this.enableToggle)
|
|
|
|
return this.pressed;
|
|
|
|
|
|
|
|
return this.cmpEl.hasClass('active')
|
|
|
|
},
|
|
|
|
|
|
|
|
setDisabled: function(disabled) {
|
2016-08-12 12:04:12 +00:00
|
|
|
if (this.rendered && this.disabled != disabled) {
|
2016-03-11 00:48:53 +00:00
|
|
|
var el = this.cmpEl,
|
|
|
|
isGroup = el.hasClass('btn-group');
|
|
|
|
|
|
|
|
disabled = (disabled===true);
|
|
|
|
|
|
|
|
if (disabled !== el.hasClass('disabled')) {
|
|
|
|
var decorateBtn = function(button) {
|
|
|
|
button.toggleClass('disabled', disabled);
|
|
|
|
(disabled) ? button.attr({disabled: disabled}) : button.removeAttr('disabled');
|
|
|
|
};
|
|
|
|
|
|
|
|
decorateBtn(el);
|
|
|
|
isGroup && decorateBtn(el.children('button'));
|
|
|
|
}
|
|
|
|
|
2016-12-16 13:26:37 +00:00
|
|
|
if (disabled || !Common.Utils.isGecko) {
|
2016-03-11 00:48:53 +00:00
|
|
|
var tip = this.cmpEl.data('bs.tooltip');
|
|
|
|
if (tip) {
|
2016-12-16 13:26:37 +00:00
|
|
|
disabled && tip.hide();
|
|
|
|
!Common.Utils.isGecko && (tip.enabled = !disabled);
|
2016-03-11 00:48:53 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
this.disabled = disabled;
|
|
|
|
},
|
|
|
|
|
|
|
|
isDisabled: function() {
|
|
|
|
return this.disabled;
|
|
|
|
},
|
|
|
|
|
|
|
|
setIconCls: function(cls) {
|
2017-03-09 08:41:47 +00:00
|
|
|
var btnIconEl = $(this.el).find('.icon'),
|
2016-03-11 00:48:53 +00:00
|
|
|
oldCls = this.iconCls;
|
|
|
|
|
|
|
|
this.iconCls = cls;
|
|
|
|
btnIconEl.removeClass(oldCls);
|
|
|
|
btnIconEl.addClass(cls || '');
|
|
|
|
},
|
|
|
|
|
|
|
|
setVisible: function(visible) {
|
|
|
|
if (this.cmpEl) this.cmpEl.toggleClass('hidden', !visible);
|
|
|
|
},
|
|
|
|
|
|
|
|
updateHint: function(hint) {
|
|
|
|
this.options.hint = hint;
|
|
|
|
|
2016-08-23 08:25:57 +00:00
|
|
|
if (!this.rendered) return;
|
|
|
|
|
2016-03-11 00:48:53 +00:00
|
|
|
var cmpEl = this.cmpEl,
|
|
|
|
modalParents = cmpEl.closest('.asc-window');
|
|
|
|
|
2016-12-23 10:03:08 +00:00
|
|
|
if (cmpEl.data('bs.tooltip'))
|
|
|
|
cmpEl.removeData('bs.tooltip');
|
2016-03-11 00:48:53 +00:00
|
|
|
cmpEl.attr('data-toggle', 'tooltip');
|
2016-12-23 10:03:08 +00:00
|
|
|
cmpEl.tooltip({
|
2016-03-11 00:48:53 +00:00
|
|
|
title : hint,
|
|
|
|
placement : this.options.hintAnchor || 'cursor'
|
|
|
|
});
|
|
|
|
|
|
|
|
if (modalParents.length > 0) {
|
|
|
|
cmpEl.data('bs.tooltip').tip().css('z-index', parseInt(modalParents.css('z-index')) + 10);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
setCaption: function(caption) {
|
|
|
|
if (this.caption != caption) {
|
|
|
|
this.caption = caption;
|
|
|
|
|
|
|
|
if (this.rendered) {
|
|
|
|
var captionNode = this.cmpEl.find('button:first > .caption').andSelf().filter('button > .caption');
|
|
|
|
|
|
|
|
if (captionNode.length > 0) {
|
|
|
|
captionNode.text(caption);
|
|
|
|
} else {
|
|
|
|
this.cmpEl.find('button:first').andSelf().filter('button').text(caption);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-08-12 12:04:12 +00:00
|
|
|
},
|
2016-08-04 17:02:57 +00:00
|
|
|
|
2016-08-12 12:04:12 +00:00
|
|
|
setMenu: function (m) {
|
2016-10-20 08:52:14 +00:00
|
|
|
if (m && _.isObject(m) && _.isFunction(m.render)){
|
2016-08-04 17:02:57 +00:00
|
|
|
this.menu = m;
|
2016-10-20 08:52:14 +00:00
|
|
|
if (this.rendered)
|
|
|
|
this.menu.render(this.cmpEl);
|
2016-08-04 17:02:57 +00:00
|
|
|
}
|
|
|
|
}
|
2016-03-11 00:48:53 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|