|
|
|
|
@ -728,9 +728,6 @@ struct PlanningView: View { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private func _eventCourtCount() -> Int { timeSlots.first?.value.first?.currentTournament()?.eventObject()?.eventCourtCount() ?? 2 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private func _save() { |
|
|
|
|
let groupByTournaments = allMatches.grouped { match in |
|
|
|
|
match.currentTournament() |
|
|
|
|
@ -750,15 +747,26 @@ struct PlanningView: View { |
|
|
|
|
Button("Tirer au sort") { |
|
|
|
|
_removeCourts() |
|
|
|
|
|
|
|
|
|
let eventCourtCount = _eventCourtCount() |
|
|
|
|
|
|
|
|
|
for slot in timeSlots { |
|
|
|
|
var courtsAvailable = Array(0...eventCourtCount) |
|
|
|
|
let matches = slot.value |
|
|
|
|
matches.forEach { match in |
|
|
|
|
if let rand = courtsAvailable.randomElement() { |
|
|
|
|
var courtsByTournament: [String: Set<Int>] = [:] |
|
|
|
|
for match in matches { |
|
|
|
|
if let tournament = match.currentTournament(), |
|
|
|
|
let available = tournament.matchScheduler()?.courtsAvailable { |
|
|
|
|
courtsByTournament[tournament.id, default: []].formUnion(available) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for match in matches { |
|
|
|
|
guard let tournament = match.currentTournament() else { continue } |
|
|
|
|
// Get current set of available courts for this tournament id |
|
|
|
|
guard var courts = courtsByTournament[tournament.id], !courts.isEmpty else { continue } |
|
|
|
|
// Pick a random court |
|
|
|
|
if let rand = courts.randomElement() { |
|
|
|
|
match.courtIndex = rand |
|
|
|
|
courtsAvailable.remove(elements: [rand]) |
|
|
|
|
// Remove from local copy and assign back into the dictionary |
|
|
|
|
courts.remove(rand) |
|
|
|
|
courtsByTournament[tournament.id] = courts |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -769,15 +777,26 @@ struct PlanningView: View { |
|
|
|
|
Button("Fixer par ordre croissant") { |
|
|
|
|
_removeCourts() |
|
|
|
|
|
|
|
|
|
let eventCourtCount = _eventCourtCount() |
|
|
|
|
|
|
|
|
|
for slot in timeSlots { |
|
|
|
|
var courtsAvailable = Array(0..<eventCourtCount) |
|
|
|
|
let matches = slot.value.sorted(by: \.computedOrder) |
|
|
|
|
var courtsByTournament: [String: Set<Int>] = [:] |
|
|
|
|
for match in matches { |
|
|
|
|
if let tournament = match.currentTournament(), |
|
|
|
|
let available = tournament.matchScheduler()?.courtsAvailable { |
|
|
|
|
courtsByTournament[tournament.id, default: []].formUnion(available.sorted()) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for i in 0..<matches.count { |
|
|
|
|
if !courtsAvailable.isEmpty { |
|
|
|
|
let court = courtsAvailable.removeFirst() |
|
|
|
|
|
|
|
|
|
guard let tournament = matches[i].currentTournament() else { continue } |
|
|
|
|
// Get current set of available courts for this tournament id |
|
|
|
|
guard var courts = courtsByTournament[tournament.id]?.sorted(), !courts.isEmpty else { continue } |
|
|
|
|
if courts.isEmpty == false { |
|
|
|
|
let court = courts.removeFirst() |
|
|
|
|
matches[i].courtIndex = court |
|
|
|
|
// Remove from local copy and assign back into the dictionary |
|
|
|
|
courtsByTournament[tournament.id] = Set(courts) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -984,3 +1003,4 @@ extension EnvironmentValues { |
|
|
|
|
set { self[EnableMoveKey.self] = newValue } |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|