Skip to content

Commit 2216c67

Browse files
authored
Merge pull request #306 from aapis/feature/1.13/ux-cleanup
UI/UX cleanup, Search improvements
2 parents 8efbf4e + d0a4c73 commit 2216c67

26 files changed

+855
-458
lines changed
+159
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
//
2+
// CDSavedSearch.swift
3+
// KlockWork
4+
//
5+
// Created by Ryan Priebe on 2024-10-15.
6+
// Copyright © 2024 YegCollective. All rights reserved.
7+
//
8+
9+
import SwiftUI
10+
import KWCore
11+
import CoreData
12+
13+
public class CDSavedSearch: ObservableObject {
14+
/// Context for updating CD objects
15+
public var moc: NSManagedObjectContext?
16+
17+
/// Thread lock
18+
private let lock = NSLock()
19+
20+
/// Create new CDSavedSearch instance
21+
/// - Parameter moc: NSManagedObjectContext
22+
public init(moc: NSManagedObjectContext?) {
23+
self.moc = moc
24+
}
25+
26+
/// Find all saved searches
27+
/// - Returns: [SavedSearch]
28+
public func all() -> [SavedSearch] {
29+
let predicate = NSPredicate(
30+
format: "created < %@",
31+
Date() as CVarArg
32+
)
33+
34+
return self.query(predicate)
35+
}
36+
37+
/// Find SavedSearch objects by term
38+
/// - Parameter term: String
39+
/// - Returns: Optional(SavedSearch
40+
public func find(by term: String) -> SavedSearch? {
41+
let predicate = NSPredicate(
42+
format: "term == %@",
43+
term
44+
)
45+
46+
let results = self.query(predicate)
47+
48+
if let result = results.first {
49+
return result
50+
}
51+
52+
return nil
53+
}
54+
55+
/// Destroy a saved search term
56+
/// - Parameter term: SavedSearch
57+
/// - Returns: Void
58+
public func destroy(_ term: String) -> Void {
59+
if let entity = self.query(NSPredicate(format: "term == %@", term)).first {
60+
self.moc!.delete(entity)
61+
62+
PersistenceController.shared.save()
63+
}
64+
}
65+
66+
/// Create and return a new saved search term
67+
/// - Parameters:
68+
/// - term: String
69+
/// - created: Date
70+
/// - saveByDefault: Bool(true)
71+
/// - Returns: Void
72+
public func createAndReturn(term: String, created: Date) -> SavedSearch {
73+
return self.make(term: term, created: created)
74+
}
75+
76+
/// Create a new saved search term
77+
/// - Parameters:
78+
/// - term: String
79+
/// - created: Date
80+
/// - saveByDefault: Bool(true)
81+
/// - Returns: Void
82+
public func create(term: String, created: Date) -> Void {
83+
let _ = self.make(term: term, created: created)
84+
}
85+
86+
/// Create a new saved search term
87+
/// - Parameters:
88+
/// - term: String
89+
/// - created: Date
90+
/// - saveByDefault: Bool(true)
91+
/// - Returns: SavedSearch
92+
private func make(term: String, created: Date, saveByDefault: Bool = true) -> SavedSearch {
93+
let savedSearch = SavedSearch(context: self.moc!)
94+
savedSearch.term = term
95+
savedSearch.created = created
96+
97+
if saveByDefault {
98+
PersistenceController.shared.save()
99+
}
100+
101+
return savedSearch
102+
}
103+
104+
/// Query companies
105+
/// - Parameter predicate: Query predicate
106+
/// - Parameter sort: [NSSortDescriptor]
107+
/// - Returns: Array<SavedSearch>
108+
private func query(_ predicate: NSPredicate? = nil, _ sort: [NSSortDescriptor] = [NSSortDescriptor(keyPath: \SavedSearch.term?, ascending: true)]) -> [SavedSearch] {
109+
lock.lock()
110+
111+
var results: [SavedSearch] = []
112+
let fetch: NSFetchRequest<SavedSearch> = SavedSearch.fetchRequest()
113+
fetch.sortDescriptors = sort
114+
fetch.returnsDistinctResults = true
115+
if predicate != nil {
116+
fetch.predicate = predicate
117+
}
118+
119+
do {
120+
results = try moc!.fetch(fetch)
121+
} catch {
122+
if predicate != nil {
123+
print("[error] CDSavedSearch.query Unable to find records for predicate \(predicate!.predicateFormat)")
124+
} else {
125+
print("[error] CDSavedSearch.query Unable to find records for query")
126+
}
127+
128+
print(error)
129+
}
130+
131+
lock.unlock()
132+
133+
return results
134+
}
135+
136+
/// Count companies
137+
/// - Parameter predicate: Query predicate
138+
/// - Parameter sort: [NSSortDescriptor]
139+
/// - Returns: Int
140+
private func count(_ predicate: NSPredicate, sort: [NSSortDescriptor] = [NSSortDescriptor(keyPath: \SavedSearch.term?, ascending: true)]) -> Int {
141+
lock.lock()
142+
143+
var count = 0
144+
let fetch: NSFetchRequest<SavedSearch> = SavedSearch.fetchRequest()
145+
fetch.sortDescriptors = sort
146+
fetch.predicate = predicate
147+
fetch.returnsDistinctResults = true
148+
149+
do {
150+
count = try moc!.fetch(fetch).count
151+
} catch {
152+
print("[error] CDSavedSearch.query Unable to find records for predicate \(predicate.predicateFormat)")
153+
}
154+
155+
lock.unlock()
156+
157+
return count
158+
}
159+
}

KWCore/Sources/UI/WidgetLibrary/WidgetLibrary.UI.Individual.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ extension WidgetLibrary.UI {
7373
let project = CoreDataProjects(moc: self.state.moc).createAndReturn(
7474
name: self.event.title,
7575
abbreviation: StringHelper.abbreviate(self.event.title),
76-
colour: Color.randomStorable(),
76+
colour: Color(self.event.calendar.color).toStored(),
7777
created: Date(),
7878
pid: Int64(Int.random(in: 1...9999999))
7979
)
@@ -87,7 +87,7 @@ extension WidgetLibrary.UI {
8787
let company = CoreDataCompanies(moc: self.state.moc).createAndReturn(
8888
name: self.event.title,
8989
abbreviation: StringHelper.abbreviate(self.event.title),
90-
colour: Color.randomStorable(),
90+
colour: Color(self.event.calendar.color).toStored(),
9191
created: Date(),
9292
projects: [],
9393
isDefault: false,
@@ -101,7 +101,7 @@ extension WidgetLibrary.UI {
101101
Button("Job...") {
102102
let job = CoreDataJob(moc: self.state.moc).createAndReturn(
103103
alive: true,
104-
colour: Color.randomStorable(),
104+
colour: Color(self.event.calendar.color).toStored(),
105105
jid: Double(Int.random(in: 1...9999999)),
106106
overview: "Work related to calendar event \"\(self.event.title ?? "Invalid event name")\" on \(self.event.startDate.formatted(date: .abbreviated, time: .omitted)) from \(self.event.startTime()) - \(self.event.endTime())",
107107
shredable: false,

0 commit comments

Comments
 (0)