From d2cb17038b8537a609be06be2ed7013dbe27117e Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Mon, 8 Mar 2021 22:11:55 +0100 Subject: beginning the BIG refactor. moving editor stuff into per-episode hierarchy --- .../views/editor/media/components/media.form.js | 287 +++++++++++++++++ .../editor/media/components/media.formFile.js | 67 ++++ .../editor/media/components/media.formGallery.js | 338 +++++++++++++++++++++ .../media/components/media.formGalleryImage.js | 129 ++++++++ .../editor/media/components/media.formImage.js | 169 +++++++++++ .../media/components/media.formImageSelection.js | 213 +++++++++++++ .../editor/media/components/media.formVideo.js | 118 +++++++ .../editor/media/components/media.indexOptions.js | 59 ++++ .../views/editor/media/components/media.menu.js | 58 ++++ .../views/editor/media/containers/media.edit.js | 57 ++++ .../views/editor/media/containers/media.index.js | 160 ++++++++++ .../app/views/editor/media/containers/media.new.js | 81 +++++ .../app/views/editor/media/media.actions.js | 9 + .../app/views/editor/media/media.container.js | 38 +++ .../frontend/app/views/editor/media/media.css | 110 +++++++ .../app/views/editor/media/media.reducer.js | 22 ++ 16 files changed, 1915 insertions(+) create mode 100644 animism-align/frontend/app/views/editor/media/components/media.form.js create mode 100644 animism-align/frontend/app/views/editor/media/components/media.formFile.js create mode 100644 animism-align/frontend/app/views/editor/media/components/media.formGallery.js create mode 100644 animism-align/frontend/app/views/editor/media/components/media.formGalleryImage.js create mode 100644 animism-align/frontend/app/views/editor/media/components/media.formImage.js create mode 100644 animism-align/frontend/app/views/editor/media/components/media.formImageSelection.js create mode 100644 animism-align/frontend/app/views/editor/media/components/media.formVideo.js create mode 100644 animism-align/frontend/app/views/editor/media/components/media.indexOptions.js create mode 100644 animism-align/frontend/app/views/editor/media/components/media.menu.js create mode 100644 animism-align/frontend/app/views/editor/media/containers/media.edit.js create mode 100644 animism-align/frontend/app/views/editor/media/containers/media.index.js create mode 100644 animism-align/frontend/app/views/editor/media/containers/media.new.js create mode 100644 animism-align/frontend/app/views/editor/media/media.actions.js create mode 100644 animism-align/frontend/app/views/editor/media/media.container.js create mode 100644 animism-align/frontend/app/views/editor/media/media.css create mode 100644 animism-align/frontend/app/views/editor/media/media.reducer.js (limited to 'animism-align/frontend/app/views/editor/media') diff --git a/animism-align/frontend/app/views/editor/media/components/media.form.js b/animism-align/frontend/app/views/editor/media/components/media.form.js new file mode 100644 index 0000000..2d21838 --- /dev/null +++ b/animism-align/frontend/app/views/editor/media/components/media.form.js @@ -0,0 +1,287 @@ +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' + +import MediaImageForm from './media.formImage' +import MediaVideoForm from './media.formVideo' +import MediaFileForm from './media.formFile' +import MediaGalleryForm from './media.formGallery' + +const newMedia = () => ({ + type: 'gallery', + tag: 'media', + url: '', + title: '', + author: '', + pre_title: '', + post_title: '', + translated_title: '', + date: '', + source: '', + medium: '', + start_ts: 0, + settings: {}, +}) + +const MEDIA_UPLOAD_TYPES = [ + 'image', 'video', 'file', 'gallery', +].map(name => ({ name, label: capitalize(name) })) + +export default class MediaForm extends Component { + state = { + title: "", + submitTitle: "", + data: { ...newMedia() }, + 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 media' : 'Editing ' + data.title + const submitTitle = isNew ? "Add Media" : "Save Changes" + this.setState({ + title, + submitTitle, + errorFields: new Set([]), + data: { + ...newMedia(), + ...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 = "author title date".split(" ") + const validKeys = "type tag url title author pre_title post_title translated_title date source medium start_ts 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 ( +
+

{title}

+
+