add calendar item some actions

multistore
Razmig Sarkissian 2 years ago
parent 1a2de6aa5d
commit 59df5a2dd4
  1. 4
      PadelClub/Data/Tournament.swift
  2. 8
      PadelClub/Manager/Network/NetworkFederalService.swift
  3. 5
      PadelClub/Manager/PadelRule.swift
  4. 1
      PadelClub/ViewModel/NavigationViewModel.swift
  5. 45
      PadelClub/Views/Navigation/Agenda/ActivityView.swift
  6. 48
      PadelClub/Views/Navigation/Agenda/CalendarView.swift
  7. 37
      PadelClub/Views/Navigation/Agenda/EventListView.swift

@ -1148,6 +1148,10 @@ extension Tournament: FederalTournamentHolder {
} }
extension Tournament: TournamentBuildHolder { extension Tournament: TournamentBuildHolder {
func buildHolderTitle() -> String {
tournamentTitle()
}
var category: TournamentCategory { var category: TournamentCategory {
tournamentCategory tournamentCategory
} }

@ -92,7 +92,7 @@ class NetworkFederalService {
} }
func getClubFederalTournaments(page: Int, tournaments: [FederalTournament], club: String, codeClub: String, startDate: Date? = nil) async throws -> [FederalTournament] { func getClubFederalTournaments(page: Int, tournaments: [FederalTournament], club: String, codeClub: String, startDate: Date? = nil, endDate: Date? = nil) async throws -> [FederalTournament] {
if formId.isEmpty { if formId.isEmpty {
do { do {
@ -103,8 +103,10 @@ class NetworkFederalService {
} }
var dateComponent = "" var dateComponent = ""
if let startDate { if let startDate, let endDate {
dateComponent = "&date[start]=\(startDate.twoDigitsYearFormatted)" dateComponent = "&date[start]=\(startDate.twoDigitsYearFormatted)&date[end]=\(endDate.endOfMonth.twoDigitsYearFormatted)"
} else if let startDate {
dateComponent = "&date[start]=\(startDate.twoDigitsYearFormatted)&date[end]=\(Calendar.current.date(byAdding: .month, value: 3, to: startDate)!.endOfMonth.twoDigitsYearFormatted)"
} }
let parameters = """ let parameters = """

@ -29,6 +29,7 @@ protocol TournamentBuildHolder: Identifiable {
var category: TournamentCategory { get } var category: TournamentCategory { get }
var level: TournamentLevel { get } var level: TournamentLevel { get }
var age: FederalTournamentAge { get } var age: FederalTournamentAge { get }
func buildHolderTitle() -> String
} }
struct TournamentBuild: TournamentBuildHolder, Hashable, Codable, Identifiable { struct TournamentBuild: TournamentBuildHolder, Hashable, Codable, Identifiable {
@ -40,6 +41,10 @@ struct TournamentBuild: TournamentBuildHolder, Hashable, Codable, Identifiable {
// var japFirstName: String? = nil // var japFirstName: String? = nil
// var japLastName: String? = nil // var japLastName: String? = nil
func buildHolderTitle() -> String {
localizedLabel()
}
var identifier: String { var identifier: String {
level.localizedLabel()+":"+category.localizedLabel()+":"+age.localizedLabel() level.localizedLabel()+":"+category.localizedLabel()+":"+age.localizedLabel()
} }

@ -13,4 +13,5 @@ class NavigationViewModel {
var selectedTab: TabDestination? var selectedTab: TabDestination?
var agendaDestination: AgendaDestination? = .activity var agendaDestination: AgendaDestination? = .activity
var tournament: Tournament? var tournament: Tournament?
var federalTournaments: [FederalTournament] = []
} }

@ -17,9 +17,9 @@ struct ActivityView: View {
@State private var presentToolbar: Bool = false @State private var presentToolbar: Bool = false
@State private var newTournament: Tournament? @State private var newTournament: Tournament?
@State private var viewStyle: AgendaDestination.ViewStyle = .list @State private var viewStyle: AgendaDestination.ViewStyle = .list
@State private var federalTournaments: [FederalTournament] = []
@State private var isGatheringFederalTournaments: Bool = false @State private var isGatheringFederalTournaments: Bool = false
@State private var error: Error? @State private var error: Error?
@State private var uuid: UUID = UUID()
var runningTournaments: [FederalTournamentHolder] { var runningTournaments: [FederalTournamentHolder] {
dataStore.tournaments.filter({ $0.endDate == nil }) dataStore.tournaments.filter({ $0.endDate == nil })
@ -46,7 +46,7 @@ struct ActivityView: View {
case .history: case .history:
endedTournaments endedTournaments
case .tenup: case .tenup:
federalTournaments navigation.federalTournaments
} }
} }
@ -63,7 +63,8 @@ struct ActivityView: View {
case .history: case .history:
EventListView(tournaments: endedTournaments, viewStyle: viewStyle) EventListView(tournaments: endedTournaments, viewStyle: viewStyle)
case .tenup: case .tenup:
EventListView(tournaments: federalTournaments, viewStyle: viewStyle) EventListView(tournaments: navigation.federalTournaments, viewStyle: viewStyle)
.id(uuid)
} }
} }
.overlay { .overlay {
@ -109,21 +110,22 @@ struct ActivityView: View {
} }
.refreshable { .refreshable {
if navigation.agendaDestination == .tenup { if navigation.agendaDestination == .tenup {
federalTournaments.removeAll() navigation.federalTournaments.removeAll()
NetworkFederalService.shared.formId = ""
_gatherFederalTournaments() _gatherFederalTournaments()
} }
} }
.task { .task {
if navigation.agendaDestination == .tenup if navigation.agendaDestination == .tenup
&& dataStore.clubs.isEmpty == false && dataStore.clubs.isEmpty == false
&& federalTournaments.isEmpty { && navigation.federalTournaments.isEmpty {
_gatherFederalTournaments() _gatherFederalTournaments()
} }
} }
.onChange(of: navigation.agendaDestination) { .onChange(of: navigation.agendaDestination) {
if navigation.agendaDestination == .tenup if navigation.agendaDestination == .tenup
&& dataStore.clubs.isEmpty == false && dataStore.clubs.isEmpty == false
&& federalTournaments.isEmpty { && navigation.federalTournaments.isEmpty {
_gatherFederalTournaments() _gatherFederalTournaments()
} }
} }
@ -159,16 +161,15 @@ struct ActivityView: View {
} }
.symbolVariant(viewStyle == .calendar ? .fill : .none) .symbolVariant(viewStyle == .calendar ? .fill : .none)
// Button {
// Button { filterEnabled.toggle()
// filterEnabled.toggle() } label: {
// } label: { Image(systemName: "line.3.horizontal.decrease.circle")
// Image(systemName: "line.3.horizontal.decrease.circle") .resizable()
// .resizable() .scaledToFit()
// .scaledToFit() .frame(minHeight: 28)
// .frame(minHeight: 28) }
// } .symbolVariant(filterEnabled ? .fill : .none)
// .symbolVariant(filterEnabled ? .fill : .none)
} }
ToolbarItem(placement: .topBarTrailing) { ToolbarItem(placement: .topBarTrailing) {
@ -195,16 +196,23 @@ struct ActivityView: View {
private func _gatherFederalTournaments() { private func _gatherFederalTournaments() {
isGatheringFederalTournaments = true isGatheringFederalTournaments = true
NetworkFederalService.shared.formId = ""
Task { Task {
do { do {
try await dataStore.clubs.filter { $0.code != nil }.concurrentForEach { club in try await dataStore.clubs.filter { $0.code != nil }.concurrentForEach { club in
federalTournaments += try await NetworkFederalService.shared.getClubFederalTournaments(page: 0, tournaments: [], club: club.name, codeClub: club.code!, startDate: .now.startOfMonth) let newTournaments = try await NetworkFederalService.shared.getClubFederalTournaments(page: 0, tournaments: [], club: club.name, codeClub: club.code!, startDate: .now.startOfMonth)
newTournaments.forEach { tournament in
if navigation.federalTournaments.contains(where: { $0.id == tournament.id }) == false {
navigation.federalTournaments.append(tournament)
}
}
} }
} catch { } catch {
self.error = error self.error = error
} }
isGatheringFederalTournaments = false isGatheringFederalTournaments = false
uuid = UUID()
} }
} }
@ -269,6 +277,7 @@ struct ActivityView: View {
Text("Aucun tournoi n'a pu être récupéré via tenup.") Text("Aucun tournoi n'a pu être récupéré via tenup.")
} actions: { } actions: {
RowButtonView("Rafraîchir") { RowButtonView("Rafraîchir") {
NetworkFederalService.shared.formId = ""
_gatherFederalTournaments() _gatherFederalTournaments()
} }
} }

@ -13,6 +13,7 @@
import SwiftUI import SwiftUI
struct CalendarView: View { struct CalendarView: View {
@EnvironmentObject var dataStore: DataStore
@Environment(NavigationViewModel.self) var navigation: NavigationViewModel @Environment(NavigationViewModel.self) var navigation: NavigationViewModel
let date: Date let date: Date
let tournaments: [FederalTournamentHolder] let tournaments: [FederalTournamentHolder]
@ -68,12 +69,29 @@ struct CalendarView: View {
newTournament = tournament newTournament = tournament
} }
let tournamentsByDay = tournaments.filter { $0.startDate.dayInt == day.dayInt } Divider()
let tournamentsByDay = tournaments.filter { day.dayInt >= $0.startDate.dayInt && day.dayInt < $0.startDate.dayInt + $0.dayDuration }
ForEach(tournamentsByDay, id: \.holderId) { tournamentHolder in ForEach(tournamentsByDay, id: \.holderId) { tournamentHolder in
if let tournament = tournamentHolder as? Tournament { if let tournament = tournamentHolder as? Tournament {
Section {
Button(tournament.tournamentTitle()) { Button(tournament.tournamentTitle()) {
navigation.path.append(tournament) navigation.path.append(tournament)
} }
} header: {
Text("sur " + tournament.dayDuration.formatted() + " jour" + tournament.dayDuration.pluralSuffix)
}
} else if let tournament = tournamentHolder as? FederalTournament {
Menu {
ForEach(tournament.tournaments, id: \.id) { build in
Button(build.buildHolderTitle()) {
_createOrShow(federalTournament: tournament, existingTournament: event(forTournament: tournament)?.existingBuild(build), build: build)
}
}
} label: {
Text(tournament.clubLabel())
Text("sur " + tournament.dayDuration.formatted() + " jour" + tournament.dayDuration.pluralSuffix)
}
} }
} }
} label: { } label: {
@ -116,6 +134,34 @@ struct CalendarView: View {
} }
counts = Dictionary(mappedItems, uniquingKeysWith: +) counts = Dictionary(mappedItems, uniquingKeysWith: +)
} }
func event(forTournament tournament: FederalTournamentHolder) -> Event? {
guard let federalTournament = tournament as? FederalTournament else { return nil }
return dataStore.events.first(where: { $0.tenupId == federalTournament.id.string })
}
private func _createOrShow(federalTournament: FederalTournament, existingTournament: Tournament?, build: any TournamentBuildHolder) {
if let existingTournament {
navigation.agendaDestination = .activity
navigation.path.append(existingTournament)
} else {
let event = federalTournament.getEvent()
let newTournament = Tournament.newEmptyInstance()
newTournament.event = event.id
//todo
//newTournament.umpireMail()
//newTournament.jsonData = jsonData
newTournament.tournamentLevel = build.level
newTournament.tournamentCategory = build.category
newTournament.federalTournamentAge = build.age
newTournament.dayDuration = federalTournament.dayDuration
newTournament.startDate = federalTournament.startDate.atBeginningOfDay(hourInt: 9)
newTournament.setupFederalSettings()
try? dataStore.tournaments.addOrUpdate(instance: newTournament)
navigation.path.append(newTournament)
}
}
} }
#Preview { #Preview {

@ -9,23 +9,21 @@ import SwiftUI
struct EventListView: View { struct EventListView: View {
@EnvironmentObject var dataStore: DataStore @EnvironmentObject var dataStore: DataStore
@Environment(NavigationViewModel.self) var navigation: NavigationViewModel
let tournaments: [FederalTournamentHolder] let tournaments: [FederalTournamentHolder]
let viewStyle: AgendaDestination.ViewStyle let viewStyle: AgendaDestination.ViewStyle
var groupedTournamentsByDate: Dictionary<Date, [FederalTournamentHolder]> {
Dictionary(grouping: navigation.agendaDestination == .tenup ? navigation.federalTournaments : tournaments) { $0.startDate.startOfMonth }
}
var body: some View { var body: some View {
let groupedTournamentsByDate = Dictionary(grouping: tournaments) { $0.startDate.startOfMonth }
switch viewStyle { switch viewStyle {
case .list: case .list:
ForEach(groupedTournamentsByDate.keys.sorted(by: <), id: \.self) { section in ForEach(groupedTournamentsByDate.keys.sorted(by: <), id: \.self) { section in
if let _tournaments = groupedTournamentsByDate[section]?.sorted(by: \.startDate) { if let _tournaments = groupedTournamentsByDate[section]?.sorted(by: \.startDate) {
Section { Section {
switch viewStyle {
case .list:
_listView(_tournaments) _listView(_tournaments)
case .calendar:
CalendarView(date: section, tournaments: _tournaments)
}
} header: { } header: {
HStack { HStack {
Text(section.monthYearFormatted) Text(section.monthYearFormatted)
@ -51,7 +49,34 @@ struct EventListView: View {
} }
} }
.headerProminence(.increased) .headerProminence(.increased)
.task {
if navigation.agendaDestination == .tenup
&& dataStore.clubs.isEmpty == false
&& _tournaments.isEmpty {
_gatherFederalTournaments(startDate: section)
}
}
}
}
}
private func _gatherFederalTournaments(startDate: Date) {
// isGatheringFederalTournaments = true
Task {
do {
try await dataStore.clubs.filter { $0.code != nil }.concurrentForEach { club in
let newTournaments = try await NetworkFederalService.shared.getClubFederalTournaments(page: 0, tournaments: [], club: club.name, codeClub: club.code!, startDate: startDate, endDate: startDate.endOfMonth)
newTournaments.forEach { tournament in
if navigation.federalTournaments.contains(where: { $0.id == tournament.id }) == false {
navigation.federalTournaments.append(tournament)
}
}
}
} catch {
// self.error = error
} }
// isGatheringFederalTournaments = false
} }
} }

Loading…
Cancel
Save