Skip to content

Commit

Permalink
Merge pull request #6 from DaleMcGrew/Dale_WCC_Dec16-2024
Browse files Browse the repository at this point in the history
Can add and remove team member.
  • Loading branch information
DaleMcGrew authored Dec 18, 2024
2 parents db41575 + 77aee62 commit 9f6aff4
Show file tree
Hide file tree
Showing 10 changed files with 392 additions and 74 deletions.
20 changes: 16 additions & 4 deletions src/js/actions/TeamActions.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,29 @@ import TeamStore from '../stores/TeamStore'; // eslint-disable-line import/no-cy

export default {
addPersonToTeam (personId, teamId) {
console.log('TeamActions, addPersonToTeam personId:', personId, ', teamId:', teamId);
const teamMemberName = PersonStore.getFullNamePreferred(personId) || '';
// console.log('TeamActions, addPersonToTeam personId:', personId, ', teamId:', teamId);
const teamMemberFirstName = PersonStore.getFirstName(personId) || '';
const teamMemberLastName = PersonStore.getLastName(personId) || '';
const teamName = TeamStore.getTeamName(teamId) || '';
const data = {
personId,
teamId,
teamMemberName,
teamName: TeamStore.getTeamById(teamId).teamName || '',
teamMemberFirstName,
teamMemberLastName,
teamName,
};
Dispatcher.loadEndpoint('add-person-to-team', data);
},

removePersonFromTeam (personId, teamId) {
// console.log('TeamActions, removePersonFromTeam personId:', personId, ', teamId:', teamId);
const data = {
personId,
teamId,
};
Dispatcher.loadEndpoint('remove-person-from-team', data);
},

teamRetrieve (teamId = '') {
// console.log('TeamActions, teamRetrieve teamId:', teamId);
if (teamId) {
Expand Down
97 changes: 73 additions & 24 deletions src/js/components/Drawers/AddPersonDrawerMainContent.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,41 @@ import PersonStore from '../../stores/PersonStore';
import TeamStore from '../../stores/TeamStore';
import apiCalming from '../../common/utils/apiCalming';
import SearchBar2024 from '../../common/components/Search/SearchBar2024';
import DesignTokenColors from '../../common/components/Style/DesignTokenColors';
import arrayContains from '../../common/utils/arrayContains';
import { renderLog } from '../../common/utils/logging';
import AddPersonForm from '../AddPerson/AddPersonForm';
import AddPersonForm from '../Person/AddPersonForm';


const AddPersonDrawerMainContent = ({ classes }) => { // classes, teamId
renderLog('AddPersonDrawerMainContent'); // Set LOG_RENDER_EVENTS to log all renders
const [allCachedPeopleList, setAllCachedPeopleList] = React.useState([]);
const [searchText, setSearchText] = React.useState('');
const [personSearchResultsList, setPersonSearchResultsList] = React.useState([]);
const [teamId, setTeamId] = React.useState(-1);
const [teamMemberPersonIdList, setTeamMemberPersonIdList] = React.useState([]);

const onAppObservableStoreChange = () => {
// console.log('AddPersonDrawerMainContent AppObservableStore-addPersonDrawerTeamId: ', AppObservableStore.getGlobalVariableState('addPersonDrawerTeamId'));
setTeamId(AppObservableStore.getGlobalVariableState('addPersonDrawerTeamId'));
};

const onPersonStoreChange = () => {
const personSearchResultsListTemp = PersonStore.getSearchResults();
// console.log('AddPersonDrawerMainContent personSearchResultsList:', personSearchResultsListTemp);
setAllCachedPeopleList(PersonStore.getAllCachedPeopleList());
setPersonSearchResultsList(personSearchResultsListTemp);
const teamIdTemp = AppObservableStore.getGlobalVariableState('addPersonDrawerTeamId');
// console.log('AddPersonDrawerMainContent-onPersonStoreChange teamIdTemp: ', teamIdTemp, ', teamMemberPersonIdList:', TeamStore.getTeamMemberPersonIdList(teamIdTemp));
setTeamMemberPersonIdList(TeamStore.getTeamMemberPersonIdList(teamIdTemp));
setTeamId(teamIdTemp);
};

const onTeamStoreChange = () => {
const teamIdTemp = AppObservableStore.getGlobalVariableState('addPersonDrawerTeamId');
// console.log('AddPersonDrawerMainContent-onTeamStoreChange teamIdTemp: ', teamIdTemp, ', teamMemberPersonIdList:', TeamStore.getTeamMemberPersonIdList(teamIdTemp));
setTeamMemberPersonIdList(TeamStore.getTeamMemberPersonIdList(teamIdTemp));
setTeamId(teamIdTemp);
};

const searchFunction = (incomingSearchText) => {
Expand All @@ -38,13 +52,15 @@ const AddPersonDrawerMainContent = ({ classes }) => { // classes, teamId
searchingJustStarted = true;
}
const isSearching = (incomingSearchText && incomingSearchText.length > 0);
if (apiCalming(`addPersonToTeamSearch-${teamId}-${incomingSearchText}`, 60000)) { // Only once per 60 seconds
PersonActions.personListRetrieve();
const teamIdTemp = AppObservableStore.getGlobalVariableState('addPersonDrawerTeamId');
if (apiCalming(`addPersonToTeamSearch-${teamIdTemp}-${incomingSearchText}`, 60000)) { // Only once per 60 seconds
PersonActions.personListRetrieve(incomingSearchText);
}
setSearchText(incomingSearchText);
};

const clearFunction = () => {
setPersonSearchResultsList([]);
setSearchText('');
};

Expand All @@ -56,17 +72,18 @@ const AddPersonDrawerMainContent = ({ classes }) => { // classes, teamId
const teamStoreListener = TeamStore.addListener(onTeamStoreChange);
onTeamStoreChange();

if (apiCalming('personListRetrieve', 30000)) {
PersonActions.personListRetrieve();
}

return () => {
// console.log('AddPersonDrawerMainContent cleanup');
appStateSubscription.unsubscribe();
personStoreListener.remove();
teamStoreListener.remove();
};
}, []);

React.useEffect(() => {
}, [personSearchResultsList]);
const personSearchResultsListTemp = PersonStore.getSearchResults();

return (
<AddPersonDrawerMainContentWrapper>
<SearchBarWrapper>
Expand All @@ -77,23 +94,47 @@ const AddPersonDrawerMainContent = ({ classes }) => { // classes, teamId
searchUpdateDelayTime={750}
/>
</SearchBarWrapper>
<AddPersonForm />
{(personSearchResultsListTemp && personSearchResultsListTemp.length > 0) && (
{(personSearchResultsList && personSearchResultsList.length > 0) && (
<PersonSearchResultsWrapper>
<PersonSearchResultsTitle>Search Results:</PersonSearchResultsTitle>
<PersonSearchResultsList>
{personSearchResultsListTemp.map((person, index) => (
<PersonSearchResultsItem key={`personResult-${person.id}`}>
<PersonListTitle>Search Results:</PersonListTitle>
<PersonList>
{personSearchResultsList.map((person, index) => (
<PersonItem key={`personResult-${person.id}`}>
{person.firstName}
{' '}
{person.lastName}
{' '}
<AddPersonToTeamLinkStyle onClick={() => TeamActions.addPersonToTeam(person.id, teamId)}>add</AddPersonToTeamLinkStyle>
</PersonSearchResultsItem>
{!arrayContains(person.id, teamMemberPersonIdList) && (
<>
{' '}
<SpanWithLinkStyle onClick={() => TeamActions.addPersonToTeam(person.id, teamId)}>add</SpanWithLinkStyle>
</>
)}
</PersonItem>
))}
</PersonSearchResultsList>
</PersonList>
</PersonSearchResultsWrapper>
)}
<PersonDirectoryWrapper>
<PersonListTitle>All Staff:</PersonListTitle>
<PersonList>
{allCachedPeopleList.map((person, index) => (
<PersonItem key={`personResult-${person.id}`}>
{person.firstName}
{' '}
{person.lastName}
{!arrayContains(person.id, teamMemberPersonIdList) && (
<>
{' '}
<SpanWithLinkStyle onClick={() => TeamActions.addPersonToTeam(person.id, teamId)}>add</SpanWithLinkStyle>
</>
)}
</PersonItem>
))}
</PersonList>
</PersonDirectoryWrapper>
<AddPersonWrapper>
<AddPersonForm />
</AddPersonWrapper>
</AddPersonDrawerMainContentWrapper>
);
};
Expand All @@ -107,19 +148,27 @@ const styles = () => ({
const AddPersonDrawerMainContentWrapper = styled('div')`
`;

const AddPersonToTeamLinkStyle = styled('span')`
text-decoration:underline;
color:#206DB3; /* primary500 */
cursor:pointer;
const AddPersonWrapper = styled('div')`
margin-top: 32px;
`;

const SpanWithLinkStyle = styled('span')`
text-decoration: underline;
color: ${DesignTokenColors.primary500};
cursor: pointer;
`;

const PersonDirectoryWrapper = styled('div')`
margin-top: 16px;
`;

const PersonSearchResultsItem = styled('div')`
const PersonItem = styled('div')`
`;

const PersonSearchResultsList = styled('div')`
const PersonList = styled('div')`
`;

const PersonSearchResultsTitle = styled('div')`
const PersonListTitle = styled('div')`
`;

const PersonSearchResultsWrapper = styled('div')`
Expand Down
2 changes: 1 addition & 1 deletion src/js/components/Drawers/AddTeamDrawer.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { messageService } from '../../stores/AppObservableStore';
import TeamStore from '../../stores/TeamStore';
import SearchBar2024 from '../../common/components/Search/SearchBar2024';
import { renderLog } from '../../common/utils/logging';
import AddTeamForm from '../AddTeam/AddTeamForm';
import AddTeamForm from '../Team/AddTeamForm';


const AddTeamDrawer = ({ classes }) => { // classes, teamId
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import PropTypes from 'prop-types';
import AppObservableStore, { messageService } from '../../stores/AppObservableStore';
import PersonActions from '../../actions/PersonActions';
import PersonStore from '../../stores/PersonStore';
import TeamStore from '../../stores/TeamStore';
import { renderLog } from '../../common/utils/logging';
import prepareDataPackageFromAppObservableStore from '../../common/utils/prepareDataPackageFromAppObservableStore';

Expand Down Expand Up @@ -46,6 +47,10 @@ const AddPersonForm = ({ classes }) => { // classes, teamId
const saveNewPerson = () => {
const acceptedVariables = ['emailPersonal', 'firstName', 'lastName'];
const data = prepareDataPackageFromAppObservableStore(acceptedVariables);
if (teamId >= 0) {
data.teamId = teamId;
data.teamName = TeamStore.getTeamById(teamId).teamName;
}
// console.log('saveNewPerson data:', data);
PersonActions.personSave('-1', data);
};
Expand All @@ -55,7 +60,7 @@ const AddPersonForm = ({ classes }) => { // classes, teamId
const newEmailPersonal = event.target.value;
AppObservableStore.setGlobalVariableState('emailPersonalChanged', true);
AppObservableStore.setGlobalVariableState('emailPersonalToBeSaved', newEmailPersonal);
console.log('updateEmailPersonal:', newEmailPersonal);
// console.log('updateEmailPersonal:', newEmailPersonal);
setEmailPersonal(newEmailPersonal);
}
};
Expand All @@ -65,7 +70,7 @@ const AddPersonForm = ({ classes }) => { // classes, teamId
const newFirstName = event.target.value;
AppObservableStore.setGlobalVariableState('firstNameChanged', true);
AppObservableStore.setGlobalVariableState('firstNameToBeSaved', newFirstName);
console.log('updateFirstName:', newFirstName);
// console.log('updateFirstName:', newFirstName);
setFirstName(newFirstName);
}
};
Expand All @@ -75,7 +80,7 @@ const AddPersonForm = ({ classes }) => { // classes, teamId
const newLastName = event.target.value;
AppObservableStore.setGlobalVariableState('lastNameChanged', true);
AppObservableStore.setGlobalVariableState('lastNameToBeSaved', newLastName);
console.log('updateLastName:', newLastName);
// console.log('updateLastName:', newLastName);
setLastName(newLastName);
}
};
Expand Down
File renamed without changes.
90 changes: 90 additions & 0 deletions src/js/components/Team/TeamMemberList.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import React from 'react';
import styled from 'styled-components';
import PropTypes from 'prop-types';
import { withStyles } from '@mui/styles';
import { messageService } from '../../stores/AppObservableStore';
import PersonStore from '../../stores/PersonStore';
import TeamStore from '../../stores/TeamStore';
import { renderLog } from '../../common/utils/logging';


const TeamMemberList = ({ classes, teamId }) => {
renderLog('TeamMemberList'); // Set LOG_RENDER_EVENTS to log all renders
const [teamMemberList, setTeamMemberList] = React.useState([]);

const onAppObservableStoreChange = () => {
};

const onRetrieveTeamListChange = () => {
setTeamMemberList(TeamStore.getTeamMemberList(teamId));
};

const onPersonStoreChange = () => {
onRetrieveTeamListChange();
};

const onTeamStoreChange = () => {
onRetrieveTeamListChange();
};

React.useEffect(() => {
setTeamMemberList([]);
const appStateSubscription = messageService.getMessage().subscribe(() => onAppObservableStoreChange());
onAppObservableStoreChange();
const personStoreListener = PersonStore.addListener(onPersonStoreChange);
onPersonStoreChange();
const teamStoreListener = TeamStore.addListener(onTeamStoreChange);
onTeamStoreChange();

return () => {
appStateSubscription.unsubscribe();
personStoreListener.remove();
teamStoreListener.remove();
};
}, []);

return (
<TeamMembersWrapper>
{teamMemberList.map((person) => (
<OnePersonWrapper key={`teamMember-${person.personId}`}>
<PersonCell width={200}>{person.firstName}</PersonCell>
</OnePersonWrapper>
))}
</TeamMembersWrapper>
);
};
TeamMemberList.propTypes = {
classes: PropTypes.object.isRequired,
teamId: PropTypes.number.isRequired,
};

const styles = (theme) => ({
ballotButtonIconRoot: {
marginRight: 8,
},
addTeamButtonRoot: {
width: 120,
[theme.breakpoints.down('md')]: {
width: '100%',
},
},
});

const OnePersonWrapper = styled('div')`
display: flex;
align-items: center;
justify-content: flex-start;
`;

const PersonCell = styled('div', {
shouldForwardProp: (prop) => !['width'].includes(prop),
})(({ width }) => (`
${width ? `max-width: ${width}px;` : ''};
${width ? `min-width: ${width}px;` : ''};
${width ? `width: ${width}px;` : ''};
`));

const TeamMembersWrapper = styled('div')`
`;

export default withStyles(styles)(TeamMemberList);
Loading

0 comments on commit 9f6aff4

Please sign in to comment.