Skip to content

Commit e5f3bdd

Browse files
authored
Merge pull request #5394 from anas-p/feature/4846-variation-number-in-list-and-details
2 parents b8ccd31 + 589020f commit e5f3bdd

10 files changed

+74
-9
lines changed

WooCommerce/Classes/ViewRelated/Products/Cells/ProductsTabProductTableViewCell.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@ extension ProductsTabProductTableViewCell: SearchResultCell {
6464

6565
extension ProductsTabProductTableViewCell {
6666
func update(viewModel: ProductsTabProductViewModel, imageService: ImageService) {
67-
nameLabel.text = viewModel.name
68-
67+
nameLabel.text = viewModel.createNameLabel()
6968
detailsLabel.attributedText = viewModel.detailsAttributedString
7069

7170
productImageView.contentMode = .center
@@ -155,7 +154,7 @@ private extension ProductsTabProductTableViewCell {
155154

156155
func configureNameLabel() {
157156
nameLabel.applyBodyStyle()
158-
nameLabel.numberOfLines = 2
157+
nameLabel.numberOfLines = 0
159158
}
160159

161160
func configureDetailsLabel() {

WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController+Helpers.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,15 @@ extension ProductFormViewController {
8484
// MARK: - Progress
8585

8686
/// Progress view for save action.
87+
///
8788
func showSavingProgress(_ messageType: SaveMessageType) {
8889
switch messageType {
8990
case .publish:
9091
displayInProgressView(title: Localization.ProgressView.productPublishingTitle, message: Localization.ProgressView.productPublishingMessage)
9192
case .save:
9293
displayInProgressView(title: Localization.ProgressView.productSavingTitle, message: Localization.ProgressView.productSavingMessage)
94+
case .saveVariation:
95+
displayInProgressView(title: Localization.ProgressView.productVariationTitle, message: Localization.ProgressView.productVariationMessage)
9396
}
9497
}
9598

@@ -176,5 +179,9 @@ private enum Localization {
176179
comment: "Title of the in-progress UI while deleting the Variation remotely")
177180
static let variationDeletionMessage = NSLocalizedString("Please wait while we update your store details",
178181
comment: "Message of the in-progress UI while deleting the Variation remotely")
182+
static let productVariationTitle = NSLocalizedString("Saving your variation...",
183+
comment: "Title of the in-progress UI while saving a Variation remotely")
184+
static let productVariationMessage = NSLocalizedString("Please wait while we save your latest changes",
185+
comment: "Message of the in-progress UI while saving a Variation remotely")
179186
}
180187
}

WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewController.swift

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ final class ProductFormViewController<ViewModel: ProductFormViewModelProtocol>:
9696

9797
override func viewDidLoad() {
9898
super.viewDidLoad()
99-
10099
configurePresentationStyle()
101100
configureNavigationBar()
101+
102102
configureMainView()
103103
configureTableView()
104104
configureMoreDetailsContainerView()
@@ -407,9 +407,12 @@ final class ProductFormViewController<ViewModel: ProductFormViewModelProtocol>:
407407
//
408408
private extension ProductFormViewController {
409409

410-
func configureNavigationBar() {
410+
/// Configure navigation bar with the title
411+
///
412+
func configureNavigationBar(title: String = "") {
411413
updateNavigationBar()
412414
updateBackButtonTitle()
415+
updateNavigationBarTitle()
413416
}
414417

415418
func configureMainView() {
@@ -801,6 +804,14 @@ private extension ProductFormViewController {
801804
navigationItem.backButtonTitle = viewModel.productModel.name.isNotEmpty ? viewModel.productModel.name : Localization.unnamedProduct
802805
}
803806

807+
func updateNavigationBarTitle() {
808+
// Update navigation bar title with variation ID for variation page
809+
guard let variationID = viewModel.productionVariationID else {
810+
return
811+
}
812+
title = Localization.variationViewTitle(variationID: "\(variationID)")
813+
}
814+
804815
func updateNavigationBar() {
805816
// Create action buttons based on view model
806817
let rightBarButtonItems: [UIBarButtonItem] = viewModel.actionButtons.reversed().map { buttonType in
@@ -1435,6 +1446,11 @@ private enum Localization {
14351446
comment: "Navigation bar title for editing linked products for a grouped product")
14361447
static let unnamedProduct = NSLocalizedString("Unnamed product",
14371448
comment: "Back button title when the product doesn't have a name")
1449+
1450+
static func variationViewTitle(variationID: String) -> String {
1451+
let titleFormat = NSLocalizedString("Variation #%1$@", comment: "Navigation bar title for variation. Parameters: %1$@ - Product variation ID")
1452+
return String.localizedStringWithFormat(titleFormat, variationID)
1453+
}
14381454
}
14391455

14401456
private enum ActionSheetStrings {

WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewModel.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import protocol Storage.StorageManagerType
77
final class ProductFormViewModel: ProductFormViewModelProtocol {
88
typealias ProductModel = EditableProductModel
99

10+
/// Production variation ID only for Product Variation not for product
11+
var productionVariationID: Int64? = nil
12+
1013
/// Emits product on change, except when the product name is the only change (`productName` is emitted for this case).
1114
var observableProduct: Observable<EditableProductModel> {
1215
productSubject

WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductFormViewModelProtocol.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ enum ActionButtonType {
1919
enum SaveMessageType {
2020
case publish
2121
case save
22+
case saveVariation
2223
}
2324

25+
2426
/// A view model for `ProductFormViewController` to add/edit a generic product model (e.g. `Product` or `ProductVariation`).
2527
///
2628
protocol ProductFormViewModelProtocol {
@@ -56,6 +58,9 @@ protocol ProductFormViewModelProtocol {
5658
/// The action buttons that should be rendered in the navigation bar.
5759
var actionButtons: [ActionButtonType] { get }
5860

61+
/// The product variation ID
62+
var productionVariationID: Int64? { get }
63+
5964
// Unsaved changes
6065

6166
func hasUnsavedChanges() -> Bool
@@ -148,14 +153,20 @@ extension ProductFormViewModelProtocol {
148153

149154
/// Returns `.publish` when the product does not exists remotely and it's gonna be published for the first time.
150155
/// Returns `.publish` when the product is going to be published from a different status (eg: from draft).
156+
/// Returns `.saveVariation` when save variation
151157
/// Returns `.save` for any other case.
152158
///
153159
func saveMessageType(for productStatus: ProductStatus) -> SaveMessageType {
154160
switch productStatus {
155161
case .publish where !productModel.existsRemotely || originalProductModel.status != .publish:
156162
return .publish
157163
default:
158-
return .save
164+
if self is ProductVariationFormViewModel {
165+
return .saveVariation
166+
}
167+
else {
168+
return .save
169+
}
159170
}
160171
}
161172
}

WooCommerce/Classes/ViewRelated/Products/Edit Product/ProductVariationFormViewModel.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ final class ProductVariationFormViewModel: ProductFormViewModelProtocol {
2626
isUpdateEnabledSubject
2727
}
2828

29+
/// The product variation ID
30+
var productionVariationID: Int64? {
31+
productVariation.productVariation.productVariationID
32+
}
33+
2934
/// Emits a void value informing when there is a new variation price state available
3035
var newVariationsPrice: Observable<Void> = PublishSubject<Void>()
3136

WooCommerce/Classes/ViewRelated/Products/Variations/ProductVariationsViewController.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,7 @@ extension ProductVariationsViewController: UITableViewDelegate {
410410
let currency = ServiceLocator.currencySettings.symbol(from: currencyCode)
411411
let productImageActionHandler = ProductImageActionHandler(siteID: productVariation.siteID,
412412
product: model)
413+
413414
let viewModel = ProductVariationFormViewModel(productVariation: model,
414415
allAttributes: allAttributes,
415416
parentProductSKU: parentProductSKU,

WooCommerce/Classes/ViewRelated/Products/Variations/ProductsTabProductViewModel+ProductVariation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ extension ProductsTabProductViewModel {
77
imageUrl = productVariationModel.productVariation.image?.src
88
name = productVariationModel.name
99
detailsAttributedString = productVariationModel.createDetailsAttributedString(currencySettings: currencySettings)
10-
10+
productVariation = productVariationModel.productVariation
1111
imageService = ServiceLocator.imageService
1212
isSelected = false
1313
isDraggable = false

WooCommerce/Classes/ViewRelated/Products/View Models/ProductsTabProductViewModel.swift

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,41 @@ private extension ProductStatus {
1919
struct ProductsTabProductViewModel {
2020
let imageUrl: String?
2121
let name: String
22+
let productVariation: ProductVariation?
2223
let detailsAttributedString: NSAttributedString
2324
let isSelected: Bool
2425
let isDraggable: Bool
2526

2627
// Dependency for configuring the view.
2728
let imageService: ImageService
2829

29-
init(product: Product, isSelected: Bool = false, isDraggable: Bool = false, imageService: ImageService = ServiceLocator.imageService) {
30+
init(product: Product,
31+
productVariation: ProductVariation? = nil,
32+
isSelected: Bool = false,
33+
isDraggable: Bool = false,
34+
imageService: ImageService = ServiceLocator.imageService) {
35+
3036
imageUrl = product.images.first?.src
3137
name = product.name.isEmpty ? Localization.noTitle : product.name
38+
self.productVariation = productVariation
3239
self.isSelected = isSelected
3340
self.isDraggable = isDraggable
3441
detailsAttributedString = EditableProductModel(product: product).createDetailsAttributedString()
3542

3643
self.imageService = imageService
3744
}
45+
46+
/// Variation will show product variation ID within the title,
47+
/// Product will only show product name
48+
/// See more: https://github.com/woocommerce/woocommerce-ios/issues/4846
49+
///
50+
func createNameLabel() -> String {
51+
if let variationID = productVariation?.productVariationID {
52+
// Add product variation ID with name
53+
return "\(Localization.variationID(variationID: "\(variationID)"))\n\(name)"
54+
}
55+
return name
56+
}
3857
}
3958

4059
private extension EditableProductModel {
@@ -83,5 +102,9 @@ private extension EditableProductModel {
83102
private extension ProductsTabProductViewModel {
84103
enum Localization {
85104
static let noTitle = NSLocalizedString("(No Title)", comment: "Product title in Products list when there is no title")
105+
static func variationID(variationID: String) -> String {
106+
let titleFormat = NSLocalizedString("#%1$@", comment: "Variation ID. Parameters: %1$@ - Product variation ID")
107+
return String.localizedStringWithFormat(titleFormat, variationID)
108+
}
86109
}
87110
}

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5402,12 +5402,12 @@
54025402
B56DB3F12049C0B800D4AA8E /* Classes */ = {
54035403
isa = PBXGroup;
54045404
children = (
5405+
B57B67882107545B00AF8905 /* Model */,
54055406
D8D15F81230A178100D48B3F /* ServiceLocator */,
54065407
747AA0872107CE270047A89B /* Analytics */,
54075408
B55D4C0420B6026700D7A50F /* Authentication */,
54085409
0211252225773EB40075AD2A /* Copiable */,
54095410
CE1CCB4C20572444000EE3AC /* Extensions */,
5410-
B57B67882107545B00AF8905 /* Model */,
54115411
B5BBD6DC21B1701F00E3207E /* Notifications */,
54125412
CE1CCB3E2056F204000EE3AC /* Styles */,
54135413
B5D1AFBE20BC67B500DB0E8C /* System */,

0 commit comments

Comments
 (0)