From 5cc82ea84e15df020912a692e232538e2123de45 Mon Sep 17 00:00:00 2001 From: Noah Shah Date: Fri, 17 Dec 2021 14:17:31 -0800 Subject: [PATCH 1/6] added sidebar with specified fields --- client/src/components/table/Table.jsx | 9 ++- client/src/pages/Projects.jsx | 110 ++++++++++++++++++++++++-- client/src/utils/consts.js | 93 +++++++++++++++++++++- 3 files changed, 202 insertions(+), 10 deletions(-) diff --git a/client/src/components/table/Table.jsx b/client/src/components/table/Table.jsx index 437ff2b..15fca6b 100644 --- a/client/src/components/table/Table.jsx +++ b/client/src/components/table/Table.jsx @@ -14,7 +14,13 @@ type TableProp = { sizeToFit?: boolean, }; -const Table = ({ data, columns, onRowClick, sizeToFit }: TableProp): Node => { +const Table = ({ + data, + columns, + onRowClick, + onRowDoubleClick, + sizeToFit, +}: TableProp): Node => { const [entries, setEntries] = useState([]); const [gridApi, setGridApi] = useState(null); @@ -49,6 +55,7 @@ const Table = ({ data, columns, onRowClick, sizeToFit }: TableProp): Node => { ensureDomOrder: true, }} onRowClicked={(e) => onRowClick?.(e)} + onRowDoubleClicked={(e) => onRowDoubleClick?.(e)} columnDefs={columns} floatingFilter enableCellTextSelection diff --git a/client/src/pages/Projects.jsx b/client/src/pages/Projects.jsx index f29f6a8..9165f6e 100644 --- a/client/src/pages/Projects.jsx +++ b/client/src/pages/Projects.jsx @@ -6,12 +6,17 @@ import { useHistory } from 'react-router-dom'; import Page from '../components/layout/Page'; import Table from '../components/table/Table'; import { projectColumnDefs } from '../utils/tableHelpers'; -import { getProjects } from '../utils/apiWrapper'; +import { getProjects, getMembers, getUserAuth } from '../utils/apiWrapper'; +import { chapterOptions, possibleStatuses } from '../utils/consts'; import '../css/Home.css'; +import { Sidebar, Segment, Form, Dimmer } from 'semantic-ui-react'; const Projects = (): Node => { const [projects, setProjects] = useState([]); + const [members, setMembers] = useState([]); + const [visible, setVisible] = useState(false); + const [currProj, setCurrProj] = useState({}); const history = useHistory(); @@ -23,16 +28,105 @@ const Projects = (): Node => { } }; getAllProjects(); + const getAllMembers = async () => { + const allMembers = await getMembers(); + if (allMembers.data) { + const memberList = []; + allMembers.data.result.forEach((e) => + memberList.push({ + key: e.firstName + e.lastName, + value: e.firstName + e.lastName, + text: `${e.firstName} ${e.lastName}`, + }), + ); + setMembers(memberList); + } + }; + const getCurrMember = async () => { + const member = await getUserAuth(); + if (member.data) { + console.log(member.data.result); + } + }; + getAllProjects(); + getAllMembers(); + getCurrMember(); }, []); return ( - - history.push(`/projects/${e.data._id}`)} - /> - + + setVisible(false)} + visible={visible} + width="wide" + direction="right" + > + + setCurrProj({ ...currProj, projectName: value }) + } + /> + + setCurrProj({ ...currProj, chapter: value }) + } + /> + + + setCurrProj({ ...currProj, status: value }) + } + /> + + { + setCurrProj({ ...currProj, members: value }); + }} + /> + + + + + + +
history.push(`/projects/${e.data._id}`)} + onRowDoubleClick={(e) => { + setCurrProj(e.data); + setVisible(true); + }} + /> + + + ); }; diff --git a/client/src/utils/consts.js b/client/src/utils/consts.js index c58e6cf..3e36ee4 100644 --- a/client/src/utils/consts.js +++ b/client/src/utils/consts.js @@ -17,4 +17,95 @@ export const requiredFields = [ 'phone', ]; -export default { levelEnum, requiredFields }; +export const chapterOptions = [ + { + key: 'UPENN', + value: 'UPENN', + text: 'University of Pennsylvania', + }, + { + key: 'UIUC', + value: 'UIUC', + text: 'University of Illinois at Urbana-Champaign', + }, + { + key: 'GEORGIA_TECH', + value: 'GEORGIA_TECH', + text: 'Bits of Good - Georgia Tech', + }, + { + key: 'CORNELL_UNIVERSITY', + value: 'CORNELL_UNIVERSITY', + text: 'Cornell University', + }, + { + key: 'BOSTON_UNIVERSITY', + value: 'BOSTON_UNIVERSITY', + text: 'Boston University', + }, + { + key: 'CALIFORNIA_POLYTECHNIC_STATE_UNIVERSITY', + value: 'CALIFORNIA_POLYTECHNIC_STATE_UNIVERSITY', + text: 'California Polytechnic State University', + }, + { + key: 'MCGILL_UNIVERSITY', + value: 'MCGILL_UNIVERSITY', + text: 'McGill University', + }, + { + key: 'UNIVERSITY_OF_MARYLAND_COLLEGE_PARK', + value: 'UNIVERSITY_OF_MARYLAND_COLLEGE_PARK', + text: 'University of Maryland, College Park', + }, + { + key: 'UNIVERSITY_OF_TENNESSEE_KNOXVILLE', + value: 'UNIVERSITY_OF_TENNESSEE_KNOXVILLE', + text: 'University of Tennessee, Knoxville', + }, + { + key: 'UNIVERSITY_OF_MICHIGAN', + value: 'UNIVERSITY_OF_MICHIGAN', + text: 'University of Michigan', + }, + { + key: 'CARLETON_COLLEGE', + value: 'CARLETON_COLLEGE', + text: 'Carleton College', + }, + { + key: 'NEW_YORK_UNIVERSITY', + value: 'NEW_YORK_UNIVERSITY', + text: 'New York University', + }, +]; + +export const possibleStatuses = [ + { + key: 'PRODUCT_RESEARCH', + value: 'PRODUCT_RESEARCH', + text: 'Product Research', + }, + { + key: 'UNDER_DEVELOPMENT', + value: 'UNDER_DEVELOPMENT', + text: 'Under Development', + }, + { + key: 'ON_HOLD', + value: 'ON_HOLD', + text: 'On Hold', + }, + { + key: 'COMPLETED', + value: 'COMPLETED', + text: 'Completed', + }, + { + key: 'ABANDONED', + value: 'ABANDONED', + text: 'Abandoned', + }, +]; + +export default { levelEnum, requiredFields, chapterOptions, possibleStatuses }; From 394e6c78816aeb15c2a31d95537ae94137d670ca Mon Sep 17 00:00:00 2001 From: Noah Shah Date: Wed, 29 Dec 2021 14:17:46 -0800 Subject: [PATCH 2/6] Finished project sidebar with edit feature --- api/src/models/projects.js | 1 + client/src/css/Project.css | 7 + client/src/pages/Projects.jsx | 244 ++++++++++++++++++++++++--------- client/src/utils/apiWrapper.js | 13 ++ client/src/utils/consts.js | 68 ++++----- 5 files changed, 238 insertions(+), 95 deletions(-) create mode 100644 client/src/css/Project.css diff --git a/api/src/models/projects.js b/api/src/models/projects.js index d2d4fda..c100159 100644 --- a/api/src/models/projects.js +++ b/api/src/models/projects.js @@ -46,6 +46,7 @@ const Project = new Schema({ github: String, figma: String, notes: String, + notion: String, }); module.exports = model('Project', Project); diff --git a/client/src/css/Project.css b/client/src/css/Project.css new file mode 100644 index 0000000..657d461 --- /dev/null +++ b/client/src/css/Project.css @@ -0,0 +1,7 @@ +.ui.form .disabled.field, +field.disabled > label, +.ui.disabled.dropdown, +.ui.form .field.disabled > label { + pointer-events: none; + opacity: 1; +} diff --git a/client/src/pages/Projects.jsx b/client/src/pages/Projects.jsx index 9165f6e..061a1b0 100644 --- a/client/src/pages/Projects.jsx +++ b/client/src/pages/Projects.jsx @@ -3,20 +3,33 @@ import React, { useState, useEffect } from 'react'; import type { Node } from 'react'; import { useHistory } from 'react-router-dom'; +import { isEqual } from 'lodash'; + import Page from '../components/layout/Page'; import Table from '../components/table/Table'; import { projectColumnDefs } from '../utils/tableHelpers'; -import { getProjects, getMembers, getUserAuth } from '../utils/apiWrapper'; +import { + getProjects, + getMembers, + getUserAuth, + updateProject, +} from '../utils/apiWrapper'; import { chapterOptions, possibleStatuses } from '../utils/consts'; import '../css/Home.css'; -import { Sidebar, Segment, Form, Dimmer } from 'semantic-ui-react'; +import '../css/Project.css'; +import { Sidebar, Segment, Form, Icon, Modal } from 'semantic-ui-react'; const Projects = (): Node => { const [projects, setProjects] = useState([]); - const [members, setMembers] = useState([]); + const [teamMembers, setTeamMembers] = useState([]); const [visible, setVisible] = useState(false); - const [currProj, setCurrProj] = useState({}); + const [currProj, setCurrProj] = useState({ projectName: '' }); + const [unmodProj, setUnmodProj] = useState({}); + const [editable, setEditable] = useState(false); + const [editMode, setEditMode] = useState(false); + const [showModal, setShowModal] = useState(false); + const [teamEmails, setTeamEmails] = useState({}); const history = useHistory(); @@ -27,90 +40,198 @@ const Projects = (): Node => { setProjects(allProjects.data.result); } }; - getAllProjects(); const getAllMembers = async () => { const allMembers = await getMembers(); if (allMembers.data) { - const memberList = []; - allMembers.data.result.forEach((e) => - memberList.push({ + const teamMemberList = []; + let teamEmails = {}; + allMembers.data.result.forEach((e) => { + teamEmails = { ...teamEmails, [e.email]: e.firstName + e.lastName }; + teamMemberList.push({ key: e.firstName + e.lastName, value: e.firstName + e.lastName, text: `${e.firstName} ${e.lastName}`, - }), - ); - setMembers(memberList); + }); + }); + setTeamMembers(teamMemberList); + setTeamEmails(teamEmails); } }; const getCurrMember = async () => { const member = await getUserAuth(); - if (member.data) { - console.log(member.data.result); - } + setEditable( + member.data && + (member.data.result.level === 'ADMIN' || + member.data.result.level === 'DIRECTOR'), + ); }; getAllProjects(); getAllMembers(); getCurrMember(); }, []); + const filterObj = (raw, allowed) => { + if (allowed) { + const filtered = Object.keys(raw) + .filter((key) => allowed.includes(key)) + .reduce((obj, key) => { + obj[key] = raw[key]; + return obj; + }, {}); + return Object.values(filtered); + } + }; + return ( + setShowModal(false), + }, + { + key: 'Save', + content: 'Save', + positive: true, + icon: 'check', + labelPosition: 'right', + onClick: () => { + setUnmodProj(currProj); + updateProject(currProj, currProj._id); + setShowModal(false); + }, + }, + ]} + /> setVisible(false)} + onHide={() => { + setVisible(false); + setEditMode(false); + if (!isEqual(currProj, unmodProj)) setShowModal(true); + }} visible={visible} width="wide" direction="right" > - - setCurrProj({ ...currProj, projectName: value }) - } - /> - - setCurrProj({ ...currProj, chapter: value }) - } - /> - - - setCurrProj({ ...currProj, status: value }) - } - /> - - { - setCurrProj({ ...currProj, members: value }); + { + setVisible(false); + setEditMode(false); }} + style={{ cursor: 'pointer' }} /> - - + {editable && ( + setEditMode(true)} + /> + )} + + { + setCurrProj({ ...currProj, projectName: value }); + }} + readOnly={!editMode} + /> + { + setCurrProj({ ...currProj, chapter: value }); + }} + disabled={!editMode} + /> + { + setCurrProj({ ...currProj, description: value }); + }} + /> + { + setCurrProj({ ...currProj, status: value }); + }} + disabled={!editMode} + /> + { + setCurrProj({ ...currProj, duration: value }); + }} + /> + {console.log(currProj)} + + { + setCurrProj({ ...currProj, github: value }); + }} + /> + { + setCurrProj({ ...currProj, notion: value }); + }} + /> + { + setUnmodProj(currProj); + updateProject(currProj, currProj._id); + e.preventDefault(); + }} + /> + @@ -122,6 +243,7 @@ const Projects = (): Node => { onRowDoubleClick={(e) => { setCurrProj(e.data); setVisible(true); + setUnmodProj(e.data); }} /> diff --git a/client/src/utils/apiWrapper.js b/client/src/utils/apiWrapper.js index 2d1ca02..d07c45b 100644 --- a/client/src/utils/apiWrapper.js +++ b/client/src/utils/apiWrapper.js @@ -230,3 +230,16 @@ export const getProjects = () => { error, })); }; + +// Updates a project +export const updateProject = (project, projectID) => { + const requestString = `${BACKEND_BASE_URL}/projects/${projectID}`; + return axios + .put(requestString, { + ...project, + }) + .catch((error) => ({ + type: 'UPDATE_PROJECT_FAIL', + error, + })); +}; diff --git a/client/src/utils/consts.js b/client/src/utils/consts.js index 3e36ee4..a604532 100644 --- a/client/src/utils/consts.js +++ b/client/src/utils/consts.js @@ -19,91 +19,91 @@ export const requiredFields = [ export const chapterOptions = [ { - key: 'UPENN', - value: 'UPENN', + key: 'University of Pennsylvania', + value: 'University of Pennsylvania', text: 'University of Pennsylvania', }, { - key: 'UIUC', - value: 'UIUC', + key: 'University of Illinois at Urbana-Champaign', + value: 'University of Illinois at Urbana-Champaign', text: 'University of Illinois at Urbana-Champaign', }, { - key: 'GEORGIA_TECH', - value: 'GEORGIA_TECH', + key: 'Bits of Good - Georgia Tech', + value: 'Bits of Good - Georgia Tech', text: 'Bits of Good - Georgia Tech', }, { - key: 'CORNELL_UNIVERSITY', - value: 'CORNELL_UNIVERSITY', + key: 'Cornell University', + value: 'Cornell University', text: 'Cornell University', }, { - key: 'BOSTON_UNIVERSITY', - value: 'BOSTON_UNIVERSITY', + key: 'Boston University', + value: 'Boston University', text: 'Boston University', }, { - key: 'CALIFORNIA_POLYTECHNIC_STATE_UNIVERSITY', - value: 'CALIFORNIA_POLYTECHNIC_STATE_UNIVERSITY', + key: 'California Polytechnic State University', + value: 'California Polytechnic State University', text: 'California Polytechnic State University', }, { - key: 'MCGILL_UNIVERSITY', - value: 'MCGILL_UNIVERSITY', + key: 'McGill University', + value: 'McGill University', text: 'McGill University', }, { - key: 'UNIVERSITY_OF_MARYLAND_COLLEGE_PARK', - value: 'UNIVERSITY_OF_MARYLAND_COLLEGE_PARK', + key: 'University of Maryland, College Park', + value: 'University of Maryland, College Park', text: 'University of Maryland, College Park', }, { - key: 'UNIVERSITY_OF_TENNESSEE_KNOXVILLE', - value: 'UNIVERSITY_OF_TENNESSEE_KNOXVILLE', + key: 'University of Tennessee, Knoxville', + value: 'University of Tennessee, Knoxville', text: 'University of Tennessee, Knoxville', }, { - key: 'UNIVERSITY_OF_MICHIGAN', - value: 'UNIVERSITY_OF_MICHIGAN', + key: 'University of Michigan', + value: 'University of Michigan', text: 'University of Michigan', }, { - key: 'CARLETON_COLLEGE', - value: 'CARLETON_COLLEGE', + key: 'Carleton College', + value: 'Carleton College', text: 'Carleton College', }, { - key: 'NEW_YORK_UNIVERSITY', - value: 'NEW_YORK_UNIVERSITY', + key: 'New York University', + value: 'New York University', text: 'New York University', }, ]; export const possibleStatuses = [ { - key: 'PRODUCT_RESEARCH', - value: 'PRODUCT_RESEARCH', + key: 'Product Research', + value: 'Product Research', text: 'Product Research', }, { - key: 'UNDER_DEVELOPMENT', - value: 'UNDER_DEVELOPMENT', + key: 'Under Development', + value: 'Under Development', text: 'Under Development', }, { - key: 'ON_HOLD', - value: 'ON_HOLD', + key: 'On Hold', + value: 'On Hold', text: 'On Hold', }, { - key: 'COMPLETED', - value: 'COMPLETED', + key: 'Completed', + value: 'Completed', text: 'Completed', }, { - key: 'ABANDONED', - value: 'ABANDONED', + key: 'Abandoned', + value: 'Abandoned', text: 'Abandoned', }, ]; From 8c3661fbb90d4453f0e097121c1c931e5b3906ad Mon Sep 17 00:00:00 2001 From: Noah Shah Date: Sun, 9 Jan 2022 10:53:44 -0800 Subject: [PATCH 3/6] Fixed bugs where changes were not saved --- client/src/components/table/Table.jsx | 1 + client/src/pages/Projects.jsx | 37 +++++++++++++++------------ 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/client/src/components/table/Table.jsx b/client/src/components/table/Table.jsx index 15fca6b..edb55c3 100644 --- a/client/src/components/table/Table.jsx +++ b/client/src/components/table/Table.jsx @@ -11,6 +11,7 @@ type TableProp = { data: Array, columns: Array, onRowClick: Function, + onRowDoubleClick: Function, sizeToFit?: boolean, }; diff --git a/client/src/pages/Projects.jsx b/client/src/pages/Projects.jsx index 061a1b0..7d4129a 100644 --- a/client/src/pages/Projects.jsx +++ b/client/src/pages/Projects.jsx @@ -2,8 +2,8 @@ import React, { useState, useEffect } from 'react'; import type { Node } from 'react'; import { useHistory } from 'react-router-dom'; - -import { isEqual } from 'lodash'; +import { isEqual, findKey, partial } from 'lodash'; +import { Sidebar, Segment, Form, Icon, Modal } from 'semantic-ui-react'; import Page from '../components/layout/Page'; import Table from '../components/table/Table'; @@ -18,7 +18,6 @@ import { chapterOptions, possibleStatuses } from '../utils/consts'; import '../css/Home.css'; import '../css/Project.css'; -import { Sidebar, Segment, Form, Icon, Modal } from 'semantic-ui-react'; const Projects = (): Node => { const [projects, setProjects] = useState([]); @@ -44,9 +43,9 @@ const Projects = (): Node => { const allMembers = await getMembers(); if (allMembers.data) { const teamMemberList = []; - let teamEmails = {}; + let teamEmail = {}; allMembers.data.result.forEach((e) => { - teamEmails = { ...teamEmails, [e.email]: e.firstName + e.lastName }; + teamEmail = { ...teamEmail, [e.email]: e.firstName + e.lastName }; teamMemberList.push({ key: e.firstName + e.lastName, value: e.firstName + e.lastName, @@ -54,7 +53,7 @@ const Projects = (): Node => { }); }); setTeamMembers(teamMemberList); - setTeamEmails(teamEmails); + setTeamEmails(teamEmail); } }; const getCurrMember = async () => { @@ -71,15 +70,12 @@ const Projects = (): Node => { }, []); const filterObj = (raw, allowed) => { - if (allowed) { - const filtered = Object.keys(raw) - .filter((key) => allowed.includes(key)) - .reduce((obj, key) => { - obj[key] = raw[key]; - return obj; - }, {}); - return Object.values(filtered); - } + const filtered = Object.values( + Object.fromEntries( + Object.entries(raw).filter(([key, value]) => allowed.includes(key)), + ), + ); + return filtered; }; return ( @@ -106,6 +102,7 @@ const Projects = (): Node => { setUnmodProj(currProj); updateProject(currProj, currProj._id); setShowModal(false); + window.location.reload(); }, }, ]} @@ -191,7 +188,6 @@ const Projects = (): Node => { setCurrProj({ ...currProj, duration: value }); }} /> - {console.log(currProj)} { : [] } disabled={!editMode} + onChange={(e, { value }) => { + const newTeam = []; + value.forEach((e) => + newTeam.push(findKey(teamEmails, partial(isEqual, e))), + ); + setCurrProj({ ...currProj, teamMembersEmail: newTeam }); + }} /> { onClick={(e) => { setUnmodProj(currProj); updateProject(currProj, currProj._id); - e.preventDefault(); + window.location.reload(); }} /> From 00a8bb5bd61b14b72a9b6b910c0684a81523803c Mon Sep 17 00:00:00 2001 From: Noah Shah Date: Sun, 9 Jan 2022 11:07:31 -0800 Subject: [PATCH 4/6] Fixed linting issues --- client/src/pages/Projects.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/pages/Projects.jsx b/client/src/pages/Projects.jsx index 7d4129a..1d27af7 100644 --- a/client/src/pages/Projects.jsx +++ b/client/src/pages/Projects.jsx @@ -72,7 +72,7 @@ const Projects = (): Node => { const filterObj = (raw, allowed) => { const filtered = Object.values( Object.fromEntries( - Object.entries(raw).filter(([key, value]) => allowed.includes(key)), + Object.entries(raw).filter(([key]) => allowed.includes(key)), ), ); return filtered; @@ -200,7 +200,7 @@ const Projects = (): Node => { : [] } disabled={!editMode} - onChange={(e, { value }) => { + onChange={(_, { value }) => { const newTeam = []; value.forEach((e) => newTeam.push(findKey(teamEmails, partial(isEqual, e))), @@ -228,7 +228,7 @@ const Projects = (): Node => { type="submit" content="Save Changes" disabled={isEqual(currProj, unmodProj)} - onClick={(e) => { + onClick={() => { setUnmodProj(currProj); updateProject(currProj, currProj._id); window.location.reload(); From dd465b5c53161c291002c31a43e7c11b96db86ba Mon Sep 17 00:00:00 2001 From: Noah Shah Date: Tue, 25 Jan 2022 14:26:22 -0800 Subject: [PATCH 5/6] Added api route in client and api --- api/src/api/members.js | 29 ++++++++++++++++++++++++++++- client/src/utils/apiWrapper.js | 17 +++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/api/src/api/members.js b/api/src/api/members.js index 4feb4c6..5f74b39 100644 --- a/api/src/api/members.js +++ b/api/src/api/members.js @@ -1,6 +1,6 @@ const express = require('express'); const router = express.Router(); -const Member = require('../models/members'); +const { Member, chapterEnum } = require('../models/members'); const errorWrap = require('../middleware/errorWrap'); const { requireRegistered, requireDirector } = require('../middleware/auth'); const { @@ -261,4 +261,31 @@ router.get( }), ); +router.get( + '/role/:role/:chapter?', + requireRegistered, + errorWrap(async (req, res) => { + let members = await Member.find({ role: req.params.role }); + if (req.params.chapter) { + if (!Object.values(chapterEnum).includes(req.params.chapter)){ + return res.status(404).json({ + success: false, + message: req.params.chapter + ' is not a valid chapter.', + }) + } + members = await Member.find({ role: req.params.role, chapter: req.params.chapter }); + } + if (!members) { + return res.status(404).json({ + success: false, + message: req.params.role + ' is not a valid role.', + }) + } + res.json({ + success: true, + result: members, + }); + }), +); + module.exports = router; diff --git a/client/src/utils/apiWrapper.js b/client/src/utils/apiWrapper.js index d07c45b..8b04e77 100644 --- a/client/src/utils/apiWrapper.js +++ b/client/src/utils/apiWrapper.js @@ -243,3 +243,20 @@ export const updateProject = (project, projectID) => { error, })); }; + +export const getRoleCount = (role, chapter) => { + let requestString = `${BACKEND_BASE_URL}/members/role/${role}`; + if (chapter) { + requestString = `${BACKEND_BASE_URL}/members/role/${role}/${chapter}`; + } + return axios + .get(requestString, { + headers: { + 'Content-Type': 'application/JSON', + }, + }) + .catch((error) => ({ + type: 'GET_ROLE_FAIL', + error, + })); +}; From 0e746ce7c782e1e591f3a1642c71a6a7cae77a07 Mon Sep 17 00:00:00 2001 From: Noah Date: Tue, 1 Mar 2022 17:55:49 -0800 Subject: [PATCH 6/6] Finished task for exporting table row checkboxes --- client/src/components/table/Table.jsx | 4 +++- client/src/utils/tableHelpers.js | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/client/src/components/table/Table.jsx b/client/src/components/table/Table.jsx index edb55c3..5345dd3 100644 --- a/client/src/components/table/Table.jsx +++ b/client/src/components/table/Table.jsx @@ -39,7 +39,9 @@ const Table = ({ return (
- diff --git a/client/src/utils/tableHelpers.js b/client/src/utils/tableHelpers.js index 08fa2d3..35244ee 100644 --- a/client/src/utils/tableHelpers.js +++ b/client/src/utils/tableHelpers.js @@ -79,6 +79,8 @@ export const memberColumnDefs = Object.freeze([ field: 'name', pinned: 'left', valueGetter: nameGetter, + checkboxSelection: true, + headerCheckboxSelection: true, }, { headerName: 'Class Standing',