Skip to content

Commit 640692c

Browse files
authored
[POS Orders] Persist sales channel filter in order settings (#15891)
2 parents f26de3a + 7cdb10b commit 640692c

File tree

12 files changed

+89
-52
lines changed

12 files changed

+89
-52
lines changed

Modules/Sources/Yosemite/Actions/AppSettingsAction.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public enum AppSettingsAction: Action {
4545
dateRangeFilter: OrderDateRangeFilter?,
4646
productFilter: FilterOrdersByProduct?,
4747
customerFilter: CustomerFilter?,
48+
salesChannelFilter: SalesChannelFilter?,
4849
onCompletion: (Error?) -> Void)
4950

5051
/// Clears all the orders settings

Modules/Sources/Yosemite/Model/Mocks/ActionHandlers/MockAppSettingsActionHandler.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ struct MockAppSettingsActionHandler: MockActionHandler {
5252
orderStatusesFilter: nil,
5353
dateRangeFilter: nil,
5454
productFilter: nil,
55-
customerFilter: nil)))
55+
customerFilter: nil,
56+
salesChannelFilter: nil)))
5657
case .upsertProductsSettings(_, _, _, _, _, _, _, let onCompletion):
5758
onCompletion(nil)
5859
case .resetEligibilityErrorInfo,
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import Foundation
2+
3+
/// Used to filter orders by sales channel
4+
///
5+
public enum SalesChannelFilter: String, Codable, Hashable {
6+
case pointOfSale
7+
case any
8+
}

Modules/Sources/Yosemite/Model/Orders/StoredOrderSettings.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,20 @@ public struct StoredOrderSettings: Codable, Equatable {
1212
public let dateRangeFilter: OrderDateRangeFilter?
1313
public let productFilter: FilterOrdersByProduct?
1414
public let customerFilter: CustomerFilter?
15+
public let salesChannelFilter: SalesChannelFilter?
1516

1617
public init(siteID: Int64,
1718
orderStatusesFilter: [OrderStatusEnum]?,
1819
dateRangeFilter: OrderDateRangeFilter?,
1920
productFilter: FilterOrdersByProduct?,
20-
customerFilter: CustomerFilter?) {
21+
customerFilter: CustomerFilter?,
22+
salesChannelFilter: SalesChannelFilter?) {
2123
self.siteID = siteID
2224
self.orderStatusesFilter = orderStatusesFilter
2325
self.dateRangeFilter = dateRangeFilter
2426
self.productFilter = productFilter
2527
self.customerFilter = customerFilter
28+
self.salesChannelFilter = salesChannelFilter
2629
}
2730

2831
public func numberOfActiveFilters() -> Int {
@@ -39,6 +42,9 @@ public struct StoredOrderSettings: Codable, Equatable {
3942
if customerFilter != nil {
4043
total += 1
4144
}
45+
if let salesChannelFilter = salesChannelFilter, case .pointOfSale = salesChannelFilter {
46+
total += 1
47+
}
4248

4349
return total
4450
}
@@ -51,6 +57,7 @@ public struct StoredOrderSettings: Codable, Equatable {
5157
case dateRangeFilter = "date_range_filter"
5258
case productFilter = "product_filter"
5359
case customerFilter = "customer_filter"
60+
case salesChannelFilter = "sales_channel_filter"
5461
}
5562
}
5663

Modules/Sources/Yosemite/Stores/AppSettingsStore.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,12 +132,14 @@ public class AppSettingsStore: Store {
132132
let dateRangeFilter,
133133
let productFilter,
134134
let customerFilter,
135+
let salesChannelFilter,
135136
let onCompletion):
136137
upsertOrdersSettings(siteID: siteID,
137138
orderStatusesFilter: orderStatusesFilter,
138139
dateRangeFilter: dateRangeFilter,
139140
productFilter: productFilter,
140141
customerFilter: customerFilter,
142+
salesChannelFilter: salesChannelFilter,
141143
onCompletion: onCompletion)
142144
case .resetOrdersSettings:
143145
resetOrdersSettings()
@@ -716,6 +718,7 @@ private extension AppSettingsStore {
716718
dateRangeFilter: OrderDateRangeFilter?,
717719
productFilter: FilterOrdersByProduct?,
718720
customerFilter: CustomerFilter?,
721+
salesChannelFilter: SalesChannelFilter?,
719722
onCompletion: (Error?) -> Void) {
720723
var existingSettings: [Int64: StoredOrderSettings.Setting] = [:]
721724
if let storedSettings: StoredOrderSettings = try? fileStorage.data(for: ordersSettingsURL) {
@@ -726,7 +729,8 @@ private extension AppSettingsStore {
726729
orderStatusesFilter: orderStatusesFilter,
727730
dateRangeFilter: dateRangeFilter,
728731
productFilter: productFilter,
729-
customerFilter: customerFilter)
732+
customerFilter: customerFilter,
733+
salesChannelFilter: salesChannelFilter)
730734
existingSettings[siteID] = newSettings
731735

732736
let newStoredOrderSettings = StoredOrderSettings(settings: existingSettings)

Modules/Tests/YosemiteTests/Stores/AppSettingsStoreTests+OrderFilterHistory.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,13 @@ private extension AppSettingsStoreTests_OrderFilterHistory {
155155
let dateRange = OrderDateRangeFilter(filter: .custom, startDate: startDate, endDate: endDate)
156156
let productFilter = FilterOrdersByProduct(id: 1, name: "Sample product")
157157
let customerFilter = CustomerFilter(customer: Customer.fake().copy(customerID: 1))
158+
let salesChannelFilter = SalesChannelFilter.pointOfSale
158159
return StoredOrderSettings.Setting(siteID: siteID,
159160
orderStatusesFilter: orderStatuses,
160161
dateRangeFilter: dateRange,
161162
productFilter: productFilter,
162-
customerFilter: customerFilter)
163+
customerFilter: customerFilter,
164+
salesChannelFilter: salesChannelFilter)
163165
}
164166

165167
func insertMockFilter(filter: StoredOrderSettings.Setting, using store: AppSettingsStore) async throws {

Modules/Tests/YosemiteTests/Stores/AppSettingsStoreTests+OrdersSettings.swift

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,13 @@ final class AppSettingsStoreTests_OrdersSettings: XCTestCase {
5151
let dateRange = OrderDateRangeFilter(filter: .custom, startDate: startDate, endDate: endDate)
5252
let productFilter = FilterOrdersByProduct(id: 1, name: "Sample product")
5353
let customerFilter = CustomerFilter(customer: Customer.fake().copy(customerID: 1))
54+
let salesChannelFilter = SalesChannelFilter.pointOfSale
5455
let orderSettings = StoredOrderSettings.Setting(siteID: siteID,
5556
orderStatusesFilter: orderStatuses,
5657
dateRangeFilter: dateRange,
5758
productFilter: productFilter,
58-
customerFilter: customerFilter
59+
customerFilter: customerFilter,
60+
salesChannelFilter: salesChannelFilter
5961
)
6062

6163
// When
@@ -73,7 +75,8 @@ final class AppSettingsStoreTests_OrdersSettings: XCTestCase {
7375
orderStatusesFilter: orderStatuses,
7476
dateRangeFilter: dateRange,
7577
productFilter: productFilter,
76-
customerFilter: customerFilter) { error in
78+
customerFilter: customerFilter,
79+
salesChannelFilter: salesChannelFilter) { error in
7780
XCTAssertNil(error)
7881
}
7982
subject.onAction(writeAction)
@@ -102,31 +105,36 @@ final class AppSettingsStoreTests_OrdersSettings: XCTestCase {
102105
let dateRange = OrderDateRangeFilter(filter: .custom, startDate: startDate, endDate: endDate)
103106
let productFilter = FilterOrdersByProduct(id: 1, name: "Sample product 1")
104107
let customerFilter = CustomerFilter(customer: Customer.fake().copy(customerID: 1))
108+
let salesChannelFilter = SalesChannelFilter.any
105109

106110
let orderStatuses2: [OrderStatusEnum] = [.pending, .cancelled]
107111
let startDate2 = Date().yearStart
108112
let endDate2 = Date().yearEnd
109113
let dateRange2 = OrderDateRangeFilter(filter: .custom, startDate: startDate2, endDate: endDate2)
110114
let productFilter2 = FilterOrdersByProduct(id: 2, name: "Sample product 2")
111115
let customerFilter2 = CustomerFilter(customer: Customer.fake().copy(customerID: 2))
116+
let salesChannelFilter2 = SalesChannelFilter.pointOfSale
112117

113118
let orderSettings1 = StoredOrderSettings.Setting(siteID: siteID1,
114-
orderStatusesFilter: orderStatuses,
115-
dateRangeFilter: dateRange,
119+
orderStatusesFilter: orderStatuses,
120+
dateRangeFilter: dateRange,
116121
productFilter: productFilter,
117-
customerFilter: customerFilter)
122+
customerFilter: customerFilter,
123+
salesChannelFilter: salesChannelFilter)
118124
let orderSettings2 = StoredOrderSettings.Setting(siteID: siteID2,
119-
orderStatusesFilter: orderStatuses2,
120-
dateRangeFilter: dateRange2,
125+
orderStatusesFilter: orderStatuses2,
126+
dateRangeFilter: dateRange2,
121127
productFilter: productFilter2,
122-
customerFilter: customerFilter2)
128+
customerFilter: customerFilter2,
129+
salesChannelFilter: salesChannelFilter2)
123130

124131
// When
125132
let writeAction1 = AppSettingsAction.upsertOrdersSettings(siteID: siteID1,
126133
orderStatusesFilter: orderStatuses,
127134
dateRangeFilter: dateRange,
128135
productFilter: productFilter,
129-
customerFilter: customerFilter) { error in
136+
customerFilter: customerFilter,
137+
salesChannelFilter: salesChannelFilter) { error in
130138
XCTAssertNil(error)
131139
}
132140
subject.onAction(writeAction1)
@@ -135,7 +143,8 @@ final class AppSettingsStoreTests_OrdersSettings: XCTestCase {
135143
orderStatusesFilter: orderStatuses2,
136144
dateRangeFilter: dateRange2,
137145
productFilter: productFilter2,
138-
customerFilter: customerFilter2) { error in
146+
customerFilter: customerFilter2,
147+
salesChannelFilter: salesChannelFilter2) { error in
139148
XCTAssertNil(error)
140149
}
141150
subject.onAction(writeAction2)

WooCommerce/Classes/Tools/BackgroundTasks/OrderListSyncBackgroundTask.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ private struct CurrentOrderListSyncUseCase {
7777
dateRange: settings.dateRangeFilter,
7878
product: settings.productFilter,
7979
customer: settings.customerFilter,
80-
salesChannel: nil, // TODO: Filter persistence WOOMOB-712
80+
salesChannel: settings.salesChannelFilter,
8181
numberOfActiveFilters: settings.numberOfActiveFilters())
8282
continuation.resume(returning: filters)
8383
case .failure:

WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift

Lines changed: 26 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ final class FilterOrderListViewModel: FilterListViewModel {
142142
dateRange: item.dateRangeFilter,
143143
product: item.productFilter,
144144
customer: item.customerFilter,
145-
salesChannel: nil, // TODO: Filter persistence WOOMOB-712
145+
salesChannel: item.salesChannelFilter,
146146
numberOfActiveFilters: item.numberOfActiveFilters())
147147
}
148148
continuation.resume(returning: filters)
@@ -168,7 +168,8 @@ final class FilterOrderListViewModel: FilterListViewModel {
168168
orderStatusesFilter: filter.orderStatus,
169169
dateRangeFilter: filter.dateRange,
170170
productFilter: filter.product,
171-
customerFilter: filter.customer)
171+
customerFilter: filter.customer,
172+
salesChannelFilter: filter.salesChannel)
172173
stores.dispatch(AppSettingsAction.upsertOrderFilterHistory(filter: settings, onCompletion: { error in
173174
if let error {
174175
DDLogError("⛔️ Error saving filter history: \(error)")
@@ -182,7 +183,8 @@ final class FilterOrderListViewModel: FilterListViewModel {
182183
orderStatusesFilter: filter.orderStatus,
183184
dateRangeFilter: filter.dateRange,
184185
productFilter: filter.product,
185-
customerFilter: filter.customer)
186+
customerFilter: filter.customer,
187+
salesChannelFilter: filter.salesChannel)
186188
stores.dispatch(AppSettingsAction.removeFromOrderFilterHistory(filter: settings, onCompletion: { error in
187189
if let error {
188190
DDLogError("⛔️ Error removing from filter history: \(error)")
@@ -266,7 +268,7 @@ extension FilterOrderListViewModel.OrderListFilter {
266268
listSelectorConfig: .customer(siteID: siteID),
267269
selectedValue: filters.customer)
268270
case .salesChannel:
269-
let salesChannelOptions: [FilterOrderListViewModel.SalesChannelFilter] = [.any, .pointOfSale]
271+
let salesChannelOptions: [SalesChannelFilter] = [.any, .pointOfSale]
270272
return FilterTypeViewModel(title: title,
271273
listSelectorConfig: .staticOptions(options: salesChannelOptions),
272274
selectedValue: filters.salesChannel)
@@ -377,33 +379,28 @@ extension CustomerFilter: FilterType {
377379
var isActive: Bool { true }
378380
}
379381

380-
extension FilterOrderListViewModel {
381-
enum SalesChannelFilter: FilterType {
382-
case pointOfSale
383-
case any
384-
385-
var description: String {
386-
switch self {
387-
case .pointOfSale:
388-
return NSLocalizedString(
389-
"salesChannelFilter.row.pos.description",
390-
value: "Point of Sale",
391-
comment: "Description for the Sales channel filter option, when selecting 'Point of Sale' orders")
392-
case .any:
393-
return NSLocalizedString(
394-
"salesChannelFilter.row.any.description",
395-
value: "Any",
396-
comment: "Description for the Sales channel filter option, when selecting 'Any' order")
397-
}
382+
extension SalesChannelFilter: FilterType {
383+
var description: String {
384+
switch self {
385+
case .pointOfSale:
386+
return NSLocalizedString(
387+
"salesChannelFilter.row.pos.description",
388+
value: "Point of Sale",
389+
comment: "Description for the Sales channel filter option, when selecting 'Point of Sale' orders")
390+
case .any:
391+
return NSLocalizedString(
392+
"salesChannelFilter.row.any.description",
393+
value: "Any",
394+
comment: "Description for the Sales channel filter option, when selecting 'Any' order")
398395
}
396+
}
399397

400-
var isActive: Bool {
401-
switch self {
402-
case .pointOfSale:
403-
return true
404-
case .any:
405-
return false
406-
}
398+
var isActive: Bool {
399+
switch self {
400+
case .pointOfSale:
401+
return true
402+
case .any:
403+
return false
407404
}
408405
}
409406
}

WooCommerce/Classes/ViewRelated/Orders/OrdersRootViewController.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ private extension OrdersRootViewController {
447447
dateRange: settings.dateRangeFilter,
448448
product: settings.productFilter,
449449
customer: settings.customerFilter,
450-
salesChannel: nil, // TODO: Filter persistence WOOMOB-712
450+
salesChannel: settings.salesChannelFilter,
451451
numberOfActiveFilters: settings.numberOfActiveFilters())
452452
case .failure(let error):
453453
print("It was not possible to sync local orders settings: \(String(describing: error))")
@@ -464,7 +464,8 @@ private extension OrdersRootViewController {
464464
orderStatusesFilter: filters.orderStatus,
465465
dateRangeFilter: filters.dateRange,
466466
productFilter: filters.product,
467-
customerFilter: filters.customer) { error in
467+
customerFilter: filters.customer,
468+
salesChannelFilter: filters.salesChannel) { error in
468469
if error != nil {
469470
assertionFailure("It was not possible to store order settings due to an error: \(String(describing: error))")
470471
}

0 commit comments

Comments
 (0)