From 20c5f1ff55d7d9ab92aa54c135137004e3ab5e41 Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Wed, 2 Jul 2025 08:43:49 +0700 Subject: [PATCH 1/7] Add sales channel filter and present empty view when navigated to --- .../DefaultFeatureFlagService.swift | 2 + Modules/Sources/Experiments/FeatureFlag.swift | 4 ++ .../OrderListSyncBackgroundTask.swift | 1 + .../Filters/FilterListViewController.swift | 6 +++ .../FilterOrderListViewModel.swift | 45 ++++++++++++++++++- .../Orders/OrdersRootViewController.swift | 1 + 6 files changed, 58 insertions(+), 1 deletion(-) diff --git a/Modules/Sources/Experiments/DefaultFeatureFlagService.swift b/Modules/Sources/Experiments/DefaultFeatureFlagService.swift index ec3b2566eba..bf7e162a4aa 100644 --- a/Modules/Sources/Experiments/DefaultFeatureFlagService.swift +++ b/Modules/Sources/Experiments/DefaultFeatureFlagService.swift @@ -97,6 +97,8 @@ public struct DefaultFeatureFlagService: FeatureFlagService { return buildConfig == .localDeveloper || buildConfig == .alpha case .pointOfSaleOrdersi1: return false + case .pointOfSaleOrdersi2: + return true default: return true } diff --git a/Modules/Sources/Experiments/FeatureFlag.swift b/Modules/Sources/Experiments/FeatureFlag.swift index 94ef3bf0e81..cbe6036a469 100644 --- a/Modules/Sources/Experiments/FeatureFlag.swift +++ b/Modules/Sources/Experiments/FeatureFlag.swift @@ -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 } diff --git a/WooCommerce/Classes/Tools/BackgroundTasks/OrderListSyncBackgroundTask.swift b/WooCommerce/Classes/Tools/BackgroundTasks/OrderListSyncBackgroundTask.swift index 25f46431b5c..dadcd4fcde8 100644 --- a/WooCommerce/Classes/Tools/BackgroundTasks/OrderListSyncBackgroundTask.swift +++ b/WooCommerce/Classes/Tools/BackgroundTasks/OrderListSyncBackgroundTask.swift @@ -77,6 +77,7 @@ private struct CurrentOrderListSyncUseCase { dateRange: settings.dateRangeFilter, product: settings.productFilter, customer: settings.customerFilter, + salesChannel: nil, // TODO: Filter persistence numberOfActiveFilters: settings.numberOfActiveFilters()) continuation.resume(returning: filters) case .failure: diff --git a/WooCommerce/Classes/ViewRelated/Filters/FilterListViewController.swift b/WooCommerce/Classes/ViewRelated/Filters/FilterListViewController.swift index dfa06b14a9d..a586be73f45 100644 --- a/WooCommerce/Classes/ViewRelated/Filters/FilterListViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Filters/FilterListViewController.swift @@ -92,6 +92,8 @@ enum FilterListValueSelectorConfig { case products(siteID: Int64) // Filter list selector for customer case customer(siteID: Int64) + + case salesChannel } @@ -297,6 +299,10 @@ private extension FilterListViewController { self.listSelector.reloadData() } self.listSelector.navigationController?.pushViewController(statusesFilterVC, animated: true) + case .salesChannel: + // TODO: Make OrderSalesChannelFilterViewController. Handle filtering selection. + 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 diff --git a/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift b/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift index dbe57c2fe36..cb4604bd09b 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift @@ -3,6 +3,24 @@ import Yosemite import Experiments import WooFoundation +enum SalesChannelFilter: FilterType { + case online + case pointOfSale + + var description: String { + switch self { + case .online: + return "online" + case .pointOfSale: + return "pos" + } + } + + var isActive: Bool { + return true + } +} + /// `FilterListViewModel` for filtering a list of orders. final class FilterOrderListViewModel: FilterListViewModel { typealias Criteria = Filters @@ -13,6 +31,7 @@ final class FilterOrderListViewModel: FilterListViewModel { let dateRange: OrderDateRangeFilter? let product: FilterOrdersByProduct? let customer: CustomerFilter? + let salesChannel: SalesChannelFilter? let numberOfActiveFilters: Int @@ -21,6 +40,7 @@ final class FilterOrderListViewModel: FilterListViewModel { dateRange = nil product = nil customer = nil + salesChannel = nil numberOfActiveFilters = 0 } @@ -28,11 +48,13 @@ final class FilterOrderListViewModel: FilterListViewModel { 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 } @@ -50,6 +72,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: ", ") } } @@ -66,6 +93,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 @@ -87,13 +115,18 @@ 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] + filterTypeViewModels = [orderStatusFilterViewModel, + dateRangeFilterViewModel, + customerFilterViewModel, + productFilterViewModel, + salesChannelFilterViewModel] } var criteria: Filters { @@ -101,11 +134,13 @@ final class FilterOrderListViewModel: FilterListViewModel { 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) } @@ -120,6 +155,7 @@ final class FilterOrderListViewModel: FilterListViewModel { dateRange: item.dateRangeFilter, product: item.productFilter, customer: item.customerFilter, + salesChannel: nil, // TODO: Filter persistence numberOfActiveFilters: item.numberOfActiveFilters()) } continuation.resume(returning: filters) @@ -198,6 +234,7 @@ extension FilterOrderListViewModel { case dateRange case product(siteID: Int64) case customer(siteID: Int64) + case salesChannel } } @@ -212,6 +249,8 @@ private extension FilterOrderListViewModel.OrderListFilter { return Localization.rowTitleProduct case .customer: return Localization.rowCustomer + case .salesChannel: + return "Sales Channel" } } } @@ -235,6 +274,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) } } } diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrdersRootViewController.swift b/WooCommerce/Classes/ViewRelated/Orders/OrdersRootViewController.swift index 7b25dd5113d..018d9eec98b 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrdersRootViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrdersRootViewController.swift @@ -448,6 +448,7 @@ private extension OrdersRootViewController { dateRange: settings.dateRangeFilter, product: settings.productFilter, customer: settings.customerFilter, + salesChannel: nil, // TODO: Filter persistence numberOfActiveFilters: settings.numberOfActiveFilters()) case .failure(let error): print("It was not possible to sync local orders settings: \(String(describing: error))") From d65cbf1d6af41a75a54f67fa39876588368869c9 Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Tue, 8 Jul 2025 11:54:45 +0700 Subject: [PATCH 2/7] hide filter behind feature flag --- .../BackgroundTasks/OrderListSyncBackgroundTask.swift | 2 +- .../Filters/FilterListViewController.swift | 4 ++-- .../Order Filters/FilterOrderListViewModel.swift | 11 +++++++---- .../ViewRelated/Orders/OrdersRootViewController.swift | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/WooCommerce/Classes/Tools/BackgroundTasks/OrderListSyncBackgroundTask.swift b/WooCommerce/Classes/Tools/BackgroundTasks/OrderListSyncBackgroundTask.swift index dadcd4fcde8..aac7cf3be61 100644 --- a/WooCommerce/Classes/Tools/BackgroundTasks/OrderListSyncBackgroundTask.swift +++ b/WooCommerce/Classes/Tools/BackgroundTasks/OrderListSyncBackgroundTask.swift @@ -77,7 +77,7 @@ private struct CurrentOrderListSyncUseCase { dateRange: settings.dateRangeFilter, product: settings.productFilter, customer: settings.customerFilter, - salesChannel: nil, // TODO: Filter persistence + salesChannel: nil, // TODO: Filter persistence WOOMOB-712 numberOfActiveFilters: settings.numberOfActiveFilters()) continuation.resume(returning: filters) case .failure: diff --git a/WooCommerce/Classes/ViewRelated/Filters/FilterListViewController.swift b/WooCommerce/Classes/ViewRelated/Filters/FilterListViewController.swift index a586be73f45..4047f1018e1 100644 --- a/WooCommerce/Classes/ViewRelated/Filters/FilterListViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Filters/FilterListViewController.swift @@ -92,7 +92,7 @@ enum FilterListValueSelectorConfig { case products(siteID: Int64) // Filter list selector for customer case customer(siteID: Int64) - + // Filter list selector for sales channel case salesChannel } @@ -300,7 +300,7 @@ private extension FilterListViewController { } self.listSelector.navigationController?.pushViewController(statusesFilterVC, animated: true) case .salesChannel: - // TODO: Make OrderSalesChannelFilterViewController. Handle filtering selection. + // TODO: Make OrderSalesChannelFilterViewController, and handle filtering selection WOOMOB-711 let emptyViewController = EmptyStateViewController(style: .list) self.listSelector.navigationController?.pushViewController(emptyViewController, animated: true) case .ordersDateRange: diff --git a/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift b/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift index cb4604bd09b..9b0ac2b729f 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift @@ -83,7 +83,7 @@ final class FilterOrderListViewModel: FilterListViewModel { let filterActionTitle = Localization.filterActionTitle - let filterTypeViewModels: [FilterTypeViewModel] + var filterTypeViewModels: [FilterTypeViewModel] let shouldShowHistory: Bool @@ -125,8 +125,11 @@ final class FilterOrderListViewModel: FilterListViewModel { filterTypeViewModels = [orderStatusFilterViewModel, dateRangeFilterViewModel, customerFilterViewModel, - productFilterViewModel, - salesChannelFilterViewModel] + productFilterViewModel] + + if featureFlagService.isFeatureFlagEnabled(.pointOfSaleOrdersi2) { + filterTypeViewModels.append(salesChannelFilterViewModel) + } } var criteria: Filters { @@ -155,7 +158,7 @@ final class FilterOrderListViewModel: FilterListViewModel { dateRange: item.dateRangeFilter, product: item.productFilter, customer: item.customerFilter, - salesChannel: nil, // TODO: Filter persistence + salesChannel: nil, // TODO: Filter persistence WOOMOB-712 numberOfActiveFilters: item.numberOfActiveFilters()) } continuation.resume(returning: filters) diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrdersRootViewController.swift b/WooCommerce/Classes/ViewRelated/Orders/OrdersRootViewController.swift index 018d9eec98b..55a2ab6da7a 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrdersRootViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrdersRootViewController.swift @@ -448,7 +448,7 @@ private extension OrdersRootViewController { dateRange: settings.dateRangeFilter, product: settings.productFilter, customer: settings.customerFilter, - salesChannel: nil, // TODO: Filter persistence + 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))") From a7d4a6ec0145a92dc3b8f37726bd2113fcb2bf7e Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Tue, 8 Jul 2025 11:55:23 +0700 Subject: [PATCH 3/7] lint --- Modules/Sources/Experiments/FeatureFlag.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Sources/Experiments/FeatureFlag.swift b/Modules/Sources/Experiments/FeatureFlag.swift index cbe6036a469..d2be4d0fd03 100644 --- a/Modules/Sources/Experiments/FeatureFlag.swift +++ b/Modules/Sources/Experiments/FeatureFlag.swift @@ -203,7 +203,7 @@ 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 From acb9bdcd229e3cd533db4f50ebaee0d54feae862 Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Tue, 8 Jul 2025 12:03:22 +0700 Subject: [PATCH 4/7] make test target compile --- .../Orders/Filters/FilterOrderListViewModelTests.swift | 10 ++++++++++ .../Orders/OrderListSyncActionUseCaseTests.swift | 4 ++++ .../ViewRelated/Orders/OrderListViewModelTests.swift | 5 +++++ 3 files changed, 19 insertions(+) diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Orders/Filters/FilterOrderListViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Orders/Filters/FilterOrderListViewModelTests.swift index 1e98f785464..868a6a7d2ef 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Orders/Filters/FilterOrderListViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Orders/Filters/FilterOrderListViewModelTests.swift @@ -15,6 +15,7 @@ final class FilterOrderListViewModelTests: XCTestCase { dateRange: nil, product: nil, customer: nil, + salesChannel: nil, numberOfActiveFilters: 0) XCTAssertEqual(viewModel.criteria, expectedCriteria) } @@ -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 @@ -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 @@ -52,6 +55,7 @@ final class FilterOrderListViewModelTests: XCTestCase { dateRange: nil, product: nil, customer: nil, + salesChannel: nil, numberOfActiveFilters: 0) XCTAssertEqual(viewModel.criteria, expectedCriteria) } @@ -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 @@ -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: [], @@ -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()) ]) } @@ -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: [], @@ -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: [], diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Orders/OrderListSyncActionUseCaseTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Orders/OrderListSyncActionUseCaseTests.swift index 33e9ce20ebf..7745cd001fb 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Orders/OrderListSyncActionUseCaseTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Orders/OrderListSyncActionUseCaseTests.swift @@ -28,6 +28,7 @@ final class OrderListSyncActionUseCaseTests: XCTestCase { dateRange: nil, product: FilterOrdersByProduct(id: 1, name: "Sample product"), customer: nil, + salesChannel: nil, numberOfActiveFilters: 1) let useCase = OrderListSyncActionUseCase(siteID: siteID, filters: filters) @@ -60,6 +61,7 @@ final class OrderListSyncActionUseCaseTests: XCTestCase { dateRange: nil, product: FilterOrdersByProduct(id: 1, name: "Sample product"), customer: nil, + salesChannel: nil, numberOfActiveFilters: 1) let useCase = OrderListSyncActionUseCase(siteID: siteID, filters: filters) @@ -144,6 +146,7 @@ final class OrderListSyncActionUseCaseTests: XCTestCase { dateRange: nil, product: FilterOrdersByProduct(id: 1, name: "Sample product"), customer: nil, + salesChannel: nil, numberOfActiveFilters: 1) let useCase = OrderListSyncActionUseCase(siteID: siteID, filters: filters) @@ -201,6 +204,7 @@ final class OrderListSyncActionUseCaseTests: XCTestCase { dateRange: nil, product: FilterOrdersByProduct(id: 1, name: "Sample product"), customer: nil, + salesChannel: nil, numberOfActiveFilters: 1) let useCase = OrderListSyncActionUseCase(siteID: siteID, filters: filters) diff --git a/WooCommerce/WooCommerceTests/ViewRelated/Orders/OrderListViewModelTests.swift b/WooCommerce/WooCommerceTests/ViewRelated/Orders/OrderListViewModelTests.swift index 61796f147d2..2ccdfa45ed0 100644 --- a/WooCommerce/WooCommerceTests/ViewRelated/Orders/OrderListViewModelTests.swift +++ b/WooCommerce/WooCommerceTests/ViewRelated/Orders/OrderListViewModelTests.swift @@ -50,6 +50,7 @@ final class OrderListViewModelTests: XCTestCase { dateRange: nil, product: nil, customer: nil, + salesChannel: nil, numberOfActiveFilters: 1) let viewModel = OrderListViewModel(siteID: siteID, storageManager: storageManager, @@ -100,6 +101,7 @@ final class OrderListViewModelTests: XCTestCase { dateRange: nil, product: nil, customer: nil, + salesChannel: nil, numberOfActiveFilters: 1) let viewModel = OrderListViewModel(siteID: siteID, storageManager: storageManager, @@ -136,6 +138,7 @@ final class OrderListViewModelTests: XCTestCase { dateRange: nil, product: nil, customer: nil, + salesChannel: nil, numberOfActiveFilters: 1) let viewModel = OrderListViewModel(siteID: siteID, storageManager: storageManager, @@ -323,6 +326,7 @@ final class OrderListViewModelTests: XCTestCase { dateRange: nil, product: nil, customer: nil, + salesChannel: nil, numberOfActiveFilters: 1)) // Assert @@ -335,6 +339,7 @@ final class OrderListViewModelTests: XCTestCase { dateRange: nil, product: nil, customer: nil, + salesChannel: nil, numberOfActiveFilters: 0) let notificationCenter = NotificationCenter() let viewModel = OrderListViewModel(siteID: siteID, From 13463125fc064f8171438f7e11d0dd19702a3081 Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Tue, 8 Jul 2025 12:26:56 +0700 Subject: [PATCH 5/7] cleanup localization. move enum to extension --- .../FilterOrderListViewModel.swift | 74 ++++++++++++------- 1 file changed, 46 insertions(+), 28 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift b/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift index 9b0ac2b729f..ff85b490c06 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift @@ -3,24 +3,6 @@ import Yosemite import Experiments import WooFoundation -enum SalesChannelFilter: FilterType { - case online - case pointOfSale - - var description: String { - switch self { - case .online: - return "online" - case .pointOfSale: - return "pos" - } - } - - var isActive: Bool { - return true - } -} - /// `FilterListViewModel` for filtering a list of orders. final class FilterOrderListViewModel: FilterListViewModel { typealias Criteria = Filters @@ -253,7 +235,7 @@ private extension FilterOrderListViewModel.OrderListFilter { case .customer: return Localization.rowCustomer case .salesChannel: - return "Sales Channel" + return Localization.rowSalesChannel } } } @@ -327,20 +309,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.") + + 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.") } } @@ -368,3 +369,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 + } + } +} From 4f93bca5d908d16f03fb45c8e7c69f5737700c28 Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Tue, 8 Jul 2025 17:58:56 +0700 Subject: [PATCH 6/7] maintain property immutability --- .../Order Filters/FilterOrderListViewModel.swift | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift b/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift index ff85b490c06..20be2956f0b 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift @@ -65,7 +65,7 @@ final class FilterOrderListViewModel: FilterListViewModel { let filterActionTitle = Localization.filterActionTitle - var filterTypeViewModels: [FilterTypeViewModel] + let filterTypeViewModels: [FilterTypeViewModel] let shouldShowHistory: Bool @@ -104,14 +104,16 @@ final class FilterOrderListViewModel: FilterListViewModel { self.analytics = analytics shouldShowHistory = featureFlagService.isFeatureFlagEnabled(.filterHistoryOnOrderAndProductLists) - filterTypeViewModels = [orderStatusFilterViewModel, - dateRangeFilterViewModel, - customerFilterViewModel, - productFilterViewModel] + var allFilterViewModels = [orderStatusFilterViewModel, + dateRangeFilterViewModel, + customerFilterViewModel, + productFilterViewModel] if featureFlagService.isFeatureFlagEnabled(.pointOfSaleOrdersi2) { - filterTypeViewModels.append(salesChannelFilterViewModel) + allFilterViewModels.append(salesChannelFilterViewModel) } + + filterTypeViewModels = allFilterViewModels } var criteria: Filters { From de53799ff5b838f4587df13bee01ad82576d44c4 Mon Sep 17 00:00:00 2001 From: iamgabrielma Date: Tue, 8 Jul 2025 18:00:53 +0700 Subject: [PATCH 7/7] uppercase --- .../Orders/Order Filters/FilterOrderListViewModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift b/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift index 20be2956f0b..1328560bf60 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/Order Filters/FilterOrderListViewModel.swift @@ -379,7 +379,7 @@ extension FilterOrderListViewModel { var description: String { switch self { case .pointOfSale: - return "pos" + return "POS" } }