fix ui thi
All checks were successful
Deploy on Master Change / deploy (push) Successful in 47s

This commit is contained in:
2026-07-02 15:51:29 +07:00
parent 4b8f4d288a
commit 1b424ab62d
3 changed files with 188 additions and 54 deletions

View File

@@ -302,9 +302,6 @@ func UpdateExamRoomHandler(db *gorm.DB) fiber.Handler {
if err := db.First(&room, id).Error; err != nil {
return c.Status(404).JSON(fiber.Map{"error": "Không tìm thấy"})
}
if !internalDb.ExamRoomEditable(room) {
return c.Status(403).JSON(fiber.Map{"error": "Chỉ sửa được phòng thi ở trạng thái tạm thời"})
}
var req struct {
Name *string `json:"name"`
StartTime *string `json:"startTime"`
@@ -315,6 +312,15 @@ func UpdateExamRoomHandler(db *gorm.DB) fiber.Handler {
if err := c.BodyParser(&req); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Invalid body"})
}
if !internalDb.ExamRoomEditable(room) {
if room.Status == models.ExamStatusReady {
if req.Name != nil || req.StartTime != nil || req.EndTime != nil || req.QuizURL != nil {
return c.Status(403).JSON(fiber.Map{"error": "Chỉ sửa được cấu hình ứng dụng được phép khi phòng thi đã đẩy hoặc đang thi"})
}
} else {
return c.Status(403).JSON(fiber.Map{"error": "Chỉ sửa được phòng thi ở trạng thái tạm thời hoặc đang sẵn sàng/đang thi"})
}
}
if req.Name != nil {
room.Name = strings.TrimSpace(*req.Name)
}
@@ -462,19 +468,42 @@ func SearchExamStudentsHandler(db *gorm.DB) fiber.Handler {
if q == "" {
return c.JSON(fiber.Map{"data": []any{}})
}
pat := "%" + q + "%"
var ids []int64
_ = db.Model(&models.Student{}).
Where("full_name LIKE ? OR student_code LIKE ? OR email LIKE ?", pat, pat, pat).
Limit(30).
Pluck("rk_id", &ids).Error
var classIDs []int64
_ = db.Model(&models.Class{}).Where("class_code LIKE ? OR name LIKE ?", pat, pat).Pluck("rk_id", &classIDs).Error
if len(classIDs) > 0 {
var more []int64
_ = db.Model(&models.ClassStudent{}).Where("class_rk_id IN ?", classIDs).Distinct().Pluck("student_rk_id", &more).Error
ids = append(ids, more...)
// Split search query by newline, comma, or semicolon
var terms []string
for _, line := range strings.FieldsFunc(q, func(r rune) bool {
return r == '\n' || r == '\r' || r == ';' || r == ','
}) {
t := strings.TrimSpace(line)
if t != "" {
terms = append(terms, t)
}
}
if len(terms) == 0 {
return c.JSON(fiber.Map{"data": []any{}})
}
if len(terms) > 100 {
terms = terms[:100]
}
var ids []int64
for _, term := range terms {
pat := "%" + term + "%"
var termIDs []int64
_ = db.Model(&models.Student{}).
Where("full_name LIKE ? OR student_code LIKE ? OR email LIKE ?", pat, pat, pat).
Limit(30).
Pluck("rk_id", &termIDs).Error
ids = append(ids, termIDs...)
var classIDs []int64
_ = db.Model(&models.Class{}).Where("class_code LIKE ? OR name LIKE ?", pat, pat).Pluck("rk_id", &classIDs).Error
if len(classIDs) > 0 {
var more []int64
_ = db.Model(&models.ClassStudent{}).Where("class_rk_id IN ?", classIDs).Distinct().Pluck("student_rk_id", &more).Error
ids = append(ids, more...)
}
}
seen := map[int64]bool{}
uniq := make([]int64, 0)
for _, id := range ids {
@@ -483,12 +512,12 @@ func SearchExamStudentsHandler(db *gorm.DB) fiber.Handler {
uniq = append(uniq, id)
}
}
if len(uniq) > 40 {
uniq = uniq[:40]
if len(uniq) > 100 {
uniq = uniq[:100]
}
var students []models.Student
if len(uniq) > 0 {
_ = db.Where("rk_id IN ?", uniq).Limit(40).Find(&students).Error
_ = db.Where("rk_id IN ?", uniq).Limit(100).Find(&students).Error
}
type row struct {
StudentRkID int64 `json:"studentRkId"`

Binary file not shown.