import React, { Component } from 'react' import { connect } from 'react-redux' import { bindActionCreators } from 'redux' import { Link } from 'react-router-dom' import { session } from '../../../session' import { TextInput, NumberInput, Select, LabelDescription, TextArea, Checkbox, SubmitButton, Loader } from '../../../common' import * as tileActions from '../../tile/tile.actions' const SELECT_TYPES = [ "image", "text" ].map(s => ({ name: s, label: s })) const ALIGNMENTS = [ "top_left", "top center", "top_right", "center_left", "center_center", "center_right", "bottom_left", "bottom_center", "bottom_right", ].map(align => ({ name: align, label: align === 'center_center' ? 'center' : align.replace('_', ' ') })) const REQUIRED_KEYS = { image: ['url'], text: ['content', 'width', 'height'], } // target_page_id = Column(Integer, ForeignKey('page.id'), nullable=True) const newImage = (data) => ({ id: 'new', settings: { ...newPosition(), is_tiled: false, url: "https://s3.amazonaws.com/i.asdf.us/im/1c/gradient_gold1-SpringGreen1_1321159749.jpg", }, type: 'image', ...data, }) const newText = (data) => ({ id: 'new', settings: { ...newPosition(), content: "", width: 200, height: 200, }, type: 'text', ...data, }) const newPosition = () => ({ x: 0, y: 0, width: 0, height: 0, rotation: 0, scale: 1, align: "center_center", }) class TileForm extends Component { state = { title: "", submitTitle: "", data: { ...newImage() }, errorFields: new Set([]), } componentDidMount() { const { graph, page, isNew } = this.props const title = isNew ? 'new tile' : 'editing tile' const submitTitle = isNew ? "Create Tile" : "Save Changes" this.setState({ title, submitTitle, errorFields: new Set([]), data: { ...(this.props.data || this.state.data), graph_id: graph.id, page_id: page.id, }, }, () => this.props.tileActions.updateTemporaryTile(this.state.data)) } handleChange(e) { const { errorFields } = this.state const { name, value } = e.target if (errorFields.has(name)) { errorFields.delete(name) } if (name === 'type') { const { graph, page } = this.props let newData; switch(type) { case 'image': newData = newImage({ graph_id: graph.id, page_id: page.id }) break case 'text': newData = newText({ graph_id: graph.id, page_id: page.id }) break } this.setState({ errorFields, data: newData, }, () => this.props.tileActions.updateTemporaryTile(this.state.data)) } this.setState({ errorFields, data: { ...this.state.data, [name]: value, } }, () => this.props.tileActions.updateTemporaryTile(this.state.data)) } handleSettingsChange(e) { const { errorFields } = this.state const { name, value } = e.target if (errorFields.has(name)) { errorFields.delete(name) } this.setState({ errorFields, data: { ...this.state.data, settings: { ...this.state.data.settings, [name]: value, } } }, () => this.props.tileActions.updateTemporaryTile(this.state.data)) } handleSelect(name, value) { const { errorFields } = this.state if (errorFields.has(name)) { errorFields.delete(name) } this.setState({ errorFields, data: { ...this.state.data, [name]: value, } }, () => this.props.tileActions.updateTemporaryTile(this.state.data)) } handleSettingsSelect(name, value) { const { errorFields } = this.state if (errorFields.has(name)) { errorFields.delete(name) } this.setState({ errorFields, data: { ...this.state.data, settings: { ...this.state.data.settings, [name]: value, } } }, () => this.props.tileActions.updateTemporaryTile(this.state.data)) } handleSubmit(e) { e.preventDefault() const { isNew, onSubmit } = this.props const { data } = this.state const requiredKeys = REQUIRED_KEYS[data.type] const validKeys = "graph_id username 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) { // side effect: set username if we're creating a new tile // 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 if (!data) return return (