Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
55a6986
updated the badgemanagement actions for feat
Ramaruva Aug 19, 2025
dd39f94
added badgemanagement testcases
Ramaruva Aug 20, 2025
1ac9ea4
updated the assignbadge and assigntablerow according to feat
Ramaruva Aug 22, 2025
72a6c36
Merge branch 'development' of https://github.com/OneCommunityGlobal/H…
Ramaruva Aug 22, 2025
528bd16
fix(TotalOrgSummary): add total mentors pie chart
deep3072 Sep 27, 2025
99de80a
fix(totalOrgSummary): improve alignment
deep3072 Sep 28, 2025
6f9cd05
fix: Merge development
deep3072 Sep 28, 2025
c5216d7
fix: update alignment
deep3072 Sep 28, 2025
d7fff99
fix: Merge Development
deep3072 Sep 28, 2025
1b125f6
Fix: Merge Development
deep3072 Oct 3, 2025
4931a1a
implement community members list with filters
deep3072 Oct 12, 2025
b0f91fe
Merge branch 'development' into deep-fix-volunteer-status-pie-chart
deep3072 Oct 17, 2025
e378fd0
fix: pr review bugs
deep3072 Oct 17, 2025
0ffaeec
Merge branch 'development' into deep-implement-community-members-list
deep3072 Oct 18, 2025
cb1d1a3
Merge branch 'development' into deep-implement-community-members-list
deep3072 Oct 25, 2025
bd95851
update dependencies
deep3072 Oct 25, 2025
6792ffe
Merge branch 'development' into deep-implement-community-members-list
deep3072 Nov 11, 2025
32af6aa
Add CPDashboard search bar with clear and icon
naiduajaykumar Nov 17, 2025
977bbac
feat: add team to dropdown menu
RitzzzZ2021 Nov 19, 2025
d8d28b3
Fix search bar behavior in Community Portal
naiduajaykumar Nov 28, 2025
d26c739
Fix search bar behavior
naiduajaykumar Nov 28, 2025
45ce07b
Fix: Convert StatisticsTab to CSS modules and improve dark mode text …
Aditya-gam Dec 5, 2025
5a1fc97
deep fix redundant tag insertion
deep3072 Dec 5, 2025
34089fc
Merge branch 'development' into deep-fix-redundant-tag-insertion
deep3072 Dec 5, 2025
7f39478
fix: Global Distribution Map for Project Status Visibility
RitzzzZ2021 Dec 6, 2025
4a177b6
deep fix dark mode issues
deep3072 Dec 6, 2025
1ccbae2
deep fix chart legend visibility
deep3072 Dec 6, 2025
f3c0cfa
merge conflicts resolved
Ramaruva Dec 6, 2025
6aeffae
fix: simplify permission checks and disable links based on user inter…
Ramaruva Dec 6, 2025
bc469b1
small change to pass testcase
Ramaruva Dec 7, 2025
4b1f86c
Merge pull request #4521 from OneCommunityGlobal/ramakirshna_fix_dash…
one-community Dec 7, 2025
15bdb29
Merge pull request #4418 from OneCommunityGlobal/xinyi_add_team_to_dr…
one-community Dec 7, 2025
e4f2a07
Merge pull request #4510 from OneCommunityGlobal/xinyi_global_distrib…
one-community Dec 7, 2025
ee0242e
deep implement equipment details page
deep3072 Dec 7, 2025
15a5f85
Merge branch 'development' into deep-fix-volunteer-status-pie-chart
deep3072 Dec 7, 2025
cdc0dea
Merge pull request #4506 from OneCommunityGlobal/Aditya-fix/dark-mode…
one-community Dec 7, 2025
3d46c29
fix: update total mentors donut chart to use new donutChartData struc…
deep3072 Dec 8, 2025
904f9e2
Merge branch 'development' into deep-implement-community-members-list
deep3072 Dec 8, 2025
53a7938
Merge pull request #3940 from OneCommunityGlobal/Ramakrishna_feature_…
one-community Dec 8, 2025
1f436a8
Venkataramanan. Fix edit suggest delete button alignment
Dec 8, 2025
56dacc9
fix linting errors
Dec 8, 2025
de4fb7a
Merge pull request #4529 from OneCommunityGlobal/venkataramanan_fix_e…
one-community Dec 8, 2025
202b2a9
Merge pull request #4138 from OneCommunityGlobal/deep-fix-volunteer-s…
one-community Dec 9, 2025
7e7e4f0
Merge pull request #4507 from OneCommunityGlobal/deep-fix-redundant-t…
one-community Dec 9, 2025
261c7e9
Merge pull request #4519 from OneCommunityGlobal/deep-fix-chart-legen…
one-community Dec 9, 2025
e1f8947
Merge pull request #4281 from OneCommunityGlobal/deep-implement-commu…
one-community Dec 9, 2025
172e09c
Merge pull request #4512 from OneCommunityGlobal/deep-add-drop-down-menu
one-community Dec 9, 2025
fdd6110
Merge branch 'development' into Ajay-fixed-search-bar-in-communityportal
naiduajaykumar Dec 9, 2025
5847556
Merge pull request #4466 from OneCommunityGlobal/Ajay-fixed-search-ba…
one-community Dec 9, 2025
c902141
Venkataramanan Fix: Progress bar width in Tasks and Timelogs table
Dec 10, 2025
84441c2
Merge pull request #4536 from OneCommunityGlobal/venkataramanan_fix_p…
one-community Dec 10, 2025
e5fc647
Venkataramanan improve performance of user profile page
Dec 10, 2025
7850fb7
Merge pull request #4539 from OneCommunityGlobal/venkataramanan_impro…
one-community Dec 10, 2025
129a8a5
Merge pull request #4527 from OneCommunityGlobal/deep-implement-equip…
one-community Dec 11, 2025
33755c9
Venkataramanan Fix alignment and styling issues in wbs and teams page
Dec 11, 2025
63b37c9
fix(reloadBS): Display previous BS on assignment
DiyaWadhwani Dec 12, 2025
dbeef1a
Merge pull request #4540 from OneCommunityGlobal/venkataramanan_fix_i…
one-community Dec 12, 2025
7b50c3f
Merge pull request #4541 from OneCommunityGlobal/Diya_Fix_BSReload
one-community Dec 12, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
309 changes: 200 additions & 109 deletions src/actions/badgeManagement.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,38 +47,6 @@ export const fetchAllBadges = (forceRefresh = false) => {
}
};
};

// Return updated badgeCollection
export const returnUpdatedBadgesCollection = (badgeCollection, selectedBadgesId) => {
const personalMaxBadge = '666b78265bca0bcb94080605'; // backend id for Personal Max badge
const badgeMap = new Map(badgeCollection?.map(badge => [badge.badge, badge]));

const currentTs = Date.now();
const currentDate = formatDate();
selectedBadgesId.forEach(originalBadgeId => {
const badgeId = originalBadgeId.replace('assign-badge-', '');
if (badgeMap.has(badgeId)) {
// Update the existing badge record
if (badgeId !== personalMaxBadge) {
const badge = badgeMap.get(badgeId);
badge.count = (badge.count || 0) + 1;
badge.lastModified = currentTs;
badge.earnedDate.push(currentDate);
}
} else {
// Add the new badge record
badgeMap.set(badgeId, {
badge: badgeId,
count: 1,
lastModified: currentTs,
earnedDate: [currentDate],
});
}
});

return Array.from(badgeMap.values());
};

export const gotCloseAlert = () => ({ type: CLOSE_ALERT });

const getBadgeCountSuccess = badgeCount => ({
Expand Down Expand Up @@ -167,7 +135,7 @@ export const validateBadges = (firstName, lastName) => {
if (!firstName || !lastName) {
dispatch(
getMessage(
'The Name Find function does not work without entering a name. Nice try though.',
'The Name Find function does not work without entering first and last name. Nice try though.',
'danger',
),
);
Expand All @@ -180,7 +148,105 @@ export const validateBadges = (firstName, lastName) => {
};
};

export const assignBadges = (firstName, lastName, selectedBadges) => {


export const returnUpdatedBadgesCollection = (badgeCollection, selectedBadgesId) => {
let newBadgeCollection = Array.from(badgeCollection);

// Object to track updated or newly added badges to prevent duplicates
const updatedOrAddedBadges = {};

selectedBadgesId.forEach(originalBadgeId => {
let badgeId = originalBadgeId;

// Remove "assign-badge-" from badgeId
if (badgeId.includes('assign-badge-')) badgeId = badgeId.replace('assign-badge-', '');

if (!updatedOrAddedBadges[badgeId]) {
// Flag to check if the badge is already in the collection
let included = false;
const currentTs = Date.now();
const currentDate = formatDate();

for (let i = 0; i < newBadgeCollection.length; i+=1) {
const badgeObj = newBadgeCollection[i];
if (badgeId === badgeObj.badge) {
// If the badge is found, increment the count and mark it as included
badgeObj.count = badgeObj.count ? badgeObj.count + 1 : 1;
badgeObj.lastModified = currentTs;
badgeObj.earnedDate.push(currentDate);
included = true;
// Mark this badge ID as updated so it's not added again
updatedOrAddedBadges[badgeId] = true;
break; // Exit loop after finding and updating the badge
}
}

// If the badge was not already in the collection, add it as a new entry
if (!included) {
newBadgeCollection.push({
badge: badgeId,
count: 1,
lastModified: currentTs,
earnedDate: [currentDate],
});
// Mark this badge ID as added
updatedOrAddedBadges[badgeId] = true;
}
}
});

return newBadgeCollection;
};

export const returnUpdatedBadgesCollectionSingleUser = (badgeCollection, selectedBadgesId) => {
let newBadgeCollection = Array.from(badgeCollection);

const updatedOrAddedBadges = {};

selectedBadgesId.forEach(originalBadgeId => {
let badgeId = originalBadgeId;
if (badgeId.includes('assign-badge-')) badgeId = badgeId.replace('assign-badge-', '');

if (!updatedOrAddedBadges[badgeId]) {
let included = false;
const currentTs = Date.now();
const currentDate = formatDate();

newBadgeCollection = newBadgeCollection.map(badgeObj => {
if (badgeId === badgeObj.badge) {
if (!included) {
included = true;
updatedOrAddedBadges[badgeId] = true;
return {
...badgeObj,
count: badgeObj.count ? badgeObj.count + 1 : 1,
lastModified: currentTs,
earnedDate: [...badgeObj.earnedDate, currentDate]
};
}
updatedOrAddedBadges[badgeId] = true;
}
return badgeObj;
});

if (!included) {
newBadgeCollection.push({
badge: badgeId,
count: 1,
lastModified: currentTs,
earnedDate: [currentDate],
});
updatedOrAddedBadges[badgeId] = true;
}
}
});

return newBadgeCollection;
};


export const assignBadgesByUserID = (userId, selectedBadges) => {
return async dispatch => {
if (selectedBadges.length === 0) {
dispatch(
Expand All @@ -189,17 +255,13 @@ export const assignBadges = (firstName, lastName, selectedBadges) => {
'danger',
),
);
if (ALERT_DELAY === 0) {
setTimeout(() => {
dispatch(closeAlert());
} else {
setTimeout(() => dispatch(closeAlert()), ALERT_DELAY);
}
}, 6000);
return;
}

const userAssigned = `${firstName} ${lastName}`;

const res = await axios.get(ENDPOINTS.USER_PROFILE_BY_NAME(userAssigned));
const res = await axios.get(ENDPOINTS.USER_PROFILE(userId));

if (res.data.length === 0) {
dispatch(
Expand All @@ -208,18 +270,22 @@ export const assignBadges = (firstName, lastName, selectedBadges) => {
'danger',
),
);
if (ALERT_DELAY === 0) {
setTimeout(() => {
dispatch(closeAlert());
} else {
setTimeout(() => dispatch(closeAlert()), ALERT_DELAY);
}
}, 6000);
return;
}
const { badgeCollection } = res.data;
for (let i = 0; i < badgeCollection.length; i+=1) {
badgeCollection[i].badge = badgeCollection[i].badge._id;
}

const { badgeCollection } = res.data[0];
const userToBeAssignedBadge = res.data[0]._id;
const newBadgeCollection = returnUpdatedBadgesCollection(badgeCollection, selectedBadges);

const userToBeAssignedBadge = res.data._id;
const newBadgeCollection = returnUpdatedBadgesCollectionSingleUser(
badgeCollection,
selectedBadges,
);
// send updated badgeCollection to backend
const url = ENDPOINTS.BADGE_ASSIGN(userToBeAssignedBadge);
try {
await axios.put(url, {
Expand All @@ -232,23 +298,19 @@ export const assignBadges = (firstName, lastName, selectedBadges) => {
'success',
),
);
if (ALERT_DELAY === 0) {
setTimeout(() => {
dispatch(closeAlert());
} else {
setTimeout(() => dispatch(closeAlert()), ALERT_DELAY);
}
}, 6000);
} catch (e) {
dispatch(getMessage('Oops, something is wrong!', 'danger'));
if (ALERT_DELAY === 0) {
setTimeout(() => {
dispatch(closeAlert());
} else {
setTimeout(() => dispatch(closeAlert()), ALERT_DELAY);
}
}, 6000);
}
};
};

export const assignBadgesByUserID = (userId, selectedBadges) => {
export const assignBadgesToMultipleUserID = (userIds, selectedBadges) => {
return async dispatch => {
if (selectedBadges.length === 0) {
dispatch(
Expand All @@ -257,45 +319,80 @@ export const assignBadgesByUserID = (userId, selectedBadges) => {
'danger',
),
);
setTimeout(() => dispatch(closeAlert()), ALERT_DELAY || 0);
setTimeout(() => {
dispatch(closeAlert());
}, 6000);
return;
}

try {
const res = await axios.get(ENDPOINTS.USER_PROFILE(userId));
const userData = Array.isArray(res.data) ? res.data[0] : res.data;
const response = await axios.post(ENDPOINTS.BADGE_ASSIGN_MULTIPLE, {
userIds,
selectedBadges,
});

if (!userData || !userData._id) {
dispatch(getMessage('User data is incomplete. Cannot assign badges.', 'danger'));
setTimeout(() => dispatch(closeAlert()), ALERT_DELAY || 0);
return;
if (response.status === 200) {
dispatch(
getMessage(
"Awesomesauce! You've increased badges and proportionally increased life happiness for multiple users!",
'success',
),
);
} else {
throw new Error('Failed to assign badges');
}
} catch (error) {
dispatch(getMessage('Oops, something went wrong while assigning badges!', 'danger'));
} finally {
setTimeout(() => {
dispatch(closeAlert());
}, 6000);
}
};
};

const badgeCollectionToSend = selectedBadges.map(badgeId => ({
badge: badgeId,
count: 1,
lastModified: Date.now(),
featured: false,
earnedDate: []
}));

await axios.put(ENDPOINTS.BADGE_ASSIGN(userData._id), {
badgeCollection: badgeCollectionToSend,
newBadges: selectedBadges.length
});

export const assignBadges = (firstName, lastName, selectedBadges) => {
return async dispatch => {
if (selectedBadges.length === 0) {
dispatch(
getMessage(
"Awesomesauce! Not only have you increased a person's badges, you've also proportionally increased their life happiness!",
'success',
"Um no, that didn't work. Badge Select Function must include actual selection of badges to work. Better luck next time!",
'danger',
),
);
setTimeout(() => {
dispatch(closeAlert());
}, 6000);
return;
}

setTimeout(() => dispatch(closeAlert()), ALERT_DELAY || 0);
} catch (e) {
toast.error('Badge assignment error:', e);
dispatch(getMessage('Oops, something is wrong!', 'danger'));
setTimeout(() => dispatch(closeAlert()), ALERT_DELAY || 0);
const userAssigned = `${firstName} ${lastName}`;

try {
const res = await axios.get(ENDPOINTS.USER_PROFILE_BY_NAME(userAssigned));
if (res.data.length === 0) {
dispatch(
getMessage(
"Can't find that user. Step 1 to getting badges: Be in the system. Not in the system? No badges for you!",
'danger',
),
);
setTimeout(() => {
dispatch(closeAlert());
}, 6000);
}
const userToBeAssignedBadge = res.data[0]._id;
await dispatch(assignBadgesByUserID([userToBeAssignedBadge], selectedBadges));
} catch (error) {
dispatch(
getMessage(
'Oops, something is wrong!',
'danger',
),
);
setTimeout(() => {
dispatch(closeAlert());
}, 6000);
}
};
};
Expand All @@ -306,30 +403,24 @@ export const sendUpdatedBadgeCollectionReq = async (
selectedBadges,
userToBeAssignedBadge,
) => {
return async dispatch => {
const url = ENDPOINTS.BADGE_ASSIGN(userToBeAssignedBadge);
try {
await axios.put(url, { badgeCollection, newBadges: selectedBadges.length });
dispatch(
getMessage(
"Awesomesauce! Not only have you increased a person's badges, you've also proportionally increased their life happiness!",
'success',
),
);
if (ALERT_DELAY === 0) {
dispatch(closeAlert());
} else {
setTimeout(() => dispatch(closeAlert()), ALERT_DELAY);
}
} catch (e) {
dispatch(getMessage('Oops, something is wrong!', 'danger'));
if (ALERT_DELAY === 0) {
dispatch(closeAlert());
} else {
setTimeout(() => dispatch(closeAlert()), ALERT_DELAY);
}
}
};
const url = ENDPOINTS.BADGE_ASSIGN(userToBeAssignedBadge);
try {
await axios.put(url, { badgeCollection, newBadges: selectedBadges.length });
dispatch(
getMessage(
"Awesomesauce! Not only have you increased a person's badges, you've also proportionally increased their life happiness!",
'success',
),
);
setTimeout(() => {
dispatch(closeAlert());
}, 6000);
} catch (e) {
dispatch(getMessage('Oops, something is wrong!', 'danger'));
setTimeout(() => {
dispatch(closeAlert());
}, 6000);
}
};

export const changeBadgesByUserID = (userId, badgeCollection) => {
Expand Down
Loading