--- /dev/null
+import React from 'react';
+import { connect } from 'react-redux';
+import PropTypes from 'prop-types';
+import { changeListEditorTitle, submitListEditor } from '../../../actions/lists';
+import IconButton from '../../../components/icon_button';
+import { defineMessages, injectIntl } from 'react-intl';
+
+const messages = defineMessages({
+ title: { id: 'lists.edit.submit', defaultMessage: 'Change title' },
+});
+
+const mapStateToProps = state => ({
+ value: state.getIn(['listEditor', 'title']),
+ disabled: !state.getIn(['listEditor', 'isChanged']),
+});
+
+const mapDispatchToProps = dispatch => ({
+ onChange: value => dispatch(changeListEditorTitle(value)),
+ onSubmit: () => dispatch(submitListEditor(false)),
+});
+
+export default @connect(mapStateToProps, mapDispatchToProps)
+@injectIntl
+class ListForm extends React.PureComponent {
+
+ static propTypes = {
+ value: PropTypes.string.isRequired,
+ disabled: PropTypes.bool,
+ intl: PropTypes.object.isRequired,
+ onChange: PropTypes.func.isRequired,
+ onSubmit: PropTypes.func.isRequired,
+ };
+
+ handleChange = e => {
+ this.props.onChange(e.target.value);
+ }
+
+ handleSubmit = e => {
+ e.preventDefault();
+ this.props.onSubmit();
+ }
+
+ handleClick = () => {
+ this.props.onSubmit();
+ }
+
+ render () {
+ const { value, disabled, intl } = this.props;
+
+ const title = intl.formatMessage(messages.title);
+
+ return (
+ <form className='column-inline-form' onSubmit={this.handleSubmit}>
+ <input
+ className='setting-text'
+ value={value}
+ onChange={this.handleChange}
+ />
+
+ <IconButton
+ disabled={disabled}
+ icon='check'
+ title={title}
+ onClick={this.handleClick}
+ />
+ </form>
+ );
+ }
+
+}
import { setupListEditor, clearListSuggestions, resetListEditor } from '../../actions/lists';
import Account from './components/account';
import Search from './components/search';
+import EditListForm from './components/edit_list_form';
import Motion from '../ui/util/optional_motion';
import spring from 'react-motion/lib/spring';
const mapStateToProps = state => ({
- title: state.getIn(['listEditor', 'title']),
accountIds: state.getIn(['listEditor', 'accounts', 'items']),
searchAccountIds: state.getIn(['listEditor', 'suggestions', 'items']),
});
onInitialize: PropTypes.func.isRequired,
onClear: PropTypes.func.isRequired,
onReset: PropTypes.func.isRequired,
- title: PropTypes.string.isRequired,
accountIds: ImmutablePropTypes.list.isRequired,
searchAccountIds: ImmutablePropTypes.list.isRequired,
};
}
render () {
- const { title, accountIds, searchAccountIds, onClear } = this.props;
+ const { accountIds, searchAccountIds, onClear } = this.props;
const showSearch = searchAccountIds.size > 0;
return (
<div className='modal-root__modal list-editor'>
- <h4>{title}</h4>
+ <EditListForm />
<Search />
const initialState = ImmutableMap({
listId: null,
isSubmitting: false,
+ isChanged: false,
title: '',
accounts: ImmutableMap({
map.set('isSubmitting', false);
});
case LIST_EDITOR_TITLE_CHANGE:
- return state.set('title', action.value);
+ return state.withMutations(map => {
+ map.set('title', action.value);
+ map.set('isChanged', true);
+ });
case LIST_CREATE_REQUEST:
case LIST_UPDATE_REQUEST:
- return state.set('isSubmitting', true);
+ return state.withMutations(map => {
+ map.set('isSubmitting', true);
+ map.set('isChanged', false);
+ });
case LIST_CREATE_FAIL:
case LIST_UPDATE_FAIL:
return state.set('isSubmitting', false);
.icon-button {
flex: 0 0 auto;
- margin-left: 5px;
+ margin: 0 5px;
}
}