|
|
|
@ -48,7 +48,7 @@ final public class Event: BaseEvent { |
|
|
|
// MARK: - Computed dependencies |
|
|
|
// MARK: - Computed dependencies |
|
|
|
|
|
|
|
|
|
|
|
public var tournaments: [Tournament] { |
|
|
|
public var tournaments: [Tournament] { |
|
|
|
DataStore.shared.tournaments.filter { $0.event == self.id && $0.isDeleted == false } |
|
|
|
DataStore.shared.tournaments.filter { $0.event == self.id && $0.isDeleted == false }.sorted(by: \.startDate) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public func clubObject() -> Club? { |
|
|
|
public func clubObject() -> Club? { |
|
|
|
@ -103,6 +103,55 @@ final public class Event: BaseEvent { |
|
|
|
public func shareURL() -> URL? { |
|
|
|
public func shareURL() -> URL? { |
|
|
|
return URL(string: URLs.main.url.appending(path: "event/\(id)").absoluteString.removingPercentEncoding!) |
|
|
|
return URL(string: URLs.main.url.appending(path: "event/\(id)").absoluteString.removingPercentEncoding!) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public func formattedDateInterval() -> String { |
|
|
|
|
|
|
|
let tournaments = self.tournaments |
|
|
|
|
|
|
|
guard !tournaments.isEmpty else { |
|
|
|
|
|
|
|
return "" // Handle empty tournament list |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let firstTournament = tournaments.first! |
|
|
|
|
|
|
|
let lastTournament = tournaments.last! |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Helper to check if two dates are on the same day |
|
|
|
|
|
|
|
func isSameDay(date1: Date, date2: Date) -> Bool { |
|
|
|
|
|
|
|
return Calendar.current.isDate(date1, inSameDayAs: date2) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Scenario 1: Only one tournament |
|
|
|
|
|
|
|
if tournaments.count == 1 { |
|
|
|
|
|
|
|
return firstTournament.startDate.formattedAsDate() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Scenario 2: Multiple tournaments, but all start and end on the same day (single-day event overall) |
|
|
|
|
|
|
|
let overallEventIsSingleDay = isSameDay(date1: firstTournament.startDate, date2: lastTournament.startDate) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if overallEventIsSingleDay { |
|
|
|
|
|
|
|
return firstTournament.startDate.formattedAsDate() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Scenario 3: Multiple tournaments, spanning multiple days (requires "Du ... au ...") |
|
|
|
|
|
|
|
let startDay = firstTournament.startDate.localizedDay() |
|
|
|
|
|
|
|
let endDay = lastTournament.startDate.localizedDay() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let startMonthYear = firstTournament.startDate.monthYearFormatted |
|
|
|
|
|
|
|
let endMonthYear = lastTournament.startDate.monthYearFormatted |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let calendar = Calendar.current |
|
|
|
|
|
|
|
let firstStartComponents = calendar.dateComponents([.year, .month], from: firstTournament.startDate) |
|
|
|
|
|
|
|
let lastEndComponents = calendar.dateComponents([.year, .month], from: lastTournament.startDate) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if firstStartComponents.year == lastEndComponents.year && firstStartComponents.month == lastEndComponents.month { |
|
|
|
|
|
|
|
// Same month and year: "Du 13 au 15 Juin 2025" |
|
|
|
|
|
|
|
return "Du \(startDay) au \(endDay) \(startMonthYear)" |
|
|
|
|
|
|
|
} else if firstStartComponents.year == lastEndComponents.year { |
|
|
|
|
|
|
|
// Different months, same year: "Du 13 Juin au 15 Juillet 2025" |
|
|
|
|
|
|
|
return "Du \(startDay) \(startMonthYear) au \(endDay) \(endMonthYear)" |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
// Different years: "Du 13 Juin 2025 au 15 Juin 2026" |
|
|
|
|
|
|
|
return "Du \(startDay) \(startMonthYear) au \(endDay) \(endMonthYear)" |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func insertOnServer() throws { |
|
|
|
func insertOnServer() throws { |
|
|
|
DataStore.shared.events.writeChangeAndInsertOnServer(instance: self) |
|
|
|
DataStore.shared.events.writeChangeAndInsertOnServer(instance: self) |
|
|
|
|