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);
+}