@@ -239,22 +239,46 @@ const TeamReviews = ({ onBack, periodId }) => {
239239 } ;
240240
241241 const updateTeamMembers = async teamMembers => {
242- // First, create a set of team members, each with a default reviewer.
243- const data = teamMembers . map ( tm => ( {
242+ // First, get the list of review assignements.
243+ let res = await getReviewAssignments ( periodId , csrf ) ;
244+ if ( res . error ) return ;
245+
246+ // Match up the review assignments with the team members.
247+ const existing = res . payload . data
248+ . filter ( a => teamMembers . find ( m => m . id == a . revieweeId ) ) ;
249+
250+ // Create a set of team members that do not yet have review assignments,
251+ // each with a default reviewer.
252+ const mem = teamMembers . filter (
253+ m => ! existing . find ( a => a . revieweeId == m . id )
254+ ) ;
255+ const data = mem . map ( tm => ( {
244256 revieweeId : tm . id ,
245257 reviewerId : tm . supervisorid ,
246258 reviewPeriodId : periodId ,
247259 approved : false
248260 } ) ) ;
249261
250262 // Set those on the server as the review assignments.
251- let res = await createReviewAssignments ( periodId , data , csrf ) ;
263+ res = await createReviewAssignments ( periodId , data , csrf ) ;
252264 if ( res . error ) return ;
253265
254266 // Get the list of review assignments from the server to ensure that we are
255267 // reflecting what was actually created.
256268 res = await getReviewAssignments ( periodId , csrf ) ;
257- const assignments = res . error ? [ ] : res . payload . data ;
269+ let assignments = res . error ? [ ] : res . payload . data ;
270+
271+ // Remove review assignments for members no longer selected.
272+ for ( let assignment of assignments ) {
273+ if ( ! teamMembers . find ( m => m . id == assignment . revieweeId ) ) {
274+ // Delete review assignments if we do not have the matching member.
275+ await removeReviewAssignment ( assignment . id , csrf ) ;
276+ }
277+ }
278+
279+ // Get the review assignments from the server one more time.
280+ res = await getReviewAssignments ( periodId , csrf ) ;
281+ assignments = res . error ? [ ] : res . payload . data ;
258282
259283 // Update our reactive assignment and member lists.
260284 setAssignments ( assignments ) ;
@@ -684,27 +708,31 @@ const TeamReviews = ({ onBack, periodId }) => {
684708
685709 // Remove all assignments for this member.
686710 newAssignments = newAssignments . filter ( a => a . revieweeId !== memberId ) ;
711+ for ( let assignment of assignments ) {
712+ if ( ! newAssignments . find ( a => a . id == assignment . id ) ) {
713+ await removeReviewAssignment ( assignment . id , csrf ) ;
714+ }
715+ }
687716
688717 // Add assignments for these reviewers if they don't already exist.
689718 // All objects in the assignments array are for the current review period.
719+ const additional = [ ] ;
690720 for ( const reviewer of reviewers ) {
691- const exists = newAssignments . some (
692- a => a . reviewerId === reviewer . id && a . revieweeId === memberId
693- ) ;
694- if ( ! exists ) {
695- newAssignments . push ( {
696- reviewPeriodId : periodId ,
697- reviewerId : reviewer . id ,
698- revieweeId : member . id
699- } ) ;
700- }
721+ additional . push ( {
722+ reviewPeriodId : periodId ,
723+ reviewerId : reviewer . id ,
724+ revieweeId : member . id
725+ } ) ;
701726 }
702727
703- const res = await createReviewAssignments ( periodId , newAssignments , csrf ) ;
728+ // Create only the new assignments.
729+ let res = await createReviewAssignments ( periodId , additional , csrf ) ;
704730 if ( res . error ) return ;
705731
706- newAssignments = sortMembers ( res . payload . data ) ;
707- setAssignments ( newAssignments ) ;
732+ // Get the actual list of assignments back from the server.
733+ res = await getReviewAssignments ( periodId , csrf ) ;
734+ newAssignments = res . error ? [ ] : res . payload . data ;
735+ setAssignments ( sortMembers ( newAssignments ) ) ;
708736 } ;
709737
710738 const closeReviewerDialog = ( ) => {
0 commit comments