Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
448173d
Fix null null error on Volunteer menu
JuliaHa0902 Apr 29, 2025
3d1ab1f
Fix navbar flexbox, align center the owner message
JuliaHa0902 Apr 30, 2025
fc18266
Fix mobile dropdown, make the second dropdown stay inside the navbar,…
JuliaHa0902 May 2, 2025
675c135
Move bell icon outside, change Task Edit Suggestion style to text in …
JuliaHa0902 May 5, 2025
6fc8bb0
Fixed Bell Notification popup position when open with the menu
JuliaHa0902 May 5, 2025
a942e6c
Close the menu dropdown when clicking outside, fixed the conflict bet…
JuliaHa0902 May 6, 2025
eadb7d5
Fix toggler conflict error of the Bell Notification
JuliaHa0902 May 6, 2025
a6eb879
Apply the same style to CPHeader, fixed the error Bell Notification i…
JuliaHa0902 May 7, 2025
cd76f95
Fix: Resolved alignment issue, added warning for 1-month gap, and fix…
gopikalakshmia Jun 14, 2025
a88196c
updating with development
gopikalakshmia Jun 18, 2025
5d39c1c
Added comments to teh changed files
gopikalakshmia Jun 18, 2025
8e48709
Fixed space or tab after '//' in comment
gopikalakshmia Jun 20, 2025
48fb75e
Fix the UserManagement action test
gopikalakshmia Jun 20, 2025
1734c6e
Merge branch 'development' into Gopika_Fix_ReportIssue
gopikalakshmia Jul 30, 2025
f175479
Changed the Report for the new Dark mode
gopikalakshmia Jul 30, 2025
6c61d07
merging with development
gopikalakshmia Aug 10, 2025
47d1773
merging with new development
gopikalakshmia Aug 23, 2025
3b325e5
Merged with development
gopikalakshmia Aug 23, 2025
ec94a19
Merge branch 'development' into Gopika_Fix_ReportIssue
gopikalakshmia Aug 23, 2025
10eb4ff
Fix: update yarn.lock and remove package-lock.json to resolve CI froz…
gopikalakshmia Aug 23, 2025
9343257
Update yarn.lock
gopikalakshmia Aug 23, 2025
6e0008e
commit changes
gopikalakshmia Sep 2, 2025
348a710
merge with dev
gopikalakshmia Sep 2, 2025
7b3c4ce
Error resolved in test
gopikalakshmia Sep 2, 2025
8ed110e
updated test
gopikalakshmia Sep 2, 2025
c45f6a4
updatesd
gopikalakshmia Sep 2, 2025
834da81
Merge with development
JuliaHa0902 Oct 4, 2025
935cbc1
Merge with development, remove Header.css, use module.css
JuliaHa0902 Oct 7, 2025
bf7a529
fixed dropdown values bug
aayushshetty12 Nov 6, 2025
6bf21ca
Added the supportPortal Folder
dipti95 Nov 13, 2025
c344794
Modifying the dashboard
dipti95 Nov 13, 2025
67f1bca
Write some code in the login file
dipti95 Nov 13, 2025
47e33aa
Added the code in the css file for logout page
dipti95 Nov 14, 2025
f186956
Added the code for supportlogViewer file
dipti95 Nov 14, 2025
87cb320
Updated routes for the support page and fixed the code for the dashbo…
dipti95 Nov 15, 2025
4dc8410
Intitial changes-need to do more
dipti95 Dec 3, 2025
d76fa9e
added code to show password
dipti95 Dec 4, 2025
31772ae
Add darkMode to communityPortal
Akshay-Jayaram Dec 14, 2025
74b54a2
merge development
shashank-madan Dec 15, 2025
b9b8764
modify api calls to correctly fetch people and project reports
shashank-madan Dec 17, 2025
3a5a502
Add attendance search filters and update styles
aryanrachala54 Dec 17, 2025
676eac6
update TeamMemberTask file to display the weekly summaries count
Akshay-Jayaram Dec 19, 2025
c1aa96a
Fixed header dropdown. Fixed CSS. Added dark mode for usage page
ChiragBellara Dec 19, 2025
970f5b2
Fixed the tick box UI
ChiragBellara Dec 19, 2025
26bbd45
Merge remote-tracking branch 'origin/development' into Akshay-Add-wee…
Akshay-Jayaram Dec 20, 2025
c3f3db5
fixed api calling for people report
shashank-madan Dec 22, 2025
feb7b57
Added caching to load all data at the start
shashank-madan Dec 22, 2025
b6f322a
Added generate bar data as a utility to reduce code duplication
shashank-madan Dec 22, 2025
5e8ee81
deduplicated caching logic
shashank-madan Dec 22, 2025
90af5c4
make dark mode colors important
KH07 Dec 24, 2025
7c50319
code cleanup
KH07 Dec 24, 2025
83dde01
add clear all button to communityportal/Activities
Akshay-Jayaram Dec 26, 2025
9151e61
Merge with development
JuliaHa0902 Dec 27, 2025
c2f6397
Change the name lbDashboard back to lowercase to see if it still caus…
JuliaHa0902 Dec 27, 2025
d32a39b
Change ItemOverview.css to module.css
JuliaHa0902 Dec 27, 2025
e15d8fa
Remove duplicated style in ItemOverview.module.css, change CPHeader t…
JuliaHa0902 Dec 27, 2025
bc2e4fb
Move OwnerMessage on top
JuliaHa0902 Dec 27, 2025
9f33628
Update test for Owner message
JuliaHa0902 Dec 27, 2025
93be7c9
Merge pull request #4641 from OneCommunityGlobal/kristin-change-color…
one-community Dec 28, 2025
5bed1e4
Merge pull request #3495 from OneCommunityGlobal/julia_fix_mobile_rep…
one-community Dec 28, 2025
17fd2cc
Merge pull request #4556 from OneCommunityGlobal/Akshay-add-darkMode-…
one-community Dec 29, 2025
90c7b5c
Merge pull request #4577 from OneCommunityGlobal/Akshay-Add-weekly-su…
one-community Dec 29, 2025
9e22203
Merge pull request #4630 from OneCommunityGlobal/Akshay-Add-clearAllB…
one-community Dec 29, 2025
44604da
fix merge conflicts
shashank-madan Dec 29, 2025
d697200
added module.css files
shashank-madan Dec 29, 2025
118168f
Merge pull request #4593 from OneCommunityGlobal/aryan_attendance_sea…
one-community Dec 29, 2025
1738c8d
Merge pull request #4603 from OneCommunityGlobal/shashank-madan-redo-…
one-community Dec 29, 2025
3af3665
Merge branch 'development' into chirag-fix-page-not-loading-resource-…
ChiragBellara Dec 29, 2025
55dca58
Fixed merger issue in CP Header
ChiragBellara Dec 29, 2025
933fcee
Merge pull request #4582 from OneCommunityGlobal/chirag-fix-page-not-…
one-community Dec 29, 2025
9b679f7
Updated team members components
aryanrachala54 Dec 5, 2025
1daa453
Merge pull request #4503 from OneCommunityGlobal/aryan_show_team_members
one-community Dec 30, 2025
af0e8a5
Merge branch 'development' into Dipti_Phase_4_Support_Team_Frontend
dipti95 Dec 30, 2025
7e03920
updated the timelog.module.css file
dipti95 Dec 31, 2025
d8b12c8
updated LBLogin file
dipti95 Dec 31, 2025
8df407f
resolved merge conflicts
aayushshetty12 Dec 31, 2025
e58779a
Merge pull request #4358 from OneCommunityGlobal/aayush_tools_form_dr…
one-community Dec 31, 2025
f115758
Merge pull request #4551 from OneCommunityGlobal/Dipti_Fix_Active_Ina…
one-community Jan 3, 2026
bbfb115
Merge pull request #4393 from OneCommunityGlobal/Dipti_Phase_4_Suppor…
one-community Jan 3, 2026
d903969
Merge pull request #4513 from OneCommunityGlobal/Dipti_ListingandBidd…
one-community Jan 3, 2026
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
254 changes: 53 additions & 201 deletions package-lock.json

Large diffs are not rendered by default.

4 changes: 0 additions & 4 deletions public/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -242,10 +242,6 @@ body.bm-dashboard-dark .nav-link {
color: #ffffff !important;
}

body.dark-mode .navbar,
body.bm-dashboard-dark .navbar {
background-color: #1b2a41 !important;
}

body.dark-mode .navbar-brand,
body.bm-dashboard-dark .navbar-brand {
Expand Down
17 changes: 9 additions & 8 deletions src/actions/__tests__/userManagement.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const mockStore = configureMockStore(middlewares);

describe('User Management Actions', () => {
let store;

beforeEach(() => {
store = mockStore({});
vi.clearAllMocks();
Expand Down Expand Up @@ -46,7 +46,7 @@ describe('User Management Actions', () => {

it('should update user to active status', async () => {
const reactivationDate = null;

axios.patch.mockResolvedValueOnce({ data: {} });

await store.dispatch(actions.updateUserStatus(mockUser, UserStatus.Active, reactivationDate));
Expand Down Expand Up @@ -143,7 +143,7 @@ describe('User Management Actions', () => {
);
});


});

describe('updateUserFinalDayStatus', () => {
Expand Down Expand Up @@ -205,6 +205,7 @@ describe('User Management Actions', () => {
{ id: 1, name: 'John Doe', email: 'john@example.com' },
{ id: 2, name: 'Jane Smith', email: 'jane@example.com' }
];
const mockSource = 'Report';

axios.get.mockResolvedValueOnce({ data: mockBasicInfo });

Expand All @@ -213,20 +214,20 @@ describe('User Management Actions', () => {
{ type: 'RECEIVE_USER_PROFILE_BASIC_INFO', payload: mockBasicInfo }
];

await store.dispatch(actions.getUserProfileBasicInfo());
await store.dispatch(actions.getUserProfileBasicInfo({source: mockSource}));
expect(store.getActions()).toEqual(expectedActions);
expect(axios.get).toHaveBeenCalledWith(ENDPOINTS.USER_PROFILE_BASIC_INFO);
expect(axios.get).toHaveBeenCalledWith(ENDPOINTS.USER_PROFILE_BASIC_INFO(mockSource));
});

it('should handle errors when fetching basic info', async () => {
axios.get.mockRejectedValueOnce(new Error('Network error'));

const mockSource = '';
const expectedActions = [
{ type: 'FETCH_USER_PROFILE_BASIC_INFO' },
{ type: 'FETCH_USER_PROFILE_BASIC_INFO_ERROR' }
];

await store.dispatch(actions.getUserProfileBasicInfo());
await store.dispatch(actions.getUserProfileBasicInfo({ source: mockSource }));
expect(store.getActions()).toEqual(expectedActions);
});
});
Expand Down Expand Up @@ -276,4 +277,4 @@ describe('User Management Actions', () => {
expect(store.getActions()).toContainEqual(expectedAction);
});
});
});
});
13 changes: 8 additions & 5 deletions src/actions/userManagement.js
Original file line number Diff line number Diff line change
Expand Up @@ -309,15 +309,18 @@ export const updateUserFinalDay = (user, finalDayDate, isSet) => {

/**
* fetching all user profiles basic info
* Added `source` parameter to identify the calling component.
*/
export const getUserProfileBasicInfo = (userId) => {
export const getUserProfileBasicInfo = ({ userId, source }) => {
// API request to fetch basic user profile information
let userProfileBasicInfoPromise;
if (userId)
let userProfileBasicInfoPromise;
if (userId)
userProfileBasicInfoPromise = axios.get(`${ENDPOINTS.USER_PROFILE_BASIC_INFO}?userId=${userId}`);
else
else if (source)
userProfileBasicInfoPromise = axios.get(ENDPOINTS.USER_PROFILE_BASIC_INFO(source));
else
userProfileBasicInfoPromise = axios.get(ENDPOINTS.USER_PROFILE_BASIC_INFO);

return async dispatch => {
// Dispatch action indicating the start of the fetch process
await dispatch(userProfilesBasicInfoFetchStartAction());
Expand Down
6 changes: 3 additions & 3 deletions src/components/BMDashboard/ItemList/SelectItem.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,9 @@ export default function SelectItem({
<option value="all" key="all-option">
All
</option>
{itemSet.map(itemName => (
<option key={`item-${itemName}`} value={itemName}>
{itemName}
{itemSet.map(item => (
<option key={`item-${item}`} value={item}>
{item}
</option>
))}
</>
Expand Down
120 changes: 81 additions & 39 deletions src/components/CommunityPortal/Activities/ActivityAttendance.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Doughnut } from 'react-chartjs-2';
import { Chart as ChartJS, ArcElement, Tooltip, Legend } from 'chart.js';
import { v4 as uuidv4 } from 'uuid';
import { FaRegClock, FaIdCard } from 'react-icons/fa';
import './ActivityAttendance.css';
import styles from './ActivityAttendance.module.css';
import { useState } from 'react';
import profileImg from '../../../assets/images/profile.png';

Expand Down Expand Up @@ -35,9 +35,9 @@ function StatsChart({ stats }) {
};

return (
<div className="chart-container">
<div className={styles.chartContainer}>
<Doughnut data={data} options={options} />
<div className="chart-label">{percentage}%</div>
<div className={styles.chartLabel}>{percentage}%</div>
</div>
);
}
Expand All @@ -59,9 +59,9 @@ const exportToCSV = students => {

function StatsCard({ title, value, color }) {
return (
<div className="stats-card">
<div className={styles.statsCard}>
<h3>{title}</h3>
<p className="stats-value" style={{ color }}>
<p className={styles.statsValue} style={{ color }}>
{value}
</p>
</div>
Expand All @@ -70,39 +70,71 @@ function StatsCard({ title, value, color }) {

function StudentRow({ img, name, time, id }) {
return (
<div className="student-row">
<div className="student-left">
<img src={img} alt={name} className="student-img" />
<div className="student-name">{name}</div>
<div className={styles.studentRow}>
<div className={styles.studentLeft}>
<img src={img} alt={name} className={styles.studentImg} />
<div className={styles.studentName}>{name}</div>
</div>
<div className="student-center">
<div className="student-time">
<FaRegClock className="student-icon" /> {time}
<div className={styles.studentCenter}>
<div className={styles.studentTime}>
<FaRegClock className={styles.studentIcon} /> {time}
</div>
</div>
<div className="student-right">
<div className="student-id">
<FaIdCard className="student-icon" /> {id}
<div className={styles.studentRight}>
<div className={styles.studentId}>
<FaIdCard className={styles.studentIcon} /> {id}
</div>
</div>
</div>
);
}

function LiveUpdates({ students, searchTerm }) {
const filteredStudents = students.filter(student =>
student.name.toLowerCase().includes(searchTerm.toLowerCase()),
);
function LiveUpdates({ students, searchTerm, selectedStatus, onStatusChange }) {
const normalizedSearch = searchTerm.trim().toLowerCase();

const filteredStudents = students.filter(student => {
const matchesStatus = selectedStatus === 'All' || student.status === selectedStatus;

const matchesSearch =
!normalizedSearch ||
student.name.toLowerCase().includes(normalizedSearch) ||
student.id.toLowerCase().includes(normalizedSearch);

return matchesStatus && matchesSearch;
});

const statuses = ['All', 'In', 'Out', 'Leave'];

return (
<div className="live-updates">
<div className="updates-header">
<h3>Live Student Update</h3>
<button className="export-btn" type="button" onClick={() => exportToCSV(filteredStudents)}>
<div className={styles.liveUpdates}>
<div className={styles.updatesHeader}>
<div className={styles.updatesHeaderLeft}>
<h3>Live Student Update</h3>
<div className={styles.statusFilters}>
{statuses.map(status => (
<button
key={status}
type="button"
className={`${styles.statusFilterBtn} ${
selectedStatus === status ? styles.statusFilterBtnActive : ''
}`}
onClick={() => onStatusChange(status)}
>
{status}
</button>
))}
</div>
</div>
<button
className={styles.exportBtn}
type="button"
onClick={() => exportToCSV(filteredStudents)}
>
Export Data
</button>
</div>
<div className="updates-list">

<div className={styles.updatesList}>
{filteredStudents.length > 0 ? (
filteredStudents.map(student => (
<StudentRow
Expand All @@ -114,7 +146,7 @@ function LiveUpdates({ students, searchTerm }) {
/>
))
) : (
<p className="no-results">No students found.</p>
<p className={styles.noResults}>No students found.</p>
)}
</div>
</div>
Expand All @@ -124,6 +156,7 @@ function LiveUpdates({ students, searchTerm }) {
function ActivityAttendance() {
const darkMode = useSelector(state => state.theme.darkMode);
const [searchTerm, setSearchTerm] = useState('');
const [statusFilter, setStatusFilter] = useState('All');

const statsData = [
{ id: uuidv4(), title: 'Total Community Members', value: 400, color: '#4CAF50' },
Expand All @@ -133,44 +166,53 @@ function ActivityAttendance() {
];

const students = [
{ img: profileImg, name: 'Ramakant Sharma', time: '12:30', id: '3CO-JVY' },
{ img: profileImg, name: 'John Doe', time: '12:45', id: '3CO-JXK' },
{ img: profileImg, name: 'Jane Smith', time: '01:00', id: '3CO-JYW' },
{ img: profileImg, name: 'Alice Johnson', time: '01:15', id: '3CO-JZP' },
{ img: profileImg, name: 'Ramakant Sharma', time: '12:30', id: '3CO-JVY', status: 'In' },
{ img: profileImg, name: 'John Doe', time: '12:45', id: '3CO-JXK', status: 'Out' },
{ img: profileImg, name: 'Jane Smith', time: '01:00', id: '3CO-JYW', status: 'Leave' },
{ img: profileImg, name: 'Alice Johnson', time: '01:15', id: '3CO-JZP', status: 'In' },
];

return (
<div className={`activity-attendance-page ${darkMode ? 'activity-attendance-dark-mode' : ''}`}>
<div className="dashboard-container">
<div
className={`${styles.activityAttendancePage} ${
darkMode ? styles.activityAttendanceDarkMode : ''
}`}
>
<div className={styles.dashboardContainer}>
{/* Title and Search Bar */}
<div className="dashboard-title">
<div className="title-text">
<div className={styles.dashboardTitle}>
<div className={styles.titleText}>
<h2>Welcome Admin</h2>
<p>Senior Admin - One Community</p>
</div>
<div className="search-container">
<div className={styles.searchContainer}>
<input
type="text"
placeholder="Search Students..."
className="search-bar"
className={styles.attendanceSearchBar}
value={searchTerm}
onChange={e => setSearchTerm(e.target.value)}
/>
</div>
</div>

<div className="dashboard-main">
<div className="stats-chart-container">
<div className={styles.dashboardMain}>
<div className={styles.statsChartContainer}>
<StatsChart stats={statsData} />
<div className="stats-grid">
<div className={styles.statsGrid}>
{statsData.map(stat => (
<StatsCard key={stat.id} title={stat.title} value={stat.value} color={stat.color} />
))}
</div>
</div>

{/* Live Student Updates */}
<LiveUpdates students={students} searchTerm={searchTerm} />
<LiveUpdates
students={students}
searchTerm={searchTerm}
selectedStatus={statusFilter}
onStatusChange={setStatusFilter}
/>
</div>
</div>
</div>
Expand Down
Loading