Skip to content
This repository has been archived by the owner on Nov 6, 2020. It is now read-only.

Commit

Permalink
Allow tags for Accounts, Addresses and Contracts (#2712)
Browse files Browse the repository at this point in the history
* Added tag to the editMeta Modal (#2643)

* Added Tags to ui and to contract/address/account Header (#2643)

* Added tags to summary (#2643)

* Added Search capabilities to contracts/address book/accounts from tokens
(#2643)

* fixes eslint

* Using Chips/Tokens for search (#2643)

* Add search tokens, clickable from List (#2643)

* Add sort capabilities to Accounts / Addresses / Contracts (#2643)

* Fixes formatting issues + state updates after component unmount bug
(#2643)

* Remove unused import

* Small fixes for PR #2697

* Added default sort order for Contracts/Addresses/Accounts

* Using official `material-ui-chip-input` NPM package

* Removed LESS from webpack
  • Loading branch information
ngotchac authored and gavofyork committed Oct 19, 2016
1 parent dadd6b1 commit cc10f41
Show file tree
Hide file tree
Showing 21 changed files with 723 additions and 36 deletions.
3 changes: 1 addition & 2 deletions js/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,6 @@
"istanbul": "^1.0.0-alpha.2",
"jsdom": "9.2.1",
"json-loader": "^0.5.4",
"less": "^2.7.1",
"less-loader": "^2.2.3",
"mocha": "^3.0.0-1",
"mock-local-storage": "1.0.2",
"mock-socket": "^3.0.1",
Expand Down Expand Up @@ -119,6 +117,7 @@
"lodash": "^4.11.1",
"marked": "^0.3.6",
"material-ui": "^0.15.4",
"material-ui-chip-input": "^0.8.0",
"moment": "^2.14.1",
"react": "^15.2.1",
"react-addons-css-transition-group": "^15.2.1",
Expand Down
20 changes: 20 additions & 0 deletions js/src/modals/EditMeta/editMeta.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
import React, { Component, PropTypes } from 'react';
import ContentClear from 'material-ui/svg-icons/content/clear';
import ContentSave from 'material-ui/svg-icons/content/save';
// import ChipInput from 'material-ui-chip-input';
import ChipInput from 'material-ui-chip-input/src/ChipInput';

import { Button, Form, Input, Modal } from '../../ui';
import { validateName } from '../../util/validation';
Expand Down Expand Up @@ -55,6 +57,7 @@ export default class EditMeta extends Component {
error={ nameError }
onSubmit={ this.onNameChange } />
{ this.renderMetaFields() }
{ this.renderTags() }
</Form>
</Modal>
);
Expand Down Expand Up @@ -96,6 +99,23 @@ export default class EditMeta extends Component {
});
}

renderTags () {
const { meta } = this.state;
const { tags } = meta || [];
const onChange = (chips) => this.onMetaChange('tags', chips);

return (
<ChipInput
defaultValue={ tags }
onChange={ onChange }
floatingLabelText='(optional) tags'
hintText='press <Enter> to add a tag'
floatingLabelFixed
fullWidth
/>
);
}

onNameChange = (name) => {
this.setState(validateName(name));
}
Expand Down
17 changes: 17 additions & 0 deletions js/src/ui/Actionbar/Search/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Copyright 2015, 2016 Ethcore (UK) Ltd.
// This file is part of Parity.

// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.

export default from './search';
43 changes: 43 additions & 0 deletions js/src/ui/Actionbar/Search/search.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/* Copyright 2015, 2016 Ethcore (UK) Ltd.
/* This file is part of Parity.
/*
/* Parity is free software: you can redistribute it and/or modify
/* it under the terms of the GNU General Public License as published by
/* the Free Software Foundation, either version 3 of the License, or
/* (at your option) any later version.
/*
/* Parity is distributed in the hope that it will be useful,
/* but WITHOUT ANY WARRANTY; without even the implied warranty of
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
/* GNU General Public License for more details.
/*
/* You should have received a copy of the GNU General Public License
/* along with Parity. If not, see <http://www.gnu.org/licenses/>.
*/
.searchcontainer {
display: flex;
overflow: hidden;
}

.searchButton {
min-width: 50px !important;
}

.input {
width: 500px !important;
}

.inputContainer {
transition: width 450ms ease-in-out 0ms, height 0ms ease-in-out 0ms;
white-space: nowrap;
overflow: hidden;
width: 500px;
height: 100%;
position: relative;
}

.inputContainerShown {
transition: width 450ms ease-in-out 0ms, height 0ms ease-in-out 400ms;
width: 0;
height: 0;
}
176 changes: 176 additions & 0 deletions js/src/ui/Actionbar/Search/search.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
// Copyright 2015, 2016 Ethcore (UK) Ltd.
// This file is part of Parity.

// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.

import React, { Component, PropTypes } from 'react';
// import ChipInput from 'material-ui-chip-input';
import ChipInput from 'material-ui-chip-input/src/ChipInput';
import ActionSearch from 'material-ui/svg-icons/action/search';
import { uniq } from 'lodash';

import { Button } from '../../';

import styles from './search.css';

export default class ActionbarSearch extends Component {
static propTypes = {
onChange: PropTypes.func.isRequired,
tokens: PropTypes.array
};

state = {
showSearch: false,
stateChanging: false,
inputValue: '',
timeoutIds: []
}

componentWillReceiveProps (nextProps) {
const { tokens } = nextProps;

if (tokens.length > 0 && this.props.tokens.length === 0) {
this.handleOpenSearch(true, true);
}
}

componentWillUnmount () {
const { timeoutIds } = this.state;

if (timeoutIds.length > 0) {
timeoutIds.map(id => window.clearTimeout(id));
}
}

render () {
const { showSearch } = this.state;
const { tokens } = this.props;

const inputContainerClasses = [ styles.inputContainer ];

if (!showSearch) {
inputContainerClasses.push(styles.inputContainerShown);
}

return (
<div
className={ styles.searchcontainer }
key='searchAccount'>
<div className={ inputContainerClasses.join(' ') }>
<ChipInput
clearOnBlur={ false }
className={ styles.input }
hintText='Enter search input...'
hintStyle={ {
transition: 'none'
} }
ref='searchInput'
value={ tokens }
onBlur={ this.handleSearchBlur }
onRequestAdd={ this.handleTokenAdd }
onRequestDelete={ this.handleTokenDelete }
onUpdateInput={ this.handleInputChange } />
</div>

<Button
className={ styles.searchButton }
icon={ <ActionSearch /> }
label=''
onClick={ this.handleSearchClick } />
</div>
);
}

handleTokenAdd = (value) => {
const { tokens } = this.props;

const newSearchValues = uniq([].concat(tokens, value));

this.setState({
inputValue: ''
});

this.handleSearchChange(newSearchValues);
}

handleTokenDelete = (value) => {
const { tokens } = this.props;

const newSearchValues = []
.concat(tokens)
.filter(v => v !== value);

this.setState({
inputValue: ''
});

this.handleSearchChange(newSearchValues);
this.refs.searchInput.focus();
}

handleInputChange = (value) => {
this.setState({ inputValue: value });
}

handleSearchChange = (searchValues) => {
const { onChange } = this.props;
const newSearchValues = searchValues.filter(v => v.length > 0);

onChange(newSearchValues);
}

handleSearchClick = () => {
const { showSearch } = this.state;

this.handleOpenSearch(!showSearch);
}

handleSearchBlur = () => {
const timeoutId = window.setTimeout(() => {
const { inputValue } = this.state;
const { tokens } = this.props;

if (tokens.length === 0 && inputValue.length === 0) {
this.handleOpenSearch(false);
}
}, 250);

this.setState({
timeoutIds: [].concat(this.state.timeoutIds, timeoutId)
});
}

handleOpenSearch = (showSearch, force) => {
if (this.state.stateChanging && !force) return false;

this.setState({
showSearch: showSearch,
stateChanging: true
});

if (showSearch) {
this.refs.searchInput.focus();
} else {
this.refs.searchInput.getInputNode().blur();
}

const timeoutId = window.setTimeout(() => {
this.setState({ stateChanging: false });
}, 450);

this.setState({
timeoutIds: [].concat(this.state.timeoutIds, timeoutId)
});
}
}
17 changes: 17 additions & 0 deletions js/src/ui/Actionbar/Sort/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Copyright 2015, 2016 Ethcore (UK) Ltd.
// This file is part of Parity.

// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.

export default from './sort';
20 changes: 20 additions & 0 deletions js/src/ui/Actionbar/Sort/sort.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/* Copyright 2015, 2016 Ethcore (UK) Ltd.
/* This file is part of Parity.
/*
/* Parity is free software: you can redistribute it and/or modify
/* it under the terms of the GNU General Public License as published by
/* the Free Software Foundation, either version 3 of the License, or
/* (at your option) any later version.
/*
/* Parity is distributed in the hope that it will be useful,
/* but WITHOUT ANY WARRANTY; without even the implied warranty of
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
/* GNU General Public License for more details.
/*
/* You should have received a copy of the GNU General Public License
/* along with Parity. If not, see <http://www.gnu.org/licenses/>.
*/

.sortButton {
min-width: 50px !important;
}
Loading

0 comments on commit cc10f41

Please sign in to comment.