You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
271 lines
9.5 KiB
271 lines
9.5 KiB
(function () { |
|
function isVertical(position) { |
|
return position === "top" || position === "bottom"; |
|
} |
|
|
|
var loadingCls = "button-loading-font anim-rotate"; |
|
|
|
/** |
|
* 文字类型的按钮 |
|
* @class BI.Button |
|
* @extends BI.BasicButton |
|
* |
|
* @cfg {JSON} options 配置属性 |
|
* @cfg {'common'/'success'/'warning'/'ignore'} [options.level='common'] 按钮类型,用不同颜色强调不同的场景 |
|
*/ |
|
BI.Button = BI.inherit(BI.BasicButton, { |
|
|
|
_const: { |
|
iconWidth: 18, |
|
}, |
|
|
|
_defaultConfig: function (props) { |
|
var conf = BI.Button.superclass._defaultConfig.apply(this, arguments); |
|
|
|
var adaptiveHeight = 0; |
|
if (isVertical(props.iconPosition)) { |
|
// 图标高度和文字高度默认相等 |
|
adaptiveHeight += (props.textHeight || 16) * 2; |
|
adaptiveHeight += props.iconGap || 0; |
|
var tGap = props.tgap || props.vgap || 2; |
|
var bGap = props.bgap || props.vgap || 2; |
|
adaptiveHeight += (tGap + bGap); |
|
} |
|
|
|
var clearMinWidth = props.block === true || props.clear === true || props.plain; |
|
|
|
return BI.extend(conf, { |
|
baseCls: (conf.baseCls || "") + " bi-button" + ((BI.isIE() && BI.isIE9Below()) ? " hack" : ""), |
|
attributes: { |
|
tabIndex: 1, |
|
}, |
|
minWidth: clearMinWidth ? 0 : 80, |
|
height: isVertical(props.iconPosition) ? adaptiveHeight : 24, |
|
shadow: props.clear !== true, |
|
isShadowShowingOnSelected: true, |
|
readonly: true, |
|
iconCls: "", |
|
level: "common", |
|
block: false, // 是否块状显示,即不显示边框,没有最小宽度的限制 |
|
clear: false, // 是否去掉边框和背景 |
|
ghost: false, // 是否幽灵显示, 即正常状态无背景 |
|
loading: false, // 是否处于加载中 |
|
light: false, // 是否使用浅色 |
|
plain: false, // 是否是朴素按钮,和 clear 的区别是 plain 有悬浮效果 |
|
textAlign: "center", |
|
whiteSpace: "nowrap", |
|
textWidth: null, |
|
textHeight: null, |
|
hgap: props.clear ? 0 : (props.plain && !props.text ? 4 : 10), |
|
vgap: 0, |
|
tgap: 0, |
|
bgap: 0, |
|
lgap: 0, |
|
rgap: 0, |
|
icon: "", |
|
iconGap: 0, |
|
iconPosition: "left", |
|
}); |
|
}, |
|
|
|
render: function () { |
|
var o = this.options, self = this; |
|
|
|
// bi.center_adapt 作用:让 hgap 不影响 iconGap。 |
|
BI.createWidget({ |
|
type: "bi.center_adapt", |
|
horizontalAlign: o.textAlign, |
|
element: this, |
|
ref(ref) { |
|
self.containerRef = ref; |
|
}, |
|
hgap: o.hgap, |
|
vgap: o.vgap, |
|
items: self.generateItems() |
|
}); |
|
|
|
// 如果 options 对应的属性为 true 则给元素添加 class |
|
var classArr = ["block", "clear", "ghost", "plain", "loading", "light"]; |
|
BI.each(classArr, function (_, clz) { |
|
if (BI.get(o, clz) === true) { |
|
self.element.addClass(clz); |
|
} |
|
}); |
|
|
|
if (o.minWidth > 0) { |
|
this.element.css({ "min-width": BI.pixFormat(o.minWidth) }); |
|
} |
|
}, |
|
|
|
generateItems(defaultRenderIcon) { |
|
var o = this.options; |
|
|
|
// 由于button默认情况下有个边框,所以要主动算行高 |
|
var lineHeight, textHeight = o.textHeight; |
|
var hasBorder = false |
|
if (BI.isNumber(o.height)) { |
|
if (!isVertical(o.iconPosition)) { |
|
if (!(o.clear && o.block && o.light)) { |
|
hasBorder = true; |
|
} |
|
lineHeight = o.height; |
|
} else { |
|
lineHeight = textHeight; |
|
} |
|
} |
|
if (!textHeight) { |
|
if (o.whiteSpace === "nowrap") { |
|
textHeight = lineHeight; |
|
} |
|
} |
|
|
|
var iconInvisible = !(o.loading || o.iconCls || o.icon || defaultRenderIcon); |
|
|
|
var textWidth = o.textWidth; |
|
if (BI.isNull(o.textWidth)) { |
|
textWidth = (o.minWidth > 0 && o.width < o.minWidth) ? o.minWidth : o.width; |
|
textWidth -= (o.hgap * 2 + o.iconGap) |
|
textWidth -= iconInvisible || isVertical(o.iconPosition) ? 0 : this._const.iconWidth |
|
} |
|
this.text = BI.createWidget({ |
|
type: "bi.label", |
|
text: o.text, |
|
whiteSpace: o.whiteSpace, |
|
textAlign: o.textAlign, |
|
textWidth: textWidth, |
|
textHeight: BI.toPix(textHeight, hasBorder ? 2 : 0), |
|
height: BI.toPix(lineHeight, hasBorder ? 2 : 0), |
|
value: o.value, |
|
title: null, |
|
}); |
|
|
|
if (iconInvisible) { |
|
return [this.text] |
|
} |
|
|
|
this._iconRendered = true; |
|
|
|
if (BI.isPlainObject(o.icon) && !o.loading) { |
|
this.icon = BI.createWidget(o.icon); |
|
} else { |
|
this.icon = BI.createWidget({ |
|
type: "bi.icon_label", |
|
cls: o.loading ? loadingCls : (o.iconCls || o.icon), |
|
width: this._const.iconWidth, |
|
height: BI.toPix(lineHeight, hasBorder ? 2 : 0), |
|
lineHeight: BI.toPix(lineHeight, hasBorder ? 2 : 0), |
|
// 不设置,自定义按钮无法居中 |
|
iconWidth: o.iconWidth, |
|
iconHeight: o.iconHeight, |
|
invisible: iconInvisible, |
|
}); |
|
} |
|
|
|
var gapContainer = { |
|
lgap: o.iconPosition === "left" && o.text ? o.iconGap : 0, |
|
rgap: o.iconPosition === "right" ? o.iconGap : 0, |
|
tgap: o.iconPosition === "top" ? o.iconGap : 0, |
|
bgap: o.iconPosition === "bottom" ? o.iconGap : 0, |
|
}; |
|
|
|
var items = [this.icon, BI.extend({ el: this.text }, gapContainer)]; |
|
if (o.iconPosition === "right" || o.iconPosition === "bottom") { |
|
items.reverse(); |
|
} |
|
|
|
return [{ |
|
type: isVertical(o.iconPosition) ? "bi.vertical" : "bi.horizontal", |
|
horizontalAlign: "center", |
|
verticalAlign: "middle", |
|
items, |
|
}]; |
|
}, |
|
|
|
doClick: function () { |
|
BI.Button.superclass.doClick.apply(this, arguments); |
|
if (this.isValid()) { |
|
this.fireEvent(BI.Button.EVENT_CHANGE, this); |
|
} |
|
}, |
|
|
|
_setEnable: function (enable) { |
|
BI.Button.superclass._setEnable.apply(this, arguments); |
|
if (enable === true) { |
|
this.element.attr("tabIndex", 1); |
|
} else if (enable === false) { |
|
this.element.removeAttr("tabIndex"); |
|
} |
|
}, |
|
|
|
beforeClick: function () { |
|
return this.isLoading(); |
|
}, |
|
|
|
isLoading: function () { |
|
return this._loading === undefined ? this.options.loading : this._loading; |
|
}, |
|
|
|
loading: function () { |
|
this._loading = true; |
|
this.element.addClass("loading"); |
|
!this._iconRendered && this.containerRef.populate(this.generateItems(true)); |
|
if (this.icon.loading) { |
|
this.icon.loading(); |
|
} else { |
|
// loadingCls 可以覆盖 iconCls 所以不需要移除 iconCls |
|
this.icon.element.addClass(loadingCls); |
|
this.icon.setVisible(true); |
|
} |
|
}, |
|
|
|
loaded: function () { |
|
this._loading = false; |
|
this.element.removeClass("loading"); |
|
if (this.icon.loaded) { |
|
this.icon.loaded(); |
|
} else { |
|
this.icon.element.removeClass(loadingCls); |
|
this.icon.setVisible(!!this.options.iconCls); |
|
} |
|
}, |
|
|
|
setText: function (text) { |
|
BI.Button.superclass.setText.apply(this, arguments); |
|
this.text.setText(text); |
|
}, |
|
|
|
setValue: function (text) { |
|
BI.Button.superclass.setValue.apply(this, arguments); |
|
if (!this.isReadOnly()) { |
|
this.text.setValue(text); |
|
} |
|
}, |
|
|
|
setIcon: function (cls) { |
|
var o = this.options; |
|
!this._iconRendered && this.containerRef.populate(this.generateItems(true)); |
|
if (this.icon && o.iconCls !== cls) { |
|
this.icon.element.removeClass(o.iconCls).addClass(cls); |
|
o.iconCls = cls; |
|
} |
|
}, |
|
|
|
doRedMark: function () { |
|
this.text.doRedMark.apply(this.text, arguments); |
|
}, |
|
|
|
unRedMark: function () { |
|
this.text.unRedMark.apply(this.text, arguments); |
|
}, |
|
|
|
doHighLight: function () { |
|
this.text.doHighLight.apply(this.text, arguments); |
|
}, |
|
|
|
unHighLight: function () { |
|
this.text.unHighLight.apply(this.text, arguments); |
|
}, |
|
}); |
|
BI.shortcut("bi.button", BI.Button); |
|
BI.Button.EVENT_CHANGE = "EVENT_CHANGE"; |
|
}());
|
|
|