fix: отображение количества участников лекции
🚀 Create and publish a Docker image / Detect changes in backend and frontend (push) Successful in 11s
🚀 Create and publish a Docker image / Build & publish backend image (push) Successful in 6m5s
🚀 Create and publish a Docker image / Build & publish frontend image (push) Successful in 29s
🚀 Create and publish a Docker image / Update stack on Portainer (push) Successful in 9s
🚀 Create and publish a Docker image / Detect changes in backend and frontend (push) Successful in 11s
🚀 Create and publish a Docker image / Build & publish backend image (push) Successful in 6m5s
🚀 Create and publish a Docker image / Build & publish frontend image (push) Successful in 29s
🚀 Create and publish a Docker image / Update stack on Portainer (push) Successful in 9s
This commit is contained in:
@@ -76,6 +76,7 @@ export function mapApiLecture(lecture: LectureDto): Lecture {
|
||||
room: lecture.format === 'Online' ? undefined : locationName,
|
||||
format: lecture.format === 'Online' ? 'online' : 'offline',
|
||||
totalSeats,
|
||||
enrolledSeats: enrolled,
|
||||
freeSeats,
|
||||
registrationClosed: !lecture.isOpen,
|
||||
tags: lecture.courseName ? [`#${lecture.courseName}`] : [],
|
||||
|
||||
@@ -217,7 +217,7 @@ input, textarea, select {
|
||||
font-weight: 600;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.badge-green { background: rgba(34,197,94,0.15); color: #15803D; border: 1px solid rgba(34,197,94,0.3); }
|
||||
.badge-green { color: #15803D; border: 1.5px solid rgba(34,197,94,0.3); }
|
||||
.badge-blue { background: rgba(6,182,212,0.15); color: #0E7490; border: 1px solid rgba(6,182,212,0.3); }
|
||||
.badge-orange { background: rgba(251,146,60,0.15); color: #C2410C; border: 1px solid rgba(251,146,60,0.3); }
|
||||
.badge-gray { background: rgba(100,116,139,0.1); color: #64748B; border: 1px solid rgba(100,116,139,0.2); }
|
||||
|
||||
@@ -42,7 +42,7 @@ function goDetail() {
|
||||
>
|
||||
<template v-if="lecture.registrationClosed">Запись закрыта</template>
|
||||
<template v-else>
|
||||
{{ lecture.freeSeats === 0 ? 'Мест нет' : `${lecture.freeSeats}/${lecture.totalSeats} мест` }}
|
||||
{{ `${lecture.enrolledSeats}/${lecture.totalSeats} записано` }}
|
||||
</template>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
@@ -78,6 +78,7 @@ export const useLecturesStore = defineStore('lectures', () => {
|
||||
await lecturesApi.enroll(lectureId)
|
||||
registered.value.push(lectureId)
|
||||
lecture.freeSeats = Math.max(lecture.freeSeats - 1, 0)
|
||||
lecture.enrolledSeats += 1
|
||||
lecture.registered = true
|
||||
}
|
||||
|
||||
@@ -87,6 +88,7 @@ export const useLecturesStore = defineStore('lectures', () => {
|
||||
const lecture = lectures.value.find(item => item.id === lectureId)
|
||||
if (lecture) {
|
||||
lecture.freeSeats = Math.min(lecture.freeSeats + 1, lecture.totalSeats)
|
||||
lecture.enrolledSeats = Math.max(lecture.enrolledSeats - 1, 0)
|
||||
lecture.registered = false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ export interface Lecture {
|
||||
room?: string
|
||||
format: 'online' | 'offline'
|
||||
totalSeats: number
|
||||
enrolledSeats: number
|
||||
freeSeats: number
|
||||
registrationClosed?: boolean
|
||||
tags: string[]
|
||||
|
||||
@@ -225,7 +225,7 @@ async function registerLecture(id: string) {
|
||||
</template>
|
||||
<template #seats="{ row }">
|
||||
<span :class="row.freeSeats === 0 ? 'badge badge-gray' : 'badge badge-green'">
|
||||
{{ row.registrationClosed ? 'Запись закрыта' : `${row.freeSeats}/${row.totalSeats}` }}
|
||||
{{ row.registrationClosed ? 'Запись закрыта' : `${row.enrolledSeats}/${row.totalSeats}` }}
|
||||
</span>
|
||||
</template>
|
||||
<template #action="{ row }">
|
||||
|
||||
@@ -74,7 +74,7 @@ onMounted(async () => {
|
||||
</div>
|
||||
<div class="info-section">
|
||||
<h3>Места</h3>
|
||||
<div class="info-value">Свободно {{ lecture.freeSeats }} из {{ lecture.totalSeats }}</div>
|
||||
<div class="info-value">Записано {{ lecture.enrolledSeats }} из {{ lecture.totalSeats }}</div>
|
||||
<StatusBadge :status="lecture.registrationClosed ? 'closed' : lecture.freeSeats === 0 ? 'full' : 'open'" />
|
||||
</div>
|
||||
<div class="info-section">
|
||||
|
||||
@@ -17,7 +17,7 @@ const teacherLectures = computed(() => {
|
||||
return owned.length ? owned : lecturesStore.all
|
||||
})
|
||||
const upcoming = computed(() => teacherLectures.value.filter(l => l.status !== 'completed').slice(0, 3))
|
||||
const enrolledTotal = computed(() => teacherLectures.value.reduce((sum, l) => sum + (l.totalSeats - l.freeSeats), 0))
|
||||
const enrolledTotal = computed(() => teacherLectures.value.reduce((sum, l) => sum + l.enrolledSeats, 0))
|
||||
const visibility = computed(() => (teacherLectures.value.length ? Math.min(100, Math.round(enrolledTotal.value * 4)) : 0))
|
||||
|
||||
onMounted(() => {
|
||||
@@ -60,7 +60,7 @@ onMounted(() => {
|
||||
<div>
|
||||
<div class="upcoming-title">{{ l.title }}</div>
|
||||
<div class="upcoming-meta">📅 {{ new Date(l.date).toLocaleDateString('ru-RU') }} · {{ l.time }}</div>
|
||||
<div class="upcoming-meta">Записалось {{ l.totalSeats - l.freeSeats }} студентов</div>
|
||||
<div class="upcoming-meta">Записалось {{ l.enrolledSeats }} студентов</div>
|
||||
</div>
|
||||
<button class="btn-secondary btn-sm" @click="router.push('/teacher/lectures')">Управлять</button>
|
||||
</div>
|
||||
|
||||
@@ -24,7 +24,7 @@ const rows = computed(() => {
|
||||
title: l.title,
|
||||
date: `${new Date(l.date).toLocaleDateString('ru-RU')} · ${l.time}`,
|
||||
status: l.status ?? 'upcoming',
|
||||
stats: `${l.totalSeats - l.freeSeats} / — / ${l.reviewCount}`,
|
||||
stats: `${l.enrolledSeats} / — / ${l.reviewCount}`,
|
||||
}))
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user