radgrad/radgrad2

View on GitHub
archive/ui/component/shared/manage-opportunities/ListOpportunitiesWidget.tsx

Summary

Maintainability
A
0 mins
Test Coverage
import React from 'react';
import { connect } from 'react-redux';
import { Grid, Header, Segment } from 'semantic-ui-react';
import _ from 'lodash';
import { useRouteMatch } from 'react-router-dom';
import { ROLE } from '../../../../../app/imports/api/role/Role';
import BaseCollection from '../../../../../app/imports/api/base/BaseCollection';
import { DescriptionPair } from '../../../../../app/imports/typings/radgrad';
import AdminPaginationWidget from '../../../../../app/imports/ui/components/admin/datamodel/AdminPaginationWidget';
import { Opportunities } from '../../../../../app/imports/api/opportunity/OpportunityCollection';
import { Slugs } from '../../../../../app/imports/api/slug/SlugCollection';
import AdminDataModelAccordion from '../../admin/datamodel/AdminDataModelAccordion';
import { dataModelActions } from '../../../../redux/admin/data-model';
import { getUserIdFromRoute } from '../../../../../app/imports/ui/components/shared/utilities/router';
import { Users } from '../../../../../app/imports/api/user/UserCollection';
import { RootState } from '../../../../redux/types';

interface ListOpportunitiesWidgetProps {
  collection: BaseCollection;
  findOptions?: { [key: string]: unknown };
  descriptionPairs: (item) => DescriptionPair[];
  handleOpenUpdate: (evt: any, id: any) => any;
  handleDelete: (evt: any, id: any) => any;
  pagination: any;
}

const mapStateToProps = (state: RootState) => ({
  pagination: state.admin.dataModel.pagination,
});

const count = (match) => Opportunities.find({ sponsorID: { $ne: getUserIdFromRoute(match) } }).count();

const isInRole = (match) => {
  const userID = getUserIdFromRoute(match);
  const profile = Users.getProfile(userID);
  return profile.role === ROLE.FACULTY;
};

const facultyOpportunities = (match) => Opportunities.find({ sponsorID: getUserIdFromRoute(match) }, { sort: { name: 1 } }).fetch();

const facultyCount = (match) => facultyOpportunities(match).length;

const titleICE = (opportunity) => ` (ICE: ${opportunity.ice.i}/${opportunity.ice.c}/${opportunity.ice.e})`;

const slugName = (slugID) => ` (${Slugs.findDoc(slugID).name})`;

const ListOpportunitiesWidget: React.FC<ListOpportunitiesWidgetProps> = ({ pagination, collection, handleOpenUpdate, handleDelete, descriptionPairs, findOptions }) => {
  // console.log('ListOpportunitiesWidget.render props=%o', props);
  const match = useRouteMatch();
  const facultyCounter = facultyCount(match);
  const startIndex = pagination[collection.getCollectionName()].showIndex;
  const showCount = pagination[collection.getCollectionName()].showCount;
  const endIndex = startIndex + showCount;
  const allItems = collection.find({}, findOptions).fetch();
  const items = _.slice(allItems, startIndex, endIndex);
  const factoryOpp = facultyOpportunities(match);
  // console.log('startIndex=%o endIndex=%o items=%o', startIndex, endIndex, items);
  return (
    <Segment padded>
      {isInRole(match) ? (
        <div>
          <Header dividing> YOUR OPPORTUNITIES ({facultyCounter}) </Header>
          {factoryOpp.map((item) => (
            <AdminDataModelAccordion
              key={item._id}
              id={item._id}
              retired={item.retired}
              name={item.name}
              slug={slugName(item.slugID)}
              descriptionPairs={descriptionPairs(item)}
              updateDisabled={false}
              deleteDisabled={false}
              handleOpenUpdate={handleOpenUpdate}
              handleDelete={handleDelete}
              additionalTitleInfo={titleICE(item)}
            />
          ))}
          <Header dividing> ALL OTHER OPPORTUNITIES ({count(match)})</Header> <br />
        </div>
      ) : (
        <Header dividing>OPPORTUNITIES ({count})</Header>
      )}

      <Grid>
        <AdminPaginationWidget collection={collection} setShowIndex={dataModelActions.setCollectionShowIndex} setShowCount={dataModelActions.setCollectionShowCount} />
        {items.map((item) => (
          <AdminDataModelAccordion
            key={item._id}
            id={item._id}
            retired={item.retired}
            name={item.name}
            slug={slugName(item.slugID)}
            descriptionPairs={descriptionPairs(item)}
            updateDisabled
            deleteDisabled
            handleOpenUpdate={handleOpenUpdate}
            handleDelete={handleDelete}
            additionalTitleInfo={titleICE(item)}
          />
        ))}
      </Grid>
    </Segment>
  );
};

const ListOpportunitiesWidgetCon = connect(mapStateToProps)(ListOpportunitiesWidget);
export default ListOpportunitiesWidgetCon;