| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- //
- // Project.swift
- // Todos
- //
- // Created by Sam Jaffe on 2/28/26.
- //
- import Foundation
- import SwiftData
- import SwiftUI
- @Model
- final class Project: Codable {
- var sortOrder: Int = 0
- var name: String = "New Project"
- var category: String = ""
- @Relationship(deleteRule: .cascade, inverse: \Task.project)
- var tasks: [Task] = []
- var notes: String = ""
- init(sortOrder: Int = 0) {
- self.sortOrder = sortOrder
- }
- func yaml(_ indent: Int = 0) -> String {
- let hdr = String(repeating: " ", count: indent)
- var rval = hdr + "\(name):\n"
- if !category.isEmpty {
- rval += hdr + " # In Category: \(category)\n"
- }
- rval += tasks.map({ $0.yaml(indent + 1) }).joined()
- return rval
- }
- enum CodingKeys: CodingKey { case category, name, tasks }
- required init(from decoder: any Decoder) throws {
- let container = try decoder.container(keyedBy: CodingKeys.self)
- name = try container.decode(String.self, forKey: .name)
- category = try container.decode(String.self, forKey: .category)
- tasks = try container.decode([Task].self, forKey: .tasks)
- for (index, item) in tasks.enumerated() {
- item.project = self
- item.sortOrder = index
- }
- }
- func encode(to encoder: any Encoder) throws {
- var container = encoder.container(keyedBy: CodingKeys.self)
- try container.encode(name, forKey: .name)
- try container.encode(category, forKey: .category)
- try container.encode(tasks, forKey: .tasks)
- }
- }
|