Skip to content

Commit b35ed82

Browse files
committed
Fix: validate member names must be selected from dropdown on submit
1 parent 89735a3 commit b35ed82

3 files changed

Lines changed: 60 additions & 10 deletions

File tree

src/components/FeedbackModal/FeedbackModal.jsx

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import axios from 'axios';
22
import { useEffect, useRef, useState } from 'react';
33
import { useSelector } from 'react-redux';
4+
import { toast } from 'react-toastify';
45
import {
56
Button,
67
FormGroup,
@@ -38,13 +39,13 @@ function FeedbackModal() {
3839
const checkHelpRequest = async () => {
3940
try {
4041
const response = await axios.get(ENDPOINTS.QUESTIONNAIRE_CHECK_MODAL(userProfile._id));
41-
console.log('CHECK MODAL RESPONSE:', response.data); // ← add this
4242
if (response.data.showModal) {
4343
setIsOpen(true);
4444
} else {
4545
setIsOpen(false);
4646
}
4747
} catch (error) {
48+
// eslint-disable-next-line no-console
4849
console.error('Error checking help request:', error);
4950
setIsOpen(false);
5051
}
@@ -81,6 +82,34 @@ function FeedbackModal() {
8182
return;
8283
}
8384

85+
// Validate that all filled member names are valid users from the list
86+
const allUsers = [...activeUsers, ...inactiveUsers];
87+
88+
const invalidActive = ratedMembers.find(
89+
m =>
90+
m.name.trim() !== '' &&
91+
!allUsers.some(
92+
u => `${u.firstName} ${u.lastName}`.toLowerCase() === m.name.trim().toLowerCase(),
93+
),
94+
);
95+
96+
const invalidInactive = inactiveRatedMembers.find(
97+
m =>
98+
m.name.trim() !== '' &&
99+
!allUsers.some(
100+
u => `${u.firstName} ${u.lastName}`.toLowerCase() === m.name.trim().toLowerCase(),
101+
),
102+
);
103+
104+
if (invalidActive || invalidInactive) {
105+
toast.warn('Please select valid members from the dropdown only.');
106+
return;
107+
}
108+
console.log('allUsers:', allUsers);
109+
console.log('ratedMembers:', ratedMembers);
110+
console.log('invalidActive:', invalidActive);
111+
console.log('invalidInactive:', invalidInactive);
112+
84113
setIsSubmitting(true);
85114

86115
try {

src/components/FeedbackModal/MemberSearchBar.jsx

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { useState, useEffect } from 'react';
21
import PropTypes from 'prop-types';
2+
import { useEffect, useState } from 'react';
33
import { Input, ListGroup, ListGroupItem } from 'reactstrap';
44
import styles from './MemberSearchBar.module.css';
55

@@ -10,11 +10,9 @@ function MemberSearchBar({ id, value, onChange, inactive, usersList = [] }) {
1010
const [loading, setLoading] = useState(false);
1111

1212
useEffect(() => {
13-
// Set the value of the input when the value prop changes
1413
setSearchTerm(value);
1514
}, [value]);
1615

17-
// Filter users based on search term
1816
const filterUsers = searchText => {
1917
if (!searchText.trim() || !usersList || usersList.length === 0) {
2018
setSuggestions([]);
@@ -25,18 +23,13 @@ function MemberSearchBar({ id, value, onChange, inactive, usersList = [] }) {
2523

2624
try {
2725
const lowerSearchText = searchText.toLowerCase();
28-
29-
// Filter users based on first name or last name containing the search text
3026
const filteredUsers = usersList.filter(user =>
3127
`${user.firstName} ${user.lastName}`.toLowerCase().includes(lowerSearchText),
3228
);
33-
34-
// Format users for display
3529
const formattedUsers = filteredUsers.map(user => ({
3630
...user,
3731
fullName: `${user.firstName} ${user.lastName}`,
3832
}));
39-
4033
setSuggestions(formattedUsers);
4134
} catch (error) {
4235
// eslint-disable-next-line no-console
@@ -52,7 +45,6 @@ function MemberSearchBar({ id, value, onChange, inactive, usersList = [] }) {
5245
setSearchTerm(inputValue);
5346
onChange(inputValue);
5447

55-
// Debounce the filtering
5648
const timeoutId = setTimeout(() => {
5749
filterUsers(inputValue);
5850
setShowSuggestions(true);
@@ -68,6 +60,25 @@ function MemberSearchBar({ id, value, onChange, inactive, usersList = [] }) {
6860
setShowSuggestions(false);
6961
};
7062

63+
// Validate on blur — clear if typed text doesn't match any user in the list
64+
const handleBlur = () => {
65+
setTimeout(() => {
66+
setShowSuggestions(false);
67+
68+
if (searchTerm.trim() !== '') {
69+
const isValidUser = usersList.some(
70+
user =>
71+
`${user.firstName} ${user.lastName}`.toLowerCase() === searchTerm.trim().toLowerCase(),
72+
);
73+
74+
if (!isValidUser) {
75+
setSearchTerm('');
76+
onChange('');
77+
}
78+
}
79+
}, 200);
80+
};
81+
7182
return (
7283
<div className={`${styles.memberSearchContainer}`}>
7384
<Input

src/components/HGNHelpSkillsDashboard/FeedbackModal.jsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,16 @@ function FeedbackModal({ authUser }) {
8484
return;
8585
}
8686

87+
// Validate that member names are selected from dropdown only
88+
const invalidActive = activeMembers.find(m => m.name.trim() !== '' && !m.selectedUser);
89+
90+
const invalidInactive = inactiveMembers.find(m => m.name.trim() !== '' && !m.selectedUser);
91+
92+
if (invalidActive || invalidInactive) {
93+
toast.warn('Please select valid members from the dropdown only.');
94+
return;
95+
}
96+
8797
const userId = authUser?.userid || 'test-user-id';
8898

8999
const feedbackData = {

0 commit comments

Comments
 (0)