Skip to content

Commit 407d306

Browse files
authored
Merge pull request #2306 from woocommerce/issue/2282-rearrange-order-details-section
Move Payment Section to Right After Products and Refunded Products
2 parents f22bf57 + 5e8ac30 commit 407d306

File tree

7 files changed

+157
-16
lines changed

7 files changed

+157
-16
lines changed

RELEASE-NOTES.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
4.4
2+
-----
3+
- In Order Details, the Payment card is now shown right after the Products and Refunded Products cards.
4+
15
4.3
26
-----
37
- Products: now the Product details can be edited and saved outside Products tab (e.g. from Order details or Top Performers).

WooCommerce/Classes/ViewModels/Order Details/OrderDetailsDataSource.swift

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
import Foundation
22
import UIKit
33
import Yosemite
4+
import protocol Storage.StorageManagerType
45

56

67
/// The main file for Order Details data.
78
///
89
final class OrderDetailsDataSource: NSObject {
10+
11+
/// This is only used to pass as a dependency to `OrderDetailsResultsControllers`.
12+
private let storageManager: StorageManagerType
13+
914
private(set) var order: Order
1015
private let couponLines: [OrderCouponLine]?
1116

@@ -127,7 +132,7 @@ final class OrderDetailsDataSource: NSObject {
127132
private var orderNotesSections: [NoteSection] = []
128133

129134
private lazy var resultsControllers: OrderDetailsResultsControllers = {
130-
return OrderDetailsResultsControllers(order: self.order)
135+
return OrderDetailsResultsControllers(order: self.order, storageManager: self.storageManager)
131136
}()
132137

133138
private lazy var orderNoteAsyncDictionary: AsyncDictionary<Int64, String> = {
@@ -136,7 +141,8 @@ final class OrderDetailsDataSource: NSObject {
136141

137142
private let imageService: ImageService = ServiceLocator.imageService
138143

139-
init(order: Order) {
144+
init(order: Order, storageManager: StorageManagerType = ServiceLocator.storageManager) {
145+
self.storageManager = storageManager
140146
self.order = order
141147
self.couponLines = order.coupons
142148

@@ -669,8 +675,8 @@ extension OrderDetailsDataSource {
669675
shippingNotice,
670676
products,
671677
refundedProducts,
672-
customerInformation,
673678
payment,
679+
customerInformation,
674680
tracking,
675681
addTracking,
676682
notes].compactMap { $0 }

WooCommerce/Classes/ViewModels/Order Details/OrderDetailsResultsControllers.swift

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import Foundation
22
import Yosemite
3+
import protocol Storage.StorageManagerType
34

45
/// Results controllers used to render the Order Details view
56
///
67
final class OrderDetailsResultsControllers {
8+
private let storageManager: StorageManagerType
9+
710
private let order: Order
811

912
/// Shipment Tracking ResultsController.
1013
///
1114
private lazy var trackingResultsController: ResultsController<StorageShipmentTracking> = {
12-
let storageManager = ServiceLocator.storageManager
1315
let predicate = NSPredicate(format: "siteID = %ld AND orderID = %ld",
1416
self.order.siteID,
1517
self.order.orderID)
@@ -21,7 +23,6 @@ final class OrderDetailsResultsControllers {
2123
/// Product ResultsController.
2224
///
2325
private lazy var productResultsController: ResultsController<StorageProduct> = {
24-
let storageManager = ServiceLocator.storageManager
2526
let predicate = NSPredicate(format: "siteID == %lld", ServiceLocator.stores.sessionManager.defaultStoreID ?? Int.min)
2627
let descriptor = NSSortDescriptor(key: "name", ascending: true)
2728

@@ -31,7 +32,6 @@ final class OrderDetailsResultsControllers {
3132
/// Status Results Controller.
3233
///
3334
private lazy var statusResultsController: ResultsController<StorageOrderStatus> = {
34-
let storageManager = ServiceLocator.storageManager
3535
let predicate = NSPredicate(format: "siteID == %lld", ServiceLocator.stores.sessionManager.defaultStoreID ?? Int.min)
3636
let descriptor = NSSortDescriptor(key: "slug", ascending: true)
3737

@@ -41,7 +41,6 @@ final class OrderDetailsResultsControllers {
4141
/// Refund Results Controller.
4242
///
4343
private lazy var refundResultsController: ResultsController<StorageRefund> = {
44-
let storageManager = ServiceLocator.storageManager
4544
let predicate = NSPredicate(format: "siteID = %ld AND orderID = %ld",
4645
self.order.siteID,
4746
self.order.orderID)
@@ -74,8 +73,10 @@ final class OrderDetailsResultsControllers {
7473
return refundResultsController.fetchedObjects
7574
}
7675

77-
init(order: Order) {
76+
init(order: Order,
77+
storageManager: StorageManagerType = ServiceLocator.storageManager) {
7878
self.order = order
79+
self.storageManager = storageManager
7980
}
8081

8182
func configureResultsControllers(onReload: @escaping () -> Void) {

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,7 @@
329329
45FBDF39238D3F8800127F77 /* ExtendedAddProductImageCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 45FBDF36238D3C7500127F77 /* ExtendedAddProductImageCollectionViewCell.xib */; };
330330
45FBDF3A238D3F8B00127F77 /* ExtendedAddProductImageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45FBDF35238D3C7500127F77 /* ExtendedAddProductImageCollectionViewCell.swift */; };
331331
45FBDF3C238D4EA800127F77 /* ExtendedAddProductImageCollectionViewCellTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45FBDF3B238D4EA800127F77 /* ExtendedAddProductImageCollectionViewCellTests.swift */; };
332+
570AAB052472FACB00516C0C /* OrderDetailsDataSourceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 570AAB042472FACB00516C0C /* OrderDetailsDataSourceTests.swift */; };
332333
573D0ACF2458665C004DE614 /* OrderSearchStarterViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 573D0ACE2458665C004DE614 /* OrderSearchStarterViewModelTests.swift */; };
333334
57448D28242E775000A56A74 /* EmptyStateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57448D27242E775000A56A74 /* EmptyStateViewController.swift */; };
334335
57448D2A242E777700A56A74 /* EmptyStateViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 57448D29242E777700A56A74 /* EmptyStateViewController.xib */; };
@@ -1179,6 +1180,7 @@
11791180
45FBDF35238D3C7500127F77 /* ExtendedAddProductImageCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtendedAddProductImageCollectionViewCell.swift; sourceTree = "<group>"; };
11801181
45FBDF36238D3C7500127F77 /* ExtendedAddProductImageCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ExtendedAddProductImageCollectionViewCell.xib; sourceTree = "<group>"; };
11811182
45FBDF3B238D4EA800127F77 /* ExtendedAddProductImageCollectionViewCellTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtendedAddProductImageCollectionViewCellTests.swift; sourceTree = "<group>"; };
1183+
570AAB042472FACB00516C0C /* OrderDetailsDataSourceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OrderDetailsDataSourceTests.swift; path = "Order Details/OrderDetailsDataSourceTests.swift"; sourceTree = "<group>"; };
11821184
573D0ACE2458665C004DE614 /* OrderSearchStarterViewModelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrderSearchStarterViewModelTests.swift; sourceTree = "<group>"; };
11831185
57448D27242E775000A56A74 /* EmptyStateViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyStateViewController.swift; sourceTree = "<group>"; };
11841186
57448D29242E777700A56A74 /* EmptyStateViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = EmptyStateViewController.xib; sourceTree = "<group>"; };
@@ -2553,6 +2555,7 @@
25532555
isa = PBXGroup;
25542556
children = (
25552557
57F2C6C9246DEBB10074063B /* Order Details */,
2558+
570AAB042472FACB00516C0C /* OrderDetailsDataSourceTests.swift */,
25562559
57F34AA02423D45A00E38AFB /* OrdersViewModelTests.swift */,
25572560
);
25582561
path = Orders;
@@ -5025,6 +5028,7 @@
50255028
D8F82AC522AF903700B67E4B /* IconsTests.swift in Sources */,
50265029
57F34AA12423D45A00E38AFB /* OrdersViewModelTests.swift in Sources */,
50275030
02A275C623FE9EFC005C560F /* MockFeatureFlagService.swift in Sources */,
5031+
570AAB052472FACB00516C0C /* OrderDetailsDataSourceTests.swift in Sources */,
50285032
B517EA1A218B2D2600730EC4 /* StringFormatterTests.swift in Sources */,
50295033
02EA6BFC2435EC3500FFF90A /* MockImageDownloader.swift in Sources */,
50305034
45B9C64523A945C0007FC4C5 /* PriceInputFormatterTests.swift in Sources */,

WooCommerce/WooCommerceTests/Tools/MockOrders.swift

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
@testable import Networking
1+
import Yosemite
22

33
final class MockOrders {
44
let siteID: Int64 = 1234
55
let orderID: Int64 = 5678
66

7-
func sampleOrder() -> Networking.Order {
7+
func makeOrder(items: [OrderItem] = []) -> Order {
88
return Order(siteID: siteID,
99
orderID: orderID,
1010
parentID: 0,
@@ -23,15 +23,19 @@ final class MockOrders {
2323
total: "31.20",
2424
totalTax: "1.20",
2525
paymentMethodTitle: "Credit Card (Stripe)",
26-
items: [],
26+
items: items,
2727
billingAddress: sampleAddress(),
2828
shippingAddress: sampleAddress(),
2929
shippingLines: sampleShippingLines(),
3030
coupons: [],
3131
refunds: [])
3232
}
3333

34-
func sampleOrderCreatedInCurrentYear() -> Networking.Order {
34+
func sampleOrder() -> Order {
35+
makeOrder()
36+
}
37+
38+
func sampleOrderCreatedInCurrentYear() -> Order {
3539
return Order(siteID: siteID,
3640
orderID: orderID,
3741
parentID: 0,
@@ -58,15 +62,15 @@ final class MockOrders {
5862
refunds: [])
5963
}
6064

61-
func sampleShippingLines() -> [Networking.ShippingLine] {
65+
func sampleShippingLines() -> [ShippingLine] {
6266
return [ShippingLine(shippingID: 123,
6367
methodTitle: "International Priority Mail Express Flat Rate",
6468
methodID: "usps",
6569
total: "133.00",
6670
totalTax: "0.00")]
6771
}
6872

69-
func sampleAddress() -> Networking.Address {
73+
func sampleAddress() -> Address {
7074
return Address(firstName: "Johnny",
7175
lastName: "Appleseed",
7276
company: "",
@@ -140,7 +144,7 @@ final class MockOrders {
140144

141145
/// An address that may or may not be broken, that came from `broken-order.json`
142146
///
143-
func brokenAddress() -> Networking.Address {
147+
func brokenAddress() -> Address {
144148
return Address(firstName: "",
145149
lastName: "",
146150
company: "",
@@ -156,7 +160,7 @@ final class MockOrders {
156160

157161
/// A shipping line that may or may not be broken, from `broken-order.json`
158162
///
159-
func brokenShippingLines() -> [Networking.ShippingLine] {
163+
func brokenShippingLines() -> [ShippingLine] {
160164
return [ShippingLine(shippingID: 1,
161165
methodTitle: "Shipping",
162166
methodID: "",
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
import Foundation
2+
import XCTest
3+
4+
import Yosemite
5+
6+
import protocol Storage.StorageManagerType
7+
import protocol Storage.StorageType
8+
9+
@testable import WooCommerce
10+
11+
/// Test cases for `OrderDetailsDataSourceTests`
12+
///
13+
final class OrderDetailsDataSourceTests: XCTestCase {
14+
15+
private typealias Title = OrderDetailsDataSource.Title
16+
17+
private var storageManager: StorageManagerType!
18+
19+
private var storage: StorageType {
20+
storageManager.viewStorage
21+
}
22+
23+
override func setUp() {
24+
super.setUp()
25+
storageManager = MockupStorageManager()
26+
}
27+
28+
override func tearDown() {
29+
storageManager = nil
30+
super.tearDown()
31+
}
32+
33+
func testPaymentSectionIsShownRightAfterTheProductsAndRefundedProductsSections() {
34+
// Given
35+
let order = makeOrder()
36+
37+
insert(refund: makeRefund(orderID: order.orderID, siteID: order.siteID))
38+
39+
let dataSource = OrderDetailsDataSource(order: order, storageManager: storageManager)
40+
dataSource.configureResultsControllers { }
41+
42+
// When
43+
dataSource.reloadSections()
44+
45+
// Then
46+
let actualTitles = dataSource.sections.map(\.title)
47+
let expectedTitles = [
48+
nil,
49+
Title.product,
50+
Title.refundedProducts,
51+
Title.payment,
52+
Title.information,
53+
Title.notes
54+
]
55+
56+
XCTAssertEqual(actualTitles, expectedTitles)
57+
}
58+
59+
}
60+
61+
// MARK: - Test Data
62+
63+
private extension OrderDetailsDataSourceTests {
64+
func makeOrder() -> Order {
65+
MockOrders().makeOrder(items: [makeOrderItem(), makeOrderItem()])
66+
}
67+
68+
func makeOrderItem() -> OrderItem {
69+
OrderItem(itemID: 1,
70+
name: "Order Item Name",
71+
productID: 1_00,
72+
variationID: 0,
73+
quantity: 1,
74+
price: NSDecimalNumber(integerLiteral: 1),
75+
sku: nil,
76+
subtotal: "1",
77+
subtotalTax: "1",
78+
taxClass: "TaxClass",
79+
taxes: [],
80+
total: "1",
81+
totalTax: "1")
82+
}
83+
84+
func makeRefund(orderID: Int64, siteID: Int64) -> Refund {
85+
let orderItemRefund = OrderItemRefund(itemID: 1,
86+
name: "OrderItemRefund",
87+
productID: 1,
88+
variationID: 1,
89+
quantity: 1,
90+
price: NSDecimalNumber(integerLiteral: 1),
91+
sku: nil,
92+
subtotal: "1",
93+
subtotalTax: "1",
94+
taxClass: "TaxClass",
95+
taxes: [],
96+
total: "1",
97+
totalTax: "1")
98+
return Refund(refundID: 1,
99+
orderID: orderID,
100+
siteID: siteID,
101+
dateCreated: Date(),
102+
amount: "1",
103+
reason: "Reason",
104+
refundedByUserID: 1,
105+
isAutomated: nil,
106+
createAutomated: nil,
107+
items: [orderItemRefund])
108+
}
109+
110+
func insert(refund: Refund) {
111+
let storageOrderItemRefunds: Set<StorageOrderItemRefund> = Set(refund.items.map { orderItemRefund in
112+
let storageOrderItemRefund = storage.insertNewObject(ofType: StorageOrderItemRefund.self)
113+
storageOrderItemRefund.update(with: orderItemRefund)
114+
return storageOrderItemRefund
115+
})
116+
117+
let storageRefund = storage.insertNewObject(ofType: StorageRefund.self)
118+
storageRefund.update(with: refund)
119+
storageRefund.addToItems(storageOrderItemRefunds as NSSet)
120+
}
121+
}

Yosemite/Yosemite/Model/Model.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ public typealias StorageAccount = Storage.Account
8181
public typealias StorageAttribute = Storage.Attribute
8282
public typealias StorageNote = Storage.Note
8383
public typealias StorageOrder = Storage.Order
84+
public typealias StorageOrderItemRefund = Storage.OrderItemRefund
8485
public typealias StorageOrderNote = Storage.OrderNote
8586
public typealias StorageOrderRefund = Storage.OrderRefundCondensed
8687
public typealias StorageOrderStats = Storage.OrderStats

0 commit comments

Comments
 (0)