better FIELDAGGREGATION

This commit is contained in:
devezhao 2021-03-31 17:33:11 +08:00
parent 89fe2a1582
commit a3cd5ea121

View file

@ -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