Skip to content

Commit dc04c34

Browse files
committed
Fixed #4847-text change on creating variation
1 parent 90da430 commit dc04c34

11 files changed

+73
-11
lines changed

WooCommerce.xcworkspace/contents.xcworkspacedata

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,15 @@ extension ProductsTabProductTableViewCell: SearchResultCell {
6464

6565
extension ProductsTabProductTableViewCell {
6666
func update(viewModel: ProductsTabProductViewModel, imageService: ImageService) {
67-
nameLabel.text = viewModel.name
67+
68+
// TODO: #update Documentation here...
69+
// TODO: Add Localization
70+
if let variationID = viewModel.productVariation?.productVariationID {
71+
nameLabel.text = "#\(variationID)\n\(viewModel.name)"
72+
}
73+
else {
74+
nameLabel.text = viewModel.name
75+
}
6876

6977
detailsLabel.attributedText = viewModel.detailsAttributedString
7078

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ extension ProductFormViewController {
9090
displayInProgressView(title: Localization.ProgressView.productPublishingTitle, message: Localization.ProgressView.productPublishingMessage)
9191
case .save:
9292
displayInProgressView(title: Localization.ProgressView.productSavingTitle, message: Localization.ProgressView.productSavingMessage)
93+
case .saveVariation:
94+
displayInProgressView(title: Localization.ProgressView.productVariationTitle, message: Localization.ProgressView.productVariationMessage)
9395
}
9496
}
9597

@@ -176,5 +178,9 @@ private enum Localization {
176178
comment: "Title of the in-progress UI while deleting the Variation remotely")
177179
static let variationDeletionMessage = NSLocalizedString("Please wait while we update your store details",
178180
comment: "Message of the in-progress UI while deleting the Variation remotely")
181+
static let productVariationTitle = NSLocalizedString("Saving your variation...",
182+
comment: "Title of the in-progress UI while saving a Variation remotely")
183+
static let productVariationMessage = NSLocalizedString("Please wait while we save your latest changes",
184+
comment: "Message of the in-progress UI while saving a Variation remotely")
179185
}
180186
}

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

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ final class ProductFormViewController<ViewModel: ProductFormViewModelProtocol>:
6060
currency: String = ServiceLocator.currencySettings.symbol(from: ServiceLocator.currencySettings.currencyCode),
6161
presentationStyle: ProductFormPresentationStyle) {
6262
self.viewModel = viewModel
63+
6364
self.eventLogger = eventLogger
6465
self.currency = currency
6566
self.presentationStyle = presentationStyle
@@ -96,9 +97,15 @@ final class ProductFormViewController<ViewModel: ProductFormViewModelProtocol>:
9697

9798
override func viewDidLoad() {
9899
super.viewDidLoad()
99-
100100
configurePresentationStyle()
101-
configureNavigationBar()
101+
// TODO: #update
102+
if let variationID = self.viewModel.getProductVariationID() {
103+
configureNavigationBar(title: "Variation #\(variationID)")
104+
}
105+
else {
106+
configureNavigationBar()
107+
}
108+
102109
configureMainView()
103110
configureTableView()
104111
configureMoreDetailsContainerView()
@@ -165,7 +172,7 @@ final class ProductFormViewController<ViewModel: ProductFormViewModelProtocol>:
165172

166173
@objc func saveProductAndLogEvent() {
167174
eventLogger.logUpdateButtonTapped()
168-
saveProduct()
175+
saveProduct(status: self.viewModel.getProductVariationID() != nil ? .custom("variation") : nil)
169176
}
170177

171178
@objc func publishProduct() {
@@ -407,9 +414,12 @@ final class ProductFormViewController<ViewModel: ProductFormViewModelProtocol>:
407414
//
408415
private extension ProductFormViewController {
409416

410-
func configureNavigationBar() {
417+
/// Configure navigation bar with the title
418+
///
419+
func configureNavigationBar(title: String = String()) {
411420
updateNavigationBar()
412421
updateBackButtonTitle()
422+
updateNavigationBarTitle(title: title)
413423
}
414424

415425
func configureMainView() {
@@ -801,7 +811,15 @@ private extension ProductFormViewController {
801811
navigationItem.backButtonTitle = viewModel.productModel.name.isNotEmpty ? viewModel.productModel.name : Localization.unnamedProduct
802812
}
803813

814+
func updateNavigationBarTitle(title: String) {
815+
// Update navigation bar title with variation ID
816+
self.title = title
817+
}
818+
804819
func updateNavigationBar() {
820+
821+
822+
805823
// Create action buttons based on view model
806824
let rightBarButtonItems: [UIBarButtonItem] = viewModel.actionButtons.reversed().map { buttonType in
807825
switch buttonType {

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,14 @@ import protocol Storage.StorageManagerType
55

66
/// Provides data for product form UI, and handles product editing actions.
77
final class ProductFormViewModel: ProductFormViewModelProtocol {
8+
89
typealias ProductModel = EditableProductModel
910

11+
// TODO: #update
12+
func getProductVariationID() -> Int64? {
13+
return nil
14+
}
15+
1016
/// Emits product on change, except when the product name is the only change (`productName` is emitted for this case).
1117
var observableProduct: Observable<EditableProductModel> {
1218
productSubject
@@ -37,6 +43,8 @@ final class ProductFormViewModel: ProductFormViewModelProtocol {
3743
originalProduct
3844
}
3945

46+
var isVariation: Bool = false
47+
4048
/// The form type could change from .add to .edit after creation.
4149
private(set) var formType: ProductFormType
4250

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

Lines changed: 9 additions & 0 deletions
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,11 @@ protocol ProductFormViewModelProtocol {
5658
/// The action buttons that should be rendered in the navigation bar.
5759
var actionButtons: [ActionButtonType] { get }
5860

61+
// //TODO: #update
62+
// var isVariation: Bool { get }
63+
64+
func getProductVariationID() -> Int64?
65+
5966
// Unsaved changes
6067

6168
func hasUnsavedChanges() -> Bool
@@ -154,6 +161,8 @@ extension ProductFormViewModelProtocol {
154161
switch productStatus {
155162
case .publish where !productModel.existsRemotely || originalProductModel.status != .publish:
156163
return .publish
164+
case .custom("variation"):
165+
return .saveVariation
157166
default:
158167
return .save
159168
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ final class ProductVariationFormViewModel: ProductFormViewModelProtocol {
66

77
typealias ProductModel = EditableProductVariationModel
88

9+
//TODO: #update
10+
func getProductVariationID() -> Int64? {
11+
return productVariation.productVariation.productVariationID
12+
}
13+
914
/// Emits product variation on change.
1015
var observableProduct: Observable<EditableProductVariationModel> {
1116
productVariationSubject
@@ -94,6 +99,7 @@ final class ProductVariationFormViewModel: ProductFormViewModelProtocol {
9499
private let storesManager: StoresManager
95100
private var cancellable: ObservationToken?
96101

102+
97103
init(productVariation: EditableProductVariationModel,
98104
allAttributes: [ProductAttribute],
99105
parentProductSKU: String?,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,6 @@ extension ProductVariationsViewController: UITableViewDataSource {
373373
let model = EditableProductVariationModel(productVariation: productVariation,
374374
allAttributes: allAttributes,
375375
parentProductSKU: parentProductSKU)
376-
377376
let viewModel = ProductsTabProductViewModel(productVariationModel: model)
378377
cell.update(viewModel: viewModel, imageService: imageService)
379378
cell.selectionStyle = .none
@@ -410,6 +409,7 @@ extension ProductVariationsViewController: UITableViewDelegate {
410409
let currency = ServiceLocator.currencySettings.symbol(from: currencyCode)
411410
let productImageActionHandler = ProductImageActionHandler(siteID: productVariation.siteID,
412411
product: model)
412+
413413
let viewModel = ProductVariationFormViewModel(productVariation: model,
414414
allAttributes: allAttributes,
415415
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: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,23 @@ 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()

0 commit comments

Comments
 (0)