1 import { BaseNew, FormContainer, FormSection, FieldLabel, JsonField, TextField } from 'features/shared/components'
2 import { DropdownButton, MenuItem } from 'react-bootstrap'
3 import { reduxForm } from 'redux-form'
4 import ActionItem from './FormActionItem'
5 import React from 'react'
6 import styles from './New.scss'
8 class Form extends React.Component {
15 this.submitWithValidation = this.submitWithValidation.bind(this)
16 this.addActionItem = this.addActionItem.bind(this)
17 this.removeActionItem = this.removeActionItem.bind(this)
18 this.toggleDropwdown = this.toggleDropwdown.bind(this)
19 this.closeDropdown = this.closeDropdown.bind(this)
20 this.disableSubmit = this.disableSubmit.bind(this)
24 this.setState({ showDropdown: !this.state.showDropdown })
28 this.setState({ showDropdown: false })
32 this.props.fields.actions.addField({
34 referenceData: '{\n\t\n}'
39 disableSubmit(actions) {
40 return actions.length == 0 & !this.state.showAdvanced
43 removeActionItem(index) {
44 this.props.fields.actions.removeField(index)
47 submitWithValidation(data) {
48 return new Promise((resolve, reject) => {
49 this.props.submitForm(data)
56 err.data.forEach((error) => {
57 response.actions[error.data.actionIndex] = {type: error}
61 response['_error'] = err
62 return reject(response)
69 fields: { baseTransaction, actions, submitAction, password },
75 let submitLabel = 'Submit transaction'
76 if (submitAction.value == 'generate') {
77 submitLabel = 'Generate transaction hex'
83 label='New transaction'
84 submitLabel={submitLabel}
85 onSubmit={handleSubmit(this.submitWithValidation)}
86 showSubmitIndicator={true}
87 submitting={submitting}
88 disabled={this.disableSubmit(actions)} >
90 <FormSection title='Actions'>
91 {actions.map((action, index) =>
96 accounts={this.props.accounts}
97 assets={this.props.assets}
98 remove={this.removeActionItem}
101 <div className={`btn-group ${styles.addActionContainer} ${this.state.showDropdown && 'open'}`}>
103 className={`btn btn-default ${styles.addAction}`}
104 id='input-dropdown-addon'
106 onSelect={this.addActionItem}
108 <MenuItem eventKey='issue'>Issue</MenuItem>
109 <MenuItem eventKey='spend_account'>Spend from account</MenuItem>
110 {/*<MenuItem eventKey='spend_account_unspent_output'>Spend unspent output</MenuItem>*/}
111 <MenuItem eventKey='control_account'>Control with account</MenuItem>
112 <MenuItem eventKey='control_receiver'>Control with receiver</MenuItem>
113 <MenuItem eventKey='control_address'>Control with address</MenuItem>
114 <MenuItem eventKey='retire'>Retire</MenuItem>
115 {/*<MenuItem eventKey='set_transaction_reference_data'>Set transaction reference data</MenuItem>*/}
120 {!this.state.showAdvanced &&
123 className={styles.showAdvanced}
126 this.setState({showAdvanced: true})
129 Show advanced options
134 {this.state.showAdvanced && <FormSection title='Advanced Options'>
137 title='Base transaction'
138 placeholder='Paste transaction hex here...'
139 fieldProps={baseTransaction}
142 <FieldLabel>Transaction Build Type</FieldLabel>
143 <table className={styles.submitTable}>
146 <td><input id='submit_action_submit' type='radio' {...submitAction} value='submit' checked={submitAction.value == 'submit'} /></td>
148 <label htmlFor='submit_action_submit'>Submit transaction to blockchain</label>
150 <label htmlFor='submit_action_submit' className={styles.submitDescription}>
151 This transaction will be signed by the MockHSM and submitted to the blockchain.
156 <td><input id='submit_action_generate' type='radio' {...submitAction} value='generate' checked={submitAction.value == 'generate'} /></td>
158 <label htmlFor='submit_action_generate'>Allow additional actions</label>
160 <label htmlFor='submit_action_generate' className={styles.submitDescription}>
161 These actions will be signed by the MockHSM and returned as a
162 transaction hex string, which should be used as the base
163 transaction in a multi-party swap. This transaction will be
177 const validate = values => {
178 const errors = {actions: {}}
181 let baseTx = values.baseTransaction || ''
182 if (baseTx.trim().match(/[^0-9a-fA-F]/)) {
183 errors.baseTransaction = 'Base transaction must be a hex string.'
188 values.actions.forEach((action, index) => {
189 fieldError = JsonField.validator(values.actions[index].referenceData)
191 errors.actions[index] = {...errors.actions[index], referenceData: fieldError}
198 export default BaseNew.connect(
200 ...BaseNew.mapStateToProps('transaction')(state),
202 BaseNew.mapDispatchToProps('transaction'),
204 form: 'NewTransactionForm',
207 'actions[].accountId',
208 'actions[].accountAlias',
210 'actions[].assetAlias',
212 'actions[].receiver',
213 'actions[].outputId',
214 'actions[].referenceData',
217 'actions[].password',
223 submitAction: 'submit',