Skip to content

Commit

Permalink
broadcast timezone start dates complete
Browse files Browse the repository at this point in the history
ugh, what a pain in the ass. I regret doing that.
  • Loading branch information
ornicar committed Oct 6, 2024
1 parent 3dd7f5b commit 84cdfd7
Show file tree
Hide file tree
Showing 7 changed files with 43 additions and 27 deletions.
15 changes: 6 additions & 9 deletions modules/common/src/main/Form.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import play.api.data.format.Formats.*
import play.api.data.format.Formatter
import play.api.data.validation.{ Constraint, Constraints }
import play.api.data.{ Form as PlayForm, FormError, Mapping, validation as V }
import scala.jdk.CollectionConverters.*
import java.lang
import java.time.{ LocalDate, ZoneId }
import java.time.{ LocalDate, LocalDateTime, ZoneId }
import scala.util.Try
import play.api.i18n.Lang

object Form:

Expand Down Expand Up @@ -229,10 +229,6 @@ object Form:
val field: Mapping[URL] = of[URL]

object timeZone:
lazy val choices: List[(String, String)] =
ZoneId.getAvailableZoneIds.asScala.toList.flatMap: id =>
Try(ZoneId.of(id)).toOption.map: tz =>
tz.getId -> tz.getId
given Formatter[ZoneId] = formatter.stringTryFormatter(
from = s => Try(ZoneId.of(s)).fold(err => Left(err.getMessage), Right(_)),
to = _.getId
Expand Down Expand Up @@ -346,12 +342,13 @@ object Form:
def unbind(key: String, value: Instant) = ISOInstant.format.unbind(key, value)
val mapping: Mapping[Instant] = of[Instant](format)
final class LocalDateTimeOrTimestamp(zone: ZoneId):
val localFormatter = java.time.format.DateTimeFormatter.ofPattern(PrettyDateTime.pattern)
def localDateTimeParse(data: String) = LocalDateTime.parse(data, localFormatter)
val format: Formatter[Instant] = new:
def bind(key: String, data: Map[String, String]) =
PrettyDateTime.format
.bind(key, data)
parsing(localDateTimeParse, "error.localDateTime", Nil)(key, data)
.map(_.atZone(zone).toInstant)
.orElse(Timestamp.format.bind(key, data))
def unbind(key: String, value: Instant) =
PrettyDateTime.format.unbind(key, value.atZone(zone).toLocalDateTime)
Map(key -> value.atZone(zone).toLocalDateTime.format(localFormatter))
val mapping: Mapping[Instant] = of[Instant](format)
4 changes: 2 additions & 2 deletions modules/event/src/main/ui/EventUi.scala
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,10 @@ final class EventUi(helpers: Helpers)(modMenu: Context ?=> Frag)(using Executor)
frag(
form3.split(
form3.group(form("startsAt"), frag("Start date ", strong(utcLink)), half = true)(
form3.flatpickr(_, utc = true)
form3.flatpickr(_, local = true)
),
form3.group(form("finishesAt"), frag("End date ", strong(utcLink)), half = true)(
form3.flatpickr(_, utc = true)
form3.flatpickr(_, local = true)
)
),
form3.split(
Expand Down
3 changes: 1 addition & 2 deletions modules/relay/src/main/RelayRoundForm.scala
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,7 @@ final class RelayRoundForm(using mode: Mode):
"delay" -> optional(number(min = 0, max = RelayDelay.maxSeconds.value).into[Seconds]),
"onlyRound" -> optional(number(min = 1, max = 999)),
"slices" -> optional:
nonEmptyText
.transform[List[RelayGame.Slice]](RelayGame.Slices.parse, RelayGame.Slices.show)
nonEmptyText.transform[List[RelayGame.Slice]](RelayGame.Slices.parse, RelayGame.Slices.show)
)(Data.apply)(unapply)

def create(trs: RelayTour.WithRounds)(using Me) = Form(
Expand Down
2 changes: 1 addition & 1 deletion modules/relay/src/main/ui/FormUi.scala
Original file line number Diff line number Diff line change
Expand Up @@ -446,7 +446,7 @@ final class FormUi(helpers: Helpers, ui: RelayUi, tourUi: RelayTourUi):
help = frag("Used to set round dates using their local time").some,
half = true
):
form3.select(_, lila.common.Form.timeZone.choices, default = "Unknown".some)
form3.select(_, timeZone.translatedChoices)
),
form3.split(
form3.group(
Expand Down
16 changes: 8 additions & 8 deletions modules/ui/src/main/helper/Form3.scala
Original file line number Diff line number Diff line change
Expand Up @@ -224,21 +224,21 @@ final class Form3(formHelper: FormHelper & I18nHelper, flairApi: FlairApi):
)(st.legend(toggle.map(_ => tabindex := 0))(legend))

private val dataEnableTime = attr("data-enable-time")
private val dataMinDate = attr("data-mindate")
private val dataMinDate = attr("data-min-date")
private val dataLocal = attr("data-local")

def flatpickr(
field: Field,
withTime: Boolean = true,
utc: Boolean = false,
minDate: Option[String] = Some("today"),
dateFormat: Option[String] = None
local: Boolean = false,
minDate: Option[String] = Some("today")
): Tag =
input(field, klass = s"flatpickr${if utc then " flatpickr-utc" else ""}")(
input(field, klass = s"flatpickr")(
dataEnableTime := withTime,
dateFormat.map(df => data("date-format") := df),
dataLocal := local,
dataMinDate := minDate.map:
case "today" if utc => "yesterday"
case d => d
case "today" if local => "yesterday"
case d => d
)

private lazy val exceptEmojis = data("except-emojis") := flairApi.adminFlairs.mkString(" ")
Expand Down
20 changes: 20 additions & 0 deletions modules/ui/src/main/helper/FormHelper.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import play.api.data.*
import scalatags.text.Builder

import lila.ui.ScalatagsTemplate.*
import scala.util.Try
import play.api.i18n.Lang

trait FormHelper:
self: I18nHelper =>
Expand Down Expand Up @@ -70,3 +72,21 @@ trait FormHelper:
false -> trans.site.no.txt(),
true -> trans.site.yes.txt()
)

object timeZone:
import java.time.{ ZoneId, ZoneOffset }
import scala.jdk.CollectionConverters.*

lazy val zones: List[(ZoneOffset, ZoneId)] =
val now = nowInstant
ZoneId.getAvailableZoneIds.asScala.toList
.flatMap: id =>
Try(ZoneId.of(id)).toOption
.map: z =>
(z.getRules.getOffset(now), z)
.toList
.sortBy: (offset, zone) =>
(offset, zone.getId)
def translatedChoices(using lang: Lang): List[(String, String)] =
zones.map: (offset, zone) =>
zone.getId -> s"$offset ${zone.getDisplayName(java.time.format.TextStyle.NARROW, lang.locale)}"
10 changes: 5 additions & 5 deletions ui/bits/src/bits.flatpickr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@ import { use24h } from 'common/i18n';

site.load.then(() => {
$('.flatpickr').each(function (this: HTMLInputElement) {
const minDate = this.dataset['mindate'];
const config = this.classList.contains('flatpickr-utc')
? {}
: { dateFormat: 'Z', altInput: true, altFormat: 'Y-m-d h:i K' };
const minDate = this.dataset['minDate'];
const enableTime = !!this.dataset['enableTime'];
const local = !!this.dataset['local'];
const config = local ? {} : { dateFormat: 'Z', altInput: true, altFormat: 'Y-m-d h:i K' };
flatpickr(this, {
minDate: minDate == 'yesterday' ? new Date(Date.now() - 1000 * 3600 * 24) : minDate,
maxDate: new Date(Date.now() + 1000 * 3600 * 24 * 31 * 12),
monthSelectorType: 'static',
disableMobile: true, // https://flatpickr.js.org/mobile-support/ https://github.com/lichess-org/lila/issues/8110
time_24hr: use24h(),
time_24hr: enableTime && use24h(),
...config,
});
});
Expand Down

0 comments on commit 84cdfd7

Please sign in to comment.