8 } from 'features/shared/components'
9 import TransactionDetails from './MultiSignTransactionDetails/TransactionDetails'
10 import {DropdownButton, MenuItem} from 'react-bootstrap'
11 import {reduxForm} from 'redux-form'
12 import ActionItem from './FormActionItem'
13 import React from 'react'
14 import styles from './New.scss'
15 import TxContainer from './NewTransactionsContainer/TxContainer'
16 import disableAutocomplete from 'utility/disableAutocomplete'
17 import actions from 'actions'
18 import { getAssetDecimal} from '../../transactions'
19 import {withNamespaces} from 'react-i18next'
22 class AdvancedTxForm extends React.Component {
31 this.submitWithValidation = this.submitWithValidation.bind(this)
32 this.addActionItem = this.addActionItem.bind(this)
33 this.removeActionItem = this.removeActionItem.bind(this)
34 this.toggleDropwdown = this.toggleDropwdown.bind(this)
35 this.closeDropdown = this.closeDropdown.bind(this)
36 this.disableSubmit = this.disableSubmit.bind(this)
40 this.setState({showDropdown: !this.state.showDropdown})
44 this.setState({showDropdown: false})
48 const counter = this.state.counter
49 this.props.fields.actions.addField({
59 disableSubmit(actions) {
60 return actions.length == 0 && !this.state.showAdvanced
63 removeActionItem(index) {
64 this.props.fields.actions.removeField(index)
67 submitWithValidation(data) {
68 return new Promise((resolve, reject) => {
69 this.props.submitForm(Object.assign({}, data, {state: this.state, form: 'advancedTx'}))
76 err.data.forEach((error) => {
77 response.actions[error.data.actionIndex] = {type: error}
81 response['_error'] = err
82 return reject(response)
89 fields: {signTransaction, actions, submitAction, password},
94 const t = this.props.t
96 let submitLabel = t('transaction.new.submit')
97 const hasBaseTransaction = ((signTransaction.value || '').trim()).length > 0
98 if (submitAction.value == 'generate' && !hasBaseTransaction) {
99 submitLabel = t('transaction.advance.generateJson')
105 onSubmit={handleSubmit(this.submitWithValidation)}
106 submitting={submitting}
107 submitLabel= {submitLabel}
108 disabled={this.disableSubmit(actions)}
109 className={`${styles.content} ${styles.center}`}
111 <FormSection title='Actions'>
112 {actions.map((action, index) =>
114 key={action.ID.value}
117 accounts={this.props.accounts}
118 assets={this.props.assets}
119 remove={this.removeActionItem}
120 decimal={getAssetDecimal(action, this.props.asset)}
123 <div className={`btn-group ${styles.addActionContainer} ${this.state.showDropdown && 'open'}`}>
125 className={`btn btn-default ${styles.addAction}`}
126 id='input-dropdown-addon'
128 onSelect={this.addActionItem}
130 <MenuItem eventKey='spend_account'>Spend from account</MenuItem>
131 <MenuItem eventKey='control_address'>Control with address</MenuItem>
132 <MenuItem eventKey='vote_output'>Vote</MenuItem>
133 <MenuItem eventKey='unvote'>Veto</MenuItem>
134 <MenuItem eventKey='cross_chain_in'>Cross Chain In</MenuItem>
135 <MenuItem eventKey='cross_chain_out'>Cross Chain Out</MenuItem>
140 {!this.state.showAdvanced &&
143 className={styles.showAdvanced}
146 this.setState({showAdvanced: true})
149 {t('transaction.advance.showAdvanced')}
154 {this.state.showAdvanced &&
155 <FormSection title={t('transaction.advance.option')}>
158 fieldProps={signTransaction}
159 decode={this.props.decode}
160 transaction={this.props.decodedTx}
161 showJsonModal={this.props.showJsonModal}
162 asset={this.props.asset}
163 btmAmountUnit = {this.props.btmAmountUnit}
166 <FieldLabel>{t('transaction.advance.buildType')}</FieldLabel>
167 <table className={styles.submitTable}>
170 <td><input id='submit_action_submit' type='radio' {...submitAction} value='submit'
171 checked={submitAction.value == 'submit'}/></td>
174 htmlFor='submit_action_submit'>{ t('transaction.advance.submitToBlockchain')}</label>
176 <label htmlFor='submit_action_submit' className={styles.submitDescription}>
177 {t('transaction.advance.submitLabel')}
182 <td><input id='submit_action_generate' type='radio' {...submitAction} value='generate'
183 checked={submitAction.value == 'generate'}/></td>
185 <label htmlFor='submit_action_generate'>{ t('transaction.advance.needMoreSign')}</label>
187 <label htmlFor='submit_action_generate' className={styles.submitDescription}>
188 {t('transaction.advance.needMoreSignDescription')}
197 {(actions.length > 0 || this.state.showAdvanced) && <FormSection>
198 <label className={styles.title}>{t('key.password')}</label>
200 placeholder={t('key.passwordPlaceholder')}
201 fieldProps={password}
209 const validate = (values, props) => {
210 const errors = {actions: {}}
214 let baseTx = (values.signTransaction || '').trim()
219 errors.signTransaction = t('errorMessage.jsonError')
225 values.actions.forEach((action, index) => {
226 numError = (!/^\d+(\.\d+)?$/i.test(values.actions[index].amount))
228 errors.actions[index] = {...errors.actions[index], amount: t('errorMessage.amountError')}
234 const mapDispatchToProps = (dispatch) => ({
235 ...BaseNew.mapDispatchToProps('transaction')(dispatch),
236 decode: (transaction) => dispatch( actions.transaction.decode(transaction)),
237 showJsonModal: (body) => dispatch(actions.app.showModal(
239 actions.app.hideModal,
245 export default withNamespaces('translations') (BaseNew.connect(
246 (state, ownProps) => ({
247 ...BaseNew.mapStateToProps('transaction')(state, ownProps),
248 decodedTx: state.transaction.decodedTx
252 form: 'AdvancedTransactionForm',
256 'actions[].accountId',
257 'actions[].accountAlias',
259 'actions[].assetAlias',
261 'actions[].outputId',
265 'actions[].sourceId',
266 'actions[].sourcePos',
267 'actions[].password',
274 submitAction: 'submit',