Source

ui/pages/admin/AdminDataModelInterestsPage.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 { InterestKeywords } from '../../../api/interest/InterestKeywordCollection';
  5. import RadGradAlert from '../../utilities/RadGradAlert';
  6. import ListCollectionWidget from '../../components/admin/datamodel/ListCollectionWidget';
  7. import { DescriptionPair, Interest, InterestType, InterestUpdate } from '../../../typings/radgrad';
  8. import { updateMethod } from '../../../api/base/BaseCollection.methods';
  9. import { Interests } from '../../../api/interest/InterestCollection';
  10. import { InterestTypes } from '../../../api/interest/InterestTypeCollection';
  11. import AddInterestForm from '../../components/admin/datamodel/interest/AddInterestForm';
  12. import UpdateInterestForm from '../../components/admin/datamodel/interest/UpdateInterestForm';
  13. import { itemToSlugName, interestTypeNameToId } from '../../components/shared/utilities/data-model';
  14. import { PAGEIDS } from '../../utilities/PageIDs';
  15. import PageLayout from '../PageLayout';
  16. import { handleCancelWrapper, handleConfirmDeleteWrapper, handleDeleteWrapper, handleOpenUpdateWrapper } from './utilities/data-model-page-callbacks';
  17. const collection = Interests; // the collection to use.
  18. /**
  19. * Returns an array of Description pairs used in the ListCollectionWidget.
  20. * @param item an item from the collection.
  21. */
  22. const descriptionPairs = (item: Interest): DescriptionPair[] => {
  23. const keywords = Interests.isDefined(item._id) && InterestKeywords.getKeywords(item._id);
  24. return [
  25. { label: 'Description', value: item.description },
  26. { label: 'Interest Type', value: InterestTypes.findDoc(item.interestTypeID).name },
  27. { label: 'Retired', value: item.retired ? 'True' : 'False' },
  28. { label: 'Keywords', value: keywords && keywords.length > 0 ? keywords.join(', ') : 'None' },
  29. ];
  30. };
  31. /**
  32. * Returns the title string for the item. Used in the ListCollectionWidget.
  33. * @param item an item from the collection.
  34. */
  35. const itemTitleString = (item: Interest): string => (Interests.isDefined(item._id) ? `${item.name} (${itemToSlugName(item)})` : '');
  36. /**
  37. * Returns the ReactNode used in the ListCollectionWidget. By default we indicate if the item is retired.
  38. * @param item an item from the collection.
  39. */
  40. const itemTitle = (item: Interest): React.ReactNode => (
  41. <React.Fragment>
  42. {item.retired ? <Icon name="eye slash" /> : ''}
  43. <Icon name="dropdown" />
  44. {itemTitleString(item)}
  45. </React.Fragment>
  46. );
  47. interface AdminDataModelInterestsPageProps {
  48. items: Interest[];
  49. interestTypes: InterestType[];
  50. }
  51. const AdminDataModelInterestsPage: React.FC<AdminDataModelInterestsPageProps> = ({ items, interestTypes }) => {
  52. const [confirmOpenState, setConfirmOpen] = useState(false);
  53. const [idState, setId] = useState('');
  54. const [showUpdateFormState, setShowUpdateForm] = useState(false);
  55. const handleCancel = handleCancelWrapper(setConfirmOpen, setId, setShowUpdateForm);
  56. const handleConfirmDelete = handleConfirmDeleteWrapper(collection.getCollectionName(), idState, setShowUpdateForm, setId, setConfirmOpen);
  57. const handleDelete = handleDeleteWrapper(setConfirmOpen, setId);
  58. const handleOpenUpdate = handleOpenUpdateWrapper(setShowUpdateForm, setId);
  59. const handleUpdate = (doc) => {
  60. // console.log('handleUpdate doc=%o', doc);
  61. const collectionName = collection.getCollectionName();
  62. const updateData: InterestUpdate = doc;
  63. updateData.id = doc._id;
  64. updateData.picture = doc.picture;
  65. if (doc.interestType) {
  66. updateData.interestType = interestTypeNameToId(doc.interestType);
  67. }
  68. // console.log(updateData);
  69. updateMethod
  70. .callPromise({ collectionName, updateData })
  71. .catch((error) => {
  72. RadGradAlert.failure('Update Failed', error.message, error);
  73. })
  74. .then(() => {
  75. RadGradAlert.success('Update Succeeded');
  76. setShowUpdateForm(false);
  77. setId('');
  78. });
  79. };
  80. return (
  81. <PageLayout id={PAGEIDS.DATA_MODEL_INTERESTS} headerPaneTitle="Interests">
  82. {showUpdateFormState ? (
  83. <UpdateInterestForm collection={collection} id={idState} handleUpdate={handleUpdate} handleCancel={handleCancel} itemTitleString={itemTitleString} interestTypes={interestTypes} />
  84. ) : (
  85. <AddInterestForm interestTypes={interestTypes} />
  86. )}
  87. <ListCollectionWidget collection={collection} descriptionPairs={descriptionPairs} itemTitle={itemTitle} handleOpenUpdate={handleOpenUpdate} handleDelete={handleDelete} items={items} />
  88. <Confirm open={confirmOpenState} onCancel={handleCancel} onConfirm={handleConfirmDelete} header="Delete Interest?" />
  89. </PageLayout>
  90. );
  91. };
  92. export default withTracker(() => {
  93. // We want to sort the items.
  94. const items = Interests.find({}, { sort: { name: 1 } }).fetch();
  95. const interestTypes = InterestTypes.find({}, { sort: { name: 1 } }).fetch();
  96. return {
  97. items,
  98. interestTypes,
  99. };
  100. })(AdminDataModelInterestsPage);