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