From ae58efd2f70f320b3154f24dccb2bce135947642 Mon Sep 17 00:00:00 2001 From: Razmig Sarkissian Date: Fri, 4 Jul 2025 10:01:17 +0200 Subject: [PATCH] fix loserbracket missing from pdf --- PadelClub.xcodeproj/project.pbxproj | 4 +- PadelClub/Utils/HtmlGenerator.swift | 2 +- PadelClub/Utils/HtmlService.swift | 22 +++- .../Tournament/Screen/PrintSettingsView.swift | 122 +++++++++--------- 4 files changed, 87 insertions(+), 63 deletions(-) diff --git a/PadelClub.xcodeproj/project.pbxproj b/PadelClub.xcodeproj/project.pbxproj index 9cadd62..5cf11b1 100644 --- a/PadelClub.xcodeproj/project.pbxproj +++ b/PadelClub.xcodeproj/project.pbxproj @@ -3137,7 +3137,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.43; + MARKETING_VERSION = 1.2.44; PRODUCT_BUNDLE_IDENTIFIER = app.padelclub; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -3183,7 +3183,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.43; + MARKETING_VERSION = 1.2.44; PRODUCT_BUNDLE_IDENTIFIER = app.padelclub; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/PadelClub/Utils/HtmlGenerator.swift b/PadelClub/Utils/HtmlGenerator.swift index cd61cc0..f91c736 100644 --- a/PadelClub/Utils/HtmlGenerator.swift +++ b/PadelClub/Utils/HtmlGenerator.swift @@ -189,7 +189,7 @@ class HtmlGenerator: ObservableObject { } var options: HtmlOptions { - HtmlOptions(headName: displayHeads, withRank: displayRank, withTeamIndex: displayTeamIndex, withScore: displayScore, withPlannedDate: displayPlannedDate) + HtmlOptions(headName: displayHeads, withRank: displayRank, withTeamIndex: displayTeamIndex, withScore: displayScore, withPlannedDate: displayPlannedDate, includeLoserBracket: includeLoserBracket) } var pdfURL: URL? { diff --git a/PadelClub/Utils/HtmlService.swift b/PadelClub/Utils/HtmlService.swift index 292f11f..dcc92dc 100644 --- a/PadelClub/Utils/HtmlService.swift +++ b/PadelClub/Utils/HtmlService.swift @@ -14,6 +14,7 @@ struct HtmlOptions { let withTeamIndex: Bool let withScore: Bool let withPlannedDate: Bool + let includeLoserBracket: Bool // Default initializer with all options defaulting to true init( @@ -21,13 +22,15 @@ struct HtmlOptions { withRank: Bool = true, withTeamIndex: Bool = true, withScore: Bool = true, - withPlannedDate: Bool = true + withPlannedDate: Bool = true, + includeLoserBracket: Bool = false ) { self.headName = headName self.withRank = withRank self.withTeamIndex = withTeamIndex self.withScore = withScore self.withPlannedDate = withPlannedDate + self.includeLoserBracket = includeLoserBracket } } @@ -308,6 +311,13 @@ enum HtmlService { var brackets = "" for round in tournament.rounds() { brackets = brackets.appending(HtmlService.bracket(round: round).html(options: options)) + + if options.includeLoserBracket { + if round.index == 1 { + let sub = HtmlService.loserBracket(upperRound: round, hideTitle: true).html(options: options) + template = template.appending(sub) + } + } } var winnerName = "" @@ -326,6 +336,16 @@ enum HtmlService { brackets = brackets.appending(winner) template = template.replacingOccurrences(of: "{{brackets}}", with: brackets) + + if options.includeLoserBracket { + for round in tournament.rounds() { + if round.index > 1 { + let sub = HtmlService.loserBracket(upperRound: round, hideTitle: true).html(options: options) + template = template.appending(sub) + } + } + } + return template } } diff --git a/PadelClub/Views/Tournament/Screen/PrintSettingsView.swift b/PadelClub/Views/Tournament/Screen/PrintSettingsView.swift index 3caae86..2cc6c92 100644 --- a/PadelClub/Views/Tournament/Screen/PrintSettingsView.swift +++ b/PadelClub/Views/Tournament/Screen/PrintSettingsView.swift @@ -50,11 +50,17 @@ struct PrintSettingsView: View { Toggle(isOn: $generator.includeBracket, label: { Text("Tableau") }) + .onChange(of: generator.includeBracket) { oldValue, newValue in + if newValue == false { + generator.includeLoserBracket = newValue + } + } Toggle(isOn: $generator.includeLoserBracket, label: { Text("Tableau des matchs de classements") }) - + .disabled(generator.includeBracket == false) + if tournament.groupStages().isEmpty == false { Toggle(isOn: $generator.includeGroupStage, label: { Text("Poules") @@ -62,71 +68,69 @@ struct PrintSettingsView: View { } } - if generator.includeBracket { - Section { - Picker(selection: $generator.zoomLevel) { - Text("1 page").tag(nil as Optional) - Text("50%").tag(2.0 as Optional) - Text("100%").tag(1.0 as Optional) - } label: { - Text("Zoom") - } - .onChange(of: generator.zoomLevel) { - if generator.zoomLevel == nil { - generator.landscape = false - } - } - - if generator.zoomLevel != nil { - Toggle(isOn: $generator.landscape, label: { - Text("Format paysage") - }) - } - - HStack { - Text("Nombre de page A4 à imprimer") - Spacer() - Text(generator.estimatedPageCount.formatted()) + Section { + Picker(selection: $generator.zoomLevel) { + Text("1 page").tag(nil as Optional) + Text("50%").tag(2.0 as Optional) + Text("100%").tag(1.0 as Optional) + } label: { + Text("Zoom") + } + .onChange(of: generator.zoomLevel) { + if generator.zoomLevel == nil { + generator.landscape = false } - } header: { - Text("Tableau principal") } - if generating == false { - RowButtonView("Générer le PDF", systemImage: "printer") { - await MainActor.run() { - self.generating = true - } - generator.preparePDF { result in - switch result { - case .success(true): - if generator.includeGroupStage && generator.groupStageIsReady == false && tournament.groupStages().isEmpty == false { - self.prepareGroupStage = true - self.generationGroupStageId = UUID() - } else { - self.presentShareView = true - self.generating = false - } - case .success(false): - print("didn't save pdf") - break - case .failure(let error): - print(error) - break + if generator.zoomLevel != nil { + Toggle(isOn: $generator.landscape, label: { + Text("Format paysage") + }) + } + + HStack { + Text("Nombre de page A4 à imprimer") + Spacer() + Text(generator.estimatedPageCount.formatted()) + } + } header: { + Text("Tableau principal") + } + + if generating == false { + RowButtonView("Générer le PDF", systemImage: "printer") { + await MainActor.run() { + self.generating = true + } + generator.preparePDF { result in + switch result { + case .success(true): + if generator.includeGroupStage && generator.groupStageIsReady == false && tournament.groupStages().isEmpty == false { + self.prepareGroupStage = true + self.generationGroupStageId = UUID() + } else { + self.presentShareView = true + self.generating = false } + case .success(false): + print("didn't save pdf") + break + case .failure(let error): + print(error) + break } - self.prepareGroupStage = false - self.generationId = UUID() - } - .disabled(generator.includeBracket == false && generator.includeGroupStage == false && generator.includeLoserBracket == false) - } else { - LabeledContent { - ProgressView() - } label: { - Text("Préparation du PDF") } - .id(generationId) + self.prepareGroupStage = false + self.generationId = UUID() + } + .disabled(generator.includeBracket == false && generator.includeGroupStage == false) + } else { + LabeledContent { + ProgressView() + } label: { + Text("Préparation du PDF") } + .id(generationId) } Section {