forked from fanruan/fineui
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.
279 lines
7.8 KiB
279 lines
7.8 KiB
/** |
|
* Popover弹出层, |
|
* @class BI.Popover |
|
* @extends BI.Widget |
|
*/ |
|
|
|
import { Widget, shortcut } from "../../core"; |
|
@shortcut() |
|
export class Popover extends Widget { |
|
_constant = { |
|
SIZE: { |
|
SMALL: "small", |
|
NORMAL: "normal", |
|
BIG: "big", |
|
}, |
|
MAX_HEIGHT: 600, |
|
} |
|
|
|
props() { |
|
return { |
|
baseCls: "bi-popover bi-card bi-border-radius", |
|
size: "normal", // small, normal, big |
|
logic: { |
|
dynamic: false, |
|
}, |
|
header: null, |
|
headerHeight: 40, |
|
body: null, |
|
footer: null, |
|
footerHeight: 44, |
|
closable: true, // BI-40839 是否显示右上角的关闭按钮 |
|
bodyHgap: BI.SIZE_CONSANTS.H_GAP_SIZE, |
|
bodyTgap: BI.SIZE_CONSANTS.V_GAP_SIZE, |
|
}; |
|
} |
|
|
|
static xtype = "bi.popover"; |
|
static EVENT_CLOSE = "EVENT_CLOSE"; |
|
static EVENT_OPEN = "EVENT_OPEN"; |
|
static EVENT_CANCEL = "EVENT_CANCEL"; |
|
static EVENT_CONFIRM = "EVENT_CONFIRM"; |
|
|
|
render() { |
|
// var self = this; |
|
const { header, headerHeight, closable, logic, footer, footerHeight, body, bodyTgap, bodyHgap } = this.options; |
|
const c = this._constant; |
|
this.startX = 0; |
|
this.startY = 0; |
|
const size = this._calculateSize(); |
|
this.tracker = new BI.MouseMoveTracker((deltaX, deltaY) => { |
|
const W = BI.Widget._renderEngine.createElement("body").width(); |
|
const H = BI.Widget._renderEngine.createElement("body").height(); |
|
this.startX += deltaX; |
|
this.startY += deltaY; |
|
this.element.css({ |
|
left: BI.clamp(this.startX, 0, W - this.element.width()) + "px", |
|
top: BI.clamp(this.startY, 0, H - this.element.height()) + "px", |
|
}); |
|
// BI-12134 没有什么特别好的方法 |
|
BI.Resizers._resize({ |
|
target: this.element[0], |
|
}); |
|
}, () => { |
|
this.tracker.releaseMouseMoves(); |
|
}, _global); |
|
const items = [{ |
|
el: { |
|
type: "bi.htape", |
|
cls: "bi-message-title bi-header-background", |
|
items: [{ |
|
el: { |
|
type: "bi.absolute", |
|
ref: (_ref) => { |
|
this.dragger = _ref; |
|
}, |
|
items: [{ |
|
el: BI.isPlainObject(header) ? BI.extend({}, header, { |
|
extraCls: "bi-font-bold", |
|
}) : { |
|
type: "bi.label", |
|
cls: "bi-font-bold", |
|
height: headerHeight, |
|
text: header, |
|
title: header, |
|
textAlign: "left", |
|
}, |
|
top: 0, |
|
bottom: 0, |
|
left: BI.SIZE_CONSANTS.H_GAP_SIZE, |
|
right: closable ? 0 : BI.SIZE_CONSANTS.H_GAP_SIZE, |
|
}], |
|
}, |
|
}, closable ? { |
|
el: { |
|
type: "bi.icon_button", |
|
cls: "bi-message-close close-font", |
|
height: headerHeight, |
|
handler: () => { |
|
this.close(); |
|
}, |
|
}, |
|
width: 56, |
|
} : null], |
|
height: headerHeight, |
|
}, |
|
height: headerHeight, |
|
}, logic.dynamic ? { |
|
el: { |
|
type: "bi.vertical", |
|
scrolly: true, |
|
cls: "popover-body", |
|
ref: (_ref) => { |
|
this.body = _ref; |
|
}, |
|
css: { |
|
"max-height": this._getSuitableBodyHeight(c.MAX_HEIGHT - headerHeight - (footer ? footerHeight : 0) - bodyTgap), |
|
"min-height": this._getSuitableBodyHeight(size.height - headerHeight - (footer ? footerHeight : 0) - bodyTgap), |
|
}, |
|
items: [{ |
|
el: body, |
|
}], |
|
hgap: bodyHgap, |
|
tgap: bodyTgap, |
|
}, |
|
} : { |
|
el: { |
|
type: "bi.absolute", |
|
items: [{ |
|
el: body, |
|
left: bodyHgap, |
|
top: bodyTgap, |
|
right: bodyHgap, |
|
bottom: 0, |
|
}], |
|
}, |
|
}]; |
|
if (footer) { |
|
items.push({ |
|
el: { |
|
type: "bi.absolute", |
|
items: [{ |
|
el: footer, |
|
left: BI.SIZE_CONSANTS.H_GAP_SIZE, |
|
top: 0, |
|
right: BI.SIZE_CONSANTS.H_GAP_SIZE, |
|
bottom: 0, |
|
}], |
|
height: footerHeight, |
|
}, |
|
height: footerHeight, |
|
}); |
|
} |
|
|
|
return BI.extend({ |
|
items: items, |
|
width: this._getSuitableWidth(size.width), |
|
}, logic.dynamic ? { |
|
type: "bi.vertical", |
|
scrolly: false, |
|
} : { |
|
type: "bi.vtape", |
|
height: this._getSuitableHeight(size.height), |
|
}); |
|
} |
|
// mounted之后绑定事件 |
|
mounted() { |
|
this.dragger.element.mousedown((e) => { |
|
if (this.options.draggable !== false) { |
|
this.startX = this.element[0].offsetLeft; |
|
this.startY = this.element[0].offsetTop; |
|
this.tracker.captureMouseMoves(e); |
|
} |
|
}); |
|
} |
|
|
|
_getSuitableBodyHeight(height) { |
|
const { headerHeight, footer, footerHeight, bodyTgap } = this.options; |
|
|
|
return BI.clamp(height, 0, BI.Widget._renderEngine.createElement("body")[0].clientHeight - headerHeight - (footer ? footerHeight : 0) - bodyTgap); |
|
} |
|
|
|
_getSuitableHeight(height) { |
|
return BI.clamp(height, 0, BI.Widget._renderEngine.createElement("body")[0].clientHeight); |
|
} |
|
|
|
_getSuitableWidth(width) { |
|
return BI.clamp(width, 0, BI.Widget._renderEngine.createElement("body").width()); |
|
} |
|
|
|
_calculateSize() { |
|
const { size, width, height } = this.options; |
|
const sizeValue = {}; |
|
if (BI.isNotNull(size)) { |
|
switch (size) { |
|
case this._constant.SIZE.SMALL: |
|
sizeValue.width = 450; |
|
sizeValue.height = 200; |
|
sizeValue.type = "small"; |
|
break; |
|
case this._constant.SIZE.BIG: |
|
sizeValue.width = 900; |
|
sizeValue.height = 500; |
|
sizeValue.type = "big"; |
|
break; |
|
default: |
|
sizeValue.width = 550; |
|
sizeValue.height = 500; |
|
sizeValue.type = "default"; |
|
} |
|
} |
|
|
|
return { |
|
width: width || sizeValue.width, |
|
height: height || sizeValue.height, |
|
type: sizeValue.type || "default", |
|
}; |
|
} |
|
setDraggable(b) { |
|
this.options.draggable = b; |
|
} |
|
|
|
hide() { |
|
|
|
} |
|
|
|
open() { |
|
this.show(); |
|
this.fireEvent(Popover.EVENT_OPEN, arguments); |
|
} |
|
|
|
close() { |
|
this.hide(); |
|
this.fireEvent(Popover.EVENT_CLOSE, arguments); |
|
} |
|
|
|
setZindex(zindex) { |
|
this.element.css({ "z-index": zindex }); |
|
} |
|
} |
|
|
|
@shortcut() |
|
export class BarPopover extends Popover { |
|
static xtype = "bi.bar_popover"; |
|
|
|
_defaultConfig() { |
|
return BI.extend(super._defaultConfig(arguments), { |
|
btns: [BI.i18nText("BI-Basic_OK"), BI.i18nText("BI-Basic_Cancel")], |
|
}); |
|
} |
|
|
|
beforeCreate() { |
|
const { footer, warningTitle } = this.options; |
|
footer || (this.options.footer = { |
|
type: "bi.right_vertical_adapt", |
|
lgap: 10, |
|
items: [{ |
|
type: "bi.button", |
|
text: this.options.btns[1], |
|
value: 1, |
|
level: "ignore", |
|
handler: (v) => { |
|
this.fireEvent(Popover.EVENT_CANCEL, v); |
|
this.close(v); |
|
}, |
|
}, { |
|
type: "bi.button", |
|
text: this.options.btns[0], |
|
warningTitle: warningTitle, |
|
value: 0, |
|
handler: (v) => { |
|
this.fireEvent(Popover.EVENT_CONFIRM, v); |
|
this.close(v); |
|
}, |
|
}], |
|
}); |
|
} |
|
} |
|
|
|
|
|
|