Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
b743f42
Add suggested job list
pranavgovi Jul 11, 2025
2ce61dc
Add location tag for jobs
pranavgovi Jul 11, 2025
027e4c6
Apply dark mode
pranavgovi Jul 11, 2025
0ffdc8b
Enhance UI for users to begin search / no results found
pranavgovi Jul 11, 2025
a1336c4
Reset hasSearched state when query and catgeories are set to initial …
pranavgovi Jul 12, 2025
46572a6
fix: Work on donut chart for experience break down
pranavgovi Aug 3, 2025
64de7f6
remove: unwanted files
pranavgovi Aug 3, 2025
16faae3
fix: update donut chart label size based on the screen size
pranavgovi Aug 9, 2025
a6b99e3
fix: update donut chart label size based on the screen size
pranavgovi Aug 9, 2025
092c99d
fix: dark mode for donut chart
pranavgovi Aug 9, 2025
7668fba
Merge branch 'pranav_impl_suggested_jobs' into development
pranavgovi Aug 16, 2025
2a59e91
feat: suggested jobs list — fix URL import and reset permissions test
pranavgovi Aug 16, 2025
bb50803
WIP-Added applicant chart and age chart components
pranavgovi Aug 17, 2025
fc804e3
Fix: applicant chart and age chart logic
pranavgovi Aug 17, 2025
76a02dc
fix: resolving conflict
pranavgovi Aug 23, 2025
670fab7
Merge branch 'development' of https://github.com/OneCommunityGlobal/H…
pranavgovi Aug 24, 2025
c64eca2
fix(loading): centering the loading message
pranavgovi Aug 30, 2025
89a463f
fix(dark) implement dark mode
pranavgovi Aug 30, 2025
706b43c
fix(search bar) category drop down alignment
pranavgovi Sep 2, 2025
41d40df
import screen
KH07 Sep 3, 2025
d865ce6
seperate expect calls in waitFor
KH07 Sep 3, 2025
e50a74d
add a display name
KH07 Sep 3, 2025
3285f22
replace some querySelector
KH07 Sep 3, 2025
c58f1f6
Merge branch 'development' of https://github.com/OneCommunityGlobal/H…
pranavgovi Sep 4, 2025
8b8e86b
fix failed checks
KH07 Sep 4, 2025
7bbe194
fix(responsiveness) make the chart responsive
pranavgovi Sep 4, 2025
5660cbe
fix(conflicts) resolve conflict
pranavgovi Sep 4, 2025
a6b374c
fix(conflicts) resolve conflict
pranavgovi Sep 4, 2025
5691f78
Merge branch 'development' of https://github.com/OneCommunityGlobal/H…
pranavgovi Sep 5, 2025
503e757
Made a overall layout of LBDashboard
dipti95 Sep 6, 2025
53276fa
insert a data-testid field to resolve most lint errors
KH07 Sep 6, 2025
15c6397
same for TaskDifferenceModal
KH07 Sep 6, 2025
561b76a
resolve all lint errors in TaskDifferenceModal.test while keeping all…
KH07 Sep 6, 2025
fd0271e
fix the last lint error
KH07 Sep 6, 2025
808362f
clear all lint errors in TeamMemberTasks.test.jsx
KH07 Sep 6, 2025
3fc1c81
clear all lint errors in TeamMemberTasks.test.jsx
KH07 Sep 6, 2025
652aa9c
revert the change in SkeletonLoading.jsx
KH07 Sep 7, 2025
3336e25
clear lint errors in TeamMembersPopup
KH07 Sep 10, 2025
763ed5b
fix(conflicts) resolve conflicts
pranavgovi Sep 10, 2025
650496f
fix(conflicts) resolve conflicts
pranavgovi Sep 10, 2025
bb16872
fix(filtering) fix time filter
pranavgovi Sep 10, 2025
9ea5bea
fix(conflict) resolve conflict
pranavgovi Sep 10, 2025
e0a53b0
fix(conflict) resolve conflict
pranavgovi Sep 10, 2025
b7dbc64
resolve duplicate import
KH07 Sep 11, 2025
7968159
remove related files from eslint ignore
KH07 Sep 11, 2025
6279752
Merge branch 'development' into kristin-fix-lint-errors-in-team-membe…
KH07 Sep 11, 2025
6040b6a
Check
Amalesh-A Sep 11, 2025
56728b6
Merge remote-tracking branch 'origin/development'
Amalesh-A Sep 11, 2025
a12325d
AccessManagementModal.jsx - Reverted
Amalesh-A Sep 11, 2025
8239b75
Hotfix (temporary) for Checkmark in Hours(Dashboard) to turn from Gra…
ujjwalbPipKcK Sep 12, 2025
bf099e2
Merge pull request #4062 from OneCommunityGlobal/tempfixcheckmarkcolo…
one-community Sep 12, 2025
48ff4c4
Merge pull request #4060 from OneCommunityGlobal/Amalesh-linting-User…
one-community Sep 12, 2025
21f3957
Fixed search disabled for active toggle
vishnu-ing Sep 4, 2025
7d1da99
Fixed Active filter search results and adding/removing member to proj…
vishnu-ing Sep 5, 2025
c8cda70
Fixed active users added not being rendered in project members list
vishnu-ing Sep 5, 2025
0b8f2f9
Fixed blank page issue on projects dashboard
vishnu-ing Sep 7, 2025
cef299e
Merge pull request #4028 from OneCommunityGlobal/Dipti_Listing_and_bi…
one-community Sep 13, 2025
d59bdcf
Merge pull request #3741 from OneCommunityGlobal/pranav_impl_suggeste…
one-community Sep 13, 2025
be739be
fix(qst): add newly assigned projects to user profile
DiyaWadhwani Sep 13, 2025
b0571c2
Merge branch 'development' into pranav-applicants_age_bar_graph
pranavgovi Sep 13, 2025
f0c7b2a
fix: regenerate yarn.lock after merge
pranavgovi Sep 13, 2025
be1bea1
Merge pull request #4067 from OneCommunityGlobal/Diya_QST_Fix
one-community Sep 13, 2025
7fa7b80
edit function working
Sep 13, 2025
d176712
Merge pull request #4071 from OneCommunityGlobal/Raahul_fix_qst_edit_…
one-community Sep 14, 2025
4606443
Merge pull request #4036 from OneCommunityGlobal/kristin-fix-lint-err…
EvianTan Sep 14, 2025
7a009a1
Merge pull request #4027 from OneCommunityGlobal/vishnu-projects-page…
one-community Sep 14, 2025
66a0e1b
Merge pull request #3913 from OneCommunityGlobal/pranav-applicants_ag…
one-community Sep 14, 2025
f5c56b0
fix(conflicts) resolving conflicts in memeber.jsx
pranavgovi Sep 14, 2025
893eae5
Merge pull request #3840 from OneCommunityGlobal/Pranav-create-donut-…
one-community Sep 14, 2025
7c7ad69
Revert "Pranav- donut chart for experience break down"
one-community Sep 14, 2025
d3c23ff
Merge pull request #4075 from OneCommunityGlobal/revert-3840-Pranav-c…
one-community Sep 14, 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
3 changes: 1 addition & 2 deletions eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ module.exports = [
// Ignore entire component folders
'src/components/Badge/**',
'src/components/SummaryManagement/**',
'src/components/TeamMemberTasks/**',
'src/components/Teams/TeamMembersPopup.jsx',
'src/components/UserProfile/**',
'src/components/Announcements/index.jsx',
],
},
Expand Down
20 changes: 10 additions & 10 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@
"@date-io/dayjs": "^3.2.0",
"@emotion/react": "^11.8.1",
"@emotion/styled": "^11.14.0",
"@fortawesome/fontawesome-svg-core": "^6",
"@fortawesome/free-brands-svg-icons": "^7.0.0",
"@fortawesome/fontawesome-svg-core": "^6.7.2",
"@fortawesome/free-brands-svg-icons": "^7.0.1",
"@fortawesome/free-regular-svg-icons": "^6",
"@fortawesome/free-solid-svg-icons": "^6.7.2",
"@fortawesome/react-fontawesome": "^0.2.3",
"@fortawesome/react-fontawesome": "^0.2.6",
"@hello-pangea/dnd": "^18.0.1",
"@mui/lab": "^7.0.0-beta.12",
"@mui/material": "^7.1.0",
Expand Down
9 changes: 5 additions & 4 deletions src/actions/projectMembers.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ export const fetchProjectsWithActiveUsers = () => {
/**
* Call API to assign/ unassign project
*/
export const assignProject = (projectId, userId, operation, firstName, lastName) => {
export const assignProject = (projectId, userId, operation, firstName, lastName, isActive) => {
const request = axios.post(ENDPOINTS.PROJECT_MEMBER(projectId), {
projectId,
users: [
Expand All @@ -158,9 +158,10 @@ export const assignProject = (projectId, userId, operation, firstName, lastName)
_id: userId,
firstName,
lastName,
isActive
}),
);
dispatch(removeFoundUser(userId));
// dispatch(removeFoundUser(userId));
} else {
dispatch(deleteMember(userId));
}
Expand Down Expand Up @@ -192,8 +193,8 @@ export const findProjectMembers = (_projectId, query) => {
);

const list = Array.isArray(data) ? data
: Array.isArray(data?.users) ? data.users
: [];
: Array.isArray(data?.users) ? data.users
: [];

const assigned = new Set(getState().projectMembers.members.map(m => m._id));
const users = list.map(u => ({ ...u, assigned: assigned.has(u._id) }));
Expand Down
67 changes: 52 additions & 15 deletions src/components/ApplicantsChart/AgeChart.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ import {
LabelList,
} from 'recharts';

function AgeChart({ data, compareLabel }) {
function AgeChart({ data, compareLabel, darkMode }) {
const formatTooltip = (value, name, props) => {
const { change } = props.payload;
let changeText = '';
if (compareLabel && change !== undefined) {
let changeText = '';
if (change > 0) {
changeText = `${change}% more than ${compareLabel}`;
} else if (change < 0) {
Expand All @@ -27,19 +27,56 @@ function AgeChart({ data, compareLabel }) {
};

return (
<div style={{ width: '800px', height: 500, margin: '0 auto', padding: '20px' }}>
<h2>Applicants grouped by Age</h2>
<ResponsiveContainer width="100%" height="100%">
<BarChart data={data} margin={{ top: 20, right: 30, left: 20, bottom: 20 }} barSize={80}>
<CartesianGrid strokeDasharray="3 3" />
<XAxis dataKey="ageGroup" />
<YAxis />
<Tooltip formatter={formatTooltip} />
<Bar dataKey="applicants" fill="#3b82f6">
<LabelList dataKey="applicants" position="top" />
</Bar>
</BarChart>
</ResponsiveContainer>
<div
className={darkMode ? 'bg-oxford-blue text-light' : 'bg-white text-black'}
style={{
width: '100%', // take full available width
maxWidth: '1000px', // optional: cap at some max width
margin: '0 auto',
padding: '20px',
}}
>
<h2 style={{ color: darkMode ? '#fff' : '#000', textAlign: 'center' }}>
Applicants Grouped by Age
</h2>
<div style={{ width: '100%', height: '60vh', minHeight: '350px' }}>
<ResponsiveContainer width="100%" height="100%">
<BarChart data={data} margin={{ top: 20, right: 30, left: 20, bottom: 40 }} barSize={60}>
<CartesianGrid strokeDasharray="3 3" stroke={darkMode ? '#555' : '#ccc'} />
<XAxis
dataKey="ageGroup"
label={{
value: 'Age Group',
position: 'insideBottom',
offset: -5,
fill: darkMode ? '#fff' : '#000',
}}
tick={{ fill: darkMode ? '#fff' : '#000' }}
/>
<YAxis
label={{
value: 'Number of Applicants',
angle: -90,
position: 'insideLeft',
offset: -5,
fill: darkMode ? '#fff' : '#000',
}}
tick={{ fill: darkMode ? '#fff' : '#000' }}
/>
<Tooltip
formatter={formatTooltip}
contentStyle={{
backgroundColor: darkMode ? '#fff' : '#fff',
color: darkMode ? '#000' : '#000',
border: `1px solid ${darkMode ? '#555' : '#ccc'}`,
}}
/>
<Bar dataKey="applicants" fill={darkMode ? '#60a5fa' : '#3b82f6'}>
<LabelList dataKey="applicants" position="top" fill={darkMode ? '#fff' : '#000'} />
</Bar>
</BarChart>
</ResponsiveContainer>
</div>
</div>
);
}
Expand Down
55 changes: 0 additions & 55 deletions src/components/ApplicantsChart/ApplicantsAgeChart.jsx

This file was deleted.

117 changes: 76 additions & 41 deletions src/components/ApplicantsChart/TimeFilter.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,63 +2,98 @@ import { useState, useEffect } from 'react';
import DatePicker from 'react-datepicker';
import 'react-datepicker/dist/react-datepicker.css';

function TimeFilter({ onFilterChange }) {
function TimeFilter({ onFilterChange, darkMode }) {
const [selectedOption, setSelectedOption] = useState('weekly');
const [startDate, setStartDate] = useState(null);
const [endDate, setEndDate] = useState(null);
const [error, setError] = useState('');

useEffect(() => {
onFilterChange({ selectedOption, startDate, endDate });
if (selectedOption === 'custom' && startDate && endDate) {
if (startDate > endDate) {
setError('🚨 Start date cannot be after end date.');
return;
} else {
setError('');
}
} else {
setError('');
}

onFilterChange({ selectedOption, startDate, endDate, error: '' });
}, [selectedOption, startDate, endDate]);

return (
<div
style={{
display: 'flex',
justifyContent: 'center',
flexDirection: 'column',
alignItems: 'center',
gap: '16px',
gap: '12px',
margin: '20px auto',
flexWrap: 'wrap',
}}
>
<label htmlFor="timeFilterSelect" style={{ fontWeight: 500 }}>
Time Filter:
</label>
<select
id="timeFilterSelect"
value={selectedOption}
onChange={e => setSelectedOption(e.target.value)}
style={{
padding: '6px 12px',
borderRadius: '4px',
border: '1px solid #ccc',
fontSize: '14px',
}}
>
<option value="weekly">Weekly</option>
<option value="monthly">Monthly</option>
<option value="yearly">Yearly</option>
<option value="custom">Custom Dates</option>
</select>
{/* Top row */}
<div style={{ display: 'flex', gap: '12px', flexWrap: 'wrap', alignItems: 'center' }}>
<label
htmlFor="timeFilterSelect"
style={{
fontWeight: 600,
color: darkMode ? '#fff' : '#000',
}}
>
Time Filter:
</label>

<select
id="timeFilterSelect"
value={selectedOption}
onChange={e => setSelectedOption(e.target.value)}
style={{
padding: '6px 12px',
borderRadius: '4px',
border: '1px solid #ccc',
fontSize: '14px',
}}
>
<option value="weekly">Weekly</option>
<option value="monthly">Monthly</option>
<option value="yearly">Yearly</option>
<option value="custom">Custom Dates</option>
</select>

{selectedOption === 'custom' && (
<>
<DatePicker
selected={startDate}
onChange={date => setStartDate(date)}
placeholderText="Start Date"
dateFormat="yyyy/MM/dd"
/>
<span style={{ color: darkMode ? '#fff' : '#000' }}>to</span>
<DatePicker
selected={endDate}
onChange={date => setEndDate(date)}
placeholderText="End Date"
dateFormat="yyyy/MM/dd"
/>
</>
)}
</div>

{selectedOption === 'custom' && (
<>
<DatePicker
selected={startDate}
onChange={date => setStartDate(date)}
placeholderText="Start Date"
dateFormat="yyyy/MM/dd"
style={{ marginRight: '10px' }}
/>
<span>to</span>
<DatePicker
selected={endDate}
onChange={date => setEndDate(date)}
placeholderText="End Date"
dateFormat="yyyy/MM/dd"
/>
</>
{/* Error message */}
{error && (
<p
style={{
color: 'red',
fontSize: '18px',
fontWeight: '600',
textAlign: 'center',
marginTop: '8px',
}}
>
{error}
</p>
)}
</div>
);
Expand Down
Loading