| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848 |
- import React from 'react'
- import { Select, Switch, message } from 'antd'
- import i18n from 'i18next'
- import cls from 'classnames'
- import treeActions from 'actions/tree'
- import uiActions from 'actions/ui'
- import serviceActions from 'actions/service'
- import widgetStore from 'stores/widget'
- import treeStore from 'stores/tree'
- import newEventStores from 'stores/newEvent'
- import serviceStore from 'stores/service'
- import { getEventNodeById } from 'stores/funcs/newEvent'
- import { isValidParamName } from 'stores/funcs/event/eventUtils'
- import { nodeIsNormalService } from 'stores/funcs/nodeType'
- import { saveCaseBeforeActions } from 'stores/funcs/service'
- import propType from 'const/propType'
- const { Option } = Select
- export default class NodeServiceParams extends React.Component {
- constructor(props) {
- super(props)
- this.state = {
- inParams: this.getInParams(),
- outParams: this.getOutParams(),
- title: this.getTitleName(),
- paramWarning: undefined,
- allowConfigShare: false, // true, false, reload, loading
- isShared: false,
- sharedTitle: '', // 服务的title
- sharedDesc: '' // 服务的desc
- }
- this.sharedServiceInfo = undefined // 读取的共享服务信息需要使用的部分
- this.types = [
- {
- name: i18n.t('FunctionView.Any'),
- value: 'undefined'
- },
- {
- name: i18n.t('FunctionView.Number'),
- value: propType.Number
- },
- {
- name: i18n.t('FunctionView.String'),
- value: propType.String
- },
- {
- name: i18n.t('FunctionView.Boolean'),
- value: propType.Boolean
- },
- {
- name: i18n.t('FunctionView.Object'),
- value: 'Object'
- }
- ]
- this.loadSharedService = this.loadSharedService.bind(this)
- this.configResult = this.configResult.bind(this)
- this.reloadAction = this.reloadAction.bind(this)
- this.onAddParam = this.onAddParam.bind(this)
- this.saveCase = this.saveCase.bind(this)
- this.onChangeShared = this.onChangeShared.bind(this)
- this.onChangeSharedInfo = this.onChangeSharedInfo.bind(this)
- this.getSharedData = this.getSharedData.bind(this)
- this.addShareData = this.addShareData.bind(this)
- this.modifySharedData = this.modifySharedData.bind(this)
- this.deleteShareData = this.deleteShareData.bind(this)
- this.getInParams = this.getInParams.bind(this)
- this.getOutParams = this.getOutParams.bind(this)
- this.getInParamsName = this.getInParamsName.bind(this)
- this.getOutParamsName = this.getOutParamsName.bind(this)
- this.getTitleName = this.getTitleName.bind(this)
- this.genAddButton = this.genAddButton.bind(this)
- this.getInParamsCom = this.getInParamsCom.bind(this)
- this.genInput = this.genInput.bind(this)
- this.genError = this.genError.bind(this)
- this.getSharedConfig = this.getSharedConfig.bind(this)
- }
- componentDidMount() {
- this.loadSharedService()
- }
- componentDidUpdate(preProps) {
- if (preProps.nodeId !== this.props.nodeId) {
- this.setState(
- {
- inParams: this.getInParams(),
- outParams: this.getOutParams(),
- title: this.getTitleName(),
- paramWarning: undefined,
- allowConfigShare: false
- },
- () => {
- this.loadSharedService()
- }
- )
- }
- }
- loadSharedService() {
- // 小模块不需要
- if (
- treeStore.curClassId ||
- !(treeStore.curCaseInfo.eid || treeStore.curCaseInfo.gid)
- ) {
- this.setState({
- allowConfigShare: false
- })
- return
- }
- let nodeId = this.props.nodeId
- let node = getEventNodeById(nodeId)
- if (nodeIsNormalService(node && node.type)) {
- this.setState({
- allowConfigShare: 'loading'
- })
- serviceStore.loadSharedService({ nodeId }).then(result => {
- // 保证修改的nodeId正确
- let _nodeId = result && result.nodeId
- if (_nodeId !== nodeId) {
- return
- }
- let obj = {
- allowConfigShare: true
- }
- this.sharedServiceInfo = undefined
- if (result === false) {
- obj.allowConfigShare = 'reload'
- } else if (result && result.id) {
- obj.isShared = true
- obj = this.configResult(obj, result, nodeId)
- } else {
- obj.isShared = false
- obj.inParams = []
- obj.outParams = []
- let node = getEventNodeById(nodeId)
- if (node) {
- obj.inParams = node.props.inParams || []
- obj.outParams = node.props.outParams || []
- }
- }
- this.setState(obj)
- })
- } else {
- this.setState({
- allowConfigShare: false
- })
- }
- }
- configResult(obj, result, nodeId) {
- this.sharedServiceInfo = { id: result.id, uri: result.uri, gid: result.gid } // 记录当前的共享服务id
- if (result.content) {
- let params = undefined
- try {
- params = JSON.parse(result.content)
- } catch (e) {}
- if (params) {
- obj.sharedTitle = result.filename
- obj.sharedDesc = params.desc
- let inParams = params.inParams || []
- let outParams = params.outParams || []
- let inParamsSame = false
- let outParamsSame = false
- try {
- inParamsSame =
- JSON.stringify(inParams) === JSON.stringify(this.state.inParams)
- } catch (e) {}
- try {
- inParamsSame =
- JSON.stringify(outParams) === JSON.stringify(this.state.outParams)
- } catch (e) {}
- if (!inParamsSame || !outParamsSame) {
- obj.inParams = inParams
- obj.outParams = outParams
- treeActions.changeNodeProps({
- nodeId: nodeId,
- props: {
- inParams: inParams,
- outParams: outParams
- },
- addRecord: false
- })
- this.reloadAction()
- }
- }
- }
- return obj
- }
- reloadAction() {
- newEventStores.reloadAction(this.props.nodeId)
- }
- onAddParam(type) {
- let obj = { paramWarning: undefined }
- let params = undefined
- switch (type) {
- case 'in':
- params = this.state.inParams
- params.push({
- name: 'param' + (this.state.inParams.length + 1)
- })
- obj.inParams = params
- break
- case 'out':
- params = this.state.outParams
- params.push('param' + (this.state.outParams.length + 1))
- obj.outParams = params
- break
- }
- this.setState(obj, () => {
- delete obj.paramWarning
- this.modifySharedData(type, params)
- treeActions.changeNodeProps({
- nodeId: this.props.nodeId,
- props: obj
- })
- this.reloadAction()
- })
- }
- onDeleteParam(index, type) {
- let obj = { paramWarning: undefined }
- let params = undefined
- switch (type) {
- case 'in':
- params = this.state.inParams
- params.splice(index, 1)
- obj.inParams = params
- break
- case 'out':
- params = this.state.outParams
- params.splice(index, 1)
- obj.outParams = params
- break
- }
- this.setState(obj, () => {
- delete obj.paramWarning
- this.modifySharedData(type, params)
- treeActions.changeNodeProps({
- nodeId: this.props.nodeId,
- props: obj
- })
- this.reloadAction()
- })
- }
- onChangeType(index, type, paramType, applyChange, e) {
- let value = e === 'undefined' ? undefined : e
- this.onChangeParam(index, type, paramType, applyChange, value)
- }
- onChangeParam(index, type, paramType, applyChange, e) {
- let value = e && e.target ? e.target.value : e
- let obj = {}
- let params = undefined
- // 处理有问题字段
- if (type === 'out' || (type === 'in' && paramType === 'name')) {
- if (applyChange && !isValidParamName(value)) {
- let errorValue = value
- if (value !== 'detail') {
- // outParam为detail时,不对其强行修改,只给出提示.其余情况将值改为paramX
- value = 'param' + (index + 1)
- }
- obj.paramWarning = {
- error: 'paramError',
- type: type,
- index,
- value: errorValue
- }
- } else {
- obj.paramWarning = undefined
- }
- }
- switch (type) {
- case 'in':
- params = this.state.inParams
- params[index][paramType] = value
- if (paramType === 'required' && !value) {
- // 为false不需要保存
- delete params[index][paramType]
- }
- obj.inParams = params
- break
- case 'out':
- params = this.state.outParams
- params[index] = value
- obj.outParams = params
- break
- }
- let nodeId = this.props.nodeId
- this.setState(obj, () => {
- if (applyChange) {
- delete obj.paramWarning
- this.modifySharedData(type, params)
- treeActions.changeNodeProps({
- nodeId: nodeId,
- props: obj
- })
- if (type === 'out' || (type === 'in' && paramType === 'name')) {
- this.reloadAction()
- }
- }
- })
- }
- saveCase(done) {
- let nodeId = this.props.nodeId
- let node = getEventNodeById(nodeId)
- if (node && nodeIsNormalService(node.type) && node.uis && node.uis.new) {
- saveCaseBeforeActions({
- success: () => {
- done && done()
- },
- fail: () => {
- uiActions.toggleLoadingBar({ show: false })
- }
- })
- } else {
- done && done()
- }
- }
- onChangeShared(value) {
- if (value) {
- // 添加共享
- uiActions.toggleLoadingBar({
- show: true,
- title: i18n.t('LoadingBar.addSharedServiceTitle'),
- content: i18n.t('LoadingBar.addSharedServiceContent'),
- progress: 100,
- type: 'dbLoading'
- })
- this.saveCase(() => {
- let nodeId = this.props.nodeId
- let node = getEventNodeById(nodeId)
- this.addShareData({
- name: (node && node.uis && node.uis.name) || undefined
- }).then(result => {
- uiActions.toggleLoadingBar({ show: false })
- // 添加后操作
- if (result && result.isSuccess) {
- this.sharedServiceInfo = {
- id: result.id,
- uri: result.uri,
- gid: result.gid
- }
- this.setState({
- isShared: value,
- sharedTitle: result.title,
- sharedDesc: result.desc
- })
- if (result.gid) {
- serviceActions.clearGroupCache({ gid: result.gid })
- }
- } else if (result.err) {
- message.error(result.err)
- }
- })
- })
- } else {
- // 删除共享
- uiActions.toggleLoadingBar({
- show: true,
- title: i18n.t('LoadingBar.delSharedServiceTitle'),
- content: i18n.t('LoadingBar.delSharedServiceContent'),
- progress: 100,
- type: 'dbLoading'
- })
- this.deleteShareData().then(result => {
- uiActions.toggleLoadingBar({ show: false })
- // 删除后操作
- if (result) {
- this.sharedServiceInfo = undefined
- this.setState({
- isShared: value,
- sharedTitle: '',
- sharedDesc: ''
- })
- }
- })
- }
- }
- onChangeSharedInfo(type, applyChange, e) {
- let value = e && e.target ? e.target.value : e
- let obj = undefined
- if (type === 'title') {
- obj = {
- sharedTitle: value
- }
- } else if (type === 'desc') {
- obj = {
- sharedDesc: value
- }
- }
- if (obj) {
- this.setState(obj, () => {
- if (applyChange) {
- this.modifySharedData(type, value)
- }
- })
- }
- }
- getSharedData(final) {
- let result = {
- fileName: this.state.sharedTitle,
- content: {
- desc: this.state.sharedDesc,
- inParams: this.state.inParams,
- outParams: this.state.outParams
- }
- }
- if (final) {
- result.content = JSON.stringify(result.content)
- }
- return result
- }
- addShareData({ name }) {
- return new Promise(resolve => {
- let { nid, gid } = treeStore.curCaseInfo
- let uri = this.props.nodeId + '-' + nid
- let data = this.getSharedData()
- data.fileName = name || i18n.t('EventView.jenga_extra.defaultServiceName')
- data.content.desc = i18n.t('EventView.jenga_extra.defaultServiceDesc')
- data.scope = gid ? 1 : 2
- data.uri = uri
- if (gid) {
- data.gid = gid
- }
- // json化
- data.content = JSON.stringify(data.content)
- if (this.sharedServiceInfo) {
- resolve({ isSuccess: false })
- return
- }
- // 添加发送请求
- serviceStore.addSharedService({ data }).then(result => {
- if (result && result.isSuccess && result.data) {
- let id = result.data.id
- let title = result.data.filename
- let desc = ''
- try {
- let params = JSON.parse(result.data.content)
- desc = params.desc
- } catch (e) {}
- resolve({ isSuccess: true, id, uri, gid, title, desc })
- } else {
- resolve({ isSuccess: false, err: result.err })
- }
- })
- })
- }
- modifySharedData(type, value) {
- if (!this.sharedServiceInfo) {
- return
- }
- // content形如:{desc: xxx, inParams: xxx, outParams: xxx}
- let data = this.getSharedData()
- switch (type) {
- case 'title':
- data.fileName = value
- break
- case 'desc':
- data.content.desc = value
- break
- case 'in':
- data.content.inParams = value
- break
- case 'out':
- data.content.outParams = value
- break
- }
- // json化
- data.content = JSON.stringify(data.content)
- let { uri, gid, id } = this.sharedServiceInfo
- data.uri = uri
- if (gid) {
- data.gid = gid
- }
- // 修改发送请求
- serviceStore.modifySharedService({ id, data })
- }
- deleteShareData() {
- return new Promise(resolve => {
- if (!this.sharedServiceInfo) {
- resolve(false)
- return
- }
- // 发送删除请求
- let { uri, gid, id } = this.sharedServiceInfo
- let data = {
- uri: uri
- }
- if (gid) {
- data.gid = gid
- }
- serviceStore.delSharedService({ id, data }).then(result => {
- resolve(result)
- })
- })
- }
- getInParams() {
- let inParams = []
- let node = getEventNodeById(this.props.nodeId)
- if (node) {
- inParams = node.props.inParams || inParams
- }
- return inParams
- }
- getOutParams() {
- let outParams = []
- let node = getEventNodeById(this.props.nodeId)
- if (node) {
- outParams = node.props.outParams || outParams
- }
- return outParams
- }
- getInParamsName() {
- let title = ''
- let node = getEventNodeById(this.props.nodeId)
- if (node && widgetStore.widget[node.type]) {
- let prop = widgetStore.widget[node.type].map.propsMap['inParams']
- title = prop.locale ? prop.locale[i18n.language] : prop.name
- }
- return title + ':'
- }
- getOutParamsName() {
- let title = ''
- let node = getEventNodeById(this.props.nodeId)
- if (node && widgetStore.widget[node.type]) {
- let prop = widgetStore.widget[node.type].map.propsMap['outParams']
- title = prop.locale ? prop.locale[i18n.language] : prop.name
- }
- return title + ':'
- }
- getTitleName(range) {
- let title = ''
- let node = getEventNodeById(this.props.nodeId)
- if (node && widgetStore.widget[node.type]) {
- let map = widgetStore.widget[node.type].map
- title = map.locale ? map.locale[i18n.language] : map.name
- }
- let text = range ? 'range' : 'define'
- return title ? title + i18n.t('EventView.jenga_extra.' + text) : title
- }
- genAddButton(type) {
- return (
- <button
- className="btn-clear btn-add-param"
- onClick={this.onAddParam.bind(this, type)}
- >
- <div className="icon">
- <span className="horizon" />
- <span className="vertical" />
- </div>
- </button>
- )
- }
- getInParamsCom(param, index, type) {
- let length = this.state.inParams.length
- let extraBtn = length - 1 === index ? this.genAddButton(type) : null
- return (
- <div
- className={cls('param-item f--hlc', {
- 'param-item-bottom': length > 0 && index !== length - 1
- })}
- key={index}
- >
- <div className="item-name">
- {i18n.t('EventView.jenga_extra.param') + (index + 1)}
- </div>
- <div className="item-input-wrap f--hlc flex-1">
- <div className="item-name first inner-name">
- {i18n.t('EventView.jenga_extra.name')}
- </div>
- <input
- className="service-input"
- value={param.name}
- onChange={this.onChangeParam.bind(this, index, type, 'name', false)}
- onBlur={this.onChangeParam.bind(this, index, type, 'name', true)}
- />
- <div className="item-name inner-name">
- {i18n.t('EventView.jenga_extra.type')}
- </div>
- <Select
- onChange={this.onChangeType.bind(this, index, type, 'type', true)}
- value={param.type}
- placeholder={i18n.t('FunctionView.Any')}
- className="prop-select prop-pair-select"
- dropdownClassName="prop-select-dropdown"
- >
- {this.types.map((item, index) => {
- return (
- <Option key={index} value={item.value} title={item.name}>
- {item.name}
- </Option>
- )
- })}
- </Select>
- <div className="item-name inner-name">
- {i18n.t('EventView.jenga_extra.required')}
- </div>
- <Switch
- className="service-switch"
- checked={param.required || false}
- onChange={this.onChangeParam.bind(
- this,
- index,
- type,
- 'required',
- true
- )}
- />
- <div className="f--hlc default-wrap">
- <div className="item-name inner-name">
- {i18n.t('EventView.jenga_extra.default')}
- </div>
- <input
- className="service-input"
- value={param.default || ''}
- placeholder={i18n.t('EventView.jenga_extra.debug-placeholder')}
- onChange={this.onChangeParam.bind(
- this,
- index,
- type,
- 'default',
- false
- )}
- onBlur={this.onChangeParam.bind(
- this,
- index,
- type,
- 'default',
- true
- )}
- />
- </div>
- <button
- className="btn-clear btn-delete-param"
- onClick={this.onDeleteParam.bind(this, index, type)}
- />
- </div>
- {extraBtn}
- </div>
- )
- }
- genInput(value, index, type) {
- let length =
- type === 'in' ? this.state.inParams.length : this.state.outParams.length
- let extraBtn = length - 1 === index ? this.genAddButton(type) : null
- return (
- <div
- className={cls('param-item f--hlc', {
- 'param-item-left': index % 3 !== 0,
- 'param-item-bottom': length > 3 && index < length - (length % 3 || 3)
- })}
- key={index}
- >
- <div className="item-name">
- {i18n.t('EventView.jenga_extra.param') + (index + 1)}
- </div>
- <div className="item-input-wrap f--hlc flex-1">
- <input
- value={value}
- onChange={this.onChangeParam.bind(
- this,
- index,
- type,
- undefined,
- false
- )}
- onBlur={this.onChangeParam.bind(this, index, type, undefined, true)}
- />
- <button
- className="btn-clear btn-delete-param"
- onClick={this.onDeleteParam.bind(this, index, type)}
- />
- </div>
- {extraBtn}
- </div>
- )
- }
- genError(type) {
- return this.state.paramWarning && this.state.paramWarning.type === type ? (
- <div className="param-warning f--hlc">
- {'* ' +
- i18n.t('EventView.jenga_extra.param') +
- (this.state.paramWarning.index + 1) +
- i18n.t('EventView.jenga_extra.setAs') +
- '"' +
- this.state.paramWarning.value +
- '"' +
- ',' +
- i18n.t('EventView.jenga_extra.' + this.state.paramWarning.error)}
- </div>
- ) : null
- }
- getSharedConfig() {
- let { allowConfigShare, isShared, sharedTitle, sharedDesc } = this.state
- return allowConfigShare ? (
- <div
- className={cls('shared-service-config', isShared ? 'f--h' : 'f--hlc')}
- >
- <div className="title">
- {treeStore.curCaseInfo.gid
- ? i18n.t('EventView.jenga_extra.shared_group_service')
- : treeStore.curCaseInfo.eid
- ? i18n.t('EventView.jenga_extra.shared_enterprise_service')
- : i18n.t('EventView.jenga_extra.shared_service')}
- {isShared && (
- <span className="shared-service-tips">
- {i18n.t('EventView.jenga_extra.shared-service-tips')}
- </span>
- )}
- </div>
- {allowConfigShare === 'loading' ? (
- <div>{i18n.t('EventView.jenga_extra.loading-data')}</div>
- ) : allowConfigShare === 'reload' ? (
- <button
- className="btn-clear btn-reload"
- onClick={this.loadSharedService}
- >
- {i18n.t('EventView.jenga_extra.reload-data')}
- </button>
- ) : (
- <div className="f--h">
- <Switch
- checked={isShared}
- onChange={this.onChangeShared}
- className="shared-service-switch"
- />
- {isShared ? (
- <>
- <div className="shared-item f--h">
- <div className="item-title">
- {i18n.t('EventView.jenga_extra.service-title')}
- </div>
- <input
- value={sharedTitle}
- onChange={this.onChangeSharedInfo.bind(
- this,
- 'title',
- false
- )}
- onBlur={this.onChangeSharedInfo.bind(this, 'title', true)}
- />
- </div>
- <div className="shared-item f--h">
- <div className="item-title">
- {i18n.t('EventView.jenga_extra.service-desc')}
- </div>
- <textarea
- value={sharedDesc}
- onChange={this.onChangeSharedInfo.bind(this, 'desc', false)}
- onBlur={this.onChangeSharedInfo.bind(this, 'desc', true)}
- />
- </div>
- </>
- ) : null}
- </div>
- )}
- </div>
- ) : null
- }
- render() {
- return (
- <div className="jenga-node-params jenga-normal-service-params">
- {this.getSharedConfig()}
- <div
- className={cls(
- 'params params-in no-border',
- this.state.inParams.length > 0 ? 'f--h' : 'f--hlc'
- )}
- >
- <div
- className={cls(
- 'params-title params-in-title',
- this.state.inParams.length > 1
- ? 'params-title-top f--h'
- : 'f--hlc'
- )}
- >
- {this.getInParamsName()}
- </div>
- <div>
- <div className="main-wrap f--hlc">
- {this.state.inParams.length === 0
- ? this.genAddButton('in')
- : this.state.inParams.map((param, index) => {
- return this.getInParamsCom(param, index, 'in')
- })}
- </div>
- {this.genError('in')}
- </div>
- </div>
- <div
- className={cls(
- 'params params-out',
- this.state.outParams.length > 0 ? 'f--h' : 'f--hlc'
- )}
- >
- <div
- className={cls(
- 'params-title params-out-title',
- this.state.outParams.length > 3
- ? 'params-title-top f--h'
- : 'f--hlc'
- )}
- >
- {this.getOutParamsName()}
- </div>
- <div>
- <div className="main-wrap f--hlc">
- {this.state.outParams.length === 0
- ? this.genAddButton('out')
- : this.state.outParams.map((param, index) => {
- return this.genInput(param, index, 'out')
- })}
- </div>
- {this.genError('out')}
- </div>
- </div>
- <div className="params-title params-def-title params-service-title f--hlc">
- <div className="flex-1">{this.getTitleName()}</div>
- </div>
- </div>
- )
- }
- }
|