From b4e267f695ce5c6185c3f4d36ca3c4bfb6151de7 Mon Sep 17 00:00:00 2001 From: Raz Date: Mon, 23 Dec 2024 15:06:34 +0100 Subject: [PATCH] fix online reg --- PadelClub/Utils/Tips.swift | 2 +- PadelClub/Views/Components/StepperView.swift | 31 ++++++++++++--- .../Views/Shared/ImportedPlayerView.swift | 3 ++ .../Views/Tournament/FileImportView.swift | 2 +- .../Screen/InscriptionManagerView.swift | 22 +++-------- .../Screen/RegistrationSetupView.swift | 8 +++- .../Screen/TableStructureView.swift | 39 +++++++++++++------ 7 files changed, 71 insertions(+), 36 deletions(-) diff --git a/PadelClub/Utils/Tips.swift b/PadelClub/Utils/Tips.swift index 6a49ad2..0faba01 100644 --- a/PadelClub/Utils/Tips.swift +++ b/PadelClub/Utils/Tips.swift @@ -600,7 +600,7 @@ struct ShouldTournamentBeOverTip: Tip { } var message: Text? { - Text("Le dernier match est terminé depuis plus de 2 heures. Si le tournoi a été annulé pour cause de météo vous pouvez l'indiquer comme 'Annulé' dans le menu 􀍡, si ce n'est pas le cas, saisissez les scores manquants pour clôturer automatiquement le tournoi et publier le classement final.") + Text("Le dernier match est terminé depuis plus de 2 heures. Si le tournoi a été annulé pour cause de météo vous pouvez l'indiquer comme 'Annulé' dans le menu en haut à droite, si ce n'est pas le cas, saisissez les scores manquants pour clôturer automatiquement le tournoi et publier le classement final.") } var image: Image? { diff --git a/PadelClub/Views/Components/StepperView.swift b/PadelClub/Views/Components/StepperView.swift index 23f3108..aadca52 100644 --- a/PadelClub/Views/Components/StepperView.swift +++ b/PadelClub/Views/Components/StepperView.swift @@ -16,6 +16,8 @@ struct StepperView: View { var maximum: Int? = nil var countChanged: (() -> ())? = nil + var submitFollowUpAction: (() -> ())? = nil + @FocusState private var amountIsFocused: Bool var body: some View { VStack { @@ -32,17 +34,14 @@ struct StepperView: View { .buttonStyle(.borderless) TextField("00", value: $count, format: .number) + .focused($amountIsFocused) .keyboardType(.numberPad) .fixedSize() // .font(.title2) .monospacedDigit() .multilineTextAlignment(.center) .onSubmit { - if let minimum, count < minimum { - count = minimum - } else if let maximum, count > maximum { - count = maximum - } + _validate() } Button(action: { self._add() @@ -60,6 +59,28 @@ struct StepperView: View { } } .multilineTextAlignment(.trailing) + .toolbar { + ToolbarItem(placement: .keyboard) { + if amountIsFocused { + HStack { + Spacer() + Button("Confirmer") { + amountIsFocused = false + _validate() + } + } + } + } + } + } + + fileprivate func _validate() { + if let minimum, count < minimum { + count = minimum + } else if let maximum, count > maximum { + count = maximum + } + submitFollowUpAction?() } fileprivate func _minusIsDisabled() -> Bool { diff --git a/PadelClub/Views/Shared/ImportedPlayerView.swift b/PadelClub/Views/Shared/ImportedPlayerView.swift index f81ae56..4843241 100644 --- a/PadelClub/Views/Shared/ImportedPlayerView.swift +++ b/PadelClub/Views/Shared/ImportedPlayerView.swift @@ -114,5 +114,8 @@ struct ImportedPlayerView: View { } } } + .contextMenu { + CopyPasteButtonView(pasteValue: player.formattedLicense()) + } } } diff --git a/PadelClub/Views/Tournament/FileImportView.swift b/PadelClub/Views/Tournament/FileImportView.swift index a25219b..500d7dc 100644 --- a/PadelClub/Views/Tournament/FileImportView.swift +++ b/PadelClub/Views/Tournament/FileImportView.swift @@ -140,7 +140,7 @@ struct FileImportView: View { } } - if tournament.unsortedTeams().count > 0 { + if tournament.unsortedTeams().count > 0, tournament.enableOnlineRegistration == false { RowButtonView("Effacer les équipes déjà inscrites", role: .destructive) { await _deleteTeams() } diff --git a/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift b/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift index 2a96c5b..76f3089 100644 --- a/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift +++ b/PadelClub/Views/Tournament/Screen/InscriptionManagerView.swift @@ -536,20 +536,10 @@ struct InscriptionManagerView: View { refreshStatus = nil refreshInProgress = true do { + try await self.tournamentStore.playerRegistrations.loadDataFromServerIfAllowed(clear: true) + try await self.tournamentStore.teamScores.loadDataFromServerIfAllowed(clear: true) + try await self.tournamentStore.teamRegistrations.loadDataFromServerIfAllowed(clear: true) - let storeIdentifier = StoreIdentifier(value: tournament.id, parameterName: "tournament") - let serverPlayers: [PlayerRegistration] = try await StoreCenter.main.service().get(identifier: storeIdentifier) - let serverTeamScores: [TeamScore] = try await StoreCenter.main.service().get(identifier: storeIdentifier) - let serverTeams: [TeamRegistration] = try await StoreCenter.main.service().get(identifier: storeIdentifier) - - self.tournamentStore.playerRegistrations.reset() - self.tournamentStore.teamScores.reset() - self.tournamentStore.teamRegistrations.reset() - - try self.tournamentStore.playerRegistrations.addOrUpdate(contentOfs: serverPlayers) - try self.tournamentStore.teamScores.addOrUpdate(contentOfs: serverTeamScores) - try self.tournamentStore.teamRegistrations.addOrUpdate(contentOfs: serverTeams) - _setHash() self.refreshResult = "la synchronization a réussi" @@ -613,11 +603,11 @@ struct InscriptionManagerView: View { } label: { TeamRowView(team: team) } - #if DEBUG .swipeActions(edge: .trailing, allowsFullSwipe: true) { - _teamDeleteButtonView(team) + if tournament.enableOnlineRegistration == false { + _teamDeleteButtonView(team) + } } - #endif .listRowView(isActive: true, color: team.initialRoundColor() ?? tournament.cutLabelColor(index: teamIndex, teamCount: filterMode == .waiting ? 0 : selectedSortedTeams.count), hideColorVariation: true) } } header: { diff --git a/PadelClub/Views/Tournament/Screen/RegistrationSetupView.swift b/PadelClub/Views/Tournament/Screen/RegistrationSetupView.swift index 7bd44eb..f279b67 100644 --- a/PadelClub/Views/Tournament/Screen/RegistrationSetupView.swift +++ b/PadelClub/Views/Tournament/Screen/RegistrationSetupView.swift @@ -84,8 +84,14 @@ struct RegistrationSetupView: View { if enableOnlineRegistration { if let shareURL = tournament.shareURL(.info) { Section { + Text(shareURL.absoluteString) + ShareLink(item: shareURL) { - Text(shareURL.absoluteString) + Text("Partager le lien") + } + + Link(destination: shareURL) { + Text("Ouvrir le lien") } } header: { Text("Page d'inscription") diff --git a/PadelClub/Views/Tournament/Screen/TableStructureView.swift b/PadelClub/Views/Tournament/Screen/TableStructureView.swift index 93c95cc..a72e616 100644 --- a/PadelClub/Views/Tournament/Screen/TableStructureView.swift +++ b/PadelClub/Views/Tournament/Screen/TableStructureView.swift @@ -83,12 +83,20 @@ struct TableStructureView: View { Section { LabeledContent { - StepperView(count: $teamCount, minimum: 4, maximum: 128) + StepperView(count: $teamCount, minimum: 4, maximum: 128) { + + } submitFollowUpAction: { + _verifyValueIntegrity() + } } label: { Text("Nombre d'équipes") } LabeledContent { - StepperView(count: $groupStageCount, minimum: 0, maximum: maxGroupStages) + StepperView(count: $groupStageCount, minimum: 0, maximum: maxGroupStages) { + + } submitFollowUpAction: { + _verifyValueIntegrity() + } } label: { Text("Nombre de poules") } @@ -100,21 +108,33 @@ struct TableStructureView: View { if (teamCount / groupStageCount) > 1 { Section { LabeledContent { - StepperView(count: $teamsPerGroupStage, minimum: 2, maximum: (teamCount / groupStageCount)) + StepperView(count: $teamsPerGroupStage, minimum: 2, maximum: (teamCount / groupStageCount)) { + + } submitFollowUpAction: { + _verifyValueIntegrity() + } } label: { Text("Équipes par poule") } if structurePreset != .doubleGroupStage { LabeledContent { - StepperView(count: $qualifiedPerGroupStage, minimum: 0, maximum: (teamsPerGroupStage-1)) + StepperView(count: $qualifiedPerGroupStage, minimum: 0, maximum: (teamsPerGroupStage-1)) { + + } submitFollowUpAction: { + _verifyValueIntegrity() + } } label: { Text("Qualifié\(qualifiedPerGroupStage.pluralSuffix) par poule") } if qualifiedPerGroupStage < teamsPerGroupStage - 1 { LabeledContent { - StepperView(count: $groupStageAdditionalQualified, minimum: 0, maximum: maxMoreQualified) + StepperView(count: $groupStageAdditionalQualified, minimum: 0, maximum: maxMoreQualified) { + + } submitFollowUpAction: { + _verifyValueIntegrity() + } } label: { Text("Qualifié\(groupStageAdditionalQualified.pluralSuffix) supplémentaires") Text(moreQualifiedLabel) @@ -311,14 +331,9 @@ struct TableStructureView: View { updatedElements.insert(.groupStageAdditionalQualified) } else { updatedElements.remove(.groupStageAdditionalQualified) - } } - .toolbar { - ToolbarItem(placement: .keyboard) { - Button("Confirmer") { - stepperFieldIsFocused = false - _verifyValueIntegrity() - } } + } + .toolbar { ToolbarItem(placement: .confirmationAction) { if tournament.state() == .initial { ButtonValidateView {