diff --git a/app/controllers/api/v0/competitions_controller.rb b/app/controllers/api/v0/competitions_controller.rb index d37b345614d..9bbba881f6e 100644 --- a/app/controllers/api/v0/competitions_controller.rb +++ b/app/controllers/api/v0/competitions_controller.rb @@ -25,7 +25,7 @@ def competition_index competitions = competitions_scope.search(params[:q], params: params) - serial_methods = ["short_display_name", "city", "country_iso2", "event_ids", "date_range", "latitude_degrees", "longitude_degrees"] + serial_methods = ["short_display_name", "city", "country_iso2", "event_ids", "latitude_degrees", "longitude_degrees"] serial_includes = {} serial_includes["delegates"] = { only: ["id", "name"], methods: [], include: ["avatar"] } if admin_mode diff --git a/app/views/competitions/my_competitions.html.erb b/app/views/competitions/my_competitions.html.erb index 735e2876b6d..d0adfcebd69 100644 --- a/app/views/competitions/my_competitions.html.erb +++ b/app/views/competitions/my_competitions.html.erb @@ -1,8 +1,8 @@ <% provide(:title, t('.title')) %> <% options = { - only: %w[id name website start_date end_date, registration_open], - methods: %w[url city country_iso2 registration_status results_posted? visible? confirmed? cancelled? report_posted? date_range short_display_name], + only: %w[id name website start_date end_date registration_open], + methods: %w[url city country_iso2 registration_status results_posted? visible? confirmed? cancelled? report_posted? short_display_name], include: %w[championships], } %> diff --git a/app/webpacker/components/CompetitionsOverview/ListViewSection.js b/app/webpacker/components/CompetitionsOverview/ListViewSection.js index 0d1999cbe02..2aaf6f47cb8 100644 --- a/app/webpacker/components/CompetitionsOverview/ListViewSection.js +++ b/app/webpacker/components/CompetitionsOverview/ListViewSection.js @@ -21,6 +21,7 @@ import { } from '../../lib/utils/competition-table'; import { countries } from '../../lib/wca-data.js.erb'; import { adminCompetitionUrl, competitionUrl } from '../../lib/requests/routes.js.erb'; +import { dateRange } from '../../lib/utils/dates'; function ListViewSection({ competitions, @@ -154,7 +155,7 @@ export function CompetitionsTable({ /> - {comp.date_range} + {dateRange(comp.start_date, comp.end_date)} @@ -210,7 +211,7 @@ export function CompetitionsTabletTable({ /> - {comp.date_range} + {dateRange(comp.start_date, comp.end_date)} @@ -257,7 +258,7 @@ export function CompetitionsMobileTable({ isSortedByAnnouncement={isSortedByAnnouncement} regStatusLoading={regStatusLoading} /> - {comp.date_range} + {dateRange(comp.start_date, comp.end_date)} {comp.short_display_name} @@ -360,7 +361,7 @@ function AdminCompetitionsTable({ - {comp.date_range} + {dateRange(comp.start_date, comp.end_date)} {comp.name}
- {`${comp.date_range} - ${comp.city}`} + {`${dateRange(comp.start_date, comp.end_date)} - ${comp.city}`} ))} diff --git a/app/webpacker/components/MyCompetitions/TableCells.jsx b/app/webpacker/components/MyCompetitions/TableCells.jsx index 4a511e6f2c1..80561dd9829 100644 --- a/app/webpacker/components/MyCompetitions/TableCells.jsx +++ b/app/webpacker/components/MyCompetitions/TableCells.jsx @@ -3,6 +3,7 @@ import React from 'react'; import I18n from '../../lib/i18n'; import { competitionReportUrl, competitionReportEditUrl } from '../../lib/requests/routes.js.erb'; import { countries } from '../../lib/wca-data.js.erb'; +import { dateRange } from '../../lib/utils/dates'; export function NameTableCell({ competition }) { return ( @@ -28,7 +29,7 @@ export function LocationTableCell({ competition }) { export function DateTableCell({ competition }) { return ( - {competition.date_range} + {dateRange(competition.start_date, competition.end_date, { separator: '-' })} ); } diff --git a/app/webpacker/components/MyCompetitions/UpcomingCompetitionTable.jsx b/app/webpacker/components/MyCompetitions/UpcomingCompetitionTable.jsx index ec93cab4178..c88262a91a8 100644 --- a/app/webpacker/components/MyCompetitions/UpcomingCompetitionTable.jsx +++ b/app/webpacker/components/MyCompetitions/UpcomingCompetitionTable.jsx @@ -24,10 +24,10 @@ const competingStatusIcon = (competingStatus) => { const registrationStatusIconText = (competition) => { if (competition.registration_status === 'not_yet_opened') { - return I18n.t('competitions.index.tooltips.registration.opens_in', { duration: DateTime.fromISO(competition.registration_open).toRelative() }); + return I18n.t('competitions.index.tooltips.registration.opens_in', { duration: DateTime.fromISO(competition.registration_open).toRelative({ locale: window.I18n.locale }) }); } if (competition.registration_status === 'past') { - return I18n.t('competitions.index.tooltips.registration.closed', { days: DateTime.fromISO(competition.start_date).toRelative() }); + return I18n.t('competitions.index.tooltips.registration.closed', { days: DateTime.fromISO(competition.start_date).toRelative({ locale: window.I18n.locale }) }); } if (competition.registration_status === 'full') { return I18n.t('competitions.index.tooltips.registration.full'); diff --git a/app/webpacker/lib/utils/dates.js b/app/webpacker/lib/utils/dates.js index 4366d866486..55234889628 100644 --- a/app/webpacker/lib/utils/dates.js +++ b/app/webpacker/lib/utils/dates.js @@ -1,5 +1,4 @@ -import { DateTime } from 'luxon'; - +import { DateTime, Interval } from 'luxon'; // parameter name conventions: // - `luxonDate` for luxon DateTime objects // - `date` for date-only ISO strings (no time) @@ -120,3 +119,7 @@ export const todayWithTime = (dateTime, timeZone) => { millisecond: luxonDate.millisecond, }); }; + +export function dateRange(fromDate, toDate, options = {}) { + return Interval.fromDateTimes(DateTime.fromISO(fromDate), DateTime.fromISO(toDate)).toLocaleString({ month: 'short', day: '2-digit', year: 'numeric' }, options); +}