From 7bd0554782c897640eacd020949ea51ded20b023 Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Sun, 19 Jan 2020 18:09:13 -0600 Subject: [PATCH] student /class UI --- app/controllers/Clas.scala | 41 ++++++++++++++++++++--------- app/views/clas/clas.scala | 38 ++++++++++++++++---------- modules/clas/src/main/ClasApi.scala | 9 +++++++ 3 files changed, 61 insertions(+), 27 deletions(-) diff --git a/app/controllers/Clas.scala b/app/controllers/Clas.scala index 5cdf7670b4..ec8ac03c0b 100644 --- a/app/controllers/Clas.scala +++ b/app/controllers/Clas.scala @@ -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)( diff --git a/app/views/clas/clas.scala b/app/views/clas/clas.scala index 02e756ccaf..2e14e7022c 100644 --- a/app/views/clas/clas.scala +++ b/app/views/clas/clas.scala @@ -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) = diff --git a/modules/clas/src/main/ClasApi.scala b/modules/clas/src/main/ClasApi.scala index 0abdb73e0a..ec5c22064a 100644 --- a/modules/clas/src/main/ClasApi.scala +++ b/modules/clas/src/main/ClasApi.scala @@ -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),