ProjectForm.js 4.3 KB

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