|
|
@@ -10,7 +10,7 @@ import SwiftData
|
|
|
|
|
|
struct TagBarView: View {
|
|
|
@Environment(\.modelContext) private var modelContext
|
|
|
- @Binding var tags: [Tag]
|
|
|
+ @Binding var task: Task
|
|
|
@AppStorage(UserDefaultsKeys.UrlHints) var allHints = CodableArray<URLHint>()
|
|
|
|
|
|
@State private var active: String = ""
|
|
|
@@ -18,7 +18,7 @@ struct TagBarView: View {
|
|
|
|
|
|
var body: some View {
|
|
|
HStack {
|
|
|
- ForEach($tags) { tag in
|
|
|
+ ForEach($task.tags) { tag in
|
|
|
let url = allHints.filter({ $0.matches(tag.wrappedValue) })
|
|
|
.first?.url(tag.wrappedValue)
|
|
|
if url != nil {
|
|
|
@@ -32,27 +32,29 @@ struct TagBarView: View {
|
|
|
TextField("", text: tag.id)
|
|
|
.focused($isFocused)
|
|
|
.onChange(of: isFocused) {
|
|
|
- tags.removeAll(where: { $0.id.isEmpty })
|
|
|
+ task.tags.removeAll(where: { $0.id.isEmpty })
|
|
|
}
|
|
|
}
|
|
|
.scaledToFit()
|
|
|
TextField("Tag", text: $active)
|
|
|
- .onSubmit {
|
|
|
- if !active.isEmpty && !tags.contains(where: { $0.like(active) }) {
|
|
|
- let newTag = Tag(id: active)
|
|
|
- modelContext.insert(newTag)
|
|
|
- tags.append(newTag)
|
|
|
- }
|
|
|
- active = ""
|
|
|
- }
|
|
|
+ .onSubmit(addItem)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private func addItem() {
|
|
|
+ if !active.isEmpty && !task.tags.contains(where: { $0.like(active) }) {
|
|
|
+ let newTag = Tag(id: active, parent: task)
|
|
|
+ modelContext.insert(newTag)
|
|
|
+ task.tags.append(newTag)
|
|
|
}
|
|
|
+ active = ""
|
|
|
}
|
|
|
}
|
|
|
|
|
|
#Preview {
|
|
|
- @Previewable @State var tags = Array<Tag>()
|
|
|
+ @Previewable @State var task = Task(name: "")
|
|
|
@Previewable @State var allHints = CodableArray([
|
|
|
URLHint(prefix: "RPD:", replacement: "http://localhost/")
|
|
|
])
|
|
|
- TagBarView(tags: $tags)
|
|
|
+ TagBarView(task: $task)
|
|
|
}
|