Add PDF maintenance report generation feature for Android and iOS
- Add generateTasksReport API endpoint in ResidenceApi - Implement report generation button in Android residence detail screen - Add report generation state management in shared ResidenceViewModel - Add report generation button to iOS residence detail view toolbar - Implement iOS-specific report generation logic in ResidenceViewModel - Display loading spinner and success/error alerts for report generation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -15,6 +15,7 @@ struct ResidenceDetailView: View {
|
||||
@State private var selectedTaskForEdit: TaskDetail?
|
||||
@State private var selectedTaskForComplete: TaskDetail?
|
||||
@State private var hasAppeared = false
|
||||
@State private var showReportAlert = false
|
||||
|
||||
var body: some View {
|
||||
ZStack {
|
||||
@@ -105,6 +106,20 @@ struct ResidenceDetailView: View {
|
||||
}
|
||||
|
||||
ToolbarItemGroup(placement: .navigationBarTrailing) {
|
||||
// Generate Report button
|
||||
if viewModel.selectedResidence != nil {
|
||||
Button(action: {
|
||||
viewModel.generateTasksReport(residenceId: residenceId)
|
||||
}) {
|
||||
if viewModel.isGeneratingReport {
|
||||
ProgressView()
|
||||
} else {
|
||||
Image(systemName: "doc.text")
|
||||
}
|
||||
}
|
||||
.disabled(viewModel.isGeneratingReport)
|
||||
}
|
||||
|
||||
// Manage Users button - only show for primary owners
|
||||
if let residence = viewModel.selectedResidence, residence.isPrimaryOwner {
|
||||
Button(action: {
|
||||
@@ -164,6 +179,16 @@ struct ResidenceDetailView: View {
|
||||
loadResidenceTasks()
|
||||
}
|
||||
}
|
||||
.onChange(of: viewModel.reportMessage) { message in
|
||||
if message != nil {
|
||||
showReportAlert = true
|
||||
}
|
||||
}
|
||||
.alert("Maintenance Report", isPresented: $showReportAlert) {
|
||||
Button("OK", role: .cancel) { }
|
||||
} message: {
|
||||
Text(viewModel.reportMessage ?? "")
|
||||
}
|
||||
.onAppear {
|
||||
loadResidenceData()
|
||||
}
|
||||
|
||||
@@ -10,6 +10,8 @@ class ResidenceViewModel: ObservableObject {
|
||||
@Published var selectedResidence: Residence?
|
||||
@Published var isLoading: Bool = false
|
||||
@Published var errorMessage: String?
|
||||
@Published var isGeneratingReport: Bool = false
|
||||
@Published var reportMessage: String?
|
||||
|
||||
// MARK: - Private Properties
|
||||
private let residenceApi: ResidenceApi
|
||||
@@ -144,6 +146,31 @@ class ResidenceViewModel: ObservableObject {
|
||||
}
|
||||
}
|
||||
|
||||
func generateTasksReport(residenceId: Int32, email: String? = nil) {
|
||||
guard let token = tokenStorage.getToken() else {
|
||||
reportMessage = "Not authenticated"
|
||||
return
|
||||
}
|
||||
|
||||
isGeneratingReport = true
|
||||
reportMessage = nil
|
||||
|
||||
residenceApi.generateTasksReport(token: token, residenceId: residenceId, email: email) { result, error in
|
||||
defer { self.isGeneratingReport = false }
|
||||
if let successResult = result as? ApiResultSuccess<GenerateReportResponse> {
|
||||
if let response = successResult.data {
|
||||
self.reportMessage = response.message
|
||||
} else {
|
||||
self.reportMessage = "Report generated, but no message returned."
|
||||
}
|
||||
} else if let errorResult = result as? ApiResultError {
|
||||
self.reportMessage = errorResult.message
|
||||
} else if let error = error {
|
||||
self.reportMessage = error.localizedDescription
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func clearError() {
|
||||
errorMessage = nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user