lila/app/views/coach/edit.scala

203 lines
7.9 KiB
Scala

package views.html.coach
import play.api.data.Form
import play.api.libs.json.Json
import lila.api.Context
import lila.app.templating.Environment._
import lila.i18n.LangList
import lila.app.ui.ScalatagsTemplate._
import lila.common.String.html.{ richText, safeJsonValue }
import controllers.routes
object edit {
private val dataTab = attr("data-tab")
private val dataValue = attr("data-value")
private lazy val jsonLanguages = safeJsonValue {
Json toJson LangList.popularNoRegion.map { l =>
Json.obj(
"code" -> l.code,
"value" -> LangList.name(l),
"searchBy" -> List(
l.toLocale.getDisplayLanguage,
l.toLocale.getDisplayCountry
).mkString(",")
)
}
}
def apply(c: lila.coach.Coach.WithUser, form: Form[_], reviews: lila.coach.CoachReview.Reviews)(implicit
ctx: Context
) = {
views.html.account.layout(
title = s"${c.user.titleUsername} coach page",
evenMoreCss = frag(cssTag("coach.editor"), cssTag("tagify")),
evenMoreJs = frag(
jsAt("vendor/jquery.form.min.js"),
jsAt("vendor/bar-rating/dist/jquery.barrating.min.js"),
tagifyTag,
jsTag("coach.form.js")
),
active = "coach"
)(
div(cls := "account coach-edit box")(
div(cls := "top")(
div(cls := "picture_wrap")(
if (c.coach.hasPicture)
a(
cls := "upload_picture",
href := routes.Coach.picture(),
title := "Change/delete your profile picture"
)(
widget.pic(c, 250)
)
else
div(cls := "upload_picture")(
a(cls := "button", href := routes.Coach.picture())("Upload a profile picture")
)
),
div(cls := "overview")(
h1(widget.titleName(c)),
div(cls := "todo", attr("data-profile") := c.user.profileOrDefault.nonEmptyRealName.isDefined)(
h3("TODO list before publishing your coach profile"),
ul
),
div(
a(
href := routes.Coach.show(c.user.username),
cls := "button button-empty text",
dataIcon := "v"
)("Preview coach page")
)
)
),
postForm(cls := "box__pad form3 async", action := routes.Coach.edit())(
div(cls := "tabs")(
div(dataTab := "basics", cls := "active")("Basics"),
div(dataTab := "texts")("Texts"),
div(dataTab := "contents")("Contents"),
div(dataTab := "reviews", dataCount := reviews.list.size, cls := "data-count")(
"Pending reviews"
)
),
div(cls := "panels")(
div(cls := "panel basics active")(
form3.split(
form3.checkbox(
form("listed"),
raw("Publish on the coaches list"),
help = raw("Enable when your profile is ready").some,
half = true
),
form3.checkbox(
form("available"),
raw("Currently available for lessons"),
help = raw("Enable to get more students").some,
half = true
)
),
form3.group(
form("profile.headline"),
raw("Short and inspiring headline"),
help = raw("Just one sentence to make students want to choose you (3 to 170 chars)").some
)(form3.input(_)),
form3.split(
form3.group(
form("languages"),
raw("Languages spoken"),
help = raw("Which languages can you give lessons in?").some,
half = true
)(
form3.input(_)(
data("all") := jsonLanguages,
data("value") := c.coach.languages.mkString(",")
)
),
form3.group(
form("profile.hourlyRate"),
raw("Hourly rate"),
help = raw("Indicative, non-contractual (3 to 140 chars)").some,
half = true
)(form3.input(_))
)
),
div(cls := "panel texts")(
form3.group(
form("profile.description"),
raw("Who are you?"),
help = raw("Age, profession, country... let your students know you").some
)(form3.textarea(_)(rows := 8)),
form3.group(
form("profile.playingExperience"),
raw("Playing experience"),
help = raw("Tournaments played, best wins, other achievements").some
)(form3.textarea(_)(rows := 8)),
form3.group(
form("profile.teachingExperience"),
raw("Teaching experience"),
help = raw("Diplomas, years of practice, best student results").some
)(form3.textarea(_)(rows := 8)),
form3.group(
form("profile.otherExperience"),
raw("Other experiences"),
help = raw("E.g. as chess commentator, or teaching other domains").some
)(form3.textarea(_)(rows := 8)),
form3.group(form("profile.skills"), raw("Best skills in chess and teaching"))(
form3.textarea(_)(rows := 8)
),
form3.group(
form("profile.methodology"),
raw("Teaching methodology"),
help = raw("How you prepare and run lessons. How you follow up with students.").some
)(form3.textarea(_)(rows := 8))
),
div(cls := "panel contents")(
form3.group(
form("profile.publicStudies"),
raw("Featured public Lichess studies"),
help = raw("Up to 6 Lichess study URLs, one per line").some
)(form3.textarea(_)()),
form3.group(form("profile.youtubeChannel"), raw("URL of your Youtube channel"))(form3.input(_)),
form3.group(
form("profile.youtubeVideos"),
raw("Featured youtube videos"),
help = raw("Up to 6 Youtube video URLs, one per line").some
)(form3.textarea(_)(rows := 6))
),
div(cls := "panel reviews")(
p(cls := "help text", dataIcon := "")("Reviews are visible only after you approve them."),
reviews.list.map { r =>
div(cls := "review", attr("data-action") := routes.Coach.approveReview(r.id))(
div(cls := "user")(
userIdLink(r.userId.some),
review.barRating(selected = r.score.some, enabled = false),
momentFromNow(r.updatedAt)
),
div(cls := "content")(
r.moddedAt.isDefined option div(cls := "modded")(
"Moderators have disapproved this review. Please only accept reviews from ",
"actual students, based on actual lessons. Reviews must be about your coaching services.",
br,
"You may delete this review, or ask the author to rephrase it, then approve it."
),
richText(r.text)
),
div(cls := "actions btn-rack")(
r.moddedAt.fold(true)(_.isBefore(r.updatedAt)) option
a(dataValue := "1", cls := "btn-rack__btn yes", dataIcon := "E"),
a(dataValue := "0", cls := "btn-rack__btn no", dataIcon := "L")
)
)
}
)
),
div(cls := "status text", dataIcon := "E")("Your changes have been saved.")
)
)
)
}
}