Skip to content

Commit 3e87309

Browse files
Dileepadaririthikreddypallaabhiramtilakiiit
authored
Members month (#175)
* initial commit * second commmit, for utils and stuff * update to use startMonth, endMonth instead of My * made some final changes * few changes * change of input format to YYYY-MM,type="month" * Refactor date handling in member positions and bulk edit forms * Fix valueGetter to use optional chaining for start and end month/year in UserMemberships * Add optional chaining to value getters in BulkEditForm and UserForm * fix delete button logic * Refactor sorting and date handling in member components for improved clarity and consistency * Remove unused date formatting imports from member components for cleaner code * Refactor imports in member components for improved organization and consistency * Remove unnecessary blank line in ClubsCouncil component for cleaner code * added month to bulk add form description --------- Co-authored-by: rithikreddypalla <rithikreddypalla@gmail.com> Co-authored-by: abhiramtilakiiit <abhiram.potula@research.iiit.ac.in>
1 parent a4eac91 commit 3e87309

File tree

10 files changed

+145
-160
lines changed

10 files changed

+145
-160
lines changed

src/app/clubs-council/page.jsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,7 @@ const filterRoles = (roles, filterWords, unfilterWords = []) => {
141141
);
142142
return matchesFilterWords && !matchesUnfilterWords;
143143
})
144-
?.sort((a, b) => {
145-
sortMonthYear(a, b);
146-
});
144+
?.sort((a, b) => sortMonthYear(a, b));
147145
} else {
148146
return filteredRoles;
149147
}

src/app/manage/members/page.jsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,7 @@ export default async function ManageMembers(props) {
147147
}
148148

149149
async function PendingMembersDataGrid() {
150-
const { data: { pendingMembers } = {} } =
151-
await getClient().query(GET_PENDING_MEMBERS);
150+
const { data: { pendingMembers } = {} } = await getClient().query(GET_PENDING_MEMBERS);
152151

153152
// TODO: convert MembersTable to a server component and fetch user profile for each row (for lazy-loading perf improvement)
154153
// concurrently fetch user profile for each member
@@ -246,8 +245,8 @@ async function MembersDataGrid({
246245
// if member is still present, return current year + 1
247246
function extractLatestYear(member) {
248247
return Math.max(
249-
...member.roles.map((r) =>
250-
!r.endYear ? new Date().getFullYear() + 1 : r.endYear,
248+
...member.roles.map((r)=>
249+
!r.endYear ? new Date().getFullYear() + 1 : r.endYear,
251250
),
252251
);
253252
}

src/components/members/BulkEditForm.jsx

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ export default function BulkEdit({ mode = "add" }) {
437437
- Please ensure that the members being added do not already exist in
438438
the selected club/body.
439439
<br />- The default start year for all members will be set as{" "}
440-
{currentYear}.
440+
{currentYear}{"-"}{currentMonth}.
441441
<br />- Any invalid entries marked in red will be skipped during
442442
submission.
443443
</Typography>
@@ -909,16 +909,13 @@ function MembersTable({
909909
}
910910
required
911911
min={`2010-01`}
912-
max={`${currentYear}-${currentMonth + 1}`}
912+
max={currentMonth === 12
913+
? `${currentYear + 1}-01`
914+
: `${currentYear}-${String(currentMonth + 1).padStart(2, "0")}`}
913915
onBlur={() => {
914916
api.stopCellEditMode({ id, field });
915917
}}
916-
style={{
917-
width: "100%",
918-
padding: 6,
919-
borderRadius: 6,
920-
border: "1px solid #ccc",
921-
}}
918+
style={{ width: "100%", padding: 6, borderRadius: 6, border: "1px solid #ccc" }}
922919
/>
923920
);
924921
},
@@ -975,7 +972,9 @@ function MembersTable({
975972
})
976973
}
977974
min={`2010-01`}
978-
max={`${currentYear}-${currentMonth + 1}`}
975+
max={currentMonth === 12
976+
? `${currentYear + 1}-01`
977+
: `${currentYear}-${String(currentMonth + 1).padStart(2, "0")}`}
979978
style={{
980979
width: "100%",
981980
padding: 6,

src/components/members/MemberCard.jsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,7 @@ export default async function MemberCard({ uid, poc, roles }) {
104104
) : null}
105105

106106
{roles
107-
?.sort((a, b) => {
108-
sortMonthYear(a, b);
109-
})
107+
?.sort((a, b) => sortMonthYear(a, b))
110108
.map((role, key) => (
111109
<Box
112110
key={key}
@@ -129,8 +127,11 @@ export default async function MemberCard({ uid, poc, roles }) {
129127
display: "inline-block",
130128
}}
131129
>
132-
({fmtMonthYear(role.startMonth, role.startYear)} -
133-
{fmtMonthYear(role.endMonth, role.endYear)})
130+
(
131+
{fmtMonthYear(role.startMonth, role.startYear)}
132+
{" "}-{" "}
133+
{fmtMonthYear(role.endMonth, role.endYear)}
134+
)
134135
</Typography>
135136
</Box>
136137
))}

src/components/members/MemberPositions.jsx

Lines changed: 113 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { fmtMonthYear } from "utils/membersDates";
2424
import { approveMemberAction } from "actions/members/approve/server_action";
2525
import { rejectMemberAction } from "actions/members/reject/server_action";
2626

27+
2728
const showActions = (rows, user) => {
2829
if (user?.role !== "cc") return false;
2930
if (rows.length > 0) {
@@ -83,11 +84,7 @@ export default function MemberPositions({
8384
if (row.startYear < minYear) row.startYear = minYear;
8485

8586
// Only clamp if the month is actually set
86-
if (
87-
row.startMonth &&
88-
(row.startYear > currentYear ||
89-
(row.startYear === currentYear && row.startMonth > currentMonth))
90-
) {
87+
if (row.startMonth && (row.startYear > currentYear || (row.startYear === currentYear && row.startMonth > currentMonth))) {
9188
row.startYear = currentYear;
9289
row.startMonth = currentMonth;
9390
}
@@ -147,9 +144,12 @@ export default function MemberPositions({
147144
}}
148145
>
149146
{p.value || (
150-
<span style={{ color: "text.secondary", fontStyle: "italic" }}>
147+
<Box
148+
component="span"
149+
sx={{ color: "text.secondary", fontStyle: "italic" }}
150+
>
151151
Double click to edit
152-
</span>
152+
</Box>
153153
)}
154154
</Typography>
155155
),
@@ -291,83 +291,82 @@ export default function MemberPositions({
291291
},
292292
...(editable
293293
? [
294-
{
295-
field: "isValid",
296-
type: "boolean",
297-
headerName: "Valid?",
298-
align: "center",
299-
width: 80,
300-
renderCell: (p) => (
301-
<Tooltip
302-
title={p.row.error || "Valid"}
303-
disableHoverListener={p.row.isValid}
304-
>
305-
<span>
306-
<Icon
307-
color={p.row.isValid ? "success.main" : "error.main"}
308-
variant={p.row.isValid ? "check-circle" : "cancel"}
309-
sx={{ height: 20, width: 20 }}
310-
/>
311-
</span>
312-
</Tooltip>
313-
),
314-
display: "flex",
315-
disableColumnMenu: true,
316-
sortable: false,
317-
},
318-
{
319-
field: "action",
320-
align: "center",
321-
headerName: "",
322-
width: 50,
323-
renderCell: (p) => (
324-
<IconButton
325-
onMouseDown={(e) => e.stopPropagation()}
326-
onClick={(e) => {
327-
e.stopPropagation();
328-
onDelete(p.row);
329-
}}
330-
size="small"
331-
>
294+
{
295+
field: "isValid",
296+
type: "boolean",
297+
headerName: "Valid?",
298+
align: "center",
299+
width: 80,
300+
renderCell: (p) => (
301+
<Tooltip
302+
title={p.row.error || "Valid"}
303+
disableHoverListener={p.row.isValid}
304+
>
305+
<span>
332306
<Icon
333-
color="error.main"
334-
variant="delete-forever-outline"
335-
sx={{ height: 16, width: 16 }}
307+
color={p.row.isValid ? "success.main" : "error.main"}
308+
variant={p.row.isValid ? "check-circle" : "cancel"}
309+
sx={{ height: 20, width: 20 }}
336310
/>
337-
</IconButton>
338-
),
339-
display: "flex",
340-
disableColumnMenu: true,
341-
sortable: false,
342-
},
343-
]
311+
</span>
312+
</Tooltip>
313+
),
314+
display: "flex",
315+
disableColumnMenu: true,
316+
sortable: false,
317+
},
318+
{
319+
field: "action",
320+
align: "center",
321+
headerName: "",
322+
width: 50,
323+
renderCell: (p) => (
324+
<IconButton onMouseDown={(e) => e.stopPropagation()}
325+
onClick={(e) => {
326+
e.stopPropagation();
327+
onDelete(p.row)
328+
}}
329+
size="small"
330+
>
331+
<Icon
332+
color="error.main"
333+
variant="delete-forever-outline"
334+
sx={{ height: 16, width: 16 }}
335+
/>
336+
</IconButton>
337+
),
338+
display: "flex",
339+
disableColumnMenu: true,
340+
sortable: false,
341+
},
342+
]
344343
: [
345-
{
346-
field: "approved",
347-
headerName: "Status",
348-
align: "center",
349-
headerAlign: "center",
350-
flex: isMobile ? null : 2,
351-
valueGetter: (value, row) => ({
352-
approved: row.approved,
353-
approvalTime: row.approvalTime,
354-
rejected: row.rejected,
355-
rejectionTime: row.rejectionTime,
356-
}),
357-
disableExport: true,
358-
renderCell: ({
359-
value: { approved, approvalTime, rejected, rejectionTime },
360-
}) => (
361-
<Tooltip
362-
title={
363-
approved
364-
? approvalTime || "No Information Available"
365-
: rejected
366-
? rejectionTime || "No Information Available"
367-
: null
368-
}
369-
placement="left-start"
370-
>
344+
{
345+
field: "approved",
346+
headerName: "Status",
347+
align: "center",
348+
headerAlign: "center",
349+
flex: isMobile ? null : 2,
350+
valueGetter: (value, row) => ({
351+
approved: row.approved,
352+
approvalTime: row.approvalTime,
353+
rejected: row.rejected,
354+
rejectionTime: row.rejectionTime,
355+
}),
356+
disableExport: true,
357+
renderCell: ({
358+
value: { approved, approvalTime, rejected, rejectionTime },
359+
}) => (
360+
<Tooltip
361+
title={
362+
approved
363+
? approvalTime || "No Information Available"
364+
: rejected
365+
? rejectionTime || "No Information Available"
366+
: null
367+
}
368+
placement="left-start"
369+
>
371370
<span>
372371
<Tag
373372
label={
@@ -379,41 +378,41 @@ export default function MemberPositions({
379378
sx={{ my: 2 }}
380379
/>
381380
</span>
382-
</Tooltip>
383-
),
384-
display: "flex",
385-
},
386-
...(showActions(rows, user)
387-
? [
388-
{
389-
field: "actions",
390-
align: "center",
391-
headerName: "",
392-
width: 100,
393-
valueGetter: (value, row) => ({
394-
approved: row.approved,
395-
rejected: row.rejected,
396-
rid: row.rid,
397-
}),
398-
disableExport: true,
399-
disableColumnMenu: true,
400-
sortable: false,
401-
renderCell: ({ value: { approved, rejected, rid } }) => (
381+
</Tooltip>
382+
),
383+
display: "flex",
384+
},
385+
...(showActions(rows, user)
386+
? [
387+
{
388+
field: "actions",
389+
align: "center",
390+
headerName: "",
391+
width: 100,
392+
valueGetter: (value, row) => ({
393+
approved: row.approved,
394+
rejected: row.rejected,
395+
rid: row.rid,
396+
}),
397+
disableExport: true,
398+
disableColumnMenu: true,
399+
sortable: false,
400+
renderCell: ({ value: { approved, rejected, rid } }) => (
401+
<>
402+
{approved || rejected ? null : (
402403
<>
403-
{approved || rejected ? null : (
404-
<>
405-
<ApproveButton rid={rid} member={member} />
406-
<Box sx={{ mx: 1 }} />
407-
<RejectButton rid={rid} member={member} />
408-
</>
409-
)}
404+
<ApproveButton rid={rid} member={member} />
405+
<Box sx={{ mx: 1 }} />
406+
<RejectButton rid={rid} member={member} />
410407
</>
411-
),
412-
display: "flex",
413-
},
414-
]
415-
: []),
416-
]),
408+
)}
409+
</>
410+
),
411+
display: "flex",
412+
},
413+
]
414+
: []),
415+
]),
417416
];
418417

419418
return (

src/components/members/MembersGrid.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,5 +69,7 @@ export function extractLatestYear(member) {
6969
// get the first year a member was in the club
7070
// if member is still present, return -1
7171
export function extractFirstYear(member) {
72-
return Math.min(...member.roles.map((r) => (!r.endYear ? -1 : r.startYear)));
72+
return Math.min(
73+
...member.roles.map((r) => (!r.endYear ? -1 : r.startYear)),
74+
);
7375
}

src/components/members/MembersTable.jsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,11 @@ export default function MembersTable({
158158
flexShrink: 0,
159159
}}
160160
>
161-
({fmtMonthYear(role?.startMonth, role?.startYear)} -
162-
{fmtMonthYear(role?.endMonth, role?.endYear)})
161+
(
162+
{fmtMonthYear(role?.startMonth, role?.startYear)}
163+
{" "}-{" "}
164+
{fmtMonthYear(role?.endMonth, role?.endYear)}
165+
)
163166
</Box>
164167
</Typography>
165168
{showIcon && (

src/components/members/TechMemberCard.jsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,7 @@ export default async function TechMemberCard({ uid, poc, roles }) {
9797
/>
9898

9999
{roles
100-
?.sort((a, b) => {
101-
sortMonthYear(a, b);
102-
})
100+
?.sort((a, b) => sortMonthYear(a, b))
103101
.map((role, key) => {
104102
const start = fmtMonthYear(role?.startMonth, role?.startYear);
105103
const end = fmtMonthYear(role?.endMonth, role?.endYear);

0 commit comments

Comments
 (0)