add list title editing
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…
Reference in New Issue