Skip to content

Commit 0439bb0

Browse files
committed
2024-11-04 - external-recips page
1 parent e41590f commit 0439bb0

File tree

6 files changed

+107
-30
lines changed

6 files changed

+107
-30
lines changed

web-ui/src/components/feedback_external_recipient_selector/FeedbackExternalRecipientSelector.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
selectProfile,
77
selectCsrfToken,
88
selectCurrentUser,
9-
selectNormalizedMembers
9+
selectNormalizedMembers, selectFeedbackExternalRecipient
1010
} from '../../context/selectors';
1111
import {getExternalRecipients} from '../../api/feedback';
1212
import Typography from '@mui/material/Typography';
@@ -194,7 +194,7 @@ const FeedbackExternalRecipientSelector = ({ changeQuery, fromQuery, forQuery })
194194
<FeedbackExternalRecipientCard
195195
key={id}
196196
profileId={id}
197-
recipientProfile={selectProfile(state, id)}
197+
recipientProfile={selectFeedbackExternalRecipient(state, id)}
198198
selected
199199
onClick={() => cardClickHandler(id)}
200200
/>

web-ui/src/context/AppContext.jsx

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
UPDATE_CERTIFICATIONS,
1515
UPDATE_TEAMS,
1616
UPDATE_PEOPLE_LOADING,
17-
UPDATE_TEAMS_LOADING
17+
UPDATE_TEAMS_LOADING, UPDATE_EXTERNAL_RECIPIENTS, UPDATE_EXTERNAL_RECIPIENTS_LOADING
1818
} from './actions';
1919
import {
2020
getCurrentUser,
@@ -31,6 +31,7 @@ import { getAllGuilds } from '../api/guild';
3131
import { getSkills } from '../api/skill';
3232
import { getAllTeams } from '../api/team';
3333
import {getCertifications} from "../api/certification.js";
34+
import { getExternalRecipients } from '../api/feedback.js';
3435

3536
const AppContext = React.createContext();
3637

@@ -54,6 +55,7 @@ const AppContextProvider = props => {
5455
teams,
5556
memberSkills,
5657
memberProfiles,
58+
feedbackExternalRecipients,
5759
checkins,
5860
skills,
5961
certifications,
@@ -145,7 +147,28 @@ const AppContextProvider = props => {
145147
if (csrf && !memberSkills) {
146148
getAllMemberSkills();
147149
}
148-
}, [csrf, memberSkills]);
150+
}
151+
, [csrf, memberSkills])
152+
;
153+
154+
useEffect(() => {
155+
async function getAllExternalRecipients() {
156+
let res = await getExternalRecipients(csrf);
157+
let externalRecipients =
158+
res.payload && res.payload.data && !res.error
159+
? res.payload.data
160+
: undefined
161+
;
162+
if (externalRecipients) {
163+
dispatch({ type: UPDATE_EXTERNAL_RECIPIENTS, payload: externalRecipients });
164+
dispatch({ type: UPDATE_EXTERNAL_RECIPIENTS_LOADING, payload: false });
165+
}
166+
}
167+
if (csrf && !feedbackExternalRecipients) {
168+
getAllExternalRecipients();
169+
}
170+
}, [csrf, feedbackExternalRecipients])
171+
;
149172

150173
useEffect(() => {
151174
async function getMemberProfiles() {
@@ -178,7 +201,8 @@ const AppContextProvider = props => {
178201
getTerminatedMembers();
179202
}
180203
}
181-
}, [csrf, userProfile, memberProfiles]);
204+
}
205+
, [csrf, userProfile, memberProfiles]);
182206

183207
useEffect(() => {
184208
function getAllTheCheckins() {

web-ui/src/context/actions.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@ export const UPDATE_SKILLS = '@@check-ins/update_skills';
2525
export const UPDATE_CERTIFICATIONS = '@@check-ins/update_certifications';
2626
export const UPDATE_TEAM_MEMBERS = '@@check-ins/update_team_members';
2727
export const UPDATE_TEAMS = '@@check-ins/update_teams';
28-
export const UPDATE_TERMINATED_MEMBERS =
29-
'@@check-ins/update_terminated_members';
28+
export const UPDATE_TERMINATED_MEMBERS = '@@check-ins/update_terminated_members';
3029
export const UPDATE_TOAST = '@@check-ins/update_toast';
3130
export const UPDATE_USER_BIO = '@@check-ins/update_bio';
32-
export const UPDATE_FEEEDBACK_SUGGESTIONS =
33-
'@@check-ins/update_feedback_suggestions';
31+
export const UPDATE_FEEEDBACK_SUGGESTIONS = '@@check-ins/update_feedback_suggestions';
3432
export const UPDATE_PEOPLE_LOADING = '@@check-ins/update_people_loading';
3533
export const UPDATE_TEAMS_LOADING = '@@check-ins/update_teams_loading';
3634
export const UPDATE_REVIEW_PERIOD = '@@check-ins/update_review_period';
3735
export const UPDATE_REVIEW_PERIODS = '@@check-ins/update_review_periods';
3836
export const ADD_REVIEW_PERIOD = '@@check-ins/add_review_period';
37+
export const UPDATE_EXTERNAL_RECIPIENTS = '@@check-ins/update_external_recipients';
38+
export const UPDATE_EXTERNAL_RECIPIENTS_LOADING = '@@check-ins/update_external_recipients_loading';

web-ui/src/context/reducer.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import {
3232
UPDATE_TEAMS_LOADING,
3333
UPDATE_REVIEW_PERIOD,
3434
UPDATE_REVIEW_PERIODS,
35-
ADD_REVIEW_PERIOD
35+
ADD_REVIEW_PERIOD, UPDATE_EXTERNAL_RECIPIENTS, UPDATE_EXTERNAL_RECIPIENTS_LOADING
3636
} from './actions';
3737

3838
export const initialState = {
@@ -46,6 +46,7 @@ export const initialState = {
4646
memberProfiles: null,
4747
terminatedMembers: [],
4848
memberSkills: null,
49+
feedbackExternalRecipients: null,
4950
roles: null,
5051
userRoles: null,
5152
skills: null,
@@ -248,6 +249,12 @@ export const reducer = (state, action) => {
248249
case UPDATE_REVIEW_PERIODS:
249250
state.reviewPeriods = action.payload;
250251
break;
252+
case UPDATE_EXTERNAL_RECIPIENTS:
253+
state.feedbackExternalRecipients = action.payload;
254+
break;
255+
case UPDATE_EXTERNAL_RECIPIENTS_LOADING:
256+
state.loading = { ...state.loading, feedbackExternalRecipients: action.payload };
257+
break;
251258
default:
252259
}
253260
return { ...state };

web-ui/src/context/selectors.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export const selectGuilds = state => state.guilds || [];
1515
export const selectLoading = state => state.loading;
1616
export const selectReviewPeriods = state => state.reviewPeriods;
1717
export const selectPermissions = state => state.permissions;
18+
export const selectFeedbackExternalRecipients = state => state.feedbackExternalRecipients || [];
1819

1920
export const noPermission = 'You do not have permission to view this page.';
2021

@@ -724,3 +725,14 @@ export const selectReviewPeriod = createSelector(
724725
(state, periodId) => periodId,
725726
(periodMap, periodId) => periodMap[periodId]
726727
);
728+
729+
export const selectFeedbackExternalRecipientIds = createSelector(
730+
selectFeedbackExternalRecipients,
731+
externalRecipients => externalRecipients.map(externalRecipient => externalRecipient.id)
732+
);
733+
734+
export const selectFeedbackExternalRecipient = createSelector(
735+
selectFeedbackExternalRecipients,
736+
(state, feedbackExternalRecipientId) => feedbackExternalRecipientId,
737+
(feedbackExternalRecipients, feedbackExternalRecipientId) => feedbackExternalRecipients.find(feedbackExternalRecipient => feedbackExternalRecipient.id === feedbackExternalRecipientId)
738+
);

web-ui/src/pages/FeedbackRequestPage.jsx

Lines changed: 54 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import {
2525
selectCurrentUser,
2626
selectCurrentMemberIds,
2727
selectHasCreateFeedbackPermission,
28-
noPermission,
28+
noPermission, selectFeedbackExternalRecipientIds,
2929
} from '../context/selectors';
3030
import DateFnsUtils from '@date-io/date-fns';
3131
import { getFeedbackTemplate, softDeleteAdHocTemplates } from '../api/feedbacktemplate';
@@ -126,6 +126,7 @@ const FeedbackRequestPage = () => {
126126
const [templateIsForExternalRecipient, setTemplateIsForExternalRecipient] = useState();
127127
const [requestee, setRequestee] = useState({});
128128
const [memberIds, setMemberIds] = useState([]);
129+
const [externalRecipientIds, setExternalRecipientIds] = useState([]);
129130
const [activeStep, setActiveStep] = useState(1);
130131

131132
const handleQueryChange = useCallback(
@@ -151,27 +152,51 @@ const FeedbackRequestPage = () => {
151152
}, [query.for, memberIds]);
152153

153154
const hasFrom = useCallback(() => {
154-
if (!memberIds.length) return true;
155-
let from = query.from;
156-
if (from) {
157-
from = Array.isArray(from) ? from : [from];
158-
for (let recipientId of from) {
159-
if (!memberIds.includes(recipientId)) {
160-
dispatch({
161-
type: UPDATE_TOAST,
162-
payload: {
163-
severity: 'error',
164-
toast: 'Member ID in URL is invalid'
165-
}
166-
});
167-
handleQueryChange('from', undefined);
168-
return false;
155+
if (templateIsForExternalRecipient) {
156+
if (!externalRecipientIds.length) return true;
157+
let from = query.from;
158+
if (from) {
159+
from = Array.isArray(from) ? from : [from];
160+
for (let externalRecipientId of from) {
161+
if (!externalRecipientIds.includes(externalRecipientId)) {
162+
dispatch({
163+
type: UPDATE_TOAST,
164+
payload: {
165+
severity: 'error',
166+
toast: 'External Recipient ID in URL is invalid'
167+
}
168+
});
169+
handleQueryChange('from', undefined);
170+
return false;
171+
}
172+
}
173+
return true;
174+
}
175+
return false;
176+
} else {
177+
if (!memberIds.length) return true;
178+
let from = query.from;
179+
if (from) {
180+
from = Array.isArray(from) ? from : [from];
181+
for (let recipientId of from) {
182+
if (!memberIds.includes(recipientId)) {
183+
dispatch({
184+
type: UPDATE_TOAST,
185+
payload: {
186+
severity: 'error',
187+
toast: 'Member ID in URL is invalid'
188+
}
189+
});
190+
handleQueryChange('from', undefined);
191+
return false;
192+
}
169193
}
194+
return true;
170195
}
171-
return true;
196+
return false;
172197
}
173-
return false;
174-
}, [memberIds, query, dispatch, handleQueryChange]);
198+
199+
}, [memberIds, query, dispatch, handleQueryChange, externalRecipientIds]);
175200

176201
const isValidDate = useCallback(dateString => {
177202
const today = new Date().setHours(0, 0, 0, 0);
@@ -269,7 +294,8 @@ const FeedbackRequestPage = () => {
269294
id: null,
270295
creatorId: currentUserId,
271296
requesteeId: query.for,
272-
recipientId: recipient,
297+
recipientId: (templateIsForExternalRecipient) ? null : recipient,
298+
externalRecipientId: (templateIsForExternalRecipient) ? recipient : null,
273299
templateId: query.template,
274300
sendDate,
275301
dueDate,
@@ -331,6 +357,14 @@ const FeedbackRequestPage = () => {
331357
}
332358
}, [state]);
333359

360+
useEffect(() => {
361+
const feedbackExternalRecipients = selectFeedbackExternalRecipientIds(state);
362+
console.log("FeedbackRequestPage, useEffect, feedbackExternalRecipients: ", feedbackExternalRecipients);
363+
if (feedbackExternalRecipients) {
364+
setExternalRecipientIds(feedbackExternalRecipients);
365+
}
366+
}, [state]);
367+
334368
useEffect(() => {
335369
const params = queryString.parse(location?.search);
336370
console.log("FeedbackRequestPage, useEffect, setQuery, params: ", params);

0 commit comments

Comments
 (0)