Deploy / deploy (push) Canceled after 0s
原来要先打开开关、名字变成带 × 的标签再点 ×,× 像删除;标完人从页面上消失, 恢复只能全部恢复。现在: - 班级下拉旁「请假」按钮,标了人之后按钮直接写「请假 2 人:陈言、黄依露 · 修改」 - 弹框只列今天还没交过的人(请假的人一定在里面,刚上课时就是全班),勾上点确定 - 请假的人在表格里变灰排到最后,不算进进度和「还没交过」 - 交了题或举手就算来了,自动取消标记 - 有效期从两小时改成今天(请假一般是一整天),仍然只记在这台电脑上 顺带修掉:被标过的学生后来交了题,会从表格里整个消失、也不算进进度。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
85 lines
2.7 KiB
TypeScript
85 lines
2.7 KiB
TypeScript
import { onMounted, ref } from "vue"
|
|
import { parseTime } from "utils/functions"
|
|
|
|
/**
|
|
* 课堂看板的「请假」:老师手动标记今天不在的学生,看板的人数、进度、「还没交过」都不算他们。
|
|
*
|
|
* **今天有效**(按东八区的日子),第二天自动清掉 —— 请假一般是请一整天,原来按两小时算,
|
|
* 连上两节课的第二节中途人又冒出来,得重标一遍。
|
|
*
|
|
* 存在 localStorage 而不是后端:这是「这台电脑上这位老师今天不想算谁」,
|
|
* 换个人、换台机器都不该继承(2026-10 用户定的,不上服务器)。
|
|
*
|
|
* 原来叫「请假隐藏」(开关 → 名字变成带 × 的标签 → 点 ×),用户说不会用,2026-10 改成
|
|
* 看板上一个「请假」按钮勾名单。旧键 `oj_hidden_students` 存的是两小时的过期时刻,
|
|
* 口径不同,不迁移,直接删掉。
|
|
*
|
|
* @param storageKey localStorage 的键
|
|
*/
|
|
export function useLeaveStudents(storageKey: string) {
|
|
/** 用户名 → 标记的那一天(YYYY-MM-DD,东八区) */
|
|
type Marks = Record<string, string>
|
|
|
|
function today() {
|
|
return parseTime(new Date(), "YYYY-MM-DD")
|
|
}
|
|
|
|
function load(): Marks {
|
|
try {
|
|
return JSON.parse(localStorage.getItem(storageKey) ?? "{}")
|
|
} catch {
|
|
return {}
|
|
}
|
|
}
|
|
|
|
function save(data: Marks) {
|
|
try {
|
|
localStorage.setItem(storageKey, JSON.stringify(data))
|
|
} catch {
|
|
// 存不下就只在这次打开里有效,不影响看板
|
|
}
|
|
}
|
|
|
|
const marks = ref<Marks>(load())
|
|
|
|
function onLeave(username: string) {
|
|
return marks.value[username] === today()
|
|
}
|
|
|
|
/**
|
|
* 把 `usernames` 这批人的标记换成 `selected`:在里面但没选的取消,选了的标上。
|
|
* 只动这一批(看板上这个班),别的班标着的人不受影响
|
|
*/
|
|
function setLeave(usernames: string[], selected: string[]) {
|
|
const scope = new Set(usernames)
|
|
const day = today()
|
|
const next = Object.fromEntries(
|
|
Object.entries(marks.value).filter(([name]) => !scope.has(name)),
|
|
)
|
|
for (const name of selected) next[name] = day
|
|
marks.value = next
|
|
save(next)
|
|
}
|
|
|
|
function cancelLeave(usernames: string[]) {
|
|
setLeave(usernames, [])
|
|
}
|
|
|
|
onMounted(() => {
|
|
try {
|
|
localStorage.removeItem("oj_hidden_students")
|
|
} catch {
|
|
// 读写不了 localStorage 的环境,没什么可清的
|
|
}
|
|
// 把不是今天的清掉再落一次盘,否则这张表只增不减
|
|
const day = today()
|
|
const cleaned = Object.fromEntries(
|
|
Object.entries(marks.value).filter(([, marked]) => marked === day),
|
|
)
|
|
marks.value = cleaned
|
|
save(cleaned)
|
|
})
|
|
|
|
return { onLeave, setLeave, cancelLeave }
|
|
}
|