fineui是帆软报表和BI产品线所使用的前端框架。
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.

337 lines
11 KiB

8 years ago
/**
* Created by zcf on 2016/9/22.
*/
BI.SingleSlider = BI.inherit(BI.Widget, {
_constant: {
EDITOR_WIDTH: 90,
EDITOR_HEIGHT: 30,
SLIDER_WIDTH_HALF: 15,
SLIDER_WIDTH: 30,
SLIDER_HEIGHT: 30,
TRACK_HEIGHT: 24
},
7 years ago
props: {
baseCls: "bi-single-slider bi-slider-track",
digit: false,
unit: ""
8 years ago
},
7 years ago
render: function () {
var self = this, o = this.options;
8 years ago
var c = this._constant;
this.enable = false;
this.value = "";
this.grayTrack = BI.createWidget({
type: "bi.layout",
cls: "gray-track",
height: 6
});
this.blueTrack = BI.createWidget({
type: "bi.layout",
cls: "blue-track bi-high-light-background",
height: 6
});
this.track = this._createTrackWrapper();
this.slider = BI.createWidget({
8 years ago
type: "bi.single_slider_button"
8 years ago
});
this._draggable(this.slider);
8 years ago
var sliderVertical = BI.createWidget({
type: "bi.vertical",
items: [{
type: "bi.absolute",
items: [this.slider]
}],
hgap: c.SLIDER_WIDTH_HALF,
height: c.SLIDER_HEIGHT
});
7 years ago
// 这边其实是有问题的,拖拽区域是个圆,在圆的边缘拖拽后放开,这边计算出来的蓝条宽度实际上会比放开时长一点或者短一点
8 years ago
sliderVertical.element.click(function (e) {
if (self.enable && self.isEnabled()) {
8 years ago
var offset = e.clientX - self.element.offset().left - c.SLIDER_WIDTH_HALF;
var trackLength = self.track.element[0].scrollWidth;
var percent = 0;
if (offset < 0) {
7 years ago
percent = 0;
8 years ago
}
if (offset > 0 && offset < (trackLength - c.SLIDER_WIDTH)) {
percent = offset * 100 / self._getGrayTrackLength();
}
if (offset > (trackLength - c.SLIDER_WIDTH)) {
7 years ago
percent = 100;
8 years ago
}
var significantPercent = BI.parseFloat(percent.toFixed(1));
self._setAllPosition(significantPercent);
8 years ago
var v = self._getValueByPercent(significantPercent);
8 years ago
v = o.digit === false ? v : v.toFixed(o.digit);
8 years ago
self.label.setValue(v);
self.value = v;
self.fireEvent(BI.SingleSlider.EVENT_CHANGE);
}
});
this.label = BI.createWidget({
7 years ago
type: "bi.sign_text_editor",
8 years ago
cls: "slider-editor-button",
8 years ago
errorText: "",
7 years ago
text: o.unit,
8 years ago
width: c.EDITOR_WIDTH - 2,
8 years ago
allowBlank: false,
validationChecker: function (v) {
return self._checkValidation(v);
}
});
8 years ago
this.label.element.hover(function () {
self.label.element.removeClass("bi-border").addClass("bi-border");
}, function () {
self.label.element.removeClass("bi-border");
});
8 years ago
this.label.on(BI.SignEditor.EVENT_CONFIRM, function () {
var v = BI.parseFloat(this.getValue());
var percent = self._getPercentByValue(v);
8 years ago
var significantPercent = BI.parseFloat(percent.toFixed(1));
self._setAllPosition(significantPercent);
8 years ago
this.setValue(v);
self.value = v;
8 years ago
self.fireEvent(BI.SingleSlider.EVENT_CHANGE);
});
this._setVisible(false);
7 years ago
return {
8 years ago
type: "bi.absolute",
items: [{
el: {
type: "bi.vertical",
items: [{
type: "bi.absolute",
items: [{
el: this.track,
width: "100%",
height: c.TRACK_HEIGHT
}]
}],
hgap: 7,
height: c.TRACK_HEIGHT
},
8 years ago
top: 23,
8 years ago
left: 0,
width: "100%"
}, {
el: sliderVertical,
8 years ago
top: 20,
8 years ago
left: 0,
width: "100%"
}, {
el: {
type: "bi.vertical",
items: [{
type: "bi.absolute",
items: [this.label]
}],
rgap: c.EDITOR_WIDTH,
height: c.EDITOR_HEIGHT
},
top: 0,
left: 0,
width: "100%"
}]
7 years ago
};
8 years ago
},
_draggable: function (widget) {
var self = this, o = this.options;
var startDrag = false;
var size = 0, offset = 0, defaultSize = 0;
var mouseMoveTracker = new BI.MouseMoveTracker(function (deltaX) {
if (mouseMoveTracker.isDragging()) {
startDrag = true;
offset += deltaX;
size = optimizeSize(defaultSize + offset);
widget.element.addClass("dragging");
var percent = size * 100 / (self._getGrayTrackLength());
7 years ago
var significantPercent = BI.parseFloat(percent.toFixed(1));// 直接对计算出来的百分数保留到小数点后一位,相当于分成了1000份。
self._setBlueTrack(significantPercent);
self._setLabelPosition(significantPercent);
self._setSliderPosition(significantPercent);
var v = self._getValueByPercent(significantPercent);
v = o.digit === false ? v : v.toFixed(o.digit);
self.label.setValue(v);
self.value = v;
self.fireEvent(BI.SingleSlider.EVENT_CHANGE);
}
}, function () {
if (startDrag === true) {
size = optimizeSize(size);
var percent = size * 100 / (self._getGrayTrackLength());
var significantPercent = BI.parseFloat(percent.toFixed(1));
self._setSliderPosition(significantPercent);
size = 0;
offset = 0;
defaultSize = size;
startDrag = false;
}
widget.element.removeClass("dragging");
mouseMoveTracker.releaseMouseMoves();
self.fireEvent(BI.SingleSlider.EVENT_CHANGE);
7 years ago
}, window);
widget.element.on("mousedown", function (event) {
7 years ago
if(!widget.isEnabled()) {
return;
}
defaultSize = this.offsetLeft;
optimizeSize(defaultSize);
mouseMoveTracker.captureMouseMoves(event);
});
7 years ago
function optimizeSize (s) {
7 years ago
return BI.clamp(s, 0, self._getGrayTrackLength());
}
},
8 years ago
_createTrackWrapper: function () {
return BI.createWidget({
type: "bi.absolute",
items: [{
el: {
type: "bi.vertical",
items: [{
type: "bi.absolute",
items: [{
el: this.grayTrack,
top: 0,
left: 0,
width: "100%"
}, {
el: this.blueTrack,
top: 0,
left: 0,
width: "0%"
}]
}],
hgap: 8,
height: 8
},
top: 8,
left: 0,
width: "100%"
}]
7 years ago
});
8 years ago
},
_checkValidation: function (v) {
7 years ago
var o = this.options;
var valid = false;
if (BI.isNumeric(v) && !(BI.isNull(v) || v < this.min || v > this.max)) {
7 years ago
if(o.digit === false) {
7 years ago
valid = true;
}else{
var dotText = (v + "").split(".")[1] || "";
valid = (dotText.length === o.digit);
}
}
return valid;
8 years ago
},
_setBlueTrack: function (percent) {
7 years ago
this.blueTrack.element.css({width: percent + "%"});
8 years ago
},
_setLabelPosition: function (percent) {
7 years ago
this.label.element.css({left: percent + "%"});
8 years ago
},
_setSliderPosition: function (percent) {
7 years ago
this.slider.element.css({left: percent + "%"});
8 years ago
},
_setAllPosition: function (percent) {
this._setSliderPosition(percent);
this._setLabelPosition(percent);
this._setBlueTrack(percent);
},
_setVisible: function (visible) {
this.slider.setVisible(visible);
this.label.setVisible(visible);
},
_getGrayTrackLength: function () {
7 years ago
return this.grayTrack.element[0].scrollWidth;
8 years ago
},
_getValueByPercent: function (percent) {
var thousandth = BI.parseInt(percent * 10);
return (((this.max - this.min) * thousandth) / 1000 + this.min);
},
_getPercentByValue: function (v) {
return (v - this.min) * 100 / (this.max - this.min);
},
getValue: function () {
return this.value;
},
setValue: function (v) {
var o = this.options;
8 years ago
v = BI.parseFloat(v);
v = o.digit === false ? v : v.toFixed(o.digit);
if ((!isNaN(v))) {
if (this._checkValidation(v)) {
this.value = v;
8 years ago
}
8 years ago
if (v > this.max) {
8 years ago
this.value = this.max;
}
8 years ago
if (v < this.min) {
8 years ago
this.value = this.min;
}
}
},
7 years ago
_setEnable: function (b) {
BI.SingleSlider.superclass._setEnable.apply(this, [b]);
7 years ago
if(b) {
this.blueTrack.element.removeClass("disabled-blue-track").addClass("blue-track");
} else {
this.blueTrack.element.removeClass("blue-track").addClass("disabled-blue-track");
}
7 years ago
},
8 years ago
setMinAndMax: function (v) {
var minNumber = BI.parseFloat(v.min);
var maxNumber = BI.parseFloat(v.max);
if ((!isNaN(minNumber)) && (!isNaN(maxNumber)) && (maxNumber > minNumber )) {
this.min = minNumber;
this.max = maxNumber;
}
},
reset: function () {
this._setVisible(false);
this.enable = false;
this.value = "";
this.min = 0;
this.max = 0;
this._setBlueTrack(0);
7 years ago
8 years ago
},
populate: function () {
if (!isNaN(this.min) && !isNaN(this.max)) {
this._setVisible(true);
this.enable = true;
this.label.setErrorText(BI.i18nText("BI-Basic_Please_Enter_Number_Between", this.min, this.max));
8 years ago
if (BI.isNumeric(this.value) || BI.isNotEmptyString(this.value)) {
this.label.setValue(this.value);
this._setAllPosition(this._getPercentByValue(this.value));
} else {
this.label.setValue(this.max);
this._setAllPosition(100);
}
}
}
});
BI.SingleSlider.EVENT_CHANGE = "EVENT_CHANGE";
BI.shortcut("bi.single_slider", BI.SingleSlider);