student /class UI

pull/5938/head
Thibault Duplessis 2020-01-19 18:09:13 -06:00
parent 676c8b4647
commit 7bd0554782
3 changed files with 61 additions and 27 deletions

View File

@ -2,6 +2,7 @@ package controllers
import play.api.mvc._
import lila.api.Context
import lila.app._
import views._
@ -12,18 +13,34 @@ final class Clas(
) extends LilaController(env) {
def index = Open { implicit ctx =>
ctx.me.ifTrue(isGranted(_.Teacher)).ifFalse(getBool("home")).map { me =>
WithTeacher(me) { t =>
env.clas.api.clas.of(t.teacher) map { classes =>
Ok(views.html.clas.clas.index(classes))
if (getBool("home")) renderHome
ctx.me match {
case _ if getBool("home") => renderHome
case None => renderHome
case Some(me) if isGranted(_.Teacher) =>
WithTeacher(me) { t =>
env.clas.api.clas.of(t.teacher) map { classes =>
Ok(views.html.clas.clas.teacherIndex(classes))
}
}
}
} | {
pageHit
prismicC getBookmark "class" map {
_ ?? {
case (doc, resolver) => Ok(views.html.clas.clas.home(doc, resolver))
case Some(me) =>
env.clas.api.student.isStudent(me) flatMap {
case false => renderHome
case _ =>
env.clas.api.student.clasIdsOfUser(me) flatMap
env.clas.api.clas.byIds map {
case List(single) => Redirect(routes.Clas.show(single.id.value))
case many => Ok(views.html.clas.clas.studentIndex(many))
}
}
}
}
private def renderHome(implicit ctx: Context) = {
pageHit
prismicC getBookmark "class" map {
_ ?? {
case (doc, resolver) => Ok(views.html.clas.clas.home(doc, resolver))
}
}
}
@ -311,9 +328,7 @@ final class Clas(
def verifyTeacher = Action { req =>
pageHit(req)
Redirect(
"https://forms.gle/Z4Nngdya1zYcD1HS7"
)
Redirect("https://forms.gle/Z4Nngdya1zYcD1HS7")
}
private def WithTeacher(me: lila.user.User)(

View File

@ -32,7 +32,7 @@ object clas {
)
}
def index(classes: List[Clas])(implicit ctx: Context) =
def teacherIndex(classes: List[Clas])(implicit ctx: Context) =
bits.layout("Lichess Classes", Right("classes"))(
cls := "clas-index",
div(cls := "box__top")(
@ -47,20 +47,30 @@ object clas {
if (classes.isEmpty)
frag(hr, p(cls := "box__pad classes__empty")("No classes yet."))
else
div(cls := "classes")(
classes.map { clas =>
div(
cls := List("clas-widget" -> true, "clas-widget-archived" -> clas.isArchived),
dataIcon := "f"
)(
a(cls := "overlay", href := routes.Clas.show(clas.id.value)),
div(
h3(clas.name),
p(clas.desc)
)
)
}
renderClasses(classes)
)
def studentIndex(classes: List[Clas])(implicit ctx: Context) =
bits.layout("Lichess Classes", Right("classes"))(
cls := "clas-index",
div(cls := "box__top")(h1("Lichess Classes")),
renderClasses(classes)
)
private def renderClasses(classes: List[Clas]) =
div(cls := "classes")(
classes.map { clas =>
div(
cls := List("clas-widget" -> true, "clas-widget-archived" -> clas.isArchived),
dataIcon := "f"
)(
a(cls := "overlay", href := routes.Clas.show(clas.id.value)),
div(
h3(clas.name),
p(clas.desc)
)
)
}
)
def teachers(clas: Clas) =

View File

@ -61,6 +61,12 @@ final class ClasApi(
.sort($sort desc "viewedAt")
.list[Clas]()
def byIds(clasIds: List[Clas.Id]): Fu[List[Clas]] =
coll.ext
.find($inIds(clasIds))
.sort($sort desc "createdAt")
.list[Clas]()
def create(data: ClasForm.ClasData, teacher: Teacher): Fu[Clas] = {
val clas = Clas.make(teacher, data.name, data.desc)
coll.insert.one(clas) inject clas
@ -117,6 +123,9 @@ final class ClasApi(
.sort($sort asc "userId")
.list[Student]()
def clasIdsOfUser(user: User): Fu[List[Clas.Id]] =
coll.distinctEasy[Clas.Id, List]("clasId", $doc("userId" -> user.id))
def withUsers(students: List[Student]): Fu[List[Student.WithUser]] =
userRepo.coll.idsMap[User, User.ID](
students.map(_.userId),