diff options
| author | Jules Laplace <julescarbon@gmail.com> | 2020-09-29 19:56:00 +0200 |
|---|---|---|
| committer | Jules Laplace <julescarbon@gmail.com> | 2020-09-29 19:56:00 +0200 |
| commit | 29275c9c79b3ac27719f2b334b0c6d694f95ff8a (patch) | |
| tree | f0c705e77795df5284d1fef509963a7da74ee6c1 /animism-align/frontend/app/views/episode/components | |
| parent | 541e23df31ed3e9f1d1c5fe02962efbb3d6c2c8f (diff) | |
stub episode form and index
Diffstat (limited to 'animism-align/frontend/app/views/episode/components')
| -rw-r--r-- | animism-align/frontend/app/views/episode/components/episode.form.js | 161 | ||||
| -rw-r--r-- | animism-align/frontend/app/views/episode/components/episode.menu.js | 57 |
2 files changed, 218 insertions, 0 deletions
diff --git a/animism-align/frontend/app/views/episode/components/episode.form.js b/animism-align/frontend/app/views/episode/components/episode.form.js new file mode 100644 index 0000000..81446f1 --- /dev/null +++ b/animism-align/frontend/app/views/episode/components/episode.form.js @@ -0,0 +1,161 @@ +import React, { Component } from 'react' +import { Link } from 'react-router-dom' + +import { capitalize } from 'app/utils' + +import { TextInput, LabelDescription, Select, TextArea, Checkbox, SubmitButton, Loader } from 'app/common' + +const newEpisode = () => ({ + title: '', + settings: {}, +}) + +export default class EpisodeForm extends Component { + state = { + title: "", + submitTitle: "", + data: { ...newEpisode() }, + errorFields: new Set([]), + } + + constructor(props) { + super(props) + this.handleKeyDown = this.handleKeyDown.bind(this) + this.handleSelect = this.handleSelect.bind(this) + this.handleChange = this.handleChange.bind(this) + this.handleSettingsChange = this.handleSettingsChange.bind(this) + this.handleSettingsChangeEvent = this.handleSettingsChangeEvent.bind(this) + this.handleSubmit = this.handleSubmit.bind(this) + } + + componentDidMount() { + const { data, isNew } = this.props + const title = isNew ? 'New episode' : 'Editing ' + data.title + const submitTitle = isNew ? "Add Episode" : "Save Changes" + this.setState({ + title, + submitTitle, + errorFields: new Set([]), + data: { + ...newEpisode(), + ...data + }, + }) + window.addEventListener('keydown', this.handleKeyDown) + } + + componentWillUnmount() { + window.removeEventListener('keydown', this.handleKeyDown) + } + + handleKeyDown(e) { + // console.log(e, e.keyCode) + if ((e.ctrlKey || e.metaKey) && e.keyCode === 83) { + if (e) { + e.preventDefault() + } + this.handleSubmit() + } + } + + handleChange(e) { + const { name, value } = e.target + this.handleSelect(name, value) + } + + handleSelect(name, value) { + const { errorFields } = this.state + if (errorFields.has(name)) { + errorFields.delete(name) + } + this.setState({ + errorFields, + data: { + ...this.state.data, + [name]: value, + } + }) + } + + handleSettingsChangeEvent(e) { + const { name, value } = e.target + this.handleSettingsChange(name, value) + } + + handleSettingsChange(name, value) { + console.log(name, value) + if (name !== 'multiple') { + value = { [name]: value } + } + this.setState({ + data: { + ...this.state.data, + settings: { + ...this.state.data.settings, + ...value, + } + } + }) + } + + handleSubmit(e) { + if (e) { + e.preventDefault() + } + const { isNew, onSubmit } = this.props + const { data } = this.state + const requiredKeys = "title episode_number".split(" ") + const validKeys = "title settings".split(" ") + const validData = validKeys.reduce((a,b) => { a[b] = data[b]; return a }, {}) + const errorFields = requiredKeys.filter(key => !validData[key]) + if (errorFields.length) { + console.log('error', errorFields, validData) + this.setState({ errorFields: new Set(errorFields) }) + } else { + if (isNew) { + // + } else { + validData.id = data.id + } + console.log('submit', validData) + onSubmit(validData) + } + } + + render() { + const { isNew } = this.props + const { title, submitTitle, errorFields, data } = this.state + // console.log(data) + return ( + <div className='form'> + <h1>{title}</h1> + <form onSubmit={this.handleSubmit}> + <TextInput + title="Title" + name="title" + required + data={data} + onChange={this.handleChange} + autoComplete="off" + /> + <Checkbox + label="Episode is live" + name="is_live" + checked={data.settings.is_live} + onChange={this.handleSettingsChange} + /> + <SubmitButton + title={submitTitle} + onClick={this.handleSubmit} + /> + {!!errorFields.size && + <label> + <span></span> + <span>Please complete the required fields</span> + </label> + } + </form> + </div> + ) + } +} diff --git a/animism-align/frontend/app/views/episode/components/episode.menu.js b/animism-align/frontend/app/views/episode/components/episode.menu.js new file mode 100644 index 0000000..445084b --- /dev/null +++ b/animism-align/frontend/app/views/episode/components/episode.menu.js @@ -0,0 +1,57 @@ +import React, { Component } from 'react' +import { Route } from 'react-router-dom' +import { connect } from 'react-redux' + +import { history } from 'app/store' +import actions from 'app/actions' +import { MenuButton } from 'app/common' + +const mapStateToProps = state => ({ + episode: state.episode, +}) + +export default class EpisodeMenu extends Component { + render() { + return ( + <div className='menuButtons'> + <Route exact path='/episode/:id/show/' component={EpisodeShowMenu} /> + <Route exact path='/episode/:id/edit/' component={EpisodeEditMenu} /> + <Route exact path='/episode/new/' component={EpisodeNewMenu} /> + <Route exact path='/episode/' component={EpisodeIndexMenu} /> + </div> + ) + } +} + +const EpisodeIndexMenu = () => ([ + <MenuButton key='new' name="new" href="/episode/new/" />, +]) + +const EpisodeShowMenu = connect(mapStateToProps)((props) => ([ + <MenuButton key='back' name="back" href="/episode/" />, + <MenuButton key='edit' name="edit" href={"/episode/" + props.match.params.id + "/edit/"} />, + <MenuButton key='delete' name="delete" onClick={() => { + const { res: episode } = props.episode.show + if (confirm("Really delete this episode?")) { + actions.episode.destroy(episode).then(() => { + history.push('/episode/') + }) + } + }} />, +])) + +const EpisodeNewMenu = (props) => ([ + <MenuButton key='back' name="back" href="/episode/" />, +]) + +const EpisodeEditMenu = connect(mapStateToProps)((props) => ([ + <MenuButton key='back' name="back" href="/episode/" />, + <MenuButton key='delete' name="delete" onClick={() => { + const { res: episode } = props.episode.show + if (confirm("Really delete this episode?")) { + actions.episode.destroy(episode).then(() => { + history.push('/episode/') + }) + } + }} />, +])) |
