ProjectVersionForm.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import gql from 'graphql-tag'
  2. import { Query, Mutation } from 'react-apollo'
  3. import { ProjectSelector } from './ProjectForm'
  4. const CREATE_PROJECT_VERSION = gql`
  5. mutation CREATE_PROJECT_VERSION($name: String!, $date: String!, $project: ID!, $changes: [String]!) {
  6. createProjectVersion(name: $name, date: $date, project: $project, changes: $changes) {
  7. id
  8. }
  9. }
  10. `
  11. const ProjectVersionFields = props => (
  12. <fieldset>
  13. {props.title && <legend>{props.title}</legend>}
  14. <label htmlFor='name'>Name</label>
  15. <input type='text' name='name' id='name' placeholder='Project version name' value={props.state.name} onChange={props.onChange} />
  16. <label htmlFor='date'>Date</label>
  17. <input type='date' name='date' id='date' placeholder='Project date' value={props.state.date} onChange={props.onChange} />
  18. <label htmlFor='change'>Changes</label>
  19. <input type='text' name='change' id='change' placeholder='Project change' value={props.state.change} onChange={props.onChange} /><button onClick={props.addChange}>Add</button>
  20. </fieldset>
  21. )
  22. const ProjectVersionState = {
  23. id: null,
  24. name: '',
  25. date: '',
  26. change: '',
  27. changes: [],
  28. project: null,
  29. }
  30. class ProjectVersionForm extends React.Component {
  31. state = {
  32. ...ProjectVersionState,
  33. ...this.props.projectVersion
  34. }
  35. toState = event => {
  36. this.setState({ [event.target.name]: event.target.value })
  37. }
  38. addChange = event => {
  39. event.preventDefault()
  40. const newChanges = this.state.changes
  41. newChanges.push(this.state.change)
  42. this.setState({ changes: newChanges, change: '' })
  43. }
  44. render() {
  45. return (
  46. <Mutation mutation={CREATE_PROJECT_VERSION} variables={this.state}>
  47. {(createProjectVersion, { data, error, loading }) => (
  48. <form onSubmit={async event => {
  49. event.preventDefault()
  50. const { data } = await createProjectVersion()
  51. this.state.id = data.createProjectVersion.id
  52. }}>
  53. <ProjectVersionFields title="Project Version" state={this.state} addChange={this.addChange} onChange={this.toState} />
  54. {this.state.changes.map((change, index) => <p key={index}>{change}</p>)}
  55. {this.props.project || <ProjectSelector name='project' id='project' value={this.state.project} onChange={this.toState} />}
  56. <button type='submit'>Save</button>
  57. </form>
  58. )}
  59. </Mutation>
  60. )
  61. }
  62. }
  63. export default ProjectVersionForm
  64. export { ProjectVersionFields, ProjectVersionState }