CharacterizationForm.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import { Query, Mutation } from 'react-apollo'
  2. import gql from 'graphql-tag'
  3. import { QUERY_PROJECTS } from './ProjectList'
  4. const ADD_CHARACTERIZATION = gql`
  5. mutation ADD_CHARACTERIZATION($name: String!, $projectVersion: ID!) {
  6. createCharacterization(name: $name, projectVersion: $projectVersion) {
  7. id
  8. name
  9. projectVersion {
  10. id
  11. name
  12. }
  13. measurementRuns {
  14. id
  15. name
  16. }
  17. }
  18. }
  19. `
  20. const QUERY_PROJECT_VERSIONS = gql`
  21. query QUERY_PROJECT_VERSIONS($projectId: ID!) {
  22. projectVersions(where: { project: { id: $projectId } }) {
  23. id
  24. name
  25. }
  26. }
  27. `
  28. class CharacterziationForm extends React.Component {
  29. state = {
  30. id: null,
  31. name: '',
  32. project: null,
  33. projectVersion: null
  34. }
  35. toState = event => {
  36. this.setState({ [event.target.name]: event.target.value })
  37. }
  38. render () {
  39. return (
  40. <Mutation mutation={ADD_CHARACTERIZATION} variables={this.state}>
  41. {(addCharacterization, { data, error, loading }) => (
  42. <form
  43. onSubmit={async event => {
  44. event.preventDefault()
  45. const { data } = await addCharacterization()
  46. const { createCharacterization } = data
  47. this.setState({ id: createCharacterization.id })
  48. }}
  49. >
  50. <fieldset>
  51. <label htmlFor='name'>Characterization name</label>
  52. <input
  53. type='text'
  54. name='name'
  55. id='name'
  56. placeholder='Characterization name'
  57. value={this.state.name}
  58. onChange={this.toState}
  59. />
  60. <Query query={QUERY_PROJECTS}>
  61. {({ data, error, loading }) => {
  62. if (error) { return <p>Error loading project: ${error.message}</p> }
  63. if (loading) return <p>Loading data...</p>
  64. if (!data || !data.projects.length) { return <p>No project found.</p> }
  65. const { projects } = data
  66. if (!this.state.project && projects.length) { this.setState({ project: projects[0].id }) }
  67. return (
  68. <>
  69. <label htmlFor='project'>Project</label>
  70. <select
  71. name='project'
  72. id='project'
  73. onChange={this.toState}
  74. >
  75. {data.projects.map(project => (
  76. <option key={project.id} value={project.id}>
  77. {project.name}
  78. </option>
  79. ))}
  80. </select>
  81. <Query
  82. query={QUERY_PROJECT_VERSIONS}
  83. variables={{ projectId: this.state.project }}
  84. >
  85. {({ data, error, loading }) => {
  86. if (error) {
  87. return (
  88. <p>
  89. Error loading project version: ${error.message}
  90. </p>
  91. )
  92. }
  93. if (loading) return <p>Loading data...</p>
  94. if (!data || !data.projectVersions.length) { return <p>No project version found.</p> }
  95. const { projectVersions } = data
  96. if (!this.state.projectVersion) {
  97. this.setState({
  98. projectVersion: projectVersions[0].id
  99. })
  100. }
  101. return (
  102. <>
  103. <label htmlFor='projectVersion' />
  104. <select
  105. name='projectVersion'
  106. id='projectVersion'
  107. onChange={this.toState}
  108. >
  109. {data.projectVersions.map(projectVersion => (
  110. <option
  111. key={projectVersion.id}
  112. value={projectVersion.id}
  113. >
  114. {projectVersion.name}
  115. </option>
  116. ))}
  117. </select>
  118. </>
  119. )
  120. }}
  121. </Query>
  122. </>
  123. )
  124. }}
  125. </Query>
  126. <button type='submit'>{data ? 'Save' : 'Add'}</button>
  127. </fieldset>
  128. </form>
  129. )}
  130. </Mutation>
  131. )
  132. }
  133. }
  134. export default CharacterziationForm