Skip to content

Commit 3a00867

Browse files
committed
2024-11-22 - allow edit of ext-recip
1 parent 7cfe3e9 commit 3a00867

File tree

6 files changed

+88
-52
lines changed

6 files changed

+88
-52
lines changed

server/src/main/java/com/objectcomputing/checkins/services/feedback_external_recipient/FeedbackExternalRecipientController.java

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,20 +51,16 @@ public HttpResponse<FeedbackExternalRecipientResponseDTO> save(@Body @Valid @Not
5151
}
5252

5353
/**
54-
* Mark a feedback request external recipient as inactive
54+
* Update a feedback request external recipient
5555
*
56-
* @param id {@link UUID} ID of the external-recipient
57-
* @return {@link HttpResponse}
56+
* @param feedbackExternalRecipientUpdateDTO {@link FeedbackExternalRecipientCreateDTO} New feedback-req external recipient to create
57+
* @return {@link FeedbackExternalRecipient}
5858
*/
59-
@Put("/inactivate/{id}")
60-
public HttpResponse<?> inactivate(UUID id) {
61-
FeedbackExternalRecipient feedbackExternalRecipient = feedbackExternalRecipientServices.getById(id);
62-
if (feedbackExternalRecipient == null) {
63-
throw new BadArgException("Invalid external recipient ID");
64-
}
65-
feedbackExternalRecipient.setInactive(true);
66-
feedbackExternalRecipientServices.update(feedbackExternalRecipient);
67-
return HttpResponse.ok();
59+
@Put
60+
public HttpResponse<FeedbackExternalRecipientResponseDTO> update(@Body @Valid @NotNull FeedbackExternalRecipientUpdateDTO feedbackExternalRecipientUpdateDTO) {
61+
FeedbackExternalRecipient savedFeedbackExternalRecipient = feedbackExternalRecipientServices.update(feedbackExternalRecipientUpdateDTO);
62+
return HttpResponse.created(fromEntity(savedFeedbackExternalRecipient))
63+
.headers(headers -> headers.location(URI.create("/feedback_external_recipient/" + savedFeedbackExternalRecipient.getId())));
6864
}
6965

7066
/**

server/src/main/java/com/objectcomputing/checkins/services/feedback_external_recipient/FeedbackExternalRecipientServices.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
public interface FeedbackExternalRecipientServices {
88
FeedbackExternalRecipient save(FeedbackExternalRecipient feedbackExternalRecipient);
99

10-
FeedbackExternalRecipient update(FeedbackExternalRecipient feedbackExternalRecipient);
10+
FeedbackExternalRecipient update(FeedbackExternalRecipientUpdateDTO feedbackExternalRecipientUpdateDTO);
1111

1212
FeedbackExternalRecipient getById(UUID id);
1313

server/src/main/java/com/objectcomputing/checkins/services/feedback_external_recipient/FeedbackExternalRecipientServicesImpl.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,16 @@ public FeedbackExternalRecipient save(FeedbackExternalRecipient feedbackExternal
2121
}
2222

2323
@Override
24-
public FeedbackExternalRecipient update(FeedbackExternalRecipient feedbackExternalRecipient) {
25-
return feedbackExternalRecipientRepository.update(feedbackExternalRecipient);
24+
public FeedbackExternalRecipient update(FeedbackExternalRecipientUpdateDTO feedbackExternalRecipientUpdateDTO) {
25+
FeedbackExternalRecipient feedbackExternalRecipientExisting = getById(feedbackExternalRecipientUpdateDTO.getId());
26+
27+
feedbackExternalRecipientExisting.setCompanyName(feedbackExternalRecipientUpdateDTO.getCompanyName());
28+
feedbackExternalRecipientExisting.setEmail(feedbackExternalRecipientUpdateDTO.getEmail());
29+
feedbackExternalRecipientExisting.setFirstName(feedbackExternalRecipientUpdateDTO.getFirstName());
30+
feedbackExternalRecipientExisting.setLastName(feedbackExternalRecipientUpdateDTO.getLastName());
31+
feedbackExternalRecipientExisting.setInactive(feedbackExternalRecipientUpdateDTO.getInactive());
32+
33+
return feedbackExternalRecipientRepository.update(feedbackExternalRecipientExisting);
2634
}
2735

2836
@Override

web-ui/src/api/feedback.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,3 +311,16 @@ export const putExternalRecipientInactivate = async (externalRecipientId, cookie
311311
}
312312
});
313313
};
314+
315+
export const putExternalRecipient = async (externalRecipient, cookie) => {
316+
return resolve({
317+
method: 'PUT',
318+
url: `${feedbackExternalRecipientsURL}`,
319+
data: externalRecipient,
320+
headers: {
321+
'X-CSRF-Header': cookie,
322+
Accept: 'application/json',
323+
'Content-Type': 'application/json;charset=UTF-8'
324+
}
325+
});
326+
};

web-ui/src/components/feedback_external_recipient_card/FeedbackExternalRecipientCard.jsx

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -132,33 +132,11 @@ const FeedbackExternalRecipientCard = ({
132132
>
133133
{recipientProfile?.email}
134134
</a>
135-
<br />
135+
<br/>
136136
Company: {recipientProfile?.companyName}
137+
<br/>
138+
Status: { recipientProfile?.inactive ? 'Inactive' : 'Active' }
137139
</Typography>
138-
<Select
139-
label="Status"
140-
name="inactive"
141-
value={recipientProfile?.inactive ? 'Inactive' : 'Active'}
142-
onChange={(e) => {
143-
e.stopPropagation();
144-
onEditHandle({ ...recipientProfile, inactive: e.target.value === 'Inactive' });
145-
}}
146-
fullWidth
147-
margin="normal"
148-
disabled={true}
149-
sx={{
150-
fontSize: '0.75rem',
151-
'& .MuiSelect-select': {
152-
padding: '4px 8px',
153-
},
154-
'& .MuiMenuItem-root': {
155-
fontSize: '0.75rem',
156-
},
157-
}}
158-
>
159-
<MenuItem value="Active">Active</MenuItem>
160-
<MenuItem value="Inactive">Inactive</MenuItem>
161-
</Select>
162140
<Button onClick={(e) => {
163141
e.stopPropagation();
164142
handleEditOpen();

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

Lines changed: 53 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import { AppContext } from '../../context/AppContext';
55
import {
66
selectProfile, selectCsrfToken, selectCurrentUser, selectNormalizedMembers,
77
} from '../../context/selectors';
8-
import {putExternalRecipientInactivate, getExternalRecipients} from '../../api/feedback';
8+
import {putExternalRecipientInactivate, getExternalRecipients, putExternalRecipient} from '../../api/feedback';
99
import Typography from '@mui/material/Typography';
10-
import { TextField, Grid, InputAdornment } from '@mui/material';
10+
import {TextField, Grid, InputAdornment, FormControlLabel, Switch} from '@mui/material';
1111
import { Search } from '@mui/icons-material';
1212
import PropTypes from 'prop-types';
1313
import './FeedbackExternalRecipientSelector.css';
@@ -56,14 +56,15 @@ const propTypes = {
5656
};
5757

5858
const FeedbackExternalRecipientSelector = ({ changeQuery, fromQuery, forQuery, addExternalRecipientId }) => {
59-
const { state, dispatch } = useContext(AppContext);
60-
const csrf = selectCsrfToken(state);
61-
const userProfile = selectCurrentUser(state);
62-
const { id } = userProfile;
63-
const searchTextUpdated = useRef(false);
64-
const hasRenewedFromURL = useRef(false);
65-
const [searchText, setSearchText] = useState('');
66-
const [externalRecipients, setExternalRecipients] = useState([]);
59+
const { state, dispatch } = useContext(AppContext);
60+
const csrf = selectCsrfToken(state);
61+
const userProfile = selectCurrentUser(state);
62+
const { id } = userProfile;
63+
const searchTextUpdated = useRef(false);
64+
const hasRenewedFromURL = useRef(false);
65+
const [searchText, setSearchText] = useState('');
66+
const [externalRecipients, setExternalRecipients] = useState([]);
67+
const [activeRecords, setActiveRecords] = useState(true);
6768

6869

6970
useEffect(() => {
@@ -159,7 +160,35 @@ const FeedbackExternalRecipientSelector = ({ changeQuery, fromQuery, forQuery, a
159160
};
160161

161162
async function externalRecipientEdit(externalRecipient) {
162-
console.log("FeedbackExternalRecipientSelector, externalRecipientEdit, externalRecipient: ", externalRecipient);
163+
let externalRecipientsCopy = [...externalRecipients];
164+
let indexArray = externalRecipientsCopy.findIndex(externalRecipientFind => externalRecipientFind.id === externalRecipient.id);
165+
166+
try {
167+
const response = await putExternalRecipient(externalRecipient, csrf);
168+
if (response && !response.error) {
169+
externalRecipientsCopy[indexArray] = response.data.payload;
170+
hasRenewedFromURL.current = false;
171+
setExternalRecipients(externalRecipientsCopy);
172+
} else {
173+
const errorMessage = 'Failed to inactivate recipient';
174+
dispatch({
175+
type: UPDATE_TOAST,
176+
payload: {
177+
severity: 'error',
178+
toast: errorMessage
179+
}
180+
});
181+
}
182+
} catch (error) {
183+
const errorMessage = ("An error occurred while inactivating the recipient: ", error);
184+
dispatch({
185+
type: UPDATE_TOAST,
186+
payload: {
187+
severity: 'error',
188+
toast: errorMessage
189+
}
190+
});
191+
}
163192
}
164193

165194
async function externalRecipientInactivate(id) {
@@ -308,6 +337,18 @@ const FeedbackExternalRecipientSelector = ({ changeQuery, fromQuery, forQuery, a
308337
>
309338
<HelpOutlineIcon style={{ color: 'gray', marginLeft: '10px' }} />
310339
</Tooltip>
340+
<FormControlLabel
341+
control={
342+
<Switch
343+
checked={activeRecords}
344+
onChange={event => {
345+
const { checked } = event.target;
346+
setActiveRecords(checked);
347+
}}
348+
/>
349+
}
350+
label="Active Records Only"
351+
/>
311352
</div>
312353
</Grid>
313354
</Grid>
@@ -319,7 +360,7 @@ const FeedbackExternalRecipientSelector = ({ changeQuery, fromQuery, forQuery, a
319360
.filter(
320361
profile =>
321362
!fromQuery ||
322-
(!fromQuery.includes(profile.id) && profile.id !== forQuery && !!!profile.inactive)
363+
(!fromQuery.includes(profile.id) && profile.id !== forQuery && ((!!!profile.inactive && activeRecords) || !activeRecords))
323364
)
324365
.map((profile, index) => (
325366
<FeedbackExternalRecipientCard

0 commit comments

Comments
 (0)