ProjectForm.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import { useState } from 'react'
  2. import styled from 'styled-components'
  3. import gql from 'graphql-tag'
  4. import { Mutation, Query } from 'react-apollo'
  5. import { FileFields, FileState, uploadFile } from './FileUpload'
  6. import { ProjectVersionFields, ProjectVersionState } from './ProjectVersionForm'
  7. const CREATE_PROJECT = gql`
  8. mutation CREATE_PROJECT($name: String!, $abbreviation: String!, $description: String) {
  9. createProject(name: $name, abbreviation: $abbreviation, description: $description) {
  10. id
  11. }
  12. }
  13. `
  14. const QUERY_PROJECTS = gql`
  15. query QUERY_PROJECTS {
  16. projects {
  17. id
  18. name
  19. abbreviation
  20. description
  21. files {
  22. id
  23. path
  24. name
  25. description
  26. filename
  27. mimetype
  28. size
  29. }
  30. versions {
  31. id
  32. name
  33. changes
  34. date
  35. }
  36. }
  37. }
  38. `
  39. const ProjectSelector = props => (
  40. <Query query={QUERY_PROJECTS}>
  41. {({ data, loading, error }) => {
  42. if (error) return (<p>Error loading project: ${error.message}</p>)
  43. if (loading) return (<p>Loading data...</p>)
  44. if (!data || !data.projects.length) return (<p>No project found.</p>)
  45. if (!props.value) props.onChange({ target: { name: 'project', value: data.projects[0].id } })
  46. const selector = (
  47. <select value={12} {...props}>
  48. {data.projects.map(project =>
  49. <option key={project.id} value={project.id}>{project.name}</option>
  50. )}
  51. </select>
  52. )
  53. return selector
  54. }}
  55. </Query >
  56. )
  57. const ProjectState = {
  58. id: null,
  59. name: '',
  60. abbreviation: '',
  61. description: '',
  62. files: [],
  63. versions: []
  64. }
  65. const ProjectFields = props => {
  66. const [state, setState] = useState({ ...ProjectState })
  67. const updateState = event => {
  68. setState({
  69. ...state,
  70. [event.target.name]: event.target.value
  71. })
  72. props.onChange(event, state)
  73. }
  74. return (
  75. <fieldset >
  76. {props.title && <legend>{props.title}</legend>}
  77. <label htmlFor='name' > Project name</label>
  78. <input type='text' name='name' id='name' placeholder='Project name' value={state.name} onChange={updateState} />
  79. <label htmlFor='abbreviation'>Project abbreviation</label>
  80. <input type='text' name='abbreviation' id='abbreviation' placeholder='Project abbreviation' value={state.abbreviation} onChange={updateState} />
  81. <label htmlFor='description'>Project description</label>
  82. <textarea name='description' id='description' placeholder='Project description' value={state.description} onChange={updateState} />
  83. </fieldset >
  84. )
  85. }
  86. const Project = props => {
  87. const [state, setState] = useState({
  88. ...ProjectState,
  89. ...props.project
  90. })
  91. const toState = (event, newState) => {
  92. setState({ ...newState })
  93. }
  94. const updateVersions = (event, newState, index) => {
  95. const versions = [...state.versions]
  96. versions[index] = newState
  97. setState({ ...state, versions })
  98. }
  99. const updateFiles = (event, newState, index) => {
  100. const files = [...state.files]
  101. files[index] = newState
  102. setState({ ...state, files })
  103. }
  104. return (
  105. <Mutation mutation={CREATE_PROJECT} variables={state} refetchQueries={[{ query: QUERY_PROJECTS }]}>
  106. {(createProject, { data, error, loading }) => (
  107. <form onSubmit={async event => {
  108. event.preventDefault()
  109. console.log('form submitted.')
  110. const { data } = await createProject()
  111. state.id = data.createProject.id
  112. }}>
  113. <ProjectFields title='Project' state={state} onChange={toState} />
  114. {state.versions.map((version, index) =>
  115. <ProjectVersionFields title='Project version' key={index} state={version} onChange={(event, state) => updateVersions(event, state, index)} />
  116. )}
  117. <button type='button' onClick={event => { setState({ ...state, versions: [...state.versions, { ...ProjectVersionState }] }) }}>Add project version</button>
  118. {state.files.map((file, index) =>
  119. <FileFields title='Files' key={index} state={file} onChange={(event, state) => updateFiles(event, state, index)} />
  120. )}
  121. <button type='button' onClick={event => { setState({ ...state, files: [...state.files, { ...FileState }] }) }}>Add file</button>
  122. <button type='submit'>{state.id && state.id !== '__NEW__' ? 'Save' : 'Add'}</button>
  123. </form>
  124. )}
  125. </Mutation>
  126. )
  127. }
  128. export default Project
  129. export { ProjectSelector, QUERY_PROJECTS, ProjectFields }