| | |
| | | import moment from 'moment' |
| | | |
| | | import Api from '@/api' |
| | | import options from '@/store/options.js' |
| | | import Utils from '@/utils/utils.js' |
| | | import SettingForm from './settingform' |
| | | import { queryTableSql } from '@/utils/option.js' |
| | | import MKEmitter from '@/utils/events.js' |
| | | import './index.scss' |
| | | |
| | | class ReplaceField extends Component { |
| | |
| | | func: 'sPC_Get_SelectedList', |
| | | LText: queryTableSql, |
| | | obj_name: 'data', |
| | | arr_field: 'TbName,Remark' |
| | | arr_field: 'TbName,Remark', |
| | | exec_type: 'x' |
| | | } |
| | | |
| | | param.LText = Utils.formatOptions(param.LText) |
| | | param.LText = Utils.formatOptions(param.LText, 'x') |
| | | param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') |
| | | param.secretkey = Utils.encrypt(param.LText, param.timestamp) |
| | | param.secretkey = Utils.encrypt('', param.timestamp) |
| | | param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp) // 云端数据验证 |
| | | |
| | | if (options.cloudServiceApi) { // 且存在云端地址 |
| | | param.rduri = options.cloudServiceApi |
| | | if (window.GLOB.cloudServiceApi) { // 且存在云端地址 |
| | | param.rduri = window.GLOB.cloudServiceApi |
| | | param.userid = sessionStorage.getItem('CloudUserID') || '' |
| | | param.LoginUID = sessionStorage.getItem('CloudLoginUID') || '' |
| | | } |
| | |
| | | |
| | | if (res.resource === 'custom') { |
| | | if (res.reType === 'name') { |
| | | let map = {[res.label]: { |
| | | let map = {[res.label.toLowerCase()]: { |
| | | FieldDec: res.label, |
| | | FieldName: res.field, |
| | | datatype: '' |
| | |
| | | |
| | | this.exec(map) |
| | | } else { |
| | | let map = {[res.field]: { |
| | | let map = {[res.field.toLowerCase()]: { |
| | | FieldDec: res.label, |
| | | FieldName: res.field, |
| | | datatype: '' |
| | |
| | | } |
| | | } else { |
| | | let param = {func: 'sPC_Get_FieldName', TBName: res.table} |
| | | if (options.cloudServiceApi) { // 且存在云端地址 |
| | | param.rduri = options.cloudServiceApi |
| | | if (window.GLOB.cloudServiceApi) { // 且存在云端地址 |
| | | param.rduri = window.GLOB.cloudServiceApi |
| | | param.userid = sessionStorage.getItem('CloudUserID') || '' |
| | | param.LoginUID = sessionStorage.getItem('CloudLoginUID') || '' |
| | | } |
| | |
| | | let map = {} |
| | | |
| | | result.FDName.forEach(item => { |
| | | if (!item.FieldDec) return |
| | | if (/NVARCHAR|INT|Decimal/ig.test(item.FieldType)) { |
| | | item.datatype = item.FieldType |
| | | } |
| | | map[item.FieldDec] = item |
| | | map[item.FieldDec.toLowerCase()] = item |
| | | }) |
| | | |
| | | this.exec(map) |
| | |
| | | let map = {} |
| | | |
| | | result.FDName.forEach(item => { |
| | | map[item.FieldName] = item |
| | | if (!item.FieldName) return |
| | | map[item.FieldName.toLowerCase()] = item |
| | | }) |
| | | |
| | | this.execLabel(map) |
| | |
| | | }) |
| | | } |
| | | |
| | | // 依据原字段替换为新字段 |
| | | exec = (map) => { |
| | | const { type } = this.props |
| | | let config = fromJS(this.props.config).toJS() |
| | | |
| | | if (this.props.type === 'custom') { |
| | | if (type === 'custom') { |
| | | let _replace = (components) => { |
| | | return components.map(item => { |
| | | if (item.type === 'tabs') { |
| | |
| | | |
| | | if (item.columns) { |
| | | item.columns = item.columns.map(col => { |
| | | let cell = map[col.field] |
| | | let cell = map[col.field.toLowerCase()] |
| | | if (cell) { |
| | | col.field = cell.FieldName |
| | | if (cell.datatype) { |
| | |
| | | } |
| | | if (item.search) { |
| | | item.search = item.search.map(col => { |
| | | if (map[col.field]) { |
| | | col.field = map[col.field].FieldName |
| | | if (col.field && map[col.field.toLowerCase()]) { |
| | | col.field = map[col.field.toLowerCase()].FieldName |
| | | } |
| | | return col |
| | | }) |
| | |
| | | item.action.forEach(m => { |
| | | if (m.modal && m.modal.fields) { |
| | | m.modal.fields = m.modal.fields.map(col => { |
| | | if (map[col.field]) { |
| | | col.field = map[col.field].FieldName |
| | | if (col.field && map[col.field.toLowerCase()]) { |
| | | col.field = map[col.field.toLowerCase()].FieldName |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | if (m.verify && m.verify.columns) { |
| | | m.verify.columns = m.verify.columns.map(col => { |
| | | if (col.Column && map[col.Column.toLowerCase()]) { |
| | | col.Column = map[col.Column.toLowerCase()].FieldName |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | if (m.config && m.config.components) { |
| | | m.config.components = _replace(m.config.components) |
| | | } |
| | | }) |
| | | } |
| | |
| | | item.subcards.forEach(card => { |
| | | if (card.elements) { // 卡片 |
| | | card.elements = card.elements.map(m => { |
| | | if (m.datatype === 'dynamic' && map[m.field]) { |
| | | m.field = map[m.field].FieldName |
| | | if (m.datatype === 'dynamic' && map[m.field.toLowerCase()]) { |
| | | m.field = map[m.field.toLowerCase()].FieldName |
| | | } |
| | | if (m.modal && m.modal.fields) { |
| | | m.modal.fields = m.modal.fields.map(col => { |
| | | if (map[col.field]) { |
| | | col.field = map[col.field].FieldName |
| | | if (col.field && map[col.field.toLowerCase()]) { |
| | | col.field = map[col.field.toLowerCase()].FieldName |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | if (m.verify && m.verify.columns) { |
| | | m.verify.columns = m.verify.columns.map(col => { |
| | | if (col.Column && map[col.Column.toLowerCase()]) { |
| | | col.Column = map[col.Column.toLowerCase()].FieldName |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | if (m.config && m.config.components) { |
| | | m.config.components = _replace(m.config.components) |
| | | } |
| | | return m |
| | | }) |
| | |
| | | |
| | | if (card.backElements) { // 卡片 |
| | | card.backElements = card.backElements.map(m => { |
| | | if (m.datatype === 'dynamic' && map[m.field]) { |
| | | m.field = map[m.field].FieldName |
| | | if (m.datatype === 'dynamic' && map[m.field.toLowerCase()]) { |
| | | m.field = map[m.field.toLowerCase()].FieldName |
| | | } |
| | | if (m.modal && m.modal.fields) { |
| | | m.modal.fields = m.modal.fields.map(col => { |
| | | if (map[col.field]) { |
| | | col.field = map[col.field].FieldName |
| | | if (col.field && map[col.field.toLowerCase()]) { |
| | | col.field = map[col.field.toLowerCase()].FieldName |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | if (m.verify && m.verify.columns) { |
| | | m.verify.columns = m.verify.columns.map(col => { |
| | | if (col.Column && map[col.Column.toLowerCase()]) { |
| | | col.Column = map[col.Column.toLowerCase()].FieldName |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | if (m.config && m.config.components) { |
| | | m.config.components = _replace(m.config.components) |
| | | } |
| | | return m |
| | | }) |
| | |
| | | |
| | | if (card.fields) { // 表单 |
| | | card.fields = card.fields.map(m => { |
| | | if (map[m.field]) { |
| | | m.field = map[m.field].FieldName |
| | | if (m.field && map[m.field.toLowerCase()]) { |
| | | m.field = map[m.field.toLowerCase()].FieldName |
| | | } |
| | | return m |
| | | }) |
| | |
| | | |
| | | if (item.elements) { |
| | | item.elements = item.elements.map(m => { |
| | | if (m.datatype === 'dynamic' && map[m.field]) { |
| | | m.field = map[m.field].FieldName |
| | | if (m.datatype === 'dynamic' && map[m.field.toLowerCase()]) { |
| | | m.field = map[m.field.toLowerCase()].FieldName |
| | | } |
| | | if (m.modal && m.modal.fields) { |
| | | m.modal.fields = m.modal.fields.map(col => { |
| | | if (map[col.field]) { |
| | | col.field = map[col.field].FieldName |
| | | if (col.field && map[col.field.toLowerCase()]) { |
| | | col.field = map[col.field.toLowerCase()].FieldName |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | if (m.verify && m.verify.columns) { |
| | | m.verify.columns = m.verify.columns.map(col => { |
| | | if (col.Column && map[col.Column.toLowerCase()]) { |
| | | col.Column = map[col.Column.toLowerCase()].FieldName |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | if (m.config && m.config.components) { |
| | | m.config.components = _replace(m.config.components) |
| | | } |
| | | return m |
| | | }) |
| | | } |
| | | |
| | | if (item.plot) { |
| | | if (item.plot.Xaxis && map[item.plot.Xaxis]) { |
| | | item.plot.Xaxis = map[item.plot.Xaxis].FieldName |
| | | if (item.plot.Xaxis && map[item.plot.Xaxis.toLowerCase()]) { |
| | | item.plot.Xaxis = map[item.plot.Xaxis.toLowerCase()].FieldName |
| | | } |
| | | // 统计图 |
| | | if (item.plot.InfoValue && map[item.plot.InfoValue]) { |
| | | item.plot.InfoValue = map[item.plot.InfoValue].FieldName |
| | | if (item.plot.InfoValue && map[item.plot.InfoValue.toLowerCase()]) { |
| | | item.plot.InfoValue = map[item.plot.InfoValue.toLowerCase()].FieldName |
| | | } |
| | | if (item.plot.InfoType && map[item.plot.InfoType]) { |
| | | item.plot.InfoType = map[item.plot.InfoType].FieldName |
| | | if (item.plot.InfoType && map[item.plot.InfoType.toLowerCase()]) { |
| | | item.plot.InfoType = map[item.plot.InfoType.toLowerCase()].FieldName |
| | | } |
| | | // 占比图 |
| | | if (item.plot.valueField && map[item.plot.valueField]) { |
| | | item.plot.valueField = map[item.plot.valueField].FieldName |
| | | if (item.plot.valueField && map[item.plot.valueField.toLowerCase()]) { |
| | | item.plot.valueField = map[item.plot.valueField.toLowerCase()].FieldName |
| | | } |
| | | if (item.plot.labelField && map[item.plot.labelField]) { |
| | | item.plot.labelField = map[item.plot.labelField].FieldName |
| | | if (item.plot.labelField && map[item.plot.labelField.toLowerCase()]) { |
| | | item.plot.labelField = map[item.plot.labelField.toLowerCase()].FieldName |
| | | } |
| | | // 饼图 |
| | | if (item.plot.type && map[item.plot.type]) { |
| | | item.plot.type = map[item.plot.type].FieldName |
| | | if (item.plot.type && map[item.plot.type.toLowerCase()]) { |
| | | item.plot.type = map[item.plot.type.toLowerCase()].FieldName |
| | | } |
| | | // 散点图 |
| | | if (item.plot.gender && map[item.plot.gender]) { |
| | | item.plot.gender = map[item.plot.gender].FieldName |
| | | if (item.plot.gender && map[item.plot.gender.toLowerCase()]) { |
| | | item.plot.gender = map[item.plot.gender.toLowerCase()].FieldName |
| | | } |
| | | if (item.Yaxis) { |
| | | if (Array.isArray(item.Yaxis)) { |
| | | item.Yaxis = item.Yaxis.map(m => { |
| | | if (map[m]) { |
| | | return map[m].FieldName |
| | | if (map[m.toLowerCase()]) { |
| | | return map[m.toLowerCase()].FieldName |
| | | } |
| | | return m |
| | | }) |
| | | } else { |
| | | if (map[item.Yaxis]) { |
| | | item.Yaxis = map[item.Yaxis].FieldName |
| | | if (item.Yaxis && map[item.Yaxis.toLowerCase()]) { |
| | | item.Yaxis = map[item.Yaxis.toLowerCase()].FieldName |
| | | } |
| | | } |
| | | } |
| | |
| | | if (item.cols) { |
| | | let _update = (cols) => { |
| | | return cols.map(col => { |
| | | if (col.type === 'action' && col.elements) { |
| | | if (col.type === 'custom' && col.elements) { |
| | | col.elements = col.elements.map(m => { |
| | | if (m.modal && m.modal.fields) { |
| | | m.modal.fields = m.modal.fields.map(col => { |
| | | if (map[col.field]) { |
| | | col.field = map[col.field].FieldName |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | |
| | | return m |
| | | }) |
| | | } else if (col.type === 'custom' && col.elements) { |
| | | col.elements = col.elements.map(m => { |
| | | if (m.datatype === 'dynamic' && map[m.field]) { |
| | | m.field = map[m.field].FieldName |
| | | if (m.eleType === 'button') { |
| | | if (m.modal && m.modal.fields) { |
| | | m.modal.fields = m.modal.fields.map(col => { |
| | | if (col.field && map[col.field.toLowerCase()]) { |
| | | col.field = map[col.field.toLowerCase()].FieldName |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | if (m.verify && m.verify.columns) { |
| | | m.verify.columns = m.verify.columns.map(col => { |
| | | if (col.Column && map[col.Column.toLowerCase()]) { |
| | | col.Column = map[col.Column.toLowerCase()].FieldName |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | if (m.config && m.config.components) { |
| | | m.config.components = _replace(m.config.components) |
| | | } |
| | | } else { |
| | | if (m.datatype === 'dynamic' && map[m.field.toLowerCase()]) { |
| | | m.field = map[m.field.toLowerCase()].FieldName |
| | | } |
| | | } |
| | | |
| | | return m |
| | |
| | | } else if (col.type === 'colspan') { |
| | | col.subcols = _update(col.subcols) |
| | | } else if (col.field) { |
| | | if (map[col.field]) { |
| | | col.field = map[col.field].FieldName |
| | | if (map[col.field.toLowerCase()]) { |
| | | col.field = map[col.field.toLowerCase()].FieldName |
| | | } |
| | | } |
| | | |
| | |
| | | item.cols = _update(item.cols) |
| | | } |
| | | |
| | | if (item.subtype === 'basetable') { |
| | | item.cols = item.cols.map(col => { |
| | | if (col.field && map[col.field.toLowerCase()]) { |
| | | col.field = map[col.field.toLowerCase()].FieldName |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | |
| | | return item |
| | | }) |
| | | } |
| | | |
| | | |
| | | config.components = _replace(config.components) |
| | | } else if (this.props.type === 'table') { |
| | | config.columns = config.columns.map(col => { |
| | | if (col.field && map[col.field]) { |
| | | col.field = map[col.field].FieldName |
| | | } |
| | | return col |
| | | }) |
| | | config.search = config.search.map(col => { |
| | | if (col.field && map[col.field]) { |
| | | col.field = map[col.field].FieldName |
| | | } |
| | | if (col.datefield && map[col.datefield]) { |
| | | col.datefield = map[col.datefield].FieldName |
| | | } |
| | | return col |
| | | }) |
| | | } else if (this.props.type === 'form') { |
| | | // } else if (type === 'table') { |
| | | // config.columns = config.columns.map(col => { |
| | | // if (col.field && map[col.field.toLowerCase()]) { |
| | | // col.field = map[col.field.toLowerCase()].FieldName |
| | | // } |
| | | // return col |
| | | // }) |
| | | |
| | | // config.search = config.search.map(col => { |
| | | // if (col.field && map[col.field.toLowerCase()]) { |
| | | // col.field = map[col.field.toLowerCase()].FieldName |
| | | // } |
| | | // if (col.datefield && map[col.datefield.toLowerCase()]) { |
| | | // col.datefield = map[col.datefield.toLowerCase()].FieldName |
| | | // } |
| | | // return col |
| | | // }) |
| | | |
| | | // config.action = config.action.map(m => { |
| | | // if (m.verify && m.verify.columns) { |
| | | // m.verify.columns = m.verify.columns.map(col => { |
| | | // if (col.Column && map[col.Column.toLowerCase()]) { |
| | | // col.Column = map[col.Column.toLowerCase()].FieldName |
| | | // } |
| | | // return col |
| | | // }) |
| | | // } |
| | | // return m |
| | | // }) |
| | | } else if (type === 'form') { |
| | | config.fields = config.fields.map(col => { |
| | | if (col.field && map[col.field]) { |
| | | col.field = map[col.field].FieldName |
| | | if (col.field && map[col.field.toLowerCase()]) { |
| | | col.field = map[col.field.toLowerCase()].FieldName |
| | | } |
| | | return col |
| | | }) |
| | |
| | | duration: 3 |
| | | }) |
| | | this.props.updateConfig(config) |
| | | |
| | | setTimeout(() => { |
| | | MKEmitter.emit('revert') |
| | | }, 500) |
| | | } |
| | | |
| | | // 依据字段替换名称 |
| | | execLabel = (map) => { |
| | | const { type } = this.props |
| | | let config = fromJS(this.props.config).toJS() |
| | | |
| | | if (this.props.type === 'custom') { |
| | | if (type === 'custom') { |
| | | let _replace = (components) => { |
| | | return components.map(item => { |
| | | if (item.type === 'tabs') { |
| | |
| | | |
| | | if (item.columns) { |
| | | item.columns = item.columns.map(col => { |
| | | if (map[col.field]) { |
| | | col.label = map[col.field].FieldDec |
| | | if (col.field && map[col.field.toLowerCase()]) { |
| | | col.label = map[col.field.toLowerCase()].FieldDec |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | if (item.search) { |
| | | item.search = item.search.map(col => { |
| | | if (map[col.field]) { |
| | | col.label = map[col.field].FieldDec |
| | | if (col.field && map[col.field.toLowerCase()]) { |
| | | col.label = map[col.field.toLowerCase()].FieldDec |
| | | } |
| | | return col |
| | | }) |
| | |
| | | item.action.forEach(m => { |
| | | if (m.modal && m.modal.fields) { |
| | | m.modal.fields = m.modal.fields.map(col => { |
| | | if (col.field && map[col.field]) { |
| | | col.label = map[col.field].FieldDec |
| | | if (col.field && map[col.field.toLowerCase()]) { |
| | | col.label = map[col.field.toLowerCase()].FieldDec |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | if (m.verify && m.verify.columns) { |
| | | m.verify.columns = m.verify.columns.map(col => { |
| | | if (col.Column && map[col.Column.toLowerCase()]) { |
| | | col.Text = map[col.Column.toLowerCase()].FieldDec |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | if (m.config && m.config.components) { |
| | | m.config.components = _replace(m.config.components) |
| | | } |
| | | }) |
| | | } |
| | |
| | | if (item.cols) { |
| | | let _update = (cols) => { |
| | | return cols.map(col => { |
| | | if (col.type === 'action' && col.elements) { |
| | | if (col.type === 'custom' && col.elements) { |
| | | col.elements = col.elements.map(m => { |
| | | if (m.modal && m.modal.fields) { |
| | | m.modal.fields = m.modal.fields.map(col => { |
| | | if (col.field && map[col.field]) { |
| | | col.label = map[col.field].FieldDec |
| | | } |
| | | return col |
| | | }) |
| | | if (m.eleType === 'button') { |
| | | if (m.modal && m.modal.fields) { |
| | | m.modal.fields = m.modal.fields.map(col => { |
| | | if (col.field && map[col.field.toLowerCase()]) { |
| | | col.label = map[col.field.toLowerCase()].FieldDec |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | if (m.verify && m.verify.columns) { |
| | | m.verify.columns = m.verify.columns.map(col => { |
| | | if (col.Column && map[col.Column.toLowerCase()]) { |
| | | col.Text = map[col.Column.toLowerCase()].FieldDec |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | if (m.config && m.config.components) { |
| | | m.config.components = _replace(m.config.components) |
| | | } |
| | | } |
| | | |
| | | return m |
| | |
| | | } else if (col.type === 'colspan') { |
| | | col.subcols = _update(col.subcols) |
| | | } else if (col.field) { |
| | | if (map[col.field]) { |
| | | col.label = map[col.field].FieldDec |
| | | if (map[col.field.toLowerCase()]) { |
| | | col.label = map[col.field.toLowerCase()].FieldDec |
| | | } |
| | | } |
| | | |
| | |
| | | item.cols = _update(item.cols) |
| | | } |
| | | |
| | | if (item.subtype === 'basetable') { |
| | | item.cols = item.cols.map(col => { |
| | | if (col.field && map[col.field.toLowerCase()]) { |
| | | col.label = map[col.field.toLowerCase()].FieldDec |
| | | } |
| | | return col |
| | | }) |
| | | } |
| | | |
| | | return item |
| | | }) |
| | | } |
| | | |
| | | config.components = _replace(config.components) |
| | | } else if (this.props.type === 'table') { |
| | | config.columns = config.columns.map(col => { |
| | | if (col.field && map[col.field]) { |
| | | col.label = map[col.field].FieldDec |
| | | } |
| | | return col |
| | | }) |
| | | // } else if (type === 'table') { |
| | | // config.columns = config.columns.map(col => { |
| | | // if (col.field && map[col.field.toLowerCase()]) { |
| | | // col.label = map[col.field.toLowerCase()].FieldDec |
| | | // } |
| | | // return col |
| | | // }) |
| | | |
| | | // config.search = config.search.map(col => { |
| | | // if (col.field && map[col.field.toLowerCase()]) { |
| | | // col.label = map[col.field.toLowerCase()].FieldDec |
| | | // } |
| | | // return col |
| | | // }) |
| | | |
| | | config.search = config.search.map(col => { |
| | | if (col.field && map[col.field]) { |
| | | col.label = map[col.field].FieldDec |
| | | } |
| | | return col |
| | | }) |
| | | } else if (this.props.type === 'form') { |
| | | // config.action = config.action.map(m => { |
| | | // if (m.verify && m.verify.columns) { |
| | | // m.verify.columns = m.verify.columns.map(col => { |
| | | // if (col.Column && map[col.Column.toLowerCase()]) { |
| | | // col.Text = map[col.Column.toLowerCase()].FieldDec |
| | | // } |
| | | // return col |
| | | // }) |
| | | // } |
| | | // return m |
| | | // }) |
| | | } else if (type === 'form') { |
| | | config.fields = config.fields.map(col => { |
| | | if (col.field && map[col.field]) { |
| | | col.label = map[col.field].FieldDec |
| | | if (col.field && map[col.field.toLowerCase()]) { |
| | | col.label = map[col.field.toLowerCase()].FieldDec |
| | | } |
| | | return col |
| | | }) |
| | |
| | | duration: 3 |
| | | }) |
| | | this.props.updateConfig(config) |
| | | setTimeout(() => { |
| | | MKEmitter.emit('revert') |
| | | }, 500) |
| | | } |
| | | |
| | | render() { |
| | | const { visible, loadingTable, tables, confirming } = this.state |
| | | |
| | | return ( |
| | | <div className="mk-replace-field" style={{display: 'inline-block'}}> |
| | | <> |
| | | <Button className="mk-border-yellow" icon="swap" loading={loadingTable} onClick={this.trigger}>字段替换</Button> |
| | | <Modal |
| | | title="字段替换" |
| | |
| | | > |
| | | <SettingForm tables={tables} wrappedComponentRef={(inst) => this.settingRef = inst}/> |
| | | </Modal> |
| | | </div> |
| | | </> |
| | | ) |
| | | } |
| | | } |