add list title editing
This commit is contained in:
		
							parent
							
								
									7baf15675f
								
							
						
					
					
						commit
						dc501c4134
					
				@ -0,0 +1,70 @@
 | 
				
			|||||||
 | 
					import React from 'react';
 | 
				
			||||||
 | 
					import { connect } from 'react-redux';
 | 
				
			||||||
 | 
					import PropTypes from 'prop-types';
 | 
				
			||||||
 | 
					import { changeListEditorTitle, submitListEditor } from 'flavours/glitch/actions/lists';
 | 
				
			||||||
 | 
					import IconButton from 'flavours/glitch/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)),
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@connect(mapStateToProps, mapDispatchToProps)
 | 
				
			||||||
 | 
					@injectIntl
 | 
				
			||||||
 | 
					export default 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>
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -7,11 +7,11 @@ import { injectIntl } from 'react-intl';
 | 
				
			|||||||
import { setupListEditor, clearListSuggestions, resetListEditor } from 'flavours/glitch/actions/lists';
 | 
					import { setupListEditor, clearListSuggestions, resetListEditor } from 'flavours/glitch/actions/lists';
 | 
				
			||||||
import AccountContainer from './containers/account_container';
 | 
					import AccountContainer from './containers/account_container';
 | 
				
			||||||
import SearchContainer from './containers/search_container';
 | 
					import SearchContainer from './containers/search_container';
 | 
				
			||||||
 | 
					import EditListForm from './components/edit_list_form';
 | 
				
			||||||
import Motion from 'flavours/glitch/util/optional_motion';
 | 
					import Motion from 'flavours/glitch/util/optional_motion';
 | 
				
			||||||
import spring from 'react-motion/lib/spring';
 | 
					import spring from 'react-motion/lib/spring';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const mapStateToProps = state => ({
 | 
					const mapStateToProps = state => ({
 | 
				
			||||||
  title: state.getIn(['listEditor', 'title']),
 | 
					 | 
				
			||||||
  accountIds: state.getIn(['listEditor', 'accounts', 'items']),
 | 
					  accountIds: state.getIn(['listEditor', 'accounts', 'items']),
 | 
				
			||||||
  searchAccountIds: state.getIn(['listEditor', 'suggestions', 'items']),
 | 
					  searchAccountIds: state.getIn(['listEditor', 'suggestions', 'items']),
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
@ -33,7 +33,6 @@ export default class ListEditor extends ImmutablePureComponent {
 | 
				
			|||||||
    onInitialize: PropTypes.func.isRequired,
 | 
					    onInitialize: PropTypes.func.isRequired,
 | 
				
			||||||
    onClear: PropTypes.func.isRequired,
 | 
					    onClear: PropTypes.func.isRequired,
 | 
				
			||||||
    onReset: PropTypes.func.isRequired,
 | 
					    onReset: PropTypes.func.isRequired,
 | 
				
			||||||
    title: PropTypes.string.isRequired,
 | 
					 | 
				
			||||||
    accountIds: ImmutablePropTypes.list.isRequired,
 | 
					    accountIds: ImmutablePropTypes.list.isRequired,
 | 
				
			||||||
    searchAccountIds: ImmutablePropTypes.list.isRequired,
 | 
					    searchAccountIds: ImmutablePropTypes.list.isRequired,
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
@ -49,12 +48,12 @@ export default class ListEditor extends ImmutablePureComponent {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  render () {
 | 
					  render () {
 | 
				
			||||||
    const { title, accountIds, searchAccountIds, onClear } = this.props;
 | 
					    const { accountIds, searchAccountIds, onClear } = this.props;
 | 
				
			||||||
    const showSearch = searchAccountIds.size > 0;
 | 
					    const showSearch = searchAccountIds.size > 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <div className='modal-root__modal list-editor'>
 | 
					      <div className='modal-root__modal list-editor'>
 | 
				
			||||||
        <h4>{title}</h4>
 | 
					        <EditListForm />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <SearchContainer />
 | 
					        <SearchContainer />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -22,6 +22,7 @@ import {
 | 
				
			|||||||
const initialState = ImmutableMap({
 | 
					const initialState = ImmutableMap({
 | 
				
			||||||
  listId: null,
 | 
					  listId: null,
 | 
				
			||||||
  isSubmitting: false,
 | 
					  isSubmitting: false,
 | 
				
			||||||
 | 
					  isChanged: false,
 | 
				
			||||||
  title: '',
 | 
					  title: '',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  accounts: ImmutableMap({
 | 
					  accounts: ImmutableMap({
 | 
				
			||||||
@ -47,10 +48,16 @@ export default function listEditorReducer(state = initialState, action) {
 | 
				
			|||||||
      map.set('isSubmitting', false);
 | 
					      map.set('isSubmitting', false);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  case LIST_EDITOR_TITLE_CHANGE:
 | 
					  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_CREATE_REQUEST:
 | 
				
			||||||
  case LIST_UPDATE_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_CREATE_FAIL:
 | 
				
			||||||
  case LIST_UPDATE_FAIL:
 | 
					  case LIST_UPDATE_FAIL:
 | 
				
			||||||
    return state.set('isSubmitting', false);
 | 
					    return state.set('isSubmitting', false);
 | 
				
			||||||
 | 
				
			|||||||
@ -500,7 +500,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  .icon-button {
 | 
					  .icon-button {
 | 
				
			||||||
    flex: 0 0 auto;
 | 
					    flex: 0 0 auto;
 | 
				
			||||||
    margin-left: 5px;
 | 
					    margin: 0 5px;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user