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