Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Modules/Sources/Experiments/DefaultFeatureFlagService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ public struct DefaultFeatureFlagService: FeatureFlagService {
return buildConfig == .localDeveloper || buildConfig == .alpha
case .pointOfSaleOrdersi1:
return buildConfig == .localDeveloper || buildConfig == .alpha
case .pointOfSaleOrdersi2:
return buildConfig == .localDeveloper || buildConfig == .alpha
default:
return true
}
Expand Down
4 changes: 4 additions & 0 deletions Modules/Sources/Experiments/FeatureFlag.swift
Original file line number Diff line number Diff line change
Expand Up @@ -203,4 +203,8 @@ public enum FeatureFlag: Int {
/// Enables displaying Point Of Sale details in order list and order details
///
case pointOfSaleOrdersi1

/// Enables displaying Point Of Sale as a filter in order list
///
case pointOfSaleOrdersi2
}
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ private struct CurrentOrderListSyncUseCase {
dateRange: settings.dateRangeFilter,
product: settings.productFilter,
customer: settings.customerFilter,
salesChannel: nil, // TODO: Filter persistence WOOMOB-712
numberOfActiveFilters: settings.numberOfActiveFilters())
continuation.resume(returning: filters)
case .failure:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ enum FilterListValueSelectorConfig {
case products(siteID: Int64)
// Filter list selector for customer
case customer(siteID: Int64)
// Filter list selector for sales channel
case salesChannel

}

Expand Down Expand Up @@ -297,6 +299,10 @@ private extension FilterListViewController {
self.listSelector.reloadData()
}
self.listSelector.navigationController?.pushViewController(statusesFilterVC, animated: true)
case .salesChannel:
// TODO: Make OrderSalesChannelFilterViewController, and handle filtering selection WOOMOB-711
let emptyViewController = EmptyStateViewController(style: .list)
self.listSelector.navigationController?.pushViewController(emptyViewController, animated: true)
case .ordersDateRange:
let selectedOrderFilter = selected.selectedValue as? OrderDateRangeFilter
let datesFilterVC = OrderDatesFilterViewController(selected: selectedOrderFilter) { dateRangeFilter in
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ final class FilterOrderListViewModel: FilterListViewModel {
let dateRange: OrderDateRangeFilter?
let product: FilterOrdersByProduct?
let customer: CustomerFilter?
let salesChannel: SalesChannelFilter?
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
let salesChannel: SalesChannelFilter?
let salesChannel: SalesChannelFilter? = nil

You don't need to change it now, but for a partial PR like this, it might be better to use the default. It saves you a bunch of changes in the tests, which you're probably going to have to change again when you implement it properly. The compiler will still help you catch them all when you remove the default in a future PR.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

True 😅 , thanks for pointing it out.


let numberOfActiveFilters: Int

Expand All @@ -21,18 +22,21 @@ final class FilterOrderListViewModel: FilterListViewModel {
dateRange = nil
product = nil
customer = nil
salesChannel = nil
numberOfActiveFilters = 0
}

init(orderStatus: [OrderStatusEnum]?,
dateRange: OrderDateRangeFilter?,
product: FilterOrdersByProduct?,
customer: CustomerFilter?,
salesChannel: SalesChannelFilter?,
numberOfActiveFilters: Int) {
self.orderStatus = orderStatus
self.dateRange = dateRange
self.product = product
self.customer = customer
self.salesChannel = salesChannel
self.numberOfActiveFilters = numberOfActiveFilters
}

Expand All @@ -50,6 +54,11 @@ final class FilterOrderListViewModel: FilterListViewModel {
if let customer = customer {
readable.append(customer.description)
}

if let salesChannel = salesChannel {
readable.append(salesChannel.description)
}

return readable.joined(separator: ", ")
}
}
Expand All @@ -66,6 +75,7 @@ final class FilterOrderListViewModel: FilterListViewModel {
private let dateRangeFilterViewModel: FilterTypeViewModel
private let productFilterViewModel: FilterTypeViewModel
private let customerFilterViewModel: FilterTypeViewModel
private let salesChannelFilterViewModel: FilterTypeViewModel

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

self.siteID = siteID
self.stores = stores
self.analytics = analytics

shouldShowHistory = featureFlagService.isFeatureFlagEnabled(.filterHistoryOnOrderAndProductLists)
filterTypeViewModels = [orderStatusFilterViewModel, dateRangeFilterViewModel, customerFilterViewModel, productFilterViewModel]
var allFilterViewModels = [orderStatusFilterViewModel,
dateRangeFilterViewModel,
customerFilterViewModel,
productFilterViewModel]

if featureFlagService.isFeatureFlagEnabled(.pointOfSaleOrdersi2) {
allFilterViewModels.append(salesChannelFilterViewModel)
}

filterTypeViewModels = allFilterViewModels
}

var criteria: Filters {
let orderStatus = orderStatusFilterViewModel.selectedValue as? [OrderStatusEnum] ?? nil
let dateRange = dateRangeFilterViewModel.selectedValue as? OrderDateRangeFilter ?? nil
let product = productFilterViewModel.selectedValue as? FilterOrdersByProduct ?? nil
let customer = customerFilterViewModel.selectedValue as? CustomerFilter ?? nil
let salesChannel = salesChannelFilterViewModel.selectedValue as? SalesChannelFilter ?? nil
let numberOfActiveFilters = filterTypeViewModels.numberOfActiveFilters
return Filters(orderStatus: orderStatus,
dateRange: dateRange,
product: product,
customer: customer,
salesChannel: salesChannel,
numberOfActiveFilters: numberOfActiveFilters)
}

Expand All @@ -120,6 +142,7 @@ final class FilterOrderListViewModel: FilterListViewModel {
dateRange: item.dateRangeFilter,
product: item.productFilter,
customer: item.customerFilter,
salesChannel: nil, // TODO: Filter persistence WOOMOB-712
numberOfActiveFilters: item.numberOfActiveFilters())
}
continuation.resume(returning: filters)
Expand Down Expand Up @@ -198,6 +221,7 @@ extension FilterOrderListViewModel {
case dateRange
case product(siteID: Int64)
case customer(siteID: Int64)
case salesChannel
}
}

Expand All @@ -212,6 +236,8 @@ private extension FilterOrderListViewModel.OrderListFilter {
return Localization.rowTitleProduct
case .customer:
return Localization.rowCustomer
case .salesChannel:
return Localization.rowSalesChannel
}
}
}
Expand All @@ -235,6 +261,10 @@ extension FilterOrderListViewModel.OrderListFilter {
return FilterTypeViewModel(title: title,
listSelectorConfig: .customer(siteID: siteID),
selectedValue: filters.customer)
case .salesChannel:
return FilterTypeViewModel(title: title,
listSelectorConfig: .salesChannel,
selectedValue: filters.salesChannel)
}
}
}
Expand Down Expand Up @@ -281,20 +311,39 @@ extension FilterOrdersByProduct: FilterType {
// MARK: - Constants
private extension FilterOrderListViewModel {
enum Localization {
static let filterActionTitle = NSLocalizedString("Show Orders", comment: "Button title for applying filters to a list of orders.")
static let filterActionTitle = NSLocalizedString(
"filterOrderListViewModel.OrderListFilter.filterActionTitle",
value: "Show Orders",
comment: "Button title for applying filters to a list of orders.")
}
}

private extension FilterOrderListViewModel.OrderListFilter {
enum Localization {
static let rowTitleOrderStatus = NSLocalizedString("Order Status", comment: "Row title for filtering orders by order status.")
static let rowTitleDateRange = NSLocalizedString("Date Range", comment: "Row title for filtering orders by date range.")
static let rowTitleProduct = NSLocalizedString("filterOrderListViewModel.OrderListFilter.rowTitleProduct",
value: "Product",
comment: "Row title for filtering orders by Product.")
static let rowCustomer = NSLocalizedString("filterOrderListViewModel.OrderListFilter.rowCustomer",
value: "Customer",
comment: "Row title for filtering orders by customer.")
static let rowTitleOrderStatus = NSLocalizedString(
"filterOrderListViewModel.OrderListFilter.rowTitleOrderStatus",
value: "Order Status",
comment: "Row title for filtering orders by order status.")

static let rowTitleDateRange = NSLocalizedString(
"filterOrderListViewModel.OrderListFilter.rowTitleDateRange",
value: "Date Range",
comment: "Row title for filtering orders by date range.")
Comment on lines +323 to +331
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's no real benefit to changing existing localized string definitions to use the key, value, comment initialiser, AFAIK.

It incurrs cost/work, because the translation will need to be done again in all the langages even though it's not changed, and I don't know if Glotpress is good at linking up the old version with the new version...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting point, thanks! Since p91TBi-aJl-p2 I've been updating these to adopt the "DNS key thingy" approach every time I had to directly work with them. I'll take that into account moving forward 👍

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, if you're changing a string, at all, it's definitely right to add the reverse DNS key.


static let rowTitleProduct = NSLocalizedString(
"filterOrderListViewModel.OrderListFilter.rowTitleProduct",
value: "Product",
comment: "Row title for filtering orders by Product.")

static let rowCustomer = NSLocalizedString(
"filterOrderListViewModel.OrderListFilter.rowCustomer",
value: "Customer",
comment: "Row title for filtering orders by customer.")

static let rowSalesChannel = NSLocalizedString(
"filterOrderListViewModel.OrderListFilter.rowSalesChannel",
value: "Sales Channel",
comment: "Row title for filtering orders by sales channel.")
}
}

Expand Down Expand Up @@ -322,3 +371,20 @@ extension CustomerFilter: FilterType {
/// Whether the filter is set to a non-empty value.
var isActive: Bool { true }
}

extension FilterOrderListViewModel {
enum SalesChannelFilter: FilterType {
case pointOfSale

var description: String {
switch self {
case .pointOfSale:
return "POS"
}
}

var isActive: Bool {
return true
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,7 @@ private extension OrdersRootViewController {
dateRange: settings.dateRangeFilter,
product: settings.productFilter,
customer: settings.customerFilter,
salesChannel: nil, // TODO: Filter persistence WOOMOB-712
numberOfActiveFilters: settings.numberOfActiveFilters())
case .failure(let error):
print("It was not possible to sync local orders settings: \(String(describing: error))")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ final class FilterOrderListViewModelTests: XCTestCase {
dateRange: nil,
product: nil,
customer: nil,
salesChannel: nil,
numberOfActiveFilters: 0)
XCTAssertEqual(viewModel.criteria, expectedCriteria)
}
Expand All @@ -25,6 +26,7 @@ final class FilterOrderListViewModelTests: XCTestCase {
dateRange: OrderDateRangeFilter(filter: .today),
product: FilterOrdersByProduct(id: 1, name: "Sample product"),
customer: CustomerFilter(customer: Customer.fake().copy(customerID: 1)),
salesChannel: nil,
numberOfActiveFilters: 4)

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

// When
Expand All @@ -52,6 +55,7 @@ final class FilterOrderListViewModelTests: XCTestCase {
dateRange: nil,
product: nil,
customer: nil,
salesChannel: nil,
numberOfActiveFilters: 0)
XCTAssertEqual(viewModel.criteria, expectedCriteria)
}
Expand All @@ -64,6 +68,7 @@ final class FilterOrderListViewModelTests: XCTestCase {
dateRange: OrderDateRangeFilter(filter: .today),
product: FilterOrdersByProduct(id: 1, name: "Sample product"),
customer: CustomerFilter(customer: Customer.fake().copy(customerID: 1)),
salesChannel: nil,
numberOfActiveFilters: 4)

// When
Expand Down Expand Up @@ -100,6 +105,7 @@ final class FilterOrderListViewModelTests: XCTestCase {
dateRange: OrderDateRangeFilter(filter: .today),
product: FilterOrdersByProduct(id: 1, name: "Sample product"),
customer: CustomerFilter(customer: Customer.fake().copy(customerID: 1)),
salesChannel: nil,
numberOfActiveFilters: 4)
let viewModel = FilterOrderListViewModel(filters: filters,
allowedStatuses: [],
Expand All @@ -116,11 +122,13 @@ final class FilterOrderListViewModelTests: XCTestCase {
dateRange: result1.dateRangeFilter,
product: result1.productFilter,
customer: result1.customerFilter,
salesChannel: nil,
numberOfActiveFilters: result1.numberOfActiveFilters()),
FilterOrderListViewModel.Filters(orderStatus: result2.orderStatusesFilter,
dateRange: result2.dateRangeFilter,
product: result2.productFilter,
customer: result2.customerFilter,
salesChannel: nil,
numberOfActiveFilters: result2.numberOfActiveFilters())
])
}
Expand All @@ -144,6 +152,7 @@ final class FilterOrderListViewModelTests: XCTestCase {
dateRange: OrderDateRangeFilter(filter: .today),
product: FilterOrdersByProduct(id: 1, name: "Sample product"),
customer: CustomerFilter(customer: Customer.fake().copy(customerID: 1)),
salesChannel: nil,
numberOfActiveFilters: 4)
let viewModel = FilterOrderListViewModel(filters: filters,
allowedStatuses: [],
Expand Down Expand Up @@ -179,6 +188,7 @@ final class FilterOrderListViewModelTests: XCTestCase {
dateRange: OrderDateRangeFilter(filter: .today),
product: FilterOrdersByProduct(id: 1, name: "Sample product"),
customer: CustomerFilter(customer: Customer.fake().copy(customerID: 1)),
salesChannel: nil,
numberOfActiveFilters: 4)
let viewModel = FilterOrderListViewModel(filters: filters,
allowedStatuses: [],
Expand Down
Loading