CharacterizationForm.js 3.7 KB

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