parent
58ffb56ef5
commit
28e94cb348
@ -0,0 +1,33 @@ |
|||||||
|
// |
||||||
|
// DateMenuView.swift |
||||||
|
// PadelClub |
||||||
|
// |
||||||
|
// Created by razmig on 22/11/2024. |
||||||
|
// |
||||||
|
|
||||||
|
|
||||||
|
import SwiftUI |
||||||
|
|
||||||
|
struct DateMenuView: View { |
||||||
|
@Binding var date: Date |
||||||
|
|
||||||
|
private func adjustDate(byDays days: Int) { |
||||||
|
let calendar = Calendar.current |
||||||
|
if let newDate = calendar.date(byAdding: .day, value: days, to: date) { |
||||||
|
date = newDate.truncateMinutesAndSeconds() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
var body: some View { |
||||||
|
Menu { |
||||||
|
Button("24h avant") { adjustDate(byDays: -1) } |
||||||
|
Button("48h avant") { adjustDate(byDays: -2) } |
||||||
|
Divider() |
||||||
|
Button("24h après") { adjustDate(byDays: 1) } |
||||||
|
Button("48h après") { adjustDate(byDays: 2) } |
||||||
|
} label: { |
||||||
|
Text("Ajuster la date") |
||||||
|
.underline() |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,244 @@ |
|||||||
|
// |
||||||
|
// RegisrationSetupView.swift |
||||||
|
// PadelClub |
||||||
|
// |
||||||
|
// Created by razmig on 20/11/2024. |
||||||
|
// |
||||||
|
|
||||||
|
import SwiftUI |
||||||
|
import LeStorage |
||||||
|
|
||||||
|
struct RegisrationSetupView: View { |
||||||
|
@EnvironmentObject var dataStore: DataStore |
||||||
|
@Bindable var tournament: Tournament |
||||||
|
@State private var enableOnlineRegistration: Bool |
||||||
|
@State private var registrationDateLimit: Date |
||||||
|
@State private var openingRegistrationDate: Date |
||||||
|
@State private var targetTeamCount: Int |
||||||
|
@State private var waitingListLimit: Int |
||||||
|
@State private var registrationDateLimitEnabled: Bool |
||||||
|
@State private var targetTeamCountEnabled: Bool |
||||||
|
@State private var waitingListLimitEnabled: Bool |
||||||
|
@State private var openingRegistrationDateEnabled: Bool |
||||||
|
@State private var hasChanges: Bool = false |
||||||
|
|
||||||
|
@Environment(\.dismiss) private var dismiss |
||||||
|
|
||||||
|
init(tournament: Tournament) { |
||||||
|
self.tournament = tournament |
||||||
|
_enableOnlineRegistration = .init(wrappedValue: tournament.enableOnlineRegistration) |
||||||
|
|
||||||
|
// Registration Date Limit |
||||||
|
if let registrationDateLimit = tournament.registrationDateLimit { |
||||||
|
_registrationDateLimit = .init(wrappedValue: registrationDateLimit) |
||||||
|
_registrationDateLimitEnabled = .init(wrappedValue: true) |
||||||
|
} else { |
||||||
|
_registrationDateLimit = .init(wrappedValue: tournament.startDate.truncateMinutesAndSeconds()) |
||||||
|
_registrationDateLimitEnabled = .init(wrappedValue: false) |
||||||
|
} |
||||||
|
|
||||||
|
// Opening Registration Date |
||||||
|
if let openingRegistrationDate = tournament.openingRegistrationDate { |
||||||
|
_openingRegistrationDate = .init(wrappedValue: openingRegistrationDate) |
||||||
|
_openingRegistrationDateEnabled = .init(wrappedValue: true) |
||||||
|
} else { |
||||||
|
_openingRegistrationDate = .init(wrappedValue: tournament.creationDate.truncateMinutesAndSeconds()) |
||||||
|
_openingRegistrationDateEnabled = .init(wrappedValue: false) |
||||||
|
} |
||||||
|
|
||||||
|
// Target Team Count |
||||||
|
if let targetTeamCount = tournament.targetTeamCount { |
||||||
|
_targetTeamCount = .init(wrappedValue: targetTeamCount) |
||||||
|
_targetTeamCountEnabled = .init(wrappedValue: true) |
||||||
|
} else { |
||||||
|
_targetTeamCount = .init(wrappedValue: tournament.teamCount) // Default value |
||||||
|
_targetTeamCountEnabled = .init(wrappedValue: false) |
||||||
|
} |
||||||
|
|
||||||
|
// Waiting List Limit |
||||||
|
if let waitingListLimit = tournament.waitingListLimit { |
||||||
|
_waitingListLimit = .init(wrappedValue: waitingListLimit) |
||||||
|
_waitingListLimitEnabled = .init(wrappedValue: true) |
||||||
|
} else { |
||||||
|
_waitingListLimit = .init(wrappedValue: 0) // Default value |
||||||
|
_waitingListLimitEnabled = .init(wrappedValue: false) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
var body: some View { |
||||||
|
List { |
||||||
|
Section { |
||||||
|
Toggle(isOn: $enableOnlineRegistration) { |
||||||
|
Text("Inscription en ligne") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if enableOnlineRegistration { |
||||||
|
|
||||||
|
Section { |
||||||
|
Toggle(isOn: $openingRegistrationDateEnabled) { |
||||||
|
Text("Date d'ouverture des inscriptions") |
||||||
|
} |
||||||
|
|
||||||
|
if openingRegistrationDateEnabled { |
||||||
|
DatePicker(selection: $openingRegistrationDate, in: tournament.creationDate.truncateMinutesAndSeconds()...tournament.startDate.truncateMinutesAndSeconds()) { |
||||||
|
DateMenuView(date: $openingRegistrationDate) |
||||||
|
} |
||||||
|
} |
||||||
|
} header: { |
||||||
|
Text("Date d'ouverture des inscriptions") |
||||||
|
} footer: { |
||||||
|
Text("Activez et définissez une date d'ouverture pour les inscriptions au tournoi.") |
||||||
|
} |
||||||
|
|
||||||
|
Section { |
||||||
|
Toggle(isOn: $registrationDateLimitEnabled) { |
||||||
|
Text("Activer une limite") |
||||||
|
} |
||||||
|
|
||||||
|
if registrationDateLimitEnabled { |
||||||
|
DatePicker(selection: $registrationDateLimit, in: tournament.creationDate.truncateMinutesAndSeconds()...tournament.startDate.truncateMinutesAndSeconds()) { |
||||||
|
DateMenuView(date: $registrationDateLimit) |
||||||
|
} |
||||||
|
} |
||||||
|
} header: { |
||||||
|
Text("Date de fermeture des inscriptions") |
||||||
|
} footer: { |
||||||
|
Text("Activez et définissez une date limite pour l'inscription en ligne.") |
||||||
|
} |
||||||
|
|
||||||
|
Section { |
||||||
|
Toggle(isOn: $targetTeamCountEnabled) { |
||||||
|
Text("Nombre d'équipes cible") |
||||||
|
} |
||||||
|
|
||||||
|
if targetTeamCountEnabled { |
||||||
|
StepperView(count: $targetTeamCount, minimum: 4) |
||||||
|
} |
||||||
|
} header: { |
||||||
|
Text("Nombre d'équipes cible") |
||||||
|
} footer: { |
||||||
|
Text("Activez et définissez le nombre d'équipes cible pour le tournoi.") |
||||||
|
} |
||||||
|
|
||||||
|
Section { |
||||||
|
Toggle(isOn: $waitingListLimitEnabled) { |
||||||
|
Text("Limite de la liste d'attente") |
||||||
|
} |
||||||
|
|
||||||
|
if waitingListLimitEnabled { |
||||||
|
StepperView(count: $waitingListLimit, minimum: 0) |
||||||
|
} |
||||||
|
} header: { |
||||||
|
Text("Limite de la liste d'attente") |
||||||
|
} footer: { |
||||||
|
Text("Activez et définissez une limite pour la liste d'attente des équipes.") |
||||||
|
} |
||||||
|
} else { |
||||||
|
ContentUnavailableView( |
||||||
|
"Activez les inscriptions en ligne", |
||||||
|
systemImage: "person.2.crop.square.stack.fill", |
||||||
|
description: Text("Permettez aux joueurs de s'inscrire eux-mêmes à ce tournoi. Les équipes inscrites apparaîtront automatiquement dans la liste de l'arbitre. L'inscription en ligne requiert un email de contact et une licence FFT.") |
||||||
|
) |
||||||
|
} |
||||||
|
} |
||||||
|
.toolbar(content: { |
||||||
|
if hasChanges { |
||||||
|
ToolbarItem(placement: .topBarLeading) { |
||||||
|
Button("Annuler", role: .cancel) { |
||||||
|
dismiss() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
ToolbarItem(placement: .topBarTrailing) { |
||||||
|
ButtonValidateView(role: .destructive) { |
||||||
|
_save() |
||||||
|
dismiss() |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}) |
||||||
|
.toolbarRole(.editor) |
||||||
|
.headerProminence(.increased) |
||||||
|
.navigationTitle("Inscription en ligne") |
||||||
|
.navigationBarTitleDisplayMode(.inline) |
||||||
|
.toolbarBackground(.visible, for: .navigationBar) |
||||||
|
.navigationBarBackButtonHidden(hasChanges) |
||||||
|
.onChange(of: enableOnlineRegistration, { |
||||||
|
_hasChanged() |
||||||
|
}) |
||||||
|
.onChange(of: openingRegistrationDateEnabled) { |
||||||
|
_hasChanged() |
||||||
|
} |
||||||
|
|
||||||
|
.onChange(of: openingRegistrationDate) { |
||||||
|
_hasChanged() |
||||||
|
} |
||||||
|
|
||||||
|
.onChange(of: registrationDateLimitEnabled) { |
||||||
|
_hasChanged() |
||||||
|
} |
||||||
|
|
||||||
|
.onChange(of: registrationDateLimit) { |
||||||
|
_hasChanged() |
||||||
|
} |
||||||
|
|
||||||
|
.onChange(of: targetTeamCountEnabled) { |
||||||
|
_hasChanged() |
||||||
|
} |
||||||
|
|
||||||
|
.onChange(of: targetTeamCount) { |
||||||
|
_hasChanged() |
||||||
|
} |
||||||
|
|
||||||
|
.onChange(of: waitingListLimitEnabled) { |
||||||
|
_hasChanged() |
||||||
|
} |
||||||
|
|
||||||
|
.onChange(of: waitingListLimit) { |
||||||
|
_hasChanged() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private func _hasChanged() { |
||||||
|
hasChanges = true |
||||||
|
} |
||||||
|
|
||||||
|
private func _save() { |
||||||
|
hasChanges = false |
||||||
|
|
||||||
|
tournament.enableOnlineRegistration = enableOnlineRegistration |
||||||
|
|
||||||
|
if openingRegistrationDateEnabled == false { |
||||||
|
tournament.openingRegistrationDate = nil |
||||||
|
} else { |
||||||
|
tournament.openingRegistrationDate = openingRegistrationDate |
||||||
|
} |
||||||
|
|
||||||
|
if registrationDateLimitEnabled == false { |
||||||
|
tournament.registrationDateLimit = nil |
||||||
|
} else { |
||||||
|
tournament.registrationDateLimit = registrationDateLimit |
||||||
|
} |
||||||
|
|
||||||
|
if targetTeamCountEnabled == false { |
||||||
|
tournament.targetTeamCount = nil |
||||||
|
} else { |
||||||
|
tournament.targetTeamCount = targetTeamCount |
||||||
|
} |
||||||
|
|
||||||
|
if waitingListLimitEnabled == false { |
||||||
|
tournament.waitingListLimit = nil |
||||||
|
} else { |
||||||
|
tournament.waitingListLimit = waitingListLimit |
||||||
|
} |
||||||
|
|
||||||
|
do { |
||||||
|
try self.dataStore.tournaments.addOrUpdate(instance: tournament) |
||||||
|
} catch { |
||||||
|
Logger.error(error) |
||||||
|
} |
||||||
|
|
||||||
|
dismiss() |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue