CharacterizationForm.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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 onSubmit={async event => {
  43. event.preventDefault()
  44. const { data } = await addCharacterization()
  45. const { createCharacterization } = data
  46. this.setState({ id: createCharacterization.id })
  47. }}>
  48. <fieldset>
  49. <label htmlFor="name">Characterization name</label>
  50. <input type="text" name="name" id="name"
  51. placeholder="Characterization name"
  52. value={this.state.name}
  53. onChange={this.toState}
  54. />
  55. <Query query={QUERY_PROJECTS}>
  56. {({ data, error, loading }) => {
  57. if (error) return (<p>Error loading project: ${error.message}</p>)
  58. if (loading) return (<p>Loading data...</p>)
  59. if (!data || !data.projects.length) return (<p>No project found.</p>)
  60. const { projects } = data
  61. if (!this.state.project && projects.length) this.setState({ project: projects[0].id })
  62. return (
  63. <>
  64. <label htmlFor="project">Project</label>
  65. <select name="project" id="project" onChange={this.toState}>
  66. {data.projects.map(project => <option key={project.id} value={project.id}>{project.name}</option>)}
  67. </select>
  68. <Query query={QUERY_PROJECT_VERSIONS} variables={{ projectId: this.state.project }}>
  69. {({ data, error, loading }) => {
  70. if (error) return (<p>Error loading project version: ${error.message}</p>)
  71. if (loading) return (<p>Loading data...</p>)
  72. if (!data || !data.projectVersions.length) return (<p>No project version found.</p>)
  73. const { projectVersions } = data
  74. if (!this.state.projectVersion) this.setState({ projectVersion: projectVersions[0].id })
  75. return (
  76. <>
  77. <label htmlFor="projectVersion"></label>
  78. <select name="projectVersion" id="projectVersion" onChange={this.toState}>
  79. {data.projectVersions.map(projectVersion =>
  80. <option key={projectVersion.id} value={projectVersion.id}>{projectVersion.name}</option>
  81. )}
  82. </select>
  83. </>
  84. )
  85. }}
  86. </Query>
  87. </>
  88. )
  89. }}
  90. </Query>
  91. <button type="submit">{data ? "Save" : "Add"}</button>
  92. </fieldset>
  93. </form>
  94. )}
  95. </Mutation>
  96. )
  97. }
  98. }
  99. export default CharacterziationForm