EditTraining.tsx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import { useCreateTrainingMutation, useUpdateTrainingMutation } from '../../gql'
  2. import { useForm, TextInput, DateTimeInput, Checkbox } from '../../form'
  3. import { emptyTraining, emptyBlockInstance, prepareDataForDB } from '../utils'
  4. import TrainingTypeSelector from './TrainingTypeSelector'
  5. import BlockInstanceInputs from './BlockInstanceInputs'
  6. import { TTraining } from '../types'
  7. import Registrations from './Registrations'
  8. import Ratings from './Ratings'
  9. import BlockList from './BlockList'
  10. import theme from '../../styles/theme'
  11. const EditTraining = ({ training }: { training?: TTraining }) => {
  12. const { values, touched, onChange, loadData } = useForm(training || emptyTraining())
  13. const [createTraining, createData] = useCreateTrainingMutation()
  14. const [updateTraining, updateDate] = useUpdateTrainingMutation()
  15. return (
  16. <form
  17. onSubmit={async (event) => {
  18. event.preventDefault()
  19. const newValues = prepareDataForDB(values, training || emptyTraining())
  20. if (!newValues || Object.keys(newValues).length === 0) {
  21. console.log('no changes.')
  22. return
  23. }
  24. console.log(newValues)
  25. const { id, ...data } = newValues
  26. if (id.startsWith('++')) {
  27. const createData = await createTraining({ variables: data })
  28. console.log('created training', createData)
  29. } else if (id.startsWith('@@')) {
  30. const updateData = await updateTraining({
  31. variables: { where: { id: id.substr(2) }, data },
  32. })
  33. console.log('updated training', updateData)
  34. }
  35. }}
  36. >
  37. <fieldset className='fields-training'>
  38. {!values.id.startsWith('++') && (
  39. <div className='training-info'>
  40. <div>Training ID: {values.id}, </div>
  41. <div>Created at: {values.createdAt}</div>
  42. </div>
  43. )}
  44. <TextInput
  45. name='title'
  46. label='Title'
  47. value={values.title}
  48. onChange={onChange}
  49. className='training-title'
  50. />
  51. <TrainingTypeSelector
  52. name='type'
  53. value={values.type}
  54. onChange={onChange}
  55. className='training-type'
  56. />
  57. <DateTimeInput
  58. name='trainingDate'
  59. label='Training date'
  60. value={values.trainingDate}
  61. onChange={onChange}
  62. className='training-time'
  63. />
  64. <TextInput
  65. name='location'
  66. label='Location'
  67. value={values.location}
  68. onChange={onChange}
  69. className='training-location'
  70. />
  71. <Registrations registrations={values.registrations} className='training-registrations' />
  72. <TextInput
  73. name='attendance'
  74. label='Attendance'
  75. type='number'
  76. value={values.attendance}
  77. onChange={onChange}
  78. className='training-attendance'
  79. />
  80. <Ratings ratings={values.ratings} className='training-ratings' />
  81. <Checkbox
  82. name='published'
  83. label='Published'
  84. value={values.published}
  85. onChange={onChange}
  86. className='training-published'
  87. />
  88. <BlockList
  89. name='blocks'
  90. value={values.blocks}
  91. onChange={onChange}
  92. className='training-blocks'
  93. />
  94. <button type='submit' disabled={createData.loading} className='training-button'>
  95. Save Training
  96. </button>
  97. {createData.data && <span color='green'>Saved.</span>}
  98. {createData.error && <span color='red'>Error saving: {createData.error.message}</span>}
  99. </fieldset>
  100. <style jsx>{`
  101. .fields-training :global(.training-title) {
  102. font-size: 120%;
  103. }
  104. @media (min-width: ${theme.midsize}) {
  105. .fields-training {
  106. display: grid;
  107. grid-gap: 0.2em 2em;
  108. grid-template-areas:
  109. 'info info info'
  110. 'title title type'
  111. 'time time location'
  112. 'published attendance empty2'
  113. 'registrations ratings empty3'
  114. 'blocks blocks blocks'
  115. 'button button button';
  116. grid-template-columns: 1fr 1fr 1fr;
  117. align-items: center;
  118. }
  119. .fields-training :global(.training-info) {
  120. grid-area: info;
  121. display: flex;
  122. justify-content: space-between;
  123. }
  124. .fields-training :global(.training-title) {
  125. grid-area: title;
  126. font-size: 140%;
  127. }
  128. .fields-training :global(.training-type) {
  129. grid-area: type;
  130. }
  131. .fields-training :global(.training-time) {
  132. grid-area: time;
  133. }
  134. .fields-training :global(.training-location) {
  135. grid-area: location;
  136. }
  137. .fields-training :global(.training-published) {
  138. grid-area: published;
  139. }
  140. .fields-training :global(.training-attendance) {
  141. grid-area: attendance;
  142. }
  143. .fields-training :global(.training-registrations) {
  144. grid-area: registrations;
  145. }
  146. .fields-training :global(.training-ratings) {
  147. grid-area: ratings;
  148. }
  149. .fields-training :global(.training-blocks) {
  150. grid-area: blocks;
  151. }
  152. .fields-training :global(.training-button) {
  153. grid-area: button;
  154. }
  155. }
  156. `}</style>
  157. </form>
  158. )
  159. }
  160. export default EditTraining