Skip to content

Commit f689348

Browse files
authored
[POS Orders] Render sales channel option as order filter (#15878)
2 parents 5feb817 + de53799 commit f689348

File tree

9 files changed

+109
-10
lines changed

9 files changed

+109
-10
lines changed

Modules/Sources/Experiments/DefaultFeatureFlagService.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ public struct DefaultFeatureFlagService: FeatureFlagService {
9999
return buildConfig == .localDeveloper || buildConfig == .alpha
100100
case .pointOfSaleOrdersi1:
101101
return buildConfig == .localDeveloper || buildConfig == .alpha
102+
case .pointOfSaleOrdersi2:
103+
return buildConfig == .localDeveloper || buildConfig == .alpha
102104
default:
103105
return true
104106
}

Modules/Sources/Experiments/FeatureFlag.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,4 +203,8 @@ public enum FeatureFlag: Int {
203203
/// Enables displaying Point Of Sale details in order list and order details
204204
///
205205
case pointOfSaleOrdersi1
206+
207+
/// Enables displaying Point Of Sale as a filter in order list
208+
///
209+
case pointOfSaleOrdersi2
206210
}

WooCommerce/Classes/Tools/BackgroundTasks/OrderListSyncBackgroundTask.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +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
8081
numberOfActiveFilters: settings.numberOfActiveFilters())
8182
continuation.resume(returning: filters)
8283
case .failure:

WooCommerce/Classes/ViewRelated/Filters/FilterListViewController.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ enum FilterListValueSelectorConfig {
9292
case products(siteID: Int64)
9393
// Filter list selector for customer
9494
case customer(siteID: Int64)
95+
// Filter list selector for sales channel
96+
case salesChannel
9597

9698
}
9799

@@ -297,6 +299,10 @@ private extension FilterListViewController {
297299
self.listSelector.reloadData()
298300
}
299301
self.listSelector.navigationController?.pushViewController(statusesFilterVC, animated: true)
302+
case .salesChannel:
303+
// TODO: Make OrderSalesChannelFilterViewController, and handle filtering selection WOOMOB-711
304+
let emptyViewController = EmptyStateViewController(style: .list)
305+
self.listSelector.navigationController?.pushViewController(emptyViewController, animated: true)
300306
case .ordersDateRange:
301307
let selectedOrderFilter = selected.selectedValue as? OrderDateRangeFilter
302308
let datesFilterVC = OrderDatesFilterViewController(selected: selectedOrderFilter) { dateRangeFilter in

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

Lines changed: 76 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ final class FilterOrderListViewModel: FilterListViewModel {
1313
let dateRange: OrderDateRangeFilter?
1414
let product: FilterOrdersByProduct?
1515
let customer: CustomerFilter?
16+
let salesChannel: SalesChannelFilter?
1617

1718
let numberOfActiveFilters: Int
1819

@@ -21,18 +22,21 @@ final class FilterOrderListViewModel: FilterListViewModel {
2122
dateRange = nil
2223
product = nil
2324
customer = nil
25+
salesChannel = nil
2426
numberOfActiveFilters = 0
2527
}
2628

2729
init(orderStatus: [OrderStatusEnum]?,
2830
dateRange: OrderDateRangeFilter?,
2931
product: FilterOrdersByProduct?,
3032
customer: CustomerFilter?,
33+
salesChannel: SalesChannelFilter?,
3134
numberOfActiveFilters: Int) {
3235
self.orderStatus = orderStatus
3336
self.dateRange = dateRange
3437
self.product = product
3538
self.customer = customer
39+
self.salesChannel = salesChannel
3640
self.numberOfActiveFilters = numberOfActiveFilters
3741
}
3842

@@ -50,6 +54,11 @@ final class FilterOrderListViewModel: FilterListViewModel {
5054
if let customer = customer {
5155
readable.append(customer.description)
5256
}
57+
58+
if let salesChannel = salesChannel {
59+
readable.append(salesChannel.description)
60+
}
61+
5362
return readable.joined(separator: ", ")
5463
}
5564
}
@@ -66,6 +75,7 @@ final class FilterOrderListViewModel: FilterListViewModel {
6675
private let dateRangeFilterViewModel: FilterTypeViewModel
6776
private let productFilterViewModel: FilterTypeViewModel
6877
private let customerFilterViewModel: FilterTypeViewModel
78+
private let salesChannelFilterViewModel: FilterTypeViewModel
6979

7080
private let siteID: Int64
7181
private let stores: StoresManager
@@ -87,25 +97,37 @@ final class FilterOrderListViewModel: FilterListViewModel {
8797
dateRangeFilterViewModel = OrderListFilter.dateRange.createViewModel(filters: filters, allowedStatuses: allowedStatuses)
8898
productFilterViewModel = OrderListFilter.product(siteID: siteID).createViewModel(filters: filters, allowedStatuses: allowedStatuses)
8999
customerFilterViewModel = OrderListFilter.customer(siteID: siteID).createViewModel(filters: filters, allowedStatuses: allowedStatuses)
100+
salesChannelFilterViewModel = OrderListFilter.salesChannel.createViewModel(filters: filters, allowedStatuses: allowedStatuses)
90101

91102
self.siteID = siteID
92103
self.stores = stores
93104
self.analytics = analytics
94105

95106
shouldShowHistory = featureFlagService.isFeatureFlagEnabled(.filterHistoryOnOrderAndProductLists)
96-
filterTypeViewModels = [orderStatusFilterViewModel, dateRangeFilterViewModel, customerFilterViewModel, productFilterViewModel]
107+
var allFilterViewModels = [orderStatusFilterViewModel,
108+
dateRangeFilterViewModel,
109+
customerFilterViewModel,
110+
productFilterViewModel]
111+
112+
if featureFlagService.isFeatureFlagEnabled(.pointOfSaleOrdersi2) {
113+
allFilterViewModels.append(salesChannelFilterViewModel)
114+
}
115+
116+
filterTypeViewModels = allFilterViewModels
97117
}
98118

99119
var criteria: Filters {
100120
let orderStatus = orderStatusFilterViewModel.selectedValue as? [OrderStatusEnum] ?? nil
101121
let dateRange = dateRangeFilterViewModel.selectedValue as? OrderDateRangeFilter ?? nil
102122
let product = productFilterViewModel.selectedValue as? FilterOrdersByProduct ?? nil
103123
let customer = customerFilterViewModel.selectedValue as? CustomerFilter ?? nil
124+
let salesChannel = salesChannelFilterViewModel.selectedValue as? SalesChannelFilter ?? nil
104125
let numberOfActiveFilters = filterTypeViewModels.numberOfActiveFilters
105126
return Filters(orderStatus: orderStatus,
106127
dateRange: dateRange,
107128
product: product,
108129
customer: customer,
130+
salesChannel: salesChannel,
109131
numberOfActiveFilters: numberOfActiveFilters)
110132
}
111133

@@ -120,6 +142,7 @@ final class FilterOrderListViewModel: FilterListViewModel {
120142
dateRange: item.dateRangeFilter,
121143
product: item.productFilter,
122144
customer: item.customerFilter,
145+
salesChannel: nil, // TODO: Filter persistence WOOMOB-712
123146
numberOfActiveFilters: item.numberOfActiveFilters())
124147
}
125148
continuation.resume(returning: filters)
@@ -198,6 +221,7 @@ extension FilterOrderListViewModel {
198221
case dateRange
199222
case product(siteID: Int64)
200223
case customer(siteID: Int64)
224+
case salesChannel
201225
}
202226
}
203227

@@ -212,6 +236,8 @@ private extension FilterOrderListViewModel.OrderListFilter {
212236
return Localization.rowTitleProduct
213237
case .customer:
214238
return Localization.rowCustomer
239+
case .salesChannel:
240+
return Localization.rowSalesChannel
215241
}
216242
}
217243
}
@@ -235,6 +261,10 @@ extension FilterOrderListViewModel.OrderListFilter {
235261
return FilterTypeViewModel(title: title,
236262
listSelectorConfig: .customer(siteID: siteID),
237263
selectedValue: filters.customer)
264+
case .salesChannel:
265+
return FilterTypeViewModel(title: title,
266+
listSelectorConfig: .salesChannel,
267+
selectedValue: filters.salesChannel)
238268
}
239269
}
240270
}
@@ -281,20 +311,39 @@ extension FilterOrdersByProduct: FilterType {
281311
// MARK: - Constants
282312
private extension FilterOrderListViewModel {
283313
enum Localization {
284-
static let filterActionTitle = NSLocalizedString("Show Orders", comment: "Button title for applying filters to a list of orders.")
314+
static let filterActionTitle = NSLocalizedString(
315+
"filterOrderListViewModel.OrderListFilter.filterActionTitle",
316+
value: "Show Orders",
317+
comment: "Button title for applying filters to a list of orders.")
285318
}
286319
}
287320

288321
private extension FilterOrderListViewModel.OrderListFilter {
289322
enum Localization {
290-
static let rowTitleOrderStatus = NSLocalizedString("Order Status", comment: "Row title for filtering orders by order status.")
291-
static let rowTitleDateRange = NSLocalizedString("Date Range", comment: "Row title for filtering orders by date range.")
292-
static let rowTitleProduct = NSLocalizedString("filterOrderListViewModel.OrderListFilter.rowTitleProduct",
293-
value: "Product",
294-
comment: "Row title for filtering orders by Product.")
295-
static let rowCustomer = NSLocalizedString("filterOrderListViewModel.OrderListFilter.rowCustomer",
296-
value: "Customer",
297-
comment: "Row title for filtering orders by customer.")
323+
static let rowTitleOrderStatus = NSLocalizedString(
324+
"filterOrderListViewModel.OrderListFilter.rowTitleOrderStatus",
325+
value: "Order Status",
326+
comment: "Row title for filtering orders by order status.")
327+
328+
static let rowTitleDateRange = NSLocalizedString(
329+
"filterOrderListViewModel.OrderListFilter.rowTitleDateRange",
330+
value: "Date Range",
331+
comment: "Row title for filtering orders by date range.")
332+
333+
static let rowTitleProduct = NSLocalizedString(
334+
"filterOrderListViewModel.OrderListFilter.rowTitleProduct",
335+
value: "Product",
336+
comment: "Row title for filtering orders by Product.")
337+
338+
static let rowCustomer = NSLocalizedString(
339+
"filterOrderListViewModel.OrderListFilter.rowCustomer",
340+
value: "Customer",
341+
comment: "Row title for filtering orders by customer.")
342+
343+
static let rowSalesChannel = NSLocalizedString(
344+
"filterOrderListViewModel.OrderListFilter.rowSalesChannel",
345+
value: "Sales Channel",
346+
comment: "Row title for filtering orders by sales channel.")
298347
}
299348
}
300349

@@ -322,3 +371,20 @@ extension CustomerFilter: FilterType {
322371
/// Whether the filter is set to a non-empty value.
323372
var isActive: Bool { true }
324373
}
374+
375+
extension FilterOrderListViewModel {
376+
enum SalesChannelFilter: FilterType {
377+
case pointOfSale
378+
379+
var description: String {
380+
switch self {
381+
case .pointOfSale:
382+
return "POS"
383+
}
384+
}
385+
386+
var isActive: Bool {
387+
return true
388+
}
389+
}
390+
}

WooCommerce/Classes/ViewRelated/Orders/OrdersRootViewController.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,7 @@ private extension OrdersRootViewController {
448448
dateRange: settings.dateRangeFilter,
449449
product: settings.productFilter,
450450
customer: settings.customerFilter,
451+
salesChannel: nil, // TODO: Filter persistence WOOMOB-712
451452
numberOfActiveFilters: settings.numberOfActiveFilters())
452453
case .failure(let error):
453454
print("It was not possible to sync local orders settings: \(String(describing: error))")

WooCommerce/WooCommerceTests/ViewRelated/Orders/Filters/FilterOrderListViewModelTests.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ final class FilterOrderListViewModelTests: XCTestCase {
1515
dateRange: nil,
1616
product: nil,
1717
customer: nil,
18+
salesChannel: nil,
1819
numberOfActiveFilters: 0)
1920
XCTAssertEqual(viewModel.criteria, expectedCriteria)
2021
}
@@ -25,6 +26,7 @@ final class FilterOrderListViewModelTests: XCTestCase {
2526
dateRange: OrderDateRangeFilter(filter: .today),
2627
product: FilterOrdersByProduct(id: 1, name: "Sample product"),
2728
customer: CustomerFilter(customer: Customer.fake().copy(customerID: 1)),
29+
salesChannel: nil,
2830
numberOfActiveFilters: 4)
2931

3032
// When
@@ -41,6 +43,7 @@ final class FilterOrderListViewModelTests: XCTestCase {
4143
dateRange: OrderDateRangeFilter(filter: .last7Days),
4244
product: FilterOrdersByProduct(id: 1, name: "Sample product"),
4345
customer: CustomerFilter(customer: Customer.fake().copy(customerID: 1)),
46+
salesChannel: nil,
4447
numberOfActiveFilters: 4)
4548

4649
// When
@@ -52,6 +55,7 @@ final class FilterOrderListViewModelTests: XCTestCase {
5255
dateRange: nil,
5356
product: nil,
5457
customer: nil,
58+
salesChannel: nil,
5559
numberOfActiveFilters: 0)
5660
XCTAssertEqual(viewModel.criteria, expectedCriteria)
5761
}
@@ -64,6 +68,7 @@ final class FilterOrderListViewModelTests: XCTestCase {
6468
dateRange: OrderDateRangeFilter(filter: .today),
6569
product: FilterOrdersByProduct(id: 1, name: "Sample product"),
6670
customer: CustomerFilter(customer: Customer.fake().copy(customerID: 1)),
71+
salesChannel: nil,
6772
numberOfActiveFilters: 4)
6873

6974
// When
@@ -100,6 +105,7 @@ final class FilterOrderListViewModelTests: XCTestCase {
100105
dateRange: OrderDateRangeFilter(filter: .today),
101106
product: FilterOrdersByProduct(id: 1, name: "Sample product"),
102107
customer: CustomerFilter(customer: Customer.fake().copy(customerID: 1)),
108+
salesChannel: nil,
103109
numberOfActiveFilters: 4)
104110
let viewModel = FilterOrderListViewModel(filters: filters,
105111
allowedStatuses: [],
@@ -116,11 +122,13 @@ final class FilterOrderListViewModelTests: XCTestCase {
116122
dateRange: result1.dateRangeFilter,
117123
product: result1.productFilter,
118124
customer: result1.customerFilter,
125+
salesChannel: nil,
119126
numberOfActiveFilters: result1.numberOfActiveFilters()),
120127
FilterOrderListViewModel.Filters(orderStatus: result2.orderStatusesFilter,
121128
dateRange: result2.dateRangeFilter,
122129
product: result2.productFilter,
123130
customer: result2.customerFilter,
131+
salesChannel: nil,
124132
numberOfActiveFilters: result2.numberOfActiveFilters())
125133
])
126134
}
@@ -144,6 +152,7 @@ final class FilterOrderListViewModelTests: XCTestCase {
144152
dateRange: OrderDateRangeFilter(filter: .today),
145153
product: FilterOrdersByProduct(id: 1, name: "Sample product"),
146154
customer: CustomerFilter(customer: Customer.fake().copy(customerID: 1)),
155+
salesChannel: nil,
147156
numberOfActiveFilters: 4)
148157
let viewModel = FilterOrderListViewModel(filters: filters,
149158
allowedStatuses: [],
@@ -179,6 +188,7 @@ final class FilterOrderListViewModelTests: XCTestCase {
179188
dateRange: OrderDateRangeFilter(filter: .today),
180189
product: FilterOrdersByProduct(id: 1, name: "Sample product"),
181190
customer: CustomerFilter(customer: Customer.fake().copy(customerID: 1)),
191+
salesChannel: nil,
182192
numberOfActiveFilters: 4)
183193
let viewModel = FilterOrderListViewModel(filters: filters,
184194
allowedStatuses: [],

0 commit comments

Comments
 (0)