diff --git a/Experiments/Experiments/DefaultFeatureFlagService.swift b/Experiments/Experiments/DefaultFeatureFlagService.swift index adad4f99bea..da53ba2a912 100644 --- a/Experiments/Experiments/DefaultFeatureFlagService.swift +++ b/Experiments/Experiments/DefaultFeatureFlagService.swift @@ -60,6 +60,8 @@ public struct DefaultFeatureFlagService: FeatureFlagService { return false case .generateAllVariations: return buildConfig == .localDeveloper || buildConfig == .alpha + case .productsBulkEditing: + return buildConfig == .localDeveloper || buildConfig == .alpha default: return true } diff --git a/Experiments/Experiments/FeatureFlag.swift b/Experiments/Experiments/FeatureFlag.swift index 32a7b4eb254..1ad15d1187c 100644 --- a/Experiments/Experiments/FeatureFlag.swift +++ b/Experiments/Experiments/FeatureFlag.swift @@ -141,4 +141,8 @@ public enum FeatureFlag: Int { /// Allows merchants to create all variations from a single button /// case generateAllVariations + + /// Bulk editing of status and price in products list + /// + case productsBulkEditing } diff --git a/WooCommerce/Classes/Extensions/UIImage+Woo.swift b/WooCommerce/Classes/Extensions/UIImage+Woo.swift index 9a42b0d57e6..7fdaf1dae1c 100644 --- a/WooCommerce/Classes/Extensions/UIImage+Woo.swift +++ b/WooCommerce/Classes/Extensions/UIImage+Woo.swift @@ -704,6 +704,12 @@ extension UIImage { return ellipsisImage.imageWithTintColor(tintColor)! } + /// Select multiple items icon + /// + static var multiSelectIcon: UIImage { + return UIImage(named: "icon-multiselect")! + } + /// Payment celebration /// static var celebrationImage: UIImage { diff --git a/WooCommerce/Classes/ViewRelated/Products/ProductsViewController.swift b/WooCommerce/Classes/ViewRelated/Products/ProductsViewController.swift index d3726d9c08a..087cbe88975 100644 --- a/WooCommerce/Classes/ViewRelated/Products/ProductsViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Products/ProductsViewController.swift @@ -262,6 +262,10 @@ private extension ProductsViewController { } coordinatingController.start() } + + @objc func startBulkEditing() { + // TODO-8517: implement selection state + } } // MARK: - View Configuration @@ -319,6 +323,25 @@ private extension ProductsViewController { }() rightBarButtonItems.append(searchItem) + if ServiceLocator.featureFlagService.isFeatureFlagEnabled(.productsBulkEditing) { + let bulkEditItem: UIBarButtonItem = { + let button = UIBarButtonItem(image: .multiSelectIcon, + style: .plain, + target: self, + action: #selector(startBulkEditing)) + button.accessibilityTraits = .button + button.accessibilityLabel = NSLocalizedString("Edit products", + comment: "Action to start bulk editing of products") + button.accessibilityHint = NSLocalizedString( + "Edit status or price for multiple products at once", + comment: "VoiceOver accessibility hint, informing the user the button can be used to bulk edit products" + ) + + return button + }() + rightBarButtonItems.append(bulkEditItem) + } + navigationItem.rightBarButtonItems = rightBarButtonItems } diff --git a/WooCommerce/Resources/Images.xcassets/icon-multiselect.imageset/Contents.json b/WooCommerce/Resources/Images.xcassets/icon-multiselect.imageset/Contents.json new file mode 100644 index 00000000000..e97433ea5d1 --- /dev/null +++ b/WooCommerce/Resources/Images.xcassets/icon-multiselect.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "icon-multiselect.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/WooCommerce/Resources/Images.xcassets/icon-multiselect.imageset/icon-multiselect.pdf b/WooCommerce/Resources/Images.xcassets/icon-multiselect.imageset/icon-multiselect.pdf new file mode 100644 index 00000000000..184329714cb Binary files /dev/null and b/WooCommerce/Resources/Images.xcassets/icon-multiselect.imageset/icon-multiselect.pdf differ diff --git a/WooCommerce/WooCommerceTests/Extensions/IconsTests.swift b/WooCommerce/WooCommerceTests/Extensions/IconsTests.swift index 2511eb78e11..e19472f83a7 100644 --- a/WooCommerce/WooCommerceTests/Extensions/IconsTests.swift +++ b/WooCommerce/WooCommerceTests/Extensions/IconsTests.swift @@ -310,6 +310,10 @@ final class IconsTests: XCTestCase { XCTAssertNotNil(UIImage.moreImage) } + func test_multiSelectIcon_is_not_nil() { + XCTAssertNotNil(UIImage.multiSelectIcon) + } + func test_multipleUsers_image_is_not_nil() { XCTAssertNotNil(UIImage.multipleUsersImage) }