From bbcf48825bec60dab7a4de955bc4831eadb37792 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Wed, 8 Jul 2020 15:01:29 +0200 Subject: media form and anuvva migration --- animism-align/frontend/views/index.js | 1 + .../frontend/views/media/components/media.form.js | 190 +++++++++++++++++++++ .../frontend/views/media/components/media.index.js | 98 ----------- .../views/media/components/media.indexOptions.js | 61 +++++++ .../frontend/views/media/components/media.menu.js | 49 ++++++ .../frontend/views/media/containers/media.edit.js | 57 +++++++ .../frontend/views/media/containers/media.index.js | 109 ++++++++++++ .../frontend/views/media/containers/media.new.js | 48 ++++++ .../frontend/views/media/media.container.js | 12 +- animism-align/frontend/views/media/media.css | 4 +- 10 files changed, 524 insertions(+), 105 deletions(-) create mode 100644 animism-align/frontend/views/media/components/media.form.js delete mode 100644 animism-align/frontend/views/media/components/media.index.js create mode 100644 animism-align/frontend/views/media/components/media.indexOptions.js create mode 100644 animism-align/frontend/views/media/components/media.menu.js create mode 100644 animism-align/frontend/views/media/containers/media.edit.js create mode 100644 animism-align/frontend/views/media/containers/media.index.js create mode 100644 animism-align/frontend/views/media/containers/media.new.js (limited to 'animism-align/frontend/views') diff --git a/animism-align/frontend/views/index.js b/animism-align/frontend/views/index.js index b7b633e..2c9ee78 100644 --- a/animism-align/frontend/views/index.js +++ b/animism-align/frontend/views/index.js @@ -1,3 +1,4 @@ export { default as align } from './align/align.container' export { default as paragraph } from './paragraph/paragraph.container' export { default as upload } from './upload/upload.container' +export { default as media } from './media/media.container' diff --git a/animism-align/frontend/views/media/components/media.form.js b/animism-align/frontend/views/media/components/media.form.js new file mode 100644 index 0000000..ed96e6e --- /dev/null +++ b/animism-align/frontend/views/media/components/media.form.js @@ -0,0 +1,190 @@ +import React, { Component } from 'react' +import { Link } from 'react-router-dom' + +import { session } from '../../../session' + +import { TextInput, LabelDescription, TextArea, Checkbox, SubmitButton, Loader } from '../../../common' + +const newMedia = () => ({ + type: '', + tag: '', + url: '', + title: '', + author: '', + pre_title: '', + translated_title: '', + date: '', + source: '', + medium: '', + start_ts: 0, + settings: {}, +}) + +export default class MediaForm extends Component { + state = { + title: "", + submitTitle: "", + data: { ...newMedia() }, + errorFields: new Set([]), + } + + componentDidMount() { + const { data, isNew } = this.props + const title = isNew ? 'New media' : 'Editing ' + data.title + const submitTitle = isNew ? "Add Media" : "Save Changes" + this.setState({ + title, + submitTitle, + errorFields: new Set([]), + data: { + ...newMedia(), + ...data + }, + }) + } + + handleChange(e) { + const { errorFields } = this.state + const { name, value } = e.target + if (errorFields.has(name)) { + errorFields.delete(name) + } + let sanitizedValue = value + if (name === 'path') { + sanitizedValue = sanitizedValue.toLowerCase().replace(/ /, '-').replace(/[!@#$%^&*()[\]{}]/, '-').replace(/-+/, '-') + } + this.setState({ + errorFields, + data: { + ...this.state.data, + [name]: sanitizedValue, + } + }) + } + + handleSelect(name, value) { + const { errorFields } = this.state + if (errorFields.has(name)) { + errorFields.delete(name) + } + this.setState({ + errorFields, + data: { + ...this.state.data, + [name]: value, + } + }) + } + + handleSubmit(e) { + e.preventDefault() + const { isNew, onSubmit } = this.props + const { data } = this.state + const requiredKeys = "title".split(" ") + const validKeys = "title".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) { + // side effect: set username if we're creating a new media + // session.set('username', data.username) + } else { + validData.id = data.id + } + console.log('submit', validData) + onSubmit(validData) + } + } + + render() { + const { isNew } = this.props + const { title, submitTitle, errorFields, data } = this.state + /* + type: '', + tag: '', + url: '', + */ + return ( +
+

{title}

+
+ + + + + + + +