Working add/remove fields for var. length #3314
This commit is contained in:
parent
046d2f2333
commit
9e2214c513
@ -18,6 +18,10 @@ import React, { Component, PropTypes } from 'react';
|
|||||||
import { MenuItem } from 'material-ui';
|
import { MenuItem } from 'material-ui';
|
||||||
import { range } from 'lodash';
|
import { range } from 'lodash';
|
||||||
|
|
||||||
|
import IconButton from 'material-ui/IconButton';
|
||||||
|
import AddIcon from 'material-ui/svg-icons/content/add';
|
||||||
|
import RemoveIcon from 'material-ui/svg-icons/content/remove';
|
||||||
|
|
||||||
import { AddressSelect, Form, Input, InputAddressSelect, Select } from '../../../ui';
|
import { AddressSelect, Form, Input, InputAddressSelect, Select } from '../../../ui';
|
||||||
import { validateAbi } from '../../../util/validation';
|
import { validateAbi } from '../../../util/validation';
|
||||||
|
|
||||||
@ -43,37 +47,65 @@ class TypedInput extends Component {
|
|||||||
const { accounts, label, value = param.default } = this.props;
|
const { accounts, label, value = param.default } = this.props;
|
||||||
const { subtype, length } = param;
|
const { subtype, length } = param;
|
||||||
|
|
||||||
if (length) {
|
const fixedLength = !!length;
|
||||||
const inputs = range(length).map((_, index) => {
|
|
||||||
const onChange = (inputValue) => {
|
|
||||||
const newValues = [].concat(this.props.value);
|
|
||||||
newValues[index] = inputValue;
|
|
||||||
this.props.onChange(newValues);
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
const inputs = range(length || value.length).map((_, index) => {
|
||||||
<TypedInput
|
const onChange = (inputValue) => {
|
||||||
key={ `${subtype.type}_${index}` }
|
const newValues = [].concat(this.props.value);
|
||||||
onChange={ onChange }
|
newValues[index] = inputValue;
|
||||||
accounts={ accounts }
|
this.props.onChange(newValues);
|
||||||
param={ subtype }
|
};
|
||||||
value={ value[index] }
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={ styles.inputs }>
|
<TypedInput
|
||||||
<label>{ label }</label>
|
key={ `${subtype.type}_${index}` }
|
||||||
{ inputs }
|
onChange={ onChange }
|
||||||
</div>
|
accounts={ accounts }
|
||||||
|
param={ subtype }
|
||||||
|
value={ value[index] }
|
||||||
|
/>
|
||||||
);
|
);
|
||||||
}
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={ styles.inputs }>
|
||||||
|
<label>{ label }</label>
|
||||||
|
{ fixedLength ? null : this.renderLength() }
|
||||||
|
{ inputs }
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.renderType(type);
|
return this.renderType(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderLength () {
|
||||||
|
const style = {
|
||||||
|
width: 16,
|
||||||
|
height: 16
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<IconButton
|
||||||
|
iconStyle={ style }
|
||||||
|
style={ style }
|
||||||
|
onClick={ this.onAddField }
|
||||||
|
>
|
||||||
|
<AddIcon />
|
||||||
|
</IconButton>
|
||||||
|
|
||||||
|
<IconButton
|
||||||
|
iconStyle={ style }
|
||||||
|
style={ style }
|
||||||
|
onClick={ this.onRemoveField }
|
||||||
|
>
|
||||||
|
<RemoveIcon />
|
||||||
|
</IconButton>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
renderType (type) {
|
renderType (type) {
|
||||||
if (type === ADDRESS_TYPE) {
|
if (type === ADDRESS_TYPE) {
|
||||||
return this.renderAddress();
|
return this.renderAddress();
|
||||||
@ -184,6 +216,20 @@ class TypedInput extends Component {
|
|||||||
this.props.onChange(value);
|
this.props.onChange(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onAddField = () => {
|
||||||
|
const { value, onChange, param } = this.props;
|
||||||
|
const newValues = [].concat(value, param.subtype.default);
|
||||||
|
|
||||||
|
onChange(newValues);
|
||||||
|
}
|
||||||
|
|
||||||
|
onRemoveField = () => {
|
||||||
|
const { value, onChange } = this.props;
|
||||||
|
const newValues = value.slice(0, -1);
|
||||||
|
|
||||||
|
onChange(newValues);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class DetailsStep extends Component {
|
export default class DetailsStep extends Component {
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.inputs {
|
.inputs {
|
||||||
padding-top: 18px;
|
padding-top: 2px;
|
||||||
|
|
||||||
label {
|
label {
|
||||||
line-height: 22px;
|
line-height: 22px;
|
||||||
@ -41,7 +41,7 @@
|
|||||||
color: rgba(255, 255, 255, 0.498039);
|
color: rgba(255, 255, 255, 0.498039);
|
||||||
-webkit-user-select: none;
|
-webkit-user-select: none;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
top: 8px;
|
top: 11px;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,10 @@
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
left: 0;
|
left: 0;
|
||||||
top: 35px;
|
top: 35px;
|
||||||
|
|
||||||
|
&.noLabel {
|
||||||
|
top: 11px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.paddedInput input {
|
.paddedInput input {
|
||||||
|
@ -106,15 +106,21 @@ export default class AddressSelect extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
renderIdentityIcon (inputValue) {
|
renderIdentityIcon (inputValue) {
|
||||||
const { error, value } = this.props;
|
const { error, value, label } = this.props;
|
||||||
|
|
||||||
if (error || !inputValue || value.length !== 42) {
|
if (error || !inputValue || value.length !== 42) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const classes = [ styles.icon ];
|
||||||
|
|
||||||
|
if (!label) {
|
||||||
|
classes.push(styles.noLabel);
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<IdentityIcon
|
<IdentityIcon
|
||||||
className={ styles.icon }
|
className={ classes.join(' ') }
|
||||||
inline center
|
inline center
|
||||||
address={ value } />
|
address={ value } />
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user