From 7946b5e0b34888d8f5331aad7b7f7fddb1c5d00e Mon Sep 17 00:00:00 2001 From: "augmentcode[bot]" <185243770+augmentcode[bot]@users.noreply.github.com> Date: Tue, 18 Aug 2026 20:51:20 +0000 Subject: [PATCH 1/2] Let mentors opt their project out of Slack attendance tracking Attendance is now inferred from Slack huddle activity (labs-gql PR #10). Teams that don't meet on Slack need a way to exclude themselves, or every student on that team gets falsely flagged absent. Adds a project-level 'Attendance Tracking' select to ProjectEditor, visible to mentors on their own project dashboard (/dash/m) as well as managers/OSMs, wired to the existing editProject mutation's attendanceTracking field. --- src/components/Dashboard/ProjectEditor.gql | 1 + src/components/Dashboard/ProjectEditor.js | 15 +++++++++++++++ .../Dashboard/SelectAttendanceTracking.js | 18 ++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 src/components/Dashboard/SelectAttendanceTracking.js diff --git a/src/components/Dashboard/ProjectEditor.gql b/src/components/Dashboard/ProjectEditor.gql index 56c0a52..68f3017 100644 --- a/src/components/Dashboard/ProjectEditor.gql +++ b/src/components/Dashboard/ProjectEditor.gql @@ -8,6 +8,7 @@ fragment ProjectEditor on LabsProject { issueUrl repositoryId affinePartnerId + attendanceTracking affinePartner { partnerCode } diff --git a/src/components/Dashboard/ProjectEditor.js b/src/components/Dashboard/ProjectEditor.js index 05160a1..4c046ab 100644 --- a/src/components/Dashboard/ProjectEditor.js +++ b/src/components/Dashboard/ProjectEditor.js @@ -22,6 +22,7 @@ import { useToasts } from '@codeday/topo/utils'; import { useFetcher } from '../../dashboardFetch'; import SelectTrack from './SelectTrack'; import SelectProjectStatus from './SelectProjectStatus'; +import SelectAttendanceTracking from './SelectAttendanceTracking'; import { EditProject, CreateProject } from './ProjectEditor.gql'; import TagPicker from './TagPicker'; @@ -48,6 +49,7 @@ export default function ProjectEditor({ tags, project: originalProject, limited, deliverables: project.deliverables || "", issueUrl: project.issueUrl || null, repositoryId: repositories ? (project.repositoryId || null) : undefined, + attendanceTracking: project.attendanceTracking || 'SLACK_HUDDLE', tags: (project.tags || []).map(({ id }) => id), ...(limited ? {} : { status: project.status, @@ -115,8 +117,21 @@ export default function ProjectEditor({ tags, project: originalProject, limited, ) } + + Attendance Tracking: + setProject(['attendanceTracking', e.target.value])} + /> + + + If your team doesn't meet over Slack, turn attendance tracking off so students aren't + falsely flagged as absent. + + {project.affinePartner?.partnerCode && ( Only For Partner: diff --git a/src/components/Dashboard/SelectAttendanceTracking.js b/src/components/Dashboard/SelectAttendanceTracking.js new file mode 100644 index 0000000..790a14b --- /dev/null +++ b/src/components/Dashboard/SelectAttendanceTracking.js @@ -0,0 +1,18 @@ +import { Select, Box } from '@codeday/topo/Atom'; + +const options = { + SLACK_HUDDLE: 'Track via Slack Huddles', + NOT_TRACKED: "We don't meet on Slack -- don't track attendance", +}; + +export default function SelectAttendanceTracking({ attendanceTracking, onChange, ...props }) { + return ( + + + + ); +} From 7d85ddeb3a48c6c023c3553087c89e599ec35054 Mon Sep 17 00:00:00 2001 From: Hannah Cotterell Date: Tue, 18 Aug 2026 13:56:49 -0700 Subject: [PATCH 2/2] allows for saving attendance tracking preferences even in limited mode --- src/components/Dashboard/ProjectEditor.js | 51 ++++++++++++++--------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/src/components/Dashboard/ProjectEditor.js b/src/components/Dashboard/ProjectEditor.js index 4c046ab..ef7935a 100644 --- a/src/components/Dashboard/ProjectEditor.js +++ b/src/components/Dashboard/ProjectEditor.js @@ -70,7 +70,7 @@ export default function ProjectEditor({ tags, project: originalProject, limited, return ( - {!(project.status === 'MATCHED' && limited) && ( - + + {project.status === 'MATCHED' && limited ? ( + ) : ( + <> + - {limited && ['DRAFT', 'PROPOSED'].includes(project.status) && ( - - - - )} - - )} + {limited && ['DRAFT', 'PROPOSED'].includes(project.status) && ( + + + + )} + + )} + {tagInfo.filter((t) => !!t.trainingLink).length > 0 && ( Onboarding Week