Fixed today view
Build and Test App / Build-and-test-App (push) Successful in 33s Details

This commit is contained in:
Andrew Lalis 2025-02-03 15:50:27 -05:00
parent 4349e4f2c3
commit 4cec4b8328
2 changed files with 28 additions and 4 deletions

View File

@ -5,6 +5,7 @@ import {
type EntriesPayload, type EntriesPayload,
type EntriesPayloadStudent, type EntriesPayloadStudent,
type EntriesResponseStudent, type EntriesResponseStudent,
type Entry,
} from '@/api/classroom_compliance' } from '@/api/classroom_compliance'
import { useAuthStore } from '@/stores/auth' import { useAuthStore } from '@/stores/auth'
import { computed, onMounted, ref, watch, type Ref } from 'vue' import { computed, onMounted, ref, watch, type Ref } from 'vue'
@ -187,17 +188,27 @@ async function saveEdits() {
async function discardEdits() { async function discardEdits() {
if (lastSaveState.value) { if (lastSaveState.value) {
students.value = JSON.parse(lastSaveState.value) students.value = JSON.parse(lastSaveState.value)
// The user's preferred sorting might have changed while editing, so we should preserve that.
if (sortingChoice.value === 'name') {
students.value.sort(sortEntriesByName)
} else if (sortingChoice.value === 'desk') {
students.value.sort(sortEntriesByDeskNumber)
}
} else { } else {
await loadEntries() await loadEntries()
} }
} }
function getTodayISOStr(): string {
const today = new Date()
today.setUTCHours(0, 0, 0, 0)
return today.toISOString().substring(0, 10)
}
function getVisibleDates(): string[] { function getVisibleDates(): string[] {
if (selectedView.value === TableView.FULL) return dates.value if (selectedView.value === TableView.FULL) return dates.value
if (selectedView.value === TableView.TODAY) { if (selectedView.value === TableView.TODAY) {
const today = new Date() const todayStr = getTodayISOStr()
today.setUTCHours(0, 0, 0, 0)
const todayStr = today.toISOString().substring(0, 10)
for (const date of dates.value) { for (const date of dates.value) {
if (date === todayStr) return [date] if (date === todayStr) return [date]
} }
@ -205,6 +216,18 @@ function getVisibleDates(): string[] {
return [] return []
} }
function getVisibleStudentEntries(student: EntriesResponseStudent): Record<string, Entry | null> {
if (selectedView.value === TableView.FULL) return student.entries
if (selectedView.value === TableView.TODAY) {
// Only show today's date, if we have it, or null otherwise.
const todayStr = getTodayISOStr()
const obj: Record<string, Entry | null> = {}
obj[todayStr] = student.entries[todayStr]
return obj
}
return {}
}
function addAllEntriesForDate(dateStr: string) { function addAllEntriesForDate(dateStr: string) {
for (let i = 0; i < students.value.length; i++) { for (let i = 0; i < students.value.length; i++) {
const student = students.value[i] const student = students.value[i]
@ -262,7 +285,7 @@ function addAllEntriesForDate(dateStr: string) {
<!-- Desk Number: --> <!-- Desk Number: -->
<td v-if="assignedDesks" v-text="student.deskNumber"></td> <td v-if="assignedDesks" v-text="student.deskNumber"></td>
<!-- A cell for each entry in the table's date range: --> <!-- A cell for each entry in the table's date range: -->
<EntryTableCell v-for="(entry, date) in selectedView === TableView.FULL ? student.entries : []" :key="date" <EntryTableCell v-for="(entry, date) in getVisibleStudentEntries(student)" :key="date"
v-model="student.entries[date]" :date-str="date" :last-save-state-timestamp="lastSaveStateTimestamp" /> v-model="student.entries[date]" :date-str="date" :last-save-state-timestamp="lastSaveStateTimestamp" />
<!-- Score cell: --> <!-- Score cell: -->
<StudentScoreCell :score="student.score" v-if="selectedView !== TableView.WHITEBOARD" /> <StudentScoreCell :score="student.score" v-if="selectedView !== TableView.WHITEBOARD" />

View File

@ -47,6 +47,7 @@ function toggleAbsence() {
// If we have an initial entry known, restore data from that. // If we have an initial entry known, restore data from that.
if (initialEntryJson.value) { if (initialEntryJson.value) {
const initialEntry = JSON.parse(initialEntryJson.value) as Entry const initialEntry = JSON.parse(initialEntryJson.value) as Entry
if (initialEntry === null) return
if (initialEntry.absent) return if (initialEntry.absent) return
if (initialEntry.phoneCompliant) { if (initialEntry.phoneCompliant) {
model.value.phoneCompliant = initialEntry.phoneCompliant model.value.phoneCompliant = initialEntry.phoneCompliant