Skip to content

Commit 4caeca3

Browse files
committed
Update predicate for booking list after filtering
1 parent 8835b27 commit 4caeca3

File tree

3 files changed

+49
-10
lines changed

3 files changed

+49
-10
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import CoreData
2+
import Storage
3+
4+
extension NSPredicate {
5+
public static func createBookingPredicate(siteID: Int64, filters: BookingFilters) -> NSPredicate {
6+
let siteIDPredicate = NSPredicate(format: "siteID == %lld", siteID)
7+
8+
let productIDsPredicate = filters.productIDs.isNotEmpty ? NSPredicate(format: "productID IN %@", filters.productIDs) : nil
9+
10+
let customerIDsPredicate = filters.customerIDs.isNotEmpty ? NSPredicate(format: "customerID IN %@", filters.customerIDs) : nil
11+
12+
let resourceIDsPredicate = filters.resourceIDs.isNotEmpty ? NSPredicate(format: "resourceID IN %@", filters.resourceIDs) : nil
13+
14+
let startDateBeforePredicate = filters.startDateBefore.flatMap { dateString -> NSPredicate? in
15+
guard let date = ISO8601DateFormatter().date(from: dateString) else { return nil }
16+
return NSPredicate(format: "startDate < %@", date as NSDate)
17+
}
18+
19+
let startDateAfterPredicate = filters.startDateAfter.flatMap { dateString -> NSPredicate? in
20+
guard let date = ISO8601DateFormatter().date(from: dateString) else { return nil }
21+
return NSPredicate(format: "startDate > %@", date as NSDate)
22+
}
23+
24+
let bookingStatusesPredicate = filters.bookingStatuses.isNotEmpty ? NSPredicate(format: "statusKey IN %@", filters.bookingStatuses) : nil
25+
26+
let attendanceStatusesPredicate = filters.attendanceStatuses.isNotEmpty ? NSPredicate(format: "attendanceStatusKey IN %@", filters.attendanceStatuses) : nil
27+
28+
let subpredicates = [
29+
siteIDPredicate,
30+
productIDsPredicate,
31+
customerIDsPredicate,
32+
resourceIDsPredicate,
33+
startDateBeforePredicate,
34+
startDateAfterPredicate,
35+
bookingStatusesPredicate,
36+
attendanceStatusesPredicate
37+
].compactMap({ $0 })
38+
39+
return NSCompoundPredicate(andPredicateWithSubpredicates: subpredicates)
40+
}
41+
}
42+
43+
extension ResultsController where T: StorageBooking {
44+
public func updatePredicate(siteID: Int64, filters: BookingFilters) {
45+
self.predicate = NSPredicate.createBookingPredicate(siteID: siteID, filters: filters)
46+
}
47+
}

WooCommerce/Classes/Bookings/BookingList/BookingListViewModel.swift

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,7 @@ final class BookingListViewModel: ObservableObject {
4949

5050
/// Booking ResultsController.
5151
private lazy var resultsController: ResultsController<StorageBooking> = {
52-
var predicates = [NSPredicate(format: "siteID == %lld", siteID)]
53-
if let before = type.startDateBefore(currentDate: currentDate) {
54-
predicates.append(NSPredicate(format: "startDate < %@", before as NSDate))
55-
}
56-
if let after = type.startDateAfter(currentDate: currentDate) {
57-
predicates.append(NSPredicate(format: "startDate > %@", after as NSDate))
58-
}
59-
let combinedPredicate = NSCompoundPredicate(type: .and, subpredicates: predicates)
52+
let combinedPredicate = NSPredicate.createBookingPredicate(siteID: siteID, filters: filters)
6053
let sortDescriptorByDate = NSSortDescriptor(key: "startDate", ascending: false)
6154
let resultsController = ResultsController<StorageBooking>(storageManager: storage,
6255
matching: combinedPredicate,
@@ -128,6 +121,7 @@ final class BookingListViewModel: ObservableObject {
128121
guard type == .all else { return }
129122
hasFilters = filters.numberOfActiveFilters > 0
130123
self.filters = filters.bookingFilters
124+
resultsController.updatePredicate(siteID: siteID, filters: self.filters)
131125
paginationTracker.resync(reason: Self.refreshCacheReason) {}
132126
}
133127

WooCommerce/Classes/Bookings/BookingList/BookingSearchViewModel.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ final class BookingSearchViewModel: ObservableObject {
1616
private let siteID: Int64
1717
private let type: BookingListTab
1818
private let stores: StoresManager
19-
private let currentDate: Date
2019
private var searchQuerySubscription: AnyCancellable?
2120
private var currentOrder: BookingListViewModel.SortBy = .newestToOldest
2221

@@ -40,7 +39,6 @@ final class BookingSearchViewModel: ObservableObject {
4039
self.siteID = siteID
4140
self.type = type
4241
self.stores = stores
43-
self.currentDate = currentDate
4442
self.searchPaginationTracker = PaginationTracker(pageFirstIndex: pageFirstIndex)
4543

4644
self.filters = {

0 commit comments

Comments
 (0)