EditTraining.tsx 5.5 KB

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