Status runs Idea → Planning → Confirmed → Completed. Pierce leads socials unless noted.
+
Status runs Idea → Planning → Confirmed → Completed.
);
}
diff --git a/components/board/derive.ts b/components/board/derive.ts
index b880ff1..3cd2bcf 100644
--- a/components/board/derive.ts
+++ b/components/board/derive.ts
@@ -1,7 +1,7 @@
"use client";
import type { Assignment, BoardData, Member } from "@/lib/board/types";
-import { CURRENT_ROUND } from "@/lib/board/static";
+import { CURRENT_ROUND, UNASSIGNED } from "@/lib/board/static";
export type PersonTasks = {
person: string;
@@ -12,10 +12,11 @@ export type PersonTasks = {
};
// Current-round tasks grouped by person, in the order they were added.
+// Tasks with no owner yet are left out (see unassignedTasks).
export function currentRound(data: BoardData): PersonTasks[] {
const map = new Map();
for (const a of data.assignments) {
- if (a.round !== CURRENT_ROUND.round) continue;
+ if (a.round !== CURRENT_ROUND.round || a.person === UNASSIGNED) continue;
let p = map.get(a.person);
if (!p) {
p = { person: a.person, role: a.personRole, items: [], due: a.dueDate, submitted: false };
@@ -31,4 +32,8 @@ export function currentRound(data: BoardData): PersonTasks[] {
return [...map.values()];
}
+// Current-round tasks with no owner yet. Only admins receive these.
+export const unassignedTasks = (data: BoardData) =>
+ data.assignments.filter((a) => a.round === CURRENT_ROUND.round && a.person === UNASSIGNED);
+
export const inLeadership = (m: Member) => m.isLead || m.tier !== null;
diff --git a/docs/board-preview.html b/docs/board-preview.html
index b49f96f..8ec85c1 100644
--- a/docs/board-preview.html
+++ b/docs/board-preview.html
@@ -140,7 +140,6 @@
.month .day.today .dn { background: var(--fg); color: var(--bg); padding: 0 5px; }
.month .dn { font-size: 14px; font-weight: 700; font-variant-numeric: tabular-nums; align-self: flex-start; }
.ev { font: inherit; font-size: 13px; line-height: 1.3; text-align: left; border: 0; border-left: 3px solid var(--accent); background: var(--tint); color: var(--fg); padding: 3px 5px; cursor: pointer; border-radius: 0; overflow-wrap: anywhere; }
-.ev.x { border-left-color: #1f5f8b; background: #eef4f9; }
.ev.o { border-left-color: var(--soft); background: #f3f2f4; }
.ev.org { border-left-color: var(--prog); background: #fbf5e9; cursor: default; }
.ev[aria-pressed="true"] { outline: 2px solid var(--accent); }
@@ -306,7 +305,7 @@
All socials
-
Status runs Idea → Planning → Confirmed → Completed. Pierce leads socials unless noted.
+
Status runs Idea → Planning → Confirmed → Completed.
@@ -351,7 +350,6 @@
Board meeting · Sep 21, 2026
P("Yunchuan Wang","Research Analyst","Research & Legal","member17@example.com","(555) 555-0117"),
P("Maria Miranda Nadsady","Legal Research","Research & Legal","member18@example.com","(555) 555-0118"),
P("Chloe Yuching Lin","Outreach Lead · Social Media","Outreach","member19@example.com","(555) 555-0119",{ lead: true }),
- P("Pierce Matthew Kosobayashi","Socials","Outreach","member20@example.com","(555) 555-0120"),
P("Rami K Dakak","Research Analyst","Research & Legal","member21@example.com","(555) 555-0121")
];
const openSeats = {};
@@ -423,18 +421,14 @@
Board meeting · Sep 21, 2026
{ name:"Noirit", role:"IVP · Price Is Right Lead", items:[
T("Price Is Right week 2 check: pipeline started, database set up, game screens running with placeholder data","GitHub commit links and a screenshot of the screens"),
T("Sunday night: message every board member who hasn't submitted yet","Screenshot of the messages")] },
- { name:"Pierce", role:"Socials", items:[
- T("VINdiBasketball: set the date and book an RSF court","Booking confirmation"),
- T("RSVP form for basketball, sent to Chloe to post","Form link"),
- T("Send invites for every social on the Socials calendar to the full member email list","Screenshot of the sent email showing the recipients"),
- T("Keep the Socials calendar current: confirm each location and update it on the page","The updated calendar")] },
{ name:"Ian", role:"Software Lead", items:[
T("Get access to the website repo from Rizwaan or Ray","Screenshot showing access"),
T("Assign 3 website-fix pull requests to Ryan and Ethan: write each fix as a GitHub issue with what's broken and what done looks like","Links to the 3 issues, each assigned to Ryan or Ethan")] },
{ name:"Halima", role:"EVP · Partnerships", items:[
T("Reach out to 10 Berkeley student orgs that make videos, starting with Cal TV, about filming or collaborating with us","Screenshot of each sent email or DM, plus a list of the 10 orgs and who replied")] },
{ name:"Daryen", role:"Communications Lead", items:[
- T("Call 5 local mechanics about recording a short video with us (carried over from round 1)","Call log: shop name, number, time called, what they said")] },
+ T("Call 5 local mechanics about recording a short video with us (carried over from round 1)","Call log: shop name, number, time called, what they said"),
+ T("Book an RSF court for VINdiBasketball, Sat Oct 17, 2–4pm","Booking confirmation")] },
{ name:"Jordan", role:"Data Lead", items:[
T("Project spec, including how many people you need (carried over)","Doc link"),
T("Message James Cheng about the project (carried over)","Screenshot of the message"),
@@ -447,7 +441,6 @@
Board meeting · Sep 21, 2026
["Ian","Follow up with Rizwaan, project spec","Marked completed"],
["Chloe","Event ideas, 5 mechanic calls, 10 high schools + YMCA","Marked completed"],
["Daryen","Help Halima, 5 mechanic calls","Not done"],
- ["Pierce","Event ideas doc, workshop timeline, connect with Halima","Not done"],
["Jordan","Project spec, connect with James, answer Ray","Not done"]
];
document.getElementById("r1-count").textContent = `${round1.filter(r => r[2] !== "Not done").length} of ${round1.length} done`;
@@ -520,21 +513,23 @@
Board meeting · Sep 21, 2026
}
/* ---------- socials ---------- */
-// kind: b = Berkeley, x = UCSC x UCB, o = online, org = org date (not a social)
+// kind: b = Berkeley, o = online, org = org date (not a social)
const socials = [
- { date:"2026-10-17", time:"2:00–4:00pm", title:"VINdiBasketball", where:"RSF", kind:"b", lead:"Pierce", status:"Planning", cost:"Free. Optional boba after, self-pay.", note:"First Berkeley social. Court booking and RSVP form due Mon, Oct 12." },
- { date:"2026-10-21", time:"9:00–10:00pm", title:"Skribbl night", where:"Discord", kind:"o", lead:"Chloe", status:"Planning", cost:"Free", note:"Open to all three chapters. Chloe posts the link that afternoon." },
- { date:"2026-10-24", time:"Afternoon", title:"UCSC × UCB social", where:"San Francisco · spot TBD", kind:"x", lead:"Rana + Ashwin", status:"Idea", cost:"Self-pay", note:"Combined social with UCSC. Location still being decided." },
- { date:"2026-10-30", time:"5:00–8:00pm", title:"Glade Night + Chipotle", where:"Memorial Glade", kind:"b", lead:"Pierce", status:"Planning", cost:"Chipotle catering from the $240, if the Oct 13 budget allows", note:"Halloween eve, costumes optional. Last week of daylight before clocks change." },
- { date:"2026-11-06", time:"", title:"Price Is Right demo", where:"", kind:"org", lead:"Noirit", status:"", cost:"", note:"Not a social. No socials Nov 5–15." },
- { date:"2026-11-18", time:"8:00–10:30pm", title:"Movie Night + Menchie's", where:"TBD", kind:"b", lead:"Daryen (movie), Chloe (Menchie's)", status:"Idea", cost:"Self-pay froyo", note:"" },
- { date:"2026-11-21", time:"1:00–4:00pm", title:"UCSC × UCB basketball", where:"Irvington Park, 41825 Blacow Rd, Fremont", kind:"x", lead:"Pierce + UCSC lead", status:"Idea", cost:"Free", note:"Meet-in-the-middle game, separate from VINdiBasketball. Outdoor court, first come. Backup: Karl Nordvik Park." },
+ { date:"2026-10-17", time:"2:00–4:00pm", title:"VINdiBasketball", where:"RSF", kind:"b", lead:"TBD", status:"Planning", cost:"Free", note:"" },
+ { date:"2026-10-21", time:"9:00–10:00pm", title:"Skribbl night", where:"Discord", kind:"o", lead:"TBD", status:"Planning", cost:"Free", note:"" },
+ { date:"2026-10-24", time:"9:30am–12:00pm", title:"Grizzly Peak hike", where:"Meet at the Big C trailhead, Stadium Rim Way", kind:"b", lead:"TBD", status:"Idea", cost:"Free", note:"Steep in parts, so bring water. Moves to Nov 21 if it rains." },
+ { date:"2026-10-27", time:"7:00–9:00pm", title:"Pumpkin carving", where:"Campus room TBD", kind:"b", lead:"TBD", status:"Idea", cost:"About $5 a pumpkin, from the $240", note:"" },
+ { date:"2026-10-30", time:"5:00–8:00pm", title:"Glade Night + Chipotle", where:"Memorial Glade", kind:"b", lead:"TBD", status:"Planning", cost:"Chipotle from the $240 if the budget allows", note:"" },
+ { date:"2026-11-06", time:"", title:"Price Is Right demo", where:"", kind:"org", lead:"TBD", status:"", cost:"", note:"Not a social." },
+ { date:"2026-11-18", time:"8:00–10:30pm", title:"Movie Night + Menchie's", where:"TBD", kind:"b", lead:"Daryen", status:"Idea", cost:"Self-pay froyo", note:"" },
+ { date:"2026-11-21", time:"2:00–4:00pm", title:"Uno on the Glade", where:"Memorial Glade", kind:"b", lead:"TBD", status:"Idea", cost:"Free", note:"Ends before sunset. Rain backup is a campus room." },
+ { date:"2026-12-04", time:"7:00–9:00pm", title:"Karaoke night", where:"Jaguar Karaoke, 2516 Durant Ave", kind:"b", lead:"TBD", status:"Idea", cost:"Self-pay, about $7 per person per hour", note:"Last social before RRR week." },
];
const SOCIALS_KEY = "vin-socials-v1";
try { const saved = JSON.parse(localStorage.getItem(SOCIALS_KEY) || "null"); if (Array.isArray(saved) && saved.length) socials.splice(0, socials.length, ...saved); } catch (_) {}
const saveSocials = () => { try { localStorage.setItem(SOCIALS_KEY, JSON.stringify(socials)); } catch (_) {} };
let editEv = null; // index being edited, or "new"
-const kinds = { All:null, Berkeley:"b", "UCSC × UCB":"x", Online:"o" };
+const kinds = { All:null, Berkeley:"b", Online:"o" };
let socialFilter = "All", openEv = null;
let viewMonth = (() => { const t = today.getFullYear() === 2026 && today.getMonth() >= 9 && today.getMonth() <= 11 ? today : D("2026-10-01"); return new Date(t.getFullYear(), t.getMonth(), 1); })();
const showEv = s => s.kind === "org" || socialFilter === "All" || s.kind === kinds[socialFilter];
@@ -567,7 +562,7 @@