Source

ui/components/shared/verification/EventVerifications.tsx

  1. import React, { useState } from 'react';
  2. import { Segment, Form } from 'semantic-ui-react';
  3. import moment from 'moment';
  4. import { processVerificationEventMethod } from '../../../../api/verification/VerificationRequestCollection.methods';
  5. import { Opportunity } from '../../../../typings/radgrad';
  6. import { AcademicTerms } from '../../../../api/academic-term/AcademicTermCollection';
  7. import RadGradHeader from '../RadGradHeader';
  8. interface EventVerificationsProps {
  9. eventOpportunities: Opportunity[];
  10. }
  11. /**
  12. * This component naively displays a supplied array of **IEventOpportunities** and a form to verify individual students.
  13. * The parent component is expected to handle permissions and filtering (eventDate property **is not checked** in this
  14. * component).
  15. * @param eventOpportunities {IEventOpportunity[]} An array of IOpportunities where eventDate exists
  16. * @returns {Segment}
  17. */
  18. const EventVerifications: React.FC<EventVerificationsProps> = ({ eventOpportunities }) => {
  19. const [studentState, setStudent] = useState('');
  20. const [opportunityState, setOpportunity] = useState('');
  21. const [logState, setLog] = useState('');
  22. const onChange = (e, { name, value }) => {
  23. switch (name) {
  24. case 'student':
  25. setStudent(value);
  26. break;
  27. case 'opportunity':
  28. setOpportunity(value);
  29. break;
  30. case 'log':
  31. setLog(value);
  32. break;
  33. default:
  34. // do nothing
  35. }
  36. };
  37. const onLog = (msg) => {
  38. setLog(`${logState}\n${msg}`);
  39. };
  40. // const scrollToBottom = () => {
  41. // const textarea = document.getElementById('logTextArea');
  42. // textarea.scrollTop = textarea.scrollHeight;
  43. // };
  44. const onSubmit = () => {
  45. // console.log('onSubmit', opportunityState, studentState);
  46. const opportunity = eventOpportunities.find((ele) => ele._id === opportunityState);
  47. // onLog(`Verifying ${opportunity.name} for ${studentState}...`);
  48. const academicTerm = AcademicTerms.getAcademicTerm(opportunity.eventDate1);
  49. processVerificationEventMethod.call(
  50. {
  51. student: studentState,
  52. opportunity: opportunityState,
  53. academicTerm,
  54. },
  55. (e, result) => {
  56. if (e) {
  57. onLog(`Error: problem during processing: ${e}\n`);
  58. } else {
  59. onLog(result);
  60. }
  61. },
  62. );
  63. };
  64. // componentDidUpdate(prevProps: Readonly<IEventVerificationsWidgetProps>, prevState: Readonly<{}>): void {
  65. // if (prevState !== this.state) {
  66. // this.scrollToBottom();
  67. // }
  68. // }
  69. const eventOptions = [];
  70. eventOpportunities.forEach((event) => {
  71. eventOptions.push({ key: `${event._id}1`, text: `${event.name} (${moment(event.eventDate1).format('MM/DD/YY')})`, value: event._id });
  72. eventOptions.push({ key: `${event._id}2`, text: `${event.name} (${moment(event.eventDate2).format('MM/DD/YY')})`, value: event._id });
  73. eventOptions.push({ key: `${event._id}3`, text: `${event.name} (${moment(event.eventDate3).format('MM/DD/YY')})`, value: event._id });
  74. eventOptions.push({ key: `${event._id}4`, text: `${event.name} (${moment(event.eventDate4).format('MM/DD/YY')})`, value: event._id });
  75. });
  76. return (
  77. <Segment>
  78. <RadGradHeader title='event verification' dividing />
  79. <Form onSubmit={onSubmit}>
  80. <Form.Group inline>
  81. <Form.Dropdown
  82. options={eventOptions}
  83. label="Select recent event: "
  84. placeholder="Select One..."
  85. name="opportunity"
  86. onChange={onChange}
  87. value={opportunityState}
  88. />
  89. <Form.Input placeholder="Student Username" name="student" onChange={onChange} value={studentState} />
  90. <Form.Button basic color="green" content="Verify Attendance" />
  91. </Form.Group>
  92. <Form.TextArea id="logTextArea" label="Log" rows="10" value={logState} readOnly />
  93. </Form>
  94. </Segment>
  95. );
  96. };
  97. export default EventVerifications;