| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- //
- // ProjectPanelView.swift
- // Todos
- //
- // Created by Sam Jaffe on 2/28/26.
- //
- import SwiftUI
- import SwiftData
- struct ProjectPanelView: View {
- @Environment(\.modelContext) private var modelContext
- @AppStorage(UserDefaultsKeys.Category) var allGroups = CodableArray<Category>()
- @Bindable var item: Project
- @State private var empty = Category()
- @State private var move = false
- var body: some View {
- HStack {
- TextField("", text: $item.name)
- .font(.title)
- .padding(.leading, 10)
- Spacer()
- Button(action: addItem) {
- Image(systemName: "plus")
- }
- .help("New Task")
- .padding(.trailing, 10)
- Toggle("Move Tasks", isOn: $move)
- .padding(.trailing, 10)
- }
- HStack {
- if let grp = $allGroups.first(where: { $0.name.wrappedValue == item.category }) {
- ColorPicker("", selection: grp.color).disabled(true).scaledToFit()
- }
- Picker("", selection: $item.category) {
- Text(empty.name).tag("")
- ForEach(allGroups) { group in
- Text(group.name)
- }
- }.help("Default category for new Tasks")
- }
- List {
- ForEach($item.tasks.sorted(by: Task.less)) { task in
- TaskView(task: task)
- .swipeActions {
- Button("Delete", systemImage: "trash", role: .destructive) {
- deleteItem(item: task.wrappedValue, from: item)
- }
- }
- ForEach(task.subtasks.sorted(by: SubTask.less)) { subtask in
- SubTaskView(task: subtask)
- .swipeActions {
- Button("Delete", systemImage: "trash", role: .destructive) {
- deleteItem(item: subtask.wrappedValue, from: task.wrappedValue)
- }
- }
- }
- .onMove(perform: { moveItem(task.wrappedValue, $0, $1) })
- .moveDisabled(!move)
- }
- .onMove(perform: { moveItem(item, $0, $1) })
- .moveDisabled(!move)
- }
- }
- private func addItem() {
- withAnimation {
- let newTask = Task(name: "New Task", parent: item)
- modelContext.insert(newTask)
- item.tasks.append(newTask)
- }
- }
- private func moveItem(_ within: any Aggregate, _ fromOffsets: IndexSet, _ toOffset: Int) {
- withAnimation {
- within.move(fromOffsets: fromOffsets, toOffset: toOffset)
- }
- }
- private func deleteItem<T: Aggregate>(item: T.Element, from: T) where T.Element: PersistentModel {
- withAnimation {
- from.remove(item)
- modelContext.delete(item)
- }
- }
- }
- #Preview {
- @Previewable @State var item = Project()
- ProjectPanelView(item: item)
- }
|