ProjectPanelView.swift 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. //
  2. // ProjectPanelView.swift
  3. // Todos
  4. //
  5. // Created by Sam Jaffe on 2/28/26.
  6. //
  7. import SwiftUI
  8. import SwiftData
  9. struct ProjectPanelView: View {
  10. @Environment(\.modelContext) private var modelContext
  11. @AppStorage(UserDefaultsKeys.Category) var allGroups = CodableArray<Category>()
  12. @Bindable var item: Project
  13. @State private var empty = Category()
  14. @Binding var isMoveMode: Bool
  15. var body: some View {
  16. let style = Date.FormatStyle(date: .numeric, time: .standard)
  17. HStack {
  18. TextField("", text: $item.name)
  19. .font(.title)
  20. .padding(.leading, 10)
  21. Spacer()
  22. Button(action: addItem) {
  23. Image(systemName: "plus")
  24. }
  25. .help("New Task")
  26. .padding(.trailing, 10)
  27. }
  28. HStack {
  29. if let grp = $allGroups.first(where: { $0.name.wrappedValue == item.category }) {
  30. ColorPicker("", selection: grp.color).disabled(true).scaledToFit()
  31. }
  32. Picker("", selection: $item.category) {
  33. Text(empty.name).tag("")
  34. ForEach(allGroups) { group in
  35. Text(group.name)
  36. }
  37. }.help("Default category for new Tasks")
  38. Text("Created on \(item.timestamp, format: style)")
  39. }
  40. VStack {
  41. ForEach($item.tasks) { task in
  42. TaskView(task: task, isMoveMode: $isMoveMode)
  43. }
  44. }
  45. }
  46. private func addItem() {
  47. withAnimation {
  48. let newTask = Task(name: "New Task", parent: item)
  49. modelContext.insert(newTask)
  50. item.tasks.append(newTask)
  51. }
  52. }
  53. }
  54. #Preview {
  55. @Previewable @State var isMoveMode = false
  56. @Previewable @State var item = Project(timestamp: Date())
  57. ProjectPanelView(item: item, isMoveMode: $isMoveMode)
  58. }