Use TypedInputs in Contracts view (#4015)
* Use TypedInput in Contracts * Add right readOnly Bool TypedInput * PR Grumbles
This commit is contained in:
		
							parent
							
								
									0f41c5b847
								
							
						
					
					
						commit
						e8ef7b357d
					
				@ -58,11 +58,13 @@ class AddressSelect extends Component {
 | 
				
			|||||||
    tokens: PropTypes.object,
 | 
					    tokens: PropTypes.object,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Optional props
 | 
					    // Optional props
 | 
				
			||||||
 | 
					    allowCopy: PropTypes.bool,
 | 
				
			||||||
    allowInput: PropTypes.bool,
 | 
					    allowInput: PropTypes.bool,
 | 
				
			||||||
    disabled: PropTypes.bool,
 | 
					    disabled: PropTypes.bool,
 | 
				
			||||||
    error: nodeOrStringProptype(),
 | 
					    error: nodeOrStringProptype(),
 | 
				
			||||||
    hint: nodeOrStringProptype(),
 | 
					    hint: nodeOrStringProptype(),
 | 
				
			||||||
    label: nodeOrStringProptype(),
 | 
					    label: nodeOrStringProptype(),
 | 
				
			||||||
 | 
					    readOnly: PropTypes.bool,
 | 
				
			||||||
    value: nodeOrStringProptype()
 | 
					    value: nodeOrStringProptype()
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -121,12 +123,12 @@ class AddressSelect extends Component {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  renderInput () {
 | 
					  renderInput () {
 | 
				
			||||||
    const { focused } = this.state;
 | 
					    const { focused } = this.state;
 | 
				
			||||||
    const { accountsInfo, disabled, error, hint, label, value } = this.props;
 | 
					    const { accountsInfo, allowCopy, disabled, error, hint, label, readOnly, value } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const input = (
 | 
					    const input = (
 | 
				
			||||||
      <InputAddress
 | 
					      <InputAddress
 | 
				
			||||||
        accountsInfo={ accountsInfo }
 | 
					        accountsInfo={ accountsInfo }
 | 
				
			||||||
        allowCopy={ false }
 | 
					        allowCopy={ allowCopy }
 | 
				
			||||||
        disabled={ disabled }
 | 
					        disabled={ disabled }
 | 
				
			||||||
        error={ error }
 | 
					        error={ error }
 | 
				
			||||||
        hint={ hint }
 | 
					        hint={ hint }
 | 
				
			||||||
@ -139,7 +141,7 @@ class AddressSelect extends Component {
 | 
				
			|||||||
      />
 | 
					      />
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (disabled) {
 | 
					    if (disabled || readOnly) {
 | 
				
			||||||
      return input;
 | 
					      return input;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -152,10 +154,10 @@ class AddressSelect extends Component {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  renderContent () {
 | 
					  renderContent () {
 | 
				
			||||||
    const { muiTheme } = this.context;
 | 
					    const { muiTheme } = this.context;
 | 
				
			||||||
    const { hint, disabled, label } = this.props;
 | 
					    const { hint, disabled, label, readOnly } = this.props;
 | 
				
			||||||
    const { expanded, inputFocused } = this.state;
 | 
					    const { expanded, inputFocused } = this.state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (disabled) {
 | 
					    if (disabled || readOnly) {
 | 
				
			||||||
      return null;
 | 
					      return null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -507,6 +509,10 @@ class AddressSelect extends Component {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  handleMainBlur = () => {
 | 
					  handleMainBlur = () => {
 | 
				
			||||||
 | 
					    if (this.props.readOnly) {
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (window.document.hasFocus() && !this.state.expanded) {
 | 
					    if (window.document.hasFocus() && !this.state.expanded) {
 | 
				
			||||||
      this.closing = false;
 | 
					      this.closing = false;
 | 
				
			||||||
      this.setState({ focused: false });
 | 
					      this.setState({ focused: false });
 | 
				
			||||||
@ -514,7 +520,7 @@ class AddressSelect extends Component {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  handleMainFocus = () => {
 | 
					  handleMainFocus = () => {
 | 
				
			||||||
    if (this.state.focused) {
 | 
					    if (this.state.focused || this.props.readOnly) {
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -529,6 +535,12 @@ class AddressSelect extends Component {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  handleFocus = () => {
 | 
					  handleFocus = () => {
 | 
				
			||||||
 | 
					    const { disabled, readOnly } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (disabled || readOnly) {
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.setState({ expanded: true, focusedItem: null, focusedCat: null }, () => {
 | 
					    this.setState({ expanded: true, focusedItem: null, focusedCat: null }, () => {
 | 
				
			||||||
      window.setTimeout(() => {
 | 
					      window.setTimeout(() => {
 | 
				
			||||||
        this.handleDOMAction(this.inputRef, 'focus');
 | 
					        this.handleDOMAction(this.inputRef, 'focus');
 | 
				
			||||||
 | 
				
			|||||||
@ -185,7 +185,7 @@ export default class Input extends Component {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    const text = typeof allowCopy === 'string'
 | 
					    const text = typeof allowCopy === 'string'
 | 
				
			||||||
      ? allowCopy
 | 
					      ? allowCopy
 | 
				
			||||||
      : value;
 | 
					      : value.toString();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const style = hideUnderline
 | 
					    const style = hideUnderline
 | 
				
			||||||
      ? {}
 | 
					      ? {}
 | 
				
			||||||
 | 
				
			|||||||
@ -78,7 +78,7 @@ class InputAddress extends Component {
 | 
				
			|||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <div className={ containerClasses.join(' ') }>
 | 
					      <div className={ containerClasses.join(' ') }>
 | 
				
			||||||
        <Input
 | 
					        <Input
 | 
				
			||||||
          allowCopy={ allowCopy && (disabled ? value : false) }
 | 
					          allowCopy={ allowCopy && ((disabled || readOnly) ? value : false) }
 | 
				
			||||||
          className={ classes.join(' ') }
 | 
					          className={ classes.join(' ') }
 | 
				
			||||||
          disabled={ disabled }
 | 
					          disabled={ disabled }
 | 
				
			||||||
          error={ error }
 | 
					          error={ error }
 | 
				
			||||||
@ -103,13 +103,13 @@ class InputAddress extends Component {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  renderIcon () {
 | 
					  renderIcon () {
 | 
				
			||||||
    const { value, disabled, label, allowCopy, hideUnderline } = this.props;
 | 
					    const { value, disabled, label, allowCopy, hideUnderline, readOnly } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!value || !value.length || !util.isAddressValid(value)) {
 | 
					    if (!value || !value.length || !util.isAddressValid(value)) {
 | 
				
			||||||
      return null;
 | 
					      return null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const classes = [disabled ? styles.iconDisabled : styles.icon];
 | 
					    const classes = [(disabled || readOnly) ? styles.iconDisabled : styles.icon];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!label) {
 | 
					    if (!label) {
 | 
				
			||||||
      classes.push(styles.noLabel);
 | 
					      classes.push(styles.noLabel);
 | 
				
			||||||
 | 
				
			|||||||
@ -25,27 +25,33 @@ class InputAddressSelect extends Component {
 | 
				
			|||||||
    accounts: PropTypes.object.isRequired,
 | 
					    accounts: PropTypes.object.isRequired,
 | 
				
			||||||
    contacts: PropTypes.object.isRequired,
 | 
					    contacts: PropTypes.object.isRequired,
 | 
				
			||||||
    contracts: PropTypes.object.isRequired,
 | 
					    contracts: PropTypes.object.isRequired,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    allowCopy: PropTypes.bool,
 | 
				
			||||||
    error: PropTypes.string,
 | 
					    error: PropTypes.string,
 | 
				
			||||||
    label: PropTypes.string,
 | 
					 | 
				
			||||||
    hint: PropTypes.string,
 | 
					    hint: PropTypes.string,
 | 
				
			||||||
    value: PropTypes.string,
 | 
					    label: PropTypes.string,
 | 
				
			||||||
    onChange: PropTypes.func
 | 
					    onChange: PropTypes.func,
 | 
				
			||||||
 | 
					    readOnly: PropTypes.bool,
 | 
				
			||||||
 | 
					    value: PropTypes.string
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  render () {
 | 
					  render () {
 | 
				
			||||||
    const { accounts, contacts, contracts, label, hint, error, value, onChange } = this.props;
 | 
					    const { accounts, allowCopy, contacts, contracts, label, hint, error, value, onChange, readOnly } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <AddressSelect
 | 
					      <AddressSelect
 | 
				
			||||||
 | 
					        allowCopy={ allowCopy }
 | 
				
			||||||
        allowInput
 | 
					        allowInput
 | 
				
			||||||
        accounts={ accounts }
 | 
					        accounts={ accounts }
 | 
				
			||||||
        contacts={ contacts }
 | 
					        contacts={ contacts }
 | 
				
			||||||
        contracts={ contracts }
 | 
					        contracts={ contracts }
 | 
				
			||||||
        error={ error }
 | 
					        error={ error }
 | 
				
			||||||
        label={ label }
 | 
					 | 
				
			||||||
        hint={ hint }
 | 
					        hint={ hint }
 | 
				
			||||||
 | 
					        label={ label }
 | 
				
			||||||
 | 
					        onChange={ onChange }
 | 
				
			||||||
 | 
					        readOnly={ readOnly }
 | 
				
			||||||
        value={ value }
 | 
					        value={ value }
 | 
				
			||||||
        onChange={ onChange } />
 | 
					      />
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,7 @@
 | 
				
			|||||||
import React, { Component, PropTypes } from 'react';
 | 
					import React, { Component, PropTypes } from 'react';
 | 
				
			||||||
import { MenuItem, Toggle } from 'material-ui';
 | 
					import { MenuItem, Toggle } from 'material-ui';
 | 
				
			||||||
import { range } from 'lodash';
 | 
					import { range } from 'lodash';
 | 
				
			||||||
 | 
					import BigNumber from 'bignumber.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import IconButton from 'material-ui/IconButton';
 | 
					import IconButton from 'material-ui/IconButton';
 | 
				
			||||||
import AddIcon from 'material-ui/svg-icons/content/add';
 | 
					import AddIcon from 'material-ui/svg-icons/content/add';
 | 
				
			||||||
@ -33,26 +34,31 @@ import styles from './typedInput.css';
 | 
				
			|||||||
export default class TypedInput extends Component {
 | 
					export default class TypedInput extends Component {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static propTypes = {
 | 
					  static propTypes = {
 | 
				
			||||||
    onChange: PropTypes.func.isRequired,
 | 
					    param: PropTypes.oneOfType([
 | 
				
			||||||
 | 
					      PropTypes.object,
 | 
				
			||||||
 | 
					      PropTypes.string
 | 
				
			||||||
 | 
					    ]).isRequired,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    accounts: PropTypes.object,
 | 
					    accounts: PropTypes.object,
 | 
				
			||||||
 | 
					    allowCopy: PropTypes.bool,
 | 
				
			||||||
    error: PropTypes.any,
 | 
					    error: PropTypes.any,
 | 
				
			||||||
    hint: PropTypes.string,
 | 
					    hint: PropTypes.string,
 | 
				
			||||||
    isEth: PropTypes.bool,
 | 
					    isEth: PropTypes.bool,
 | 
				
			||||||
    label: PropTypes.string,
 | 
					    label: PropTypes.string,
 | 
				
			||||||
    max: PropTypes.number,
 | 
					    max: PropTypes.number,
 | 
				
			||||||
    min: PropTypes.number,
 | 
					    min: PropTypes.number,
 | 
				
			||||||
    param: PropTypes.oneOfType([
 | 
					    onChange: PropTypes.func,
 | 
				
			||||||
      PropTypes.object,
 | 
					    readOnly: PropTypes.bool,
 | 
				
			||||||
      PropTypes.string
 | 
					 | 
				
			||||||
    ]).isRequired,
 | 
					 | 
				
			||||||
    value: PropTypes.any
 | 
					    value: PropTypes.any
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static defaultProps = {
 | 
					  static defaultProps = {
 | 
				
			||||||
 | 
					    allowCopy: false,
 | 
				
			||||||
 | 
					    isEth: null,
 | 
				
			||||||
    min: null,
 | 
					    min: null,
 | 
				
			||||||
    max: null,
 | 
					    max: null,
 | 
				
			||||||
    isEth: null
 | 
					    onChange: () => {},
 | 
				
			||||||
 | 
					    readOnly: false
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  state = {
 | 
					  state = {
 | 
				
			||||||
@ -61,8 +67,11 @@ export default class TypedInput extends Component {
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  componentWillMount () {
 | 
					  componentWillMount () {
 | 
				
			||||||
    if (this.props.isEth && this.props.value) {
 | 
					    const { isEth, value } = this.props;
 | 
				
			||||||
      this.setState({ isEth: true, ethValue: fromWei(this.props.value) });
 | 
					
 | 
				
			||||||
 | 
					    if (typeof isEth === 'boolean' && value) {
 | 
				
			||||||
 | 
					      const ethValue = isEth ? fromWei(value) : value;
 | 
				
			||||||
 | 
					      this.setState({ isEth, ethValue });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -78,7 +87,7 @@ export default class TypedInput extends Component {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  renderParam (param) {
 | 
					  renderParam (param) {
 | 
				
			||||||
    const { isEth } = this.props;
 | 
					    const { allowCopy, isEth, readOnly } = this.props;
 | 
				
			||||||
    const { type } = param;
 | 
					    const { type } = param;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (type === ABI_TYPES.ARRAY) {
 | 
					    if (type === ABI_TYPES.ARRAY) {
 | 
				
			||||||
@ -96,10 +105,12 @@ export default class TypedInput extends Component {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        return (
 | 
					        return (
 | 
				
			||||||
          <TypedInput
 | 
					          <TypedInput
 | 
				
			||||||
 | 
					            accounts={ accounts }
 | 
				
			||||||
 | 
					            allowCopy={ allowCopy }
 | 
				
			||||||
            key={ `${subtype.type}_${index}` }
 | 
					            key={ `${subtype.type}_${index}` }
 | 
				
			||||||
            onChange={ onChange }
 | 
					            onChange={ onChange }
 | 
				
			||||||
            accounts={ accounts }
 | 
					 | 
				
			||||||
            param={ subtype }
 | 
					            param={ subtype }
 | 
				
			||||||
 | 
					            readOnly={ readOnly }
 | 
				
			||||||
            value={ value[index] }
 | 
					            value={ value[index] }
 | 
				
			||||||
          />
 | 
					          />
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
@ -226,21 +237,23 @@ export default class TypedInput extends Component {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  renderInteger (value = this.props.value, onChange = this.onChange) {
 | 
					  renderInteger (value = this.props.value, onChange = this.onChange) {
 | 
				
			||||||
    const { label, error, hint, min, max } = this.props;
 | 
					    const { allowCopy, label, error, hint, min, max, readOnly } = this.props;
 | 
				
			||||||
    const param = this.getParam();
 | 
					    const param = this.getParam();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const realValue = value && typeof value.toNumber === 'function'
 | 
					    const realValue = value
 | 
				
			||||||
      ? value.toNumber()
 | 
					      ? (new BigNumber(value))[readOnly ? 'toFormat' : 'toNumber']()
 | 
				
			||||||
      : value;
 | 
					      : value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <Input
 | 
					      <Input
 | 
				
			||||||
 | 
					        allowCopy={ allowCopy }
 | 
				
			||||||
        label={ label }
 | 
					        label={ label }
 | 
				
			||||||
        hint={ hint }
 | 
					        hint={ hint }
 | 
				
			||||||
        value={ realValue }
 | 
					        value={ realValue }
 | 
				
			||||||
        error={ error }
 | 
					        error={ error }
 | 
				
			||||||
        onChange={ onChange }
 | 
					        onChange={ onChange }
 | 
				
			||||||
        type='number'
 | 
					        readOnly={ readOnly }
 | 
				
			||||||
 | 
					        type={ readOnly ? 'text' : 'number' }
 | 
				
			||||||
        step={ 1 }
 | 
					        step={ 1 }
 | 
				
			||||||
        min={ min !== null ? min : (param.signed ? null : 0) }
 | 
					        min={ min !== null ? min : (param.signed ? null : 0) }
 | 
				
			||||||
        max={ max !== null ? max : null }
 | 
					        max={ max !== null ? max : null }
 | 
				
			||||||
@ -256,20 +269,22 @@ export default class TypedInput extends Component {
 | 
				
			|||||||
   * @see https://github.com/facebook/react/issues/1549
 | 
					   * @see https://github.com/facebook/react/issues/1549
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  renderFloat (value = this.props.value, onChange = this.onChange) {
 | 
					  renderFloat (value = this.props.value, onChange = this.onChange) {
 | 
				
			||||||
    const { label, error, hint, min, max } = this.props;
 | 
					    const { allowCopy, label, error, hint, min, max, readOnly } = this.props;
 | 
				
			||||||
    const param = this.getParam();
 | 
					    const param = this.getParam();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const realValue = value && typeof value.toNumber === 'function'
 | 
					    const realValue = value
 | 
				
			||||||
      ? value.toNumber()
 | 
					      ? (new BigNumber(value))[readOnly ? 'toFormat' : 'toNumber']()
 | 
				
			||||||
      : value;
 | 
					      : value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <Input
 | 
					      <Input
 | 
				
			||||||
 | 
					        allowCopy={ allowCopy }
 | 
				
			||||||
        label={ label }
 | 
					        label={ label }
 | 
				
			||||||
        hint={ hint }
 | 
					        hint={ hint }
 | 
				
			||||||
        value={ realValue }
 | 
					        value={ realValue }
 | 
				
			||||||
        error={ error }
 | 
					        error={ error }
 | 
				
			||||||
        onChange={ onChange }
 | 
					        onChange={ onChange }
 | 
				
			||||||
 | 
					        readOnly={ readOnly }
 | 
				
			||||||
        type='text'
 | 
					        type='text'
 | 
				
			||||||
        min={ min !== null ? min : (param.signed ? null : 0) }
 | 
					        min={ min !== null ? min : (param.signed ? null : 0) }
 | 
				
			||||||
        max={ max !== null ? max : null }
 | 
					        max={ max !== null ? max : null }
 | 
				
			||||||
@ -278,37 +293,44 @@ export default class TypedInput extends Component {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  renderDefault () {
 | 
					  renderDefault () {
 | 
				
			||||||
    const { label, value, error, hint } = this.props;
 | 
					    const { allowCopy, label, value, error, hint, readOnly } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <Input
 | 
					      <Input
 | 
				
			||||||
 | 
					        allowCopy={ allowCopy }
 | 
				
			||||||
        label={ label }
 | 
					        label={ label }
 | 
				
			||||||
        hint={ hint }
 | 
					        hint={ hint }
 | 
				
			||||||
        value={ value }
 | 
					        value={ value }
 | 
				
			||||||
        error={ error }
 | 
					        error={ error }
 | 
				
			||||||
        onSubmit={ this.onSubmit }
 | 
					        onSubmit={ this.onSubmit }
 | 
				
			||||||
 | 
					        readOnly={ readOnly }
 | 
				
			||||||
      />
 | 
					      />
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  renderAddress () {
 | 
					  renderAddress () {
 | 
				
			||||||
    const { accounts, label, value, error, hint } = this.props;
 | 
					    const { accounts, allowCopy, label, value, error, hint, readOnly } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <InputAddressSelect
 | 
					      <InputAddressSelect
 | 
				
			||||||
 | 
					        allowCopy={ allowCopy }
 | 
				
			||||||
        accounts={ accounts }
 | 
					        accounts={ accounts }
 | 
				
			||||||
        label={ label }
 | 
					 | 
				
			||||||
        hint={ hint }
 | 
					 | 
				
			||||||
        value={ value }
 | 
					 | 
				
			||||||
        error={ error }
 | 
					        error={ error }
 | 
				
			||||||
 | 
					        hint={ hint }
 | 
				
			||||||
 | 
					        label={ label }
 | 
				
			||||||
        onChange={ this.onChange }
 | 
					        onChange={ this.onChange }
 | 
				
			||||||
        editing
 | 
					        readOnly={ readOnly }
 | 
				
			||||||
 | 
					        value={ value }
 | 
				
			||||||
      />
 | 
					      />
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  renderBoolean () {
 | 
					  renderBoolean () {
 | 
				
			||||||
    const { label, value, error, hint } = this.props;
 | 
					    const { allowCopy, label, value, error, hint, readOnly } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (readOnly) {
 | 
				
			||||||
 | 
					      return this.renderDefault();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const boolitems = ['false', 'true'].map((bool) => {
 | 
					    const boolitems = ['false', 'true'].map((bool) => {
 | 
				
			||||||
      return (
 | 
					      return (
 | 
				
			||||||
@ -323,6 +345,7 @@ export default class TypedInput extends Component {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <Select
 | 
					      <Select
 | 
				
			||||||
 | 
					        allowCopy={ allowCopy }
 | 
				
			||||||
        error={ error }
 | 
					        error={ error }
 | 
				
			||||||
        hint={ hint }
 | 
					        hint={ hint }
 | 
				
			||||||
        label={ label }
 | 
					        label={ label }
 | 
				
			||||||
 | 
				
			|||||||
@ -19,29 +19,31 @@ import React, { Component, PropTypes } from 'react';
 | 
				
			|||||||
import LinearProgress from 'material-ui/LinearProgress';
 | 
					import LinearProgress from 'material-ui/LinearProgress';
 | 
				
			||||||
import { Card, CardActions, CardTitle, CardText } from 'material-ui/Card';
 | 
					import { Card, CardActions, CardTitle, CardText } from 'material-ui/Card';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { Button, Input, InputAddress, InputAddressSelect } from '~/ui';
 | 
					import { Button, TypedInput } from '~/ui';
 | 
				
			||||||
 | 
					import { arrayOrObjectProptype } from '~/util/proptypes';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import styles from './queries.css';
 | 
					import styles from './queries.css';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class InputQuery extends Component {
 | 
					export default class InputQuery extends Component {
 | 
				
			||||||
  static contextTypes = {
 | 
					  static contextTypes = {
 | 
				
			||||||
    api: PropTypes.object
 | 
					    api: PropTypes.object
 | 
				
			||||||
  }
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static propTypes = {
 | 
					  static propTypes = {
 | 
				
			||||||
 | 
					    accountsInfo: PropTypes.object.isRequired,
 | 
				
			||||||
    contract: PropTypes.object.isRequired,
 | 
					    contract: PropTypes.object.isRequired,
 | 
				
			||||||
    inputs: PropTypes.array.isRequired,
 | 
					    inputs: arrayOrObjectProptype().isRequired,
 | 
				
			||||||
    outputs: PropTypes.array.isRequired,
 | 
					    outputs: arrayOrObjectProptype().isRequired,
 | 
				
			||||||
    name: PropTypes.string.isRequired,
 | 
					    name: PropTypes.string.isRequired,
 | 
				
			||||||
    signature: PropTypes.string.isRequired,
 | 
					    signature: PropTypes.string.isRequired,
 | 
				
			||||||
    className: PropTypes.string
 | 
					    className: PropTypes.string
 | 
				
			||||||
  }
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  state = {
 | 
					  state = {
 | 
				
			||||||
    isValid: true,
 | 
					    isValid: true,
 | 
				
			||||||
    results: [],
 | 
					    results: [],
 | 
				
			||||||
    values: {}
 | 
					    values: {}
 | 
				
			||||||
  }
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  render () {
 | 
					  render () {
 | 
				
			||||||
    const { name, className } = this.props;
 | 
					    const { name, className } = this.props;
 | 
				
			||||||
@ -89,7 +91,7 @@ export default class InputQuery extends Component {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  renderResults () {
 | 
					  renderResults () {
 | 
				
			||||||
    const { results, isLoading } = this.state;
 | 
					    const { results, isLoading } = this.state;
 | 
				
			||||||
    const { outputs } = this.props;
 | 
					    const { accountsInfo, outputs } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (isLoading) {
 | 
					    if (isLoading) {
 | 
				
			||||||
      return (<LinearProgress mode='indeterminate' />);
 | 
					      return (<LinearProgress mode='indeterminate' />);
 | 
				
			||||||
@ -108,25 +110,16 @@ export default class InputQuery extends Component {
 | 
				
			|||||||
      }))
 | 
					      }))
 | 
				
			||||||
      .sort((outA, outB) => outA.display.length - outB.display.length)
 | 
					      .sort((outA, outB) => outA.display.length - outB.display.length)
 | 
				
			||||||
      .map((out, index) => {
 | 
					      .map((out, index) => {
 | 
				
			||||||
        let input = null;
 | 
					        const input = (
 | 
				
			||||||
        if (out.type === 'address') {
 | 
					          <TypedInput
 | 
				
			||||||
          input = (
 | 
					            accounts={ accountsInfo }
 | 
				
			||||||
            <InputAddress
 | 
					 | 
				
			||||||
              className={ styles.queryValue }
 | 
					 | 
				
			||||||
              disabled
 | 
					 | 
				
			||||||
              value={ out.display }
 | 
					 | 
				
			||||||
            />
 | 
					 | 
				
			||||||
          );
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
          input = (
 | 
					 | 
				
			||||||
            <Input
 | 
					 | 
				
			||||||
              className={ styles.queryValue }
 | 
					 | 
				
			||||||
              readOnly
 | 
					 | 
				
			||||||
            allowCopy
 | 
					            allowCopy
 | 
				
			||||||
 | 
					            isEth={ false }
 | 
				
			||||||
 | 
					            param={ out.type }
 | 
				
			||||||
 | 
					            readOnly
 | 
				
			||||||
            value={ out.display }
 | 
					            value={ out.display }
 | 
				
			||||||
          />
 | 
					          />
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return (
 | 
					        return (
 | 
				
			||||||
          <div key={ index }>
 | 
					          <div key={ index }>
 | 
				
			||||||
@ -144,8 +137,7 @@ export default class InputQuery extends Component {
 | 
				
			|||||||
    const { name, type } = input;
 | 
					    const { name, type } = input;
 | 
				
			||||||
    const label = `${name ? `${name}: ` : ''}${type}`;
 | 
					    const label = `${name ? `${name}: ` : ''}${type}`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const onChange = (event, input) => {
 | 
					    const onChange = (value) => {
 | 
				
			||||||
      const value = event && event.target.value || input;
 | 
					 | 
				
			||||||
      const { values } = this.state;
 | 
					      const { values } = this.state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      this.setState({
 | 
					      this.setState({
 | 
				
			||||||
@ -156,28 +148,15 @@ export default class InputQuery extends Component {
 | 
				
			|||||||
      });
 | 
					      });
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (type === 'address') {
 | 
					 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <div key={ name }>
 | 
					      <div key={ name }>
 | 
				
			||||||
          <InputAddressSelect
 | 
					        <TypedInput
 | 
				
			||||||
          hint={ type }
 | 
					          hint={ type }
 | 
				
			||||||
          label={ label }
 | 
					          label={ label }
 | 
				
			||||||
            value={ values[name] }
 | 
					          isEth={ false }
 | 
				
			||||||
            required
 | 
					 | 
				
			||||||
          onChange={ onChange }
 | 
					          onChange={ onChange }
 | 
				
			||||||
          />
 | 
					          param={ type }
 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
      );
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return (
 | 
					 | 
				
			||||||
      <div key={ name }>
 | 
					 | 
				
			||||||
        <Input
 | 
					 | 
				
			||||||
          hint={ type }
 | 
					 | 
				
			||||||
          label={ label }
 | 
					 | 
				
			||||||
          value={ values[name] }
 | 
					          value={ values[name] }
 | 
				
			||||||
          required
 | 
					 | 
				
			||||||
          onChange={ onChange }
 | 
					 | 
				
			||||||
        />
 | 
					        />
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
@ -192,7 +171,9 @@ export default class InputQuery extends Component {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (api.util.isInstanceOf(value, BigNumber)) {
 | 
					    if (api.util.isInstanceOf(value, BigNumber)) {
 | 
				
			||||||
      return value.toFormat(0);
 | 
					      return value.toFormat(0);
 | 
				
			||||||
    } else if (api.util.isArray(value)) {
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (api.util.isArray(value)) {
 | 
				
			||||||
      return api.util.bytesToHex(value);
 | 
					      return api.util.bytesToHex(value);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -14,12 +14,11 @@
 | 
				
			|||||||
// You should have received a copy of the GNU General Public License
 | 
					// You should have received a copy of the GNU General Public License
 | 
				
			||||||
// along with Parity.  If not, see <http://www.gnu.org/licenses/>.
 | 
					// along with Parity.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import BigNumber from 'bignumber.js';
 | 
					 | 
				
			||||||
import React, { Component, PropTypes } from 'react';
 | 
					import React, { Component, PropTypes } from 'react';
 | 
				
			||||||
import { Card, CardTitle, CardText } from 'material-ui/Card';
 | 
					import { Card, CardTitle, CardText } from 'material-ui/Card';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import InputQuery from './inputQuery';
 | 
					import InputQuery from './inputQuery';
 | 
				
			||||||
import { Container, Input, InputAddress } from '~/ui';
 | 
					import { Container, TypedInput } from '~/ui';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import styles from './queries.css';
 | 
					import styles from './queries.css';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -29,6 +28,7 @@ export default class Queries extends Component {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static propTypes = {
 | 
					  static propTypes = {
 | 
				
			||||||
 | 
					    accountsInfo: PropTypes.object.isRequired,
 | 
				
			||||||
    contract: PropTypes.object,
 | 
					    contract: PropTypes.object,
 | 
				
			||||||
    values: PropTypes.object
 | 
					    values: PropTypes.object
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -74,11 +74,12 @@ export default class Queries extends Component {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  renderInputQuery (fn) {
 | 
					  renderInputQuery (fn) {
 | 
				
			||||||
    const { abi, name, signature } = fn;
 | 
					    const { abi, name, signature } = fn;
 | 
				
			||||||
    const { contract } = this.props;
 | 
					    const { accountsInfo, contract } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <div className={ styles.container } key={ fn.signature }>
 | 
					      <div className={ styles.container } key={ fn.signature }>
 | 
				
			||||||
        <InputQuery
 | 
					        <InputQuery
 | 
				
			||||||
 | 
					          accountsInfo={ accountsInfo }
 | 
				
			||||||
          className={ styles.method }
 | 
					          className={ styles.method }
 | 
				
			||||||
          inputs={ abi.inputs }
 | 
					          inputs={ abi.inputs }
 | 
				
			||||||
          outputs={ abi.outputs }
 | 
					          outputs={ abi.outputs }
 | 
				
			||||||
@ -116,34 +117,23 @@ export default class Queries extends Component {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const { api } = this.context;
 | 
					    const { api } = this.context;
 | 
				
			||||||
    let valueToDisplay = null;
 | 
					    const { accountsInfo } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (api.util.isInstanceOf(value, BigNumber)) {
 | 
					    let valueToDisplay = value;
 | 
				
			||||||
      valueToDisplay = value.toFormat(0);
 | 
					
 | 
				
			||||||
    } else if (api.util.isArray(value)) {
 | 
					    if (api.util.isArray(value)) {
 | 
				
			||||||
      valueToDisplay = api.util.bytesToHex(value);
 | 
					      valueToDisplay = api.util.bytesToHex(value);
 | 
				
			||||||
    } else if (typeof value === 'boolean') {
 | 
					    } else if (typeof value === 'boolean') {
 | 
				
			||||||
      valueToDisplay = value ? 'true' : 'false';
 | 
					      valueToDisplay = value ? 'true' : 'false';
 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      valueToDisplay = value.toString();
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (type === 'address') {
 | 
					 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
        <InputAddress
 | 
					      <TypedInput
 | 
				
			||||||
          className={ styles.queryValue }
 | 
					        accounts={ accountsInfo }
 | 
				
			||||||
          value={ valueToDisplay }
 | 
					 | 
				
			||||||
          disabled
 | 
					 | 
				
			||||||
        />
 | 
					 | 
				
			||||||
      );
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return (
 | 
					 | 
				
			||||||
      <Input
 | 
					 | 
				
			||||||
        className={ styles.queryValue }
 | 
					 | 
				
			||||||
        value={ valueToDisplay }
 | 
					 | 
				
			||||||
        readOnly
 | 
					 | 
				
			||||||
        allowCopy
 | 
					        allowCopy
 | 
				
			||||||
 | 
					        isEth={ false }
 | 
				
			||||||
 | 
					        param={ type }
 | 
				
			||||||
 | 
					        readOnly
 | 
				
			||||||
 | 
					        value={ valueToDisplay }
 | 
				
			||||||
      />
 | 
					      />
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -46,6 +46,7 @@ class Contract extends Component {
 | 
				
			|||||||
    setVisibleAccounts: PropTypes.func.isRequired,
 | 
					    setVisibleAccounts: PropTypes.func.isRequired,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    accounts: PropTypes.object,
 | 
					    accounts: PropTypes.object,
 | 
				
			||||||
 | 
					    accountsInfo: PropTypes.object,
 | 
				
			||||||
    balances: PropTypes.object,
 | 
					    balances: PropTypes.object,
 | 
				
			||||||
    contracts: PropTypes.object,
 | 
					    contracts: PropTypes.object,
 | 
				
			||||||
    isTest: PropTypes.bool,
 | 
					    isTest: PropTypes.bool,
 | 
				
			||||||
@ -115,7 +116,7 @@ class Contract extends Component {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  render () {
 | 
					  render () {
 | 
				
			||||||
    const { balances, contracts, params, isTest } = this.props;
 | 
					    const { accountsInfo, balances, contracts, params, isTest } = this.props;
 | 
				
			||||||
    const { allEvents, contract, queryValues, loadingEvents } = this.state;
 | 
					    const { allEvents, contract, queryValues, loadingEvents } = this.state;
 | 
				
			||||||
    const account = contracts[params.address];
 | 
					    const account = contracts[params.address];
 | 
				
			||||||
    const balance = balances[params.address];
 | 
					    const balance = balances[params.address];
 | 
				
			||||||
@ -138,6 +139,7 @@ class Contract extends Component {
 | 
				
			|||||||
          />
 | 
					          />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          <Queries
 | 
					          <Queries
 | 
				
			||||||
 | 
					            accountsInfo={ accountsInfo }
 | 
				
			||||||
            contract={ contract }
 | 
					            contract={ contract }
 | 
				
			||||||
            values={ queryValues }
 | 
					            values={ queryValues }
 | 
				
			||||||
          />
 | 
					          />
 | 
				
			||||||
@ -447,13 +449,14 @@ class Contract extends Component {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function mapStateToProps (state) {
 | 
					function mapStateToProps (state) {
 | 
				
			||||||
  const { accounts, contracts } = state.personal;
 | 
					  const { accounts, accountsInfo, contracts } = state.personal;
 | 
				
			||||||
  const { balances } = state.balances;
 | 
					  const { balances } = state.balances;
 | 
				
			||||||
  const { isTest } = state.nodeStatus;
 | 
					  const { isTest } = state.nodeStatus;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return {
 | 
					  return {
 | 
				
			||||||
    isTest,
 | 
					    isTest,
 | 
				
			||||||
    accounts,
 | 
					    accounts,
 | 
				
			||||||
 | 
					    accountsInfo,
 | 
				
			||||||
    contracts,
 | 
					    contracts,
 | 
				
			||||||
    balances
 | 
					    balances
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user