mirror of
https://github.com/getrebuild/rebuild.git
synced 2024-09-20 15:35:55 +08:00
better FIELDAGGREGATION
This commit is contained in:
parent
89fe2a1582
commit
a3cd5ea121
|
@ -58,10 +58,10 @@ class ContentFieldAggregation extends ActionContentSpec {
|
|||
{(this.state.items || []).length > 0 &&
|
||||
this.state.items.map((item) => {
|
||||
return (
|
||||
<div key={'item-' + item.targetField}>
|
||||
<div key={item.targetField}>
|
||||
<div className="row">
|
||||
<div className="col-5">
|
||||
<span className="badge badge-warning">{this._getFieldLabel(this.state.targetFields, item.targetField)}</span>
|
||||
<span className="badge badge-warning">{_getFieldLabel(this.state.targetFields, item.targetField)}</span>
|
||||
</div>
|
||||
<div className="col-2">
|
||||
<span className="zmdi zmdi-forward zmdi-hc-rotate-180"></span>
|
||||
|
@ -69,7 +69,7 @@ class ContentFieldAggregation extends ActionContentSpec {
|
|||
</div>
|
||||
<div className="col-5 del-wrap">
|
||||
<span className="badge badge-warning">
|
||||
{item.calcMode === 'FORMULA' ? this.textFormula(item.sourceFormula) : this._getFieldLabel(this.state.sourceFields, item.sourceField)}
|
||||
{item.calcMode === 'FORMULA' ? this.textFormula(item.sourceFormula) : _getFieldLabel(this.state.sourceFields, item.sourceField)}
|
||||
</span>
|
||||
<a className="del" title={$L('Remove')} onClick={() => this.delItem(item.targetField)}>
|
||||
<span className="zmdi zmdi-close"></span>
|
||||
|
@ -85,7 +85,7 @@ class ContentFieldAggregation extends ActionContentSpec {
|
|||
<select className="form-control form-control-sm" ref={(c) => (this._targetField = c)}>
|
||||
{(this.state.targetFields || []).map((item) => {
|
||||
return (
|
||||
<option key={'tf-' + item[0]} value={item[0]}>
|
||||
<option key={item[0]} value={item[0]}>
|
||||
{item[1]}
|
||||
</option>
|
||||
)
|
||||
|
@ -98,7 +98,7 @@ class ContentFieldAggregation extends ActionContentSpec {
|
|||
<select className="form-control form-control-sm" ref={(c) => (this._calcMode = c)}>
|
||||
{Object.keys(CALC_MODES).map((item) => {
|
||||
return (
|
||||
<option key={'opt-' + item} value={item}>
|
||||
<option key={item} value={item}>
|
||||
{CALC_MODES[item]}
|
||||
</option>
|
||||
)
|
||||
|
@ -160,16 +160,17 @@ class ContentFieldAggregation extends ActionContentSpec {
|
|||
this.__select2 = []
|
||||
$.get(`/admin/robot/trigger/field-aggregation-entities?source=${this.props.sourceEntity}`, (res) => {
|
||||
this.setState({ targetEntities: res.data }, () => {
|
||||
const s2te = $(this._targetEntity)
|
||||
const $s2te = $(this._targetEntity)
|
||||
.select2({ placeholder: $L('SelectSome,TargetEntity') })
|
||||
.on('change', () => this.changeTargetEntity())
|
||||
.on('change', () => this._changeTargetEntity())
|
||||
|
||||
if (content && content.targetEntity) {
|
||||
s2te.val(content.targetEntity)
|
||||
if (rb.env !== 'dev') s2te.attr('disabled', true)
|
||||
$s2te.val(content.targetEntity)
|
||||
if (rb.env !== 'dev') $s2te.attr('disabled', true)
|
||||
}
|
||||
s2te.trigger('change')
|
||||
this.__select2.push(s2te)
|
||||
|
||||
$s2te.trigger('change')
|
||||
this.__select2.push($s2te)
|
||||
})
|
||||
})
|
||||
|
||||
|
@ -179,7 +180,7 @@ class ContentFieldAggregation extends ActionContentSpec {
|
|||
}
|
||||
}
|
||||
|
||||
changeTargetEntity() {
|
||||
_changeTargetEntity() {
|
||||
const te = ($(this._targetEntity).val() || '').split('.')[1]
|
||||
if (!te) return
|
||||
// 清空现有规则
|
||||
|
@ -192,28 +193,24 @@ class ContentFieldAggregation extends ActionContentSpec {
|
|||
this.setState({ targetFields: res.data.target })
|
||||
} else {
|
||||
this.setState({ sourceFields: res.data.source, targetFields: res.data.target }, () => {
|
||||
const s2sf = $(this._sourceField).select2({ placeholder: $L('SelectSome,SourceField') })
|
||||
const s2cm = $(this._calcMode)
|
||||
const $s2sf = $(this._sourceField).select2({ placeholder: $L('SelectSome,SourceField') })
|
||||
const $s2cm = $(this._calcMode)
|
||||
.select2({ placeholder: $L('SelectSome,AggregationMethod') })
|
||||
.on('change', (e) => this.setState({ calcMode: e.target.value }))
|
||||
const s2tf = $(this._targetField).select2({ placeholder: $L('SelectSome,TargetField') })
|
||||
const $s2tf = $(this._targetField).select2({ placeholder: $L('SelectSome,TargetField') })
|
||||
|
||||
this.__select2.push(s2sf)
|
||||
this.__select2.push(s2cm)
|
||||
this.__select2.push(s2tf)
|
||||
this.__select2.push($s2sf)
|
||||
this.__select2.push($s2cm)
|
||||
this.__select2.push($s2tf)
|
||||
})
|
||||
|
||||
if (this.props.content) this.setState({ items: this.props.content.items || [] })
|
||||
if (this.props.content) {
|
||||
this.setState({ items: this.props.content.items || [] })
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
_getFieldLabel(fields, field) {
|
||||
let found = fields.find((x) => x[0] === field)
|
||||
if (found) found = found[1]
|
||||
return found || '[' + field.toUpperCase() + ']'
|
||||
}
|
||||
|
||||
textFormula(formula) {
|
||||
const fs = this.state.sourceFields
|
||||
for (let i = 0; i < fs.length; i++) {
|
||||
|
@ -234,69 +231,6 @@ class ContentFieldAggregation extends ActionContentSpec {
|
|||
renderRbcomp(<FormulaCalc fields={this.state.sourceFields} call={(v) => $(this._$formula).attr('data-v', v).text(this.textFormula(v))} />)
|
||||
}
|
||||
|
||||
addItem() {
|
||||
const tf = $(this._targetField).val()
|
||||
const calc = $(this._calcMode).val()
|
||||
const sf = calc === 'FORMULA' ? null : $(this._sourceField).val()
|
||||
const formula = calc === 'FORMULA' ? $(this._$formula).attr('data-v') : null
|
||||
if (!tf) {
|
||||
RbHighbar.create($L('PlsSelectSome,TargetField'))
|
||||
return false
|
||||
}
|
||||
if (calc === 'FORMULA') {
|
||||
if (!formula) {
|
||||
RbHighbar.create($L('PlsInputSome,CalcFORMULA'))
|
||||
return false
|
||||
}
|
||||
} else if (!sf) {
|
||||
RbHighbar.create($L('PlsSelectSome,SourceField'))
|
||||
return false
|
||||
}
|
||||
|
||||
// 目标字段=源字段
|
||||
if (sf === $(this._targetEntity).val().split('.')[0] + '.' + tf) {
|
||||
RbHighbar.create($L('TargetAndSourceNotSame'))
|
||||
return false
|
||||
}
|
||||
|
||||
const items = this.state.items || []
|
||||
const found = items.find((x) => {
|
||||
return x.targetField === tf
|
||||
})
|
||||
if (found) {
|
||||
RbHighbar.create($L('SomeDuplicate,TargetField'))
|
||||
return false
|
||||
}
|
||||
|
||||
items.push({ targetField: tf, calcMode: calc, sourceField: sf, sourceFormula: formula })
|
||||
this.setState({ items: items })
|
||||
}
|
||||
|
||||
delItem(targetField) {
|
||||
const items = (this.state.items || []).filter((item) => {
|
||||
return item.targetField !== targetField
|
||||
})
|
||||
this.setState({ items: items })
|
||||
}
|
||||
|
||||
buildContent() {
|
||||
const content = {
|
||||
targetEntity: $(this._targetEntity).val(),
|
||||
items: this.state.items,
|
||||
readonlyFields: $(this._readonlyFields).prop('checked'),
|
||||
dataFilter: this._advFilter__data,
|
||||
}
|
||||
if (!content.targetEntity) {
|
||||
RbHighbar.create($L('PlsSelectSome,TargetEntity'))
|
||||
return false
|
||||
}
|
||||
if (content.items.length === 0) {
|
||||
RbHighbar.create($L('PlsAdd1AggregationRuleLeast'))
|
||||
return false
|
||||
}
|
||||
return content
|
||||
}
|
||||
|
||||
_dataAdvFilter = () => {
|
||||
const that = this
|
||||
if (that._advFilter) that._advFilter.show()
|
||||
|
@ -314,6 +248,63 @@ class ContentFieldAggregation extends ActionContentSpec {
|
|||
this._advFilter__data = filter
|
||||
this.setState({ dataFilterItems: filter && filter.items ? filter.items.length : 0 })
|
||||
}
|
||||
|
||||
addItem() {
|
||||
const tf = $(this._targetField).val()
|
||||
const calc = $(this._calcMode).val()
|
||||
const sf = calc === 'FORMULA' ? null : $(this._sourceField).val()
|
||||
const formula = calc === 'FORMULA' ? $(this._$formula).attr('data-v') : null
|
||||
|
||||
if (!tf) return RbHighbar.create($L('PlsSelectSome,TargetField'))
|
||||
if (calc === 'FORMULA') {
|
||||
if (!formula) return RbHighbar.create($L('PlsInputSome,CalcFORMULA'))
|
||||
} else if (!sf) {
|
||||
return RbHighbar.create($L('PlsSelectSome,SourceField'))
|
||||
}
|
||||
|
||||
// 目标字段=源字段
|
||||
const tfFull = `${$(this._targetEntity).val().split('.')[0]}.${tf}`.replace('$PRIMARY$.', '')
|
||||
if (sf === tfFull) return RbHighbar.create($L('TargetAndSourceNotSame'))
|
||||
|
||||
const items = this.state.items || []
|
||||
const exists = items.find((x) => x.targetField === tf)
|
||||
if (exists) return RbHighbar.create($L('SomeDuplicate,TargetField'))
|
||||
|
||||
items.push({ targetField: tf, calcMode: calc, sourceField: sf, sourceFormula: formula })
|
||||
this.setState({ items: items })
|
||||
}
|
||||
|
||||
delItem(targetField) {
|
||||
const itemsNew = (this.state.items || []).filter((item) => {
|
||||
return item.targetField !== targetField
|
||||
})
|
||||
this.setState({ items: itemsNew })
|
||||
}
|
||||
|
||||
buildContent() {
|
||||
const content = {
|
||||
targetEntity: $(this._targetEntity).val(),
|
||||
items: this.state.items,
|
||||
readonlyFields: $(this._readonlyFields).prop('checked'),
|
||||
dataFilter: this._advFilter__data,
|
||||
}
|
||||
|
||||
if (!content.targetEntity) {
|
||||
RbHighbar.create($L('PlsSelectSome,TargetEntity'))
|
||||
return false
|
||||
}
|
||||
if (content.items.length === 0) {
|
||||
RbHighbar.create($L('PlsAdd1AggregationRuleLeast'))
|
||||
return false
|
||||
}
|
||||
return content
|
||||
}
|
||||
}
|
||||
|
||||
const _getFieldLabel = function (fields, field) {
|
||||
let found = fields.find((x) => x[0] === field)
|
||||
if (found) found = found[1]
|
||||
return found || '[' + field.toUpperCase() + ']'
|
||||
}
|
||||
|
||||
// ~公式计算器
|
||||
|
@ -335,7 +326,7 @@ class FormulaCalc extends RbAlert {
|
|||
<ul className="list-unstyled mb-0" _title={$L('NoUsesField')}>
|
||||
{this.props.fields.map((item) => {
|
||||
return (
|
||||
<li key={`flag-${item}`}>
|
||||
<li key={item[0]}>
|
||||
<a onClick={() => this.handleInput(item)}>{item[1]}</a>
|
||||
</li>
|
||||
)
|
||||
|
@ -347,7 +338,7 @@ class FormulaCalc extends RbAlert {
|
|||
<ul className="list-unstyled numbers mb-0">
|
||||
{INPUT_KEYS.map((item) => {
|
||||
return (
|
||||
<li className="list-inline-item" key={`flag-${item}`}>
|
||||
<li className="list-inline-item" key={item}>
|
||||
<a onClick={() => this.handleInput(item)}>{item}</a>
|
||||
</li>
|
||||
)
|
||||
|
@ -380,7 +371,7 @@ class FormulaCalc extends RbAlert {
|
|||
$(['', 'SUM', 'COUNT', 'COUNT2', 'AVG', 'MAX', 'MIN']).each(function () {
|
||||
const $a = $(`<a class="dropdown-item" data-mode="${this}">${CALC_MODES[this] || $L('Null')}</a>`).appendTo($menu)
|
||||
$a.click(function () {
|
||||
FormulaCalc._changeCalcMode(this)
|
||||
_changeCalcMode(this)
|
||||
})
|
||||
})
|
||||
$field.appendTo(this._$formula)
|
||||
|
@ -392,26 +383,27 @@ class FormulaCalc extends RbAlert {
|
|||
}
|
||||
|
||||
confirm() {
|
||||
const vvv = []
|
||||
const vv = []
|
||||
$(this._$formula)
|
||||
.find('i')
|
||||
.each(function () {
|
||||
const $this = $(this)
|
||||
const v = $this.data('v')
|
||||
if ($this.attr('data-mode')) vvv.push(`${v.substr(0, v.length - 1)}$$$$${$this.attr('data-mode')}}`)
|
||||
else vvv.push(v)
|
||||
if ($this.attr('data-mode')) vv.push(`${v.substr(0, v.length - 1)}$$$$${$this.attr('data-mode')}}`)
|
||||
else vv.push(v)
|
||||
})
|
||||
typeof this.props.call === 'function' && this.props.call(vvv.join(''))
|
||||
|
||||
typeof this.props.call === 'function' && this.props.call(vv.join(''))
|
||||
this.hide()
|
||||
}
|
||||
}
|
||||
|
||||
static _changeCalcMode(el) {
|
||||
el = $(el)
|
||||
const $field = el.parent().prev()
|
||||
const mode = el.data('mode')
|
||||
const modeText = mode ? ` (${CALC_MODES[mode]})` : ''
|
||||
$field.attr('data-mode', mode || '').text(`{${$field.data('name')}${modeText}}`)
|
||||
}
|
||||
const _changeCalcMode = function (el) {
|
||||
el = $(el)
|
||||
const $field = el.parent().prev()
|
||||
const mode = el.data('mode')
|
||||
const modeText = mode ? ` (${CALC_MODES[mode]})` : ''
|
||||
$field.attr('data-mode', mode || '').text(`{${$field.data('name')}${modeText}}`)
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-undef
|
||||
|
|
Loading…
Reference in a new issue