RbDialog > RbModal

This commit is contained in:
FangfangZhao 2019-01-04 20:41:29 +08:00
parent d5bf9f9d20
commit 710045f8e1
9 changed files with 82 additions and 153 deletions

View file

@ -1,5 +1,5 @@
// ~~
class DlgAssign extends RbDialogHandler {
class DlgAssign extends RbModalHandler {
constructor(props) {
super(props)
this.onView = !!window.RbViewPage
@ -7,7 +7,7 @@ class DlgAssign extends RbDialogHandler {
this.typeName = '分派'
}
render() {
return (<RbDialog title={this.typeName} ref="dlg">
return (<RbModal title={this.typeName} ref="dlg">
<form>
{this.onView == true ? null : (
<div className="form-group row">
@ -44,7 +44,7 @@ class DlgAssign extends RbDialogHandler {
</div>
</div>
</form>
</RbDialog>)
</RbModal>)
}
componentDidMount() {
$(this.refs['toUser']).select2({
@ -127,13 +127,13 @@ class DlgShare extends DlgAssign {
}
// ~~
class DlgUnShare extends RbDialogHandler {
class DlgUnShare extends RbModalHandler {
constructor(props) {
super(props)
this.state.selectAccess = []
}
render(){
return (<RbDialog title={(this.props.unshare == true ? '管理' : '') + '共享用户'} ref="dlg">
return (<RbModal title={(this.props.unshare == true ? '管理' : '') + '共享用户'} ref="dlg">
<div className="sharing-list">
<ul className="list-unstyled list-inline">
{(this.state.sharingList ||[]).map((item)=>{
@ -150,7 +150,7 @@ class DlgUnShare extends RbDialogHandler {
<button className="btn btn-secondary btn-space" type="button" onClick={()=>this.hide()}>取消</button>
</div>
</div>
</RbDialog>)
</RbModal>)
}
componentDidMount() {
$.get(`${rb.baseUrl}/app/entity/sharing-list?id=${this.props.id}`, (res)=>{

View file

@ -46,14 +46,14 @@ const toggleDisabled = function(disabled){
}
//
class DlgChangeDept extends RbDialogHandler {
class DlgChangeDept extends RbModalHandler {
constructor(props) {
super(props)
this.type = 'Department'
this.typeName = '部门'
}
render(){
return (<RbDialog title={'变更' + this.typeName} ref="dlg" disposeOnHide={true}>
return (<RbModal title={'变更' + this.typeName} ref="dlg" disposeOnHide={true}>
<form>
<div className="form-group row">
<label className="col-sm-3 col-form-label text-sm-right">选择新{this.typeName}</label>
@ -68,7 +68,7 @@ class DlgChangeDept extends RbDialogHandler {
</div>
</div>
</form>
</RbDialog>)
</RbModal>)
}
componentDidMount() {
let that = this

View file

@ -38,15 +38,12 @@ $(document).ready(() => {
}
}).disableSelection()
let dlg_filter
let saveFilter = function(filter){
dlg_filter.hide()
esourceFilter = filter
render_preview()
}
$('.J_filter').click(()=>{
if (dlg_filter) dlg_filter.show()
else dlg_filter = renderRbcomp(<AdvFilter entity={window.__sourceEntity} filter={esourceFilter} inModal={true} destroyOnHide={false} confirm={saveFilter} />)
renderRbcomp(<AdvFilter entity={window.__sourceEntity} filter={esourceFilter} inModal={true} confirm={saveFilter} />)
})
let cts = $('.chart-type > a').click(function(){
@ -93,7 +90,7 @@ $(window).resize(() => {
})
const CTs = { SUM:'求和', AVG:'平均值', MAX:'最大值', MIN:'最小值', COUNT:'计数', Y:'按年', Q:'按季', M:'按月', D:'按日', H:'按时' }
let axis_props = null
let dlgAxisProps
let add_axis = ((target, axis) => {
let el = $($('#axis-ietm').html()).appendTo($(target))
let fName = null
@ -149,9 +146,13 @@ let add_axis = ((target, axis) => {
_this.addClass('text-primary')
render_preview()
} else {
let state = { axisEl: el, isNumAxis: isNumAxis, label: el.attr('data-label'), scale: el.attr('data-scale') }
if (axis_props) axis_props.show(state)
else axis_props = renderRbcomp(<DlgAxisProps { ...state } />)
let state = { isNumAxis: isNumAxis, label: el.attr('data-label'), scale: el.attr('data-scale') }
state.callback = (s)=>{
el.attr({ 'data-label': s.label, 'data-scale': s.scale })
render_preview()
}
if (dlgAxisProps) dlgAxisProps.show(state)
else dlgAxisProps = renderRbcomp(<DlgAxisProps { ...state } />)
}
})
if (!!calc) el.find('.dropdown-menu li[data-calc="' + calc + '"]').addClass('text-primary')
@ -246,26 +247,24 @@ let __build_axisItem = ((item, isNum) => {
return x
})
class DlgAxisProps extends React.Component {
class DlgAxisProps extends RbFormHandler {
constructor(props) {
super(props)
this.state = { ...props }
this.changeVal = this.changeVal.bind(this)
}
render() {
return (<RbModal title="显示样式" destroyOnHide={false} ref="dlg">
<form>
return (<RbModal title="显示样式" ref="dlg">
<form>
<div className="form-group row">
<label className="col-sm-3 col-form-label text-sm-right">別名</label>
<div className="col-sm-7">
<input className="form-control form-control-sm" data-id="label" placeholder="默认" value={this.state.label || ''} onChange={this.changeVal} />
<input className="form-control form-control-sm" placeholder="默认" data-id="label" value={this.state.label || ''} onChange={this.handleChange} />
</div>
</div>
{this.state.isNumAxis !== true ? null :
<div className="form-group row">
<label className="col-sm-3 col-form-label text-sm-right">小数位</label>
<div className="col-sm-7">
<select className="form-control form-control-sm" data-id="scale" value={this.state.scale || 2} onChange={this.changeVal}>
<select className="form-control form-control-sm" value={this.state.scale || 2} data-id="scale" onChange={this.handleChange}>
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
@ -277,26 +276,15 @@ class DlgAxisProps extends React.Component {
}
<div className="form-group row footer">
<div className="col-sm-7 offset-sm-3">
<button className="btn btn-primary" type="button" onClick={()=>this.saveProps()}>确定</button>
<button className="btn btn-primary btn-space" type="button" onClick={()=>this.saveProps()}>确定</button>
<a className="btn btn-link btn-space" onClick={()=>this.hide()}>取消</a>
</div>
</div>
</form>
</RbModal>)
}
changeVal(e) {
let id = e.target.dataset.id
let vvv = {}
vvv[id] = e.target.value
this.setState({ ...vvv })
</RbModal>)
}
saveProps() {
this.state.axisEl.attr({ 'data-label': this.state['label'], 'data-scale': this.state['scale'] })
this.refs['dlg'].hide()
render_preview()
}
show(state) {
this.setState({ ...state }, () => {
this.refs['dlg'].show()
})
this.state.callback(this.state)
this.hide()
}
}

View file

@ -127,7 +127,7 @@ class DlgAddChart extends RbFormHandler {
super(props)
}
render() {
return (<RbDialog title="添加图表" ref="dlg">
return (<RbModal title="添加图表" ref="dlg">
<form>
<div className="form-group row">
<label className="col-sm-3 col-form-label text-sm-right">图表数据来源</label>
@ -141,7 +141,7 @@ class DlgAddChart extends RbFormHandler {
</div>
</div>
</form>
</RbDialog>)
</RbModal>)
}
componentDidMount() {
let that = this
@ -169,7 +169,7 @@ class DlgDashSettings extends RbFormHandler {
super(props)
}
render() {
return (<RbDialog title="仪表盘设置" ref="dlg">
return (<RbModal title="仪表盘设置" ref="dlg">
<form>
<div className="form-group row">
<label className="col-sm-3 col-form-label text-sm-right">名称</label>
@ -192,7 +192,7 @@ class DlgDashSettings extends RbFormHandler {
</div>
</div>
</form>
</RbDialog>)
</RbModal>)
}
save() {
let _data = { shareTo: this.state.shareToAll == true ? 'ALL' : 'SELF', title: this.state.title || '默认仪表盘' }
@ -211,7 +211,7 @@ class DlgDashAdd extends RbFormHandler {
super(props)
}
render() {
return (<RbDialog title="添加仪表盘" ref="dlg">
return (<RbModal title="添加仪表盘" ref="dlg">
<form>
<div className="form-group row">
<label className="col-sm-3 col-form-label text-sm-right">名称</label>
@ -234,7 +234,7 @@ class DlgDashAdd extends RbFormHandler {
</div>
</div>
</form>
</RbDialog>)
</RbModal>)
}
save() {
let _data = { title: this.state.title || '我的仪表盘' }

View file

@ -15,10 +15,10 @@ class AdvFilter extends React.Component {
this.childrenRef = []
}
render() {
let needSave = this.props.needSave == true
let showSave = this.props.showSave == true
let operBtns = (
<div className={needSave ? 'float-right' : 'item'}>
<button className="btn btn-primary" type="button" onClick={()=>this.confirm()}>{needSave ? '保存' : '确定'}</button>
<div className={showSave ? 'float-right' : 'item'}>
<button className="btn btn-primary" type="button" onClick={()=>this.confirm()}>{showSave ? '保存' : '确定'}</button>
<button className="btn btn-secondary" type="button" onClick={()=>this.hide(true)}>取消</button>
</div>
)
@ -49,7 +49,7 @@ class AdvFilter extends React.Component {
</div>
}
</div>
{needSave ?
{showSave ?
<div className="item dialog-footer">
{rb.isAdminUser !== true ? null :
<div className="float-left">
@ -68,8 +68,7 @@ class AdvFilter extends React.Component {
</div>
</div>
)
if (this.props.inModal) return (<RbModal ref="dlg" title={this.props.title || '设置过滤条件'} destroyOnHide={this.props.destroyOnHide == true}>{advFilter}</RbModal>)
if (this.props.inModal) return <RbModal ref="dlg" title={this.props.title || '设置过滤条件'} disposeOnHide={true}>{advFilter}</RbModal>
else return advFilter
}
componentDidMount() {
@ -178,22 +177,22 @@ class AdvFilter extends React.Component {
confirm() {
let adv = this.toFilterJson()
if (!!!adv) return
if (this.props.confirm) this.props.confirm(adv, this.state.filterName, this.state.applyToAll)
else if (this.props.confirm) this.props.confirm(adv, this.state.filterName, this.state.applyToAll)
else{
$.post(rb.baseUrl + '/app/entity/advfilter/test-parse', JSON.stringify(adv), function(res){
if (res.error_code == 0) console.log(JSON.stringify(adv) + '\n>> ' + res.data)
else rb.notice(res.error_msg, 'danger')
})
}
if (this.props.inModal) this.refs['dlg'].hide()
}
show(state) {
if (this.props.inModal) this.refs['dlg'].show(state)
}
hide(callCancel) {
hide() {
if (this.props.inModal) this.refs['dlg'].hide()
// callback
if (callCancel == true && this.props.cancel) this.props.cancel()
if (this.props.cancel) this.props.cancel()
}
}

View file

@ -1,5 +1,5 @@
// ~~ Dialog iFrame
class RbDialog extends React.Component {
// ~~ Modal iFrame
class RbModal extends React.Component {
constructor(props) {
super(props)
this.state = { ...props }
@ -51,12 +51,12 @@ class RbDialog extends React.Component {
else height += 45; // .main-content's padding
root.find('.modal-body').height(height)
that.setState({ frameLoad: false })
}, 100, 'RbDialog-resize')
}, 100, 'RbModal-resize')
}
}
//~~ Dialog
class RbDialogHandler extends React.Component {
//~~ Modal
class RbModalHandler extends React.Component {
constructor(props) {
super(props)
this.state = { ...props }
@ -77,7 +77,7 @@ class RbDialogHandler extends React.Component {
}
// ~~ Form
class RbFormHandler extends RbDialogHandler {
class RbFormHandler extends RbModalHandler {
constructor(props) {
super(props)
this.handleChange = this.handleChange.bind(this)
@ -92,73 +92,6 @@ class RbFormHandler extends RbDialogHandler {
}
}
// ~~
class RbModal extends React.Component {
constructor(props) {
super(props)
this.state = { ...props, inLoad: true, isDestroy: false }
}
render() {
return (this.state.isDestroy == true ? null :
<div className="modal rbmodal colored-header colored-header-primary" ref="rbmodal">
<div className="modal-dialog" style={{ maxWidth:(this.props.width || 680) + 'px' }}>
<div className="modal-content">
<div className="modal-header modal-header-colored">
<h3 className="modal-title">{this.state.title || 'RbModal'}</h3>
<button className="close" type="button" onClick={()=>this.hide()}><span className="zmdi zmdi-close"></span></button>
</div>
<div className={'modal-body rb-loading' + (this.state.inLoad ? ' rb-loading-active' : '') + (this.state.url ? ' iframe' : '')}>
{this.props.children || <iframe src={this.state.url || 'about:blank'} frameBorder="0" scrolling="no" onLoad={()=>this.resize()}></iframe>}
<RbSpinner />
</div>
</div>
</div>
</div>
)
}
componentDidMount() {
if (this.props.children) this.setState({ inLoad: false })
this.show(this.props.onShow)
}
resize() {
if (!!!this.state.url) return // iframe resize
let root = $(this.refs['rbmodal'])
let that = this
$setTimeout(function(){
let iframe = root.find('iframe')
let height = iframe.contents().find('.main-content').height()
if (height == 0) height = iframe.contents().find('body').height()
else height += 45; // .main-content's padding
root.find('.modal-body').height(height)
that.setState({ inLoad: false })
}, 100, 'RbModal-resize')
}
show(callback) {
let that = this
this.setState({ isDestroy: false }, function(){
$(that.refs['rbmodal']).modal({ show: true, backdrop: 'static' })
typeof callback == 'function' && callback(that)
})
}
hide(){
let root = $(this.refs['rbmodal'])
let warp = root.parent()
root.modal('hide')
let destroy = true
if (this.props.destroyOnHide == false) destroy = false
else root.modal('dispose')
this.setState({ isDestroy: destroy, inLoad: destroy }, ()=>{
if (destroy == true) {
setTimeout(() => { warp.remove() }, 200)
}
// modal open modal-open
if ($('.rbmodal.show').length > 0) $(document.body).addClass('modal-open')
})
}
}
// ~~
class RbAlert extends React.Component {
constructor(props) {
@ -267,23 +200,27 @@ let rb = rb || {}
rb.__currentModal
rb.__currentModalCache = {}
// @url - URL in iframe
// @title
// @ext - more props
rb.modal = function(url, title, ext) {
ext = ext || {}
if (ext.destroyOnHide !== true) ext.destroyOnHide = false // default false
if (ext.destroyOnHide === false && !!rb.__currentModalCache[url]) {
ext.disposeOnHide = ext.disposeOnHide === true // default false
if (ext.disposeOnHide === false && !!rb.__currentModalCache[url]) {
rb.__currentModal = rb.__currentModalCache[url]
rb.__currentModal.show()
return rb.__currentModal
} else {
rb.__currentModal = renderRbcomp(<RbModal url={url} title={title} width={ext.width} destroyOnHide={ext.destroyOnHide === false ? false : true } />)
if (ext.destroyOnHide === false) rb.__currentModalCache[url] = rb.__currentModal
return rb.__currentModal
rb.__currentModal = renderRbcomp(<RbModal url={url} title={title} width={ext.width} disposeOnHide={ext.disposeOnHide} />)
if (ext.disposeOnHide == false){ // No cache
rb.__currentModalCache[url] = rb.__currentModal
}
}
return rb.__currentModal
}
rb.modalHide = function(url){
if (url){
let m = rb.__currentModalCache[url]
if (m) m.hide()
let c = rb.__currentModalCache[url]
if (c) c.hide()
else console.warn('No Modal found by url-key : ' + url)
} else if (rb.__currentModal) {
rb.__currentModal.hide()
@ -291,25 +228,31 @@ rb.modalHide = function(url){
}
rb.modalResize = function(url){
if (url){
let m = rb.__currentModalCache[url]
if (m) m.resize()
let c = rb.__currentModalCache[url]
if (c) m.resize()
else console.warn('No Modal found by url-key : ' + url)
} else if (rb.__currentModal){
rb.__currentModal.resize()
}
}
rb.alert = function(message, title_ext, ext){
let title = title_ext
if ($.type(title_ext) == 'object'){
// @message
// @titleExt - title or ext
// @ext - more props
rb.alert = function(message, titleExt, ext){
let title = titleExt
if ($.type(titleExt) == 'object'){
title = null
ext = title_ext
ext = titleExt
}
ext = ext || {}
if (ext.html == true) return renderRbcomp(<RbAlert htmlMessage={message} title={title} type={ext.type} confirmText={ext.confirmText} confirm={ext.confirm} />)
else return renderRbcomp(<RbAlert message={message} title={title} type={ext.type} confirmText={ext.confirmText} confirm={ext.confirm} />)
}
//@message
//@type - danger, warning or null
//@ext - more props
rb.notice = function(message, type, ext){
if (top != self && parent.rb && parent.rb.notice){
parent.rb.notice(message, type, ext)

View file

@ -848,7 +848,7 @@ class RbViewModal extends React.Component {
// rbview open modal-open
if ($('.rbview.show').length > 0) $(document.body).addClass('modal-open').css({ 'padding-right': 17 })
// subView always dispose
if (that.state.destroyOnHide == true) {
if (that.state.disposeOnHide == true) {
root.modal('dispose')
let warp = root.parent().parent()
that.setState({ isDestroy: true }, function(){
@ -909,7 +909,7 @@ rb.RbViewModal = function(props, subView) {
let viewUrl = `${rb.baseUrl}/app/${props.entity}/view/${props.id}`
if (subView == true){
rb.RbViewModalHide(props.id)
let m = renderRbcomp(<RbViewModal url={viewUrl} destroyOnHide={true} id={props.id} subView={true} />)
let m = renderRbcomp(<RbViewModal url={viewUrl} disposeOnHide={true} id={props.id} subView={true} />)
rb.__currentRbFormModalCache[props.id] = m
return m
}

View file

@ -568,7 +568,6 @@ const AdvFilters = {
$.post(url, JSON.stringify(filter), function(res){
if (res.error_code == 0){
rb.notice('过滤项已保存', 'success')
that.__modal.hide()
that.loadFilters()
} else rb.notice(res.error_msg, 'danger')
})
@ -576,14 +575,14 @@ const AdvFilters = {
showAdvFilter(id) {
this.__cfgid = id
let props = { entity: this.__entity, inModal: true, needSave: true, confirm: this.saveFilter, destroyOnHide: true }
let props = { entity: this.__entity, inModal: true, showSave: true, confirm: this.saveFilter }
if (!!!id){
this.__modal = renderRbcomp(<AdvFilter { ...props } title="添加过滤项" />)
renderRbcomp(<AdvFilter { ...props } title="添加过滤项" />)
}else{
let that = this
$.get(rb.baseUrl + '/app/entity/advfilter/get?id=' + id, function(res){
let _data = res.data
that.__modal = renderRbcomp(<AdvFilter { ...props } title="修改过滤项" filter={_data.filter} filterName={_data.name} applyToAll={_data.applyTo == 'ALL'} />)
renderRbcomp(<AdvFilter { ...props } title="修改过滤项" filter={_data.filter} filterName={_data.name} applyToAll={_data.applyTo == 'ALL'} />)
})
}
}

View file

@ -43,7 +43,7 @@ class DlgChangePasswd extends RbFormHandler {
super(props)
}
render(){
return (<RbDialog title="更改密码" ref="dlg" disposeOnHide={true}>
return (<RbModal title="更改密码" ref="dlg" disposeOnHide={true}>
<form>
<div className="form-group row">
<label className="col-sm-3 col-form-label text-sm-right">原密码</label>
@ -70,7 +70,7 @@ class DlgChangePasswd extends RbFormHandler {
</div>
</div>
</form>
</RbDialog>)
</RbModal>)
}
post() {
let s = this.state
@ -94,7 +94,7 @@ class DlgChangeEmail extends RbFormHandler {
this.state = { ...this.state, vcodeDisabled: false, vcodeCountdown: '获取验证码' }
}
render(){
return (<RbDialog title="更改邮箱" ref="dlg" disposeOnHide={true}>
return (<RbModal title="更改邮箱" ref="dlg" disposeOnHide={true}>
<form>
<div className="form-group row">
<label className="col-sm-3 col-form-label text-sm-right">邮箱地址</label>
@ -118,7 +118,7 @@ class DlgChangeEmail extends RbFormHandler {
</div>
</div>
</form>
</RbDialog>)
</RbModal>)
}
sendVCode() {
let s = this.state