Source

ui/pages/admin/AdminDataModelAcademicTermsPage.tsx

  1. import { withTracker } from 'meteor/react-meteor-data';
  2. import React, { useState } from 'react';
  3. import { Confirm, Icon } from 'semantic-ui-react';
  4. import RadGradAlert from '../../utilities/RadGradAlert';
  5. import { AcademicTerms } from '../../../api/academic-term/AcademicTermCollection';
  6. import { updateMethod } from '../../../api/base/BaseCollection.methods';
  7. import { CourseInstances } from '../../../api/course/CourseInstanceCollection';
  8. import { OpportunityInstances } from '../../../api/opportunity/OpportunityInstanceCollection';
  9. import { AcademicTerm, DescriptionPair } from '../../../typings/radgrad';
  10. import ListCollectionWidget from '../../components/admin/datamodel/ListCollectionWidget';
  11. import AdminDataModelUpdateForm from '../../components/admin/datamodel/AdminDataModelUpdateForm';
  12. import AdminDataModelAddForm from '../../components/admin/datamodel/AdminDataModelAddForm';
  13. import { PAGEIDS } from '../../utilities/PageIDs';
  14. import { handleCancelWrapper, handleConfirmDeleteWrapper, handleDeleteWrapper, handleOpenUpdateWrapper } from './utilities/data-model-page-callbacks';
  15. import PageLayout from '../PageLayout';
  16. const collection = AcademicTerms;
  17. const numReferences = (term) => {
  18. let references = 0;
  19. [CourseInstances, OpportunityInstances].forEach((entity) => {
  20. entity
  21. .find()
  22. .fetch()
  23. .forEach((e) => {
  24. if (e.termID === term._id) {
  25. references++;
  26. }
  27. });
  28. });
  29. return references;
  30. };
  31. const descriptionPairs = (term: AcademicTerm): DescriptionPair[] => [
  32. { label: 'Term', value: AcademicTerms.toString(term._id, false) },
  33. { label: 'Term Number', value: `${term.termNumber}` },
  34. { label: 'References', value: `${numReferences(term)}` },
  35. { label: 'Retired', value: term.retired ? 'True' : 'False' },
  36. ];
  37. const itemTitle = (term: AcademicTerm): React.ReactNode => {
  38. if (AcademicTerms.isDefined(term._id)) {
  39. return (
  40. <React.Fragment>
  41. {term.retired ? <Icon name="eye slash" /> : ''}
  42. <Icon name="dropdown" />
  43. {AcademicTerms.toString(term._id, false)}
  44. </React.Fragment>
  45. );
  46. }
  47. return <React.Fragment />;
  48. };
  49. const itemTitleString = (term) => AcademicTerms.toString(term._id, false);
  50. interface AdminDataModelAcademicTermsPageProps {
  51. items: AcademicTerm[];
  52. }
  53. /**
  54. * AdminDataModelAcademicTermsPage.
  55. * @param {AcademicTerm[]} items
  56. * @return {JSX.Element}
  57. * @memberOf ui/pages/admin
  58. * @constructor
  59. */
  60. const AdminDataModelAcademicTermsPage: React.FC<AdminDataModelAcademicTermsPageProps> = ({ items }) => {
  61. const [confirmOpenState, setConfirmOpen] = useState(false);
  62. const [idState, setId] = useState('');
  63. const [showUpdateFormState, setShowUpdateForm] = useState(false);
  64. const handleCancel = handleCancelWrapper(setConfirmOpen, setId, setShowUpdateForm);
  65. const handleConfirmDelete = handleConfirmDeleteWrapper(collection.getCollectionName(), idState, setShowUpdateForm, setId, setConfirmOpen);
  66. const handleDelete = handleDeleteWrapper(setConfirmOpen, setId);
  67. const handleOpenUpdate = handleOpenUpdateWrapper(setShowUpdateForm, setId);
  68. const handleUpdate = (doc) => {
  69. // console.log('handleUpdate doc=%o', doc);
  70. const collectionName = collection.getCollectionName();
  71. const updateData: { id?: string; retired?: boolean } = {};
  72. updateData.id = doc._id;
  73. updateData.retired = doc.retired;
  74. // console.log('parameter = %o', { collectionName, updateData });
  75. updateMethod
  76. .callPromise({ collectionName, updateData })
  77. .catch((error) => {
  78. RadGradAlert.failure('Update Failed', error.message, error);
  79. })
  80. .then(() => {
  81. RadGradAlert.success('Update Succeeded');
  82. setShowUpdateForm(false);
  83. setId('');
  84. });
  85. };
  86. return (
  87. <PageLayout id={PAGEIDS.DATA_MODEL_ACADEMIC_TERMS} headerPaneTitle="Academic Terms">
  88. {showUpdateFormState ? (
  89. <AdminDataModelUpdateForm collection={AcademicTerms} id={idState} handleUpdate={handleUpdate} handleCancel={handleCancel} itemTitleString={itemTitleString} />
  90. ) : (
  91. <AdminDataModelAddForm collection={AcademicTerms} />
  92. )}
  93. <ListCollectionWidget collection={AcademicTerms} descriptionPairs={descriptionPairs} itemTitle={itemTitle} handleOpenUpdate={handleOpenUpdate} handleDelete={handleDelete} items={items} />
  94. <Confirm open={confirmOpenState} onCancel={handleCancel} onConfirm={handleConfirmDelete} header="Delete Academic Term?" />
  95. </PageLayout>
  96. );
  97. };
  98. export default withTracker(() => {
  99. // We want to sort the items.
  100. const items = AcademicTerms.find({}, { sort: { termNumber: 1 } }).fetch();
  101. return {
  102. items,
  103. };
  104. })(AdminDataModelAcademicTermsPage);