|
|
@@ -9,17 +9,18 @@ import SwiftUI
|
|
|
import SwiftData
|
|
|
internal import Combine
|
|
|
|
|
|
-struct AutosaveMenu: View {
|
|
|
+struct RotateContentMenu: View {
|
|
|
@Environment(\.modelContext) private var modelContext
|
|
|
@AppStorage(UserDefaultsKeys.WeekStart) private var weekStart = Date()
|
|
|
let inPreview = ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1"
|
|
|
|
|
|
@Query private var items: [Project]
|
|
|
- @Binding var hasAutosave: Bool
|
|
|
+ @Binding var rotate: RotateTracking
|
|
|
|
|
|
var body: some View {
|
|
|
Button("Save and Cleanup", systemImage: "arrow.3.trianglepath") {
|
|
|
- tryAutosave()
|
|
|
+ rotate.summary = RotateController().summarize(items)
|
|
|
+ rotate.manuallyInvoked = true
|
|
|
}
|
|
|
.keyboardShortcut("R", modifiers: [.command, .shift])
|
|
|
// .disabled(!shouldAutosave)
|
|
|
@@ -29,9 +30,8 @@ struct AutosaveMenu: View {
|
|
|
|
|
|
func tryAutosave() {
|
|
|
if shouldAutosave && !inPreview {
|
|
|
- saveAndCleanup(weekStart)
|
|
|
- weekStart = Date()
|
|
|
- hasAutosave = true
|
|
|
+ RotateController().saveAndRotate(items, &weekStart, &rotate)
|
|
|
+ rotate.hasTriggeredAutosave = true
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -41,34 +41,14 @@ struct AutosaveMenu: View {
|
|
|
matchingPolicy: .nextTime)!
|
|
|
}
|
|
|
|
|
|
- func ymd(_ date: Date) -> String {
|
|
|
- date.formatted(.iso8601.year().month().day())
|
|
|
- }
|
|
|
+ func ymd(_ date: Date) -> String { RotateController.ymd(date) }
|
|
|
|
|
|
var shouldAutosave: Bool {
|
|
|
ymd(Date()) > ymd(nextSunday(weekStart))
|
|
|
}
|
|
|
-
|
|
|
- func saveAndCleanup(_ date: Date) {
|
|
|
- SaveController().save(items, onDate: ymd(date))
|
|
|
-
|
|
|
- for item in items {
|
|
|
- item.tasks.removeAll(where: { $0.status == .complete })
|
|
|
- for task in item.tasks {
|
|
|
- if task.status == .inProgress {
|
|
|
- task.status = .todo
|
|
|
- }
|
|
|
-
|
|
|
- task.subtasks.removeAll(where: { $0.status == .complete })
|
|
|
- for subtask in task.subtasks where subtask.status == .inProgress {
|
|
|
- subtask.status = .todo
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
#Preview {
|
|
|
- @Previewable @State var hasAutosave = true
|
|
|
- AutosaveMenu(hasAutosave: $hasAutosave)
|
|
|
+ @Previewable @State var rotate = RotateTracking()
|
|
|
+ RotateContentMenu(rotate: $rotate)
|
|
|
}
|