From f9c87ea509bcf5dbd9a3e66e534d35b74fb4b92f Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Mon, 23 Jul 2018 11:01:38 -0500 Subject: [PATCH 01/23] Create the .addOrderNote action. Create the addOrderNote network request. --- .../Networking/Remote/OrdersRemote.swift | 28 +++++++++++++++++-- .../Yosemite/Actions/OrderNoteAction.swift | 1 + Yosemite/Yosemite/Stores/OrderNoteStore.swift | 17 +++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/Networking/Networking/Remote/OrdersRemote.swift b/Networking/Networking/Remote/OrdersRemote.swift index b2762f62783..3d54d988379 100644 --- a/Networking/Networking/Remote/OrdersRemote.swift +++ b/Networking/Networking/Remote/OrdersRemote.swift @@ -68,6 +68,26 @@ public class OrdersRemote: Remote { let request = JetpackRequest(wooApiVersion: .mark2, method: .post, siteID: siteID, path: path, parameters: parameters) enqueue(request, mapper: mapper, completion: completion) } + + /// Adds an order note to a specific Order. + /// + /// - Parameters: + /// - siteID: Site which hosts the Order. + /// - orderID: Identifier of the Order to be updated. + /// - isCustomerNote: if true, the note will be shown to customers and they will be notified. + /// if false, the note will be for admin reference only. Default is false. + /// - note: The note to be posted. + /// - completion: Closure to be executed upon completion. + /// + public func addOrderNote(for siteID: Int, orderID: Int, isCustomerNote: Bool, with note: OrderNote, completion: @escaping ([OrderNote]?, Error?) -> Void) { + let path = "\(Constants.ordersPath)/" + String(orderID) + "/" + "\(Constants.notesPath)" + let parameters = [ParameterKeys.note: note.note, + ParameterKeys.customerNote: String(isCustomerNote)] + let mapper = OrderNotesMapper() + + let request = JetpackRequest(wooApiVersion: .mark2, method: .post, siteID: siteID, path: path, parameters: parameters) + enqueue(request, mapper: mapper, completion: completion) + } } @@ -81,8 +101,10 @@ private extension OrdersRemote { } enum ParameterKeys { - static let status: String = "status" - static let page: String = "page" - static let perPage: String = "per_page" + static let customerNote: String = "customer_note" + static let note: String = "note" + static let page: String = "page" + static let perPage: String = "per_page" + static let status: String = "status" } } diff --git a/Yosemite/Yosemite/Actions/OrderNoteAction.swift b/Yosemite/Yosemite/Actions/OrderNoteAction.swift index 857099d2df5..dc2f590b7d6 100644 --- a/Yosemite/Yosemite/Actions/OrderNoteAction.swift +++ b/Yosemite/Yosemite/Actions/OrderNoteAction.swift @@ -6,4 +6,5 @@ import Networking // public enum OrderNoteAction: Action { case retrieveOrderNotes(siteID: Int, orderID: Int, onCompletion: ([OrderNote]?, Error?) -> Void) + case addOrderNote(siteID: Int, orderID: Int, isCustomerNote: Bool, note: OrderNote, onCompletion: ([OrderNote]?, Error?) -> Void) } diff --git a/Yosemite/Yosemite/Stores/OrderNoteStore.swift b/Yosemite/Yosemite/Stores/OrderNoteStore.swift index a978517c679..33faf4222e0 100644 --- a/Yosemite/Yosemite/Stores/OrderNoteStore.swift +++ b/Yosemite/Yosemite/Stores/OrderNoteStore.swift @@ -24,6 +24,8 @@ public class OrderNoteStore: Store { switch action { case .retrieveOrderNotes(let siteId, let orderId, let onCompletion): retrieveOrderNotes(siteID: siteId, orderID: orderId, onCompletion: onCompletion) + case .addOrderNote(let siteId, let orderId, let isCustomerNote, let note, let onCompletion): + addOrderNote(siteID: siteId, orderID: orderId, isCustomerNote: isCustomerNote, note: note, onCompletion: onCompletion) } } } @@ -47,6 +49,21 @@ private extension OrderNoteStore { onCompletion(orderNotes, nil) } } + + /// Adds a single order note and associates it with the provided siteID and orderID. + /// + func addOrderNote(siteID: Int, orderID: Int, isCustomerNote: Bool, note: OrderNote, onCompletion: @escaping ([OrderNote]?, Error?) -> Void) { + let remote = OrdersRemote(network: network) + remote.addOrderNote(for: siteID, orderID: orderID, isCustomerNote: isCustomerNote, with: note) { [weak self] (orderNotes, error) in + guard let orderNotes = orderNotes else { + onCompletion(nil, error) + return + } + + self?.upsertStoredOrderNotes(readOnlyOrderNotes: orderNotes, orderID: orderID) + onCompletion(orderNotes, nil) + } + } } From 3800738def133700eda7d361b162bcb9c669c833 Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Mon, 23 Jul 2018 16:11:03 -0500 Subject: [PATCH 02/23] addOrderNote: original note line should be a `String` not an `OrderNote` object. Should return an `OrderNote?` instead of an `[OrderNote]?` --- Networking/Networking/Remote/OrdersRemote.swift | 4 ++-- Yosemite/Yosemite/Actions/OrderNoteAction.swift | 2 +- Yosemite/Yosemite/Stores/OrderNoteStore.swift | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Networking/Networking/Remote/OrdersRemote.swift b/Networking/Networking/Remote/OrdersRemote.swift index 3d54d988379..d49354c903b 100644 --- a/Networking/Networking/Remote/OrdersRemote.swift +++ b/Networking/Networking/Remote/OrdersRemote.swift @@ -79,9 +79,9 @@ public class OrdersRemote: Remote { /// - note: The note to be posted. /// - completion: Closure to be executed upon completion. /// - public func addOrderNote(for siteID: Int, orderID: Int, isCustomerNote: Bool, with note: OrderNote, completion: @escaping ([OrderNote]?, Error?) -> Void) { + public func addOrderNote(for siteID: Int, orderID: Int, isCustomerNote: Bool, with note: String, completion: @escaping ([OrderNote]?, Error?) -> Void) { let path = "\(Constants.ordersPath)/" + String(orderID) + "/" + "\(Constants.notesPath)" - let parameters = [ParameterKeys.note: note.note, + let parameters = [ParameterKeys.note: note, ParameterKeys.customerNote: String(isCustomerNote)] let mapper = OrderNotesMapper() diff --git a/Yosemite/Yosemite/Actions/OrderNoteAction.swift b/Yosemite/Yosemite/Actions/OrderNoteAction.swift index dc2f590b7d6..fb8ddf2b4ee 100644 --- a/Yosemite/Yosemite/Actions/OrderNoteAction.swift +++ b/Yosemite/Yosemite/Actions/OrderNoteAction.swift @@ -6,5 +6,5 @@ import Networking // public enum OrderNoteAction: Action { case retrieveOrderNotes(siteID: Int, orderID: Int, onCompletion: ([OrderNote]?, Error?) -> Void) - case addOrderNote(siteID: Int, orderID: Int, isCustomerNote: Bool, note: OrderNote, onCompletion: ([OrderNote]?, Error?) -> Void) + case addOrderNote(siteID: Int, orderID: Int, isCustomerNote: Bool, note: String, onCompletion: (OrderNote?, Error?) -> Void) } diff --git a/Yosemite/Yosemite/Stores/OrderNoteStore.swift b/Yosemite/Yosemite/Stores/OrderNoteStore.swift index 33faf4222e0..a1d94a6758e 100644 --- a/Yosemite/Yosemite/Stores/OrderNoteStore.swift +++ b/Yosemite/Yosemite/Stores/OrderNoteStore.swift @@ -52,16 +52,16 @@ private extension OrderNoteStore { /// Adds a single order note and associates it with the provided siteID and orderID. /// - func addOrderNote(siteID: Int, orderID: Int, isCustomerNote: Bool, note: OrderNote, onCompletion: @escaping ([OrderNote]?, Error?) -> Void) { + func addOrderNote(siteID: Int, orderID: Int, isCustomerNote: Bool, note: String, onCompletion: @escaping (OrderNote?, Error?) -> Void) { let remote = OrdersRemote(network: network) remote.addOrderNote(for: siteID, orderID: orderID, isCustomerNote: isCustomerNote, with: note) { [weak self] (orderNotes, error) in - guard let orderNotes = orderNotes else { + guard let orderNote = orderNotes?.first else { onCompletion(nil, error) return } - self?.upsertStoredOrderNotes(readOnlyOrderNotes: orderNotes, orderID: orderID) - onCompletion(orderNotes, nil) + self?.upsertStoredOrderNotes(readOnlyOrderNotes: [orderNote], orderID: orderID) + onCompletion(orderNote, nil) } } } From ac7ee88e86de863fec303c83b0b540f3d3572a3d Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Mon, 23 Jul 2018 16:11:45 -0500 Subject: [PATCH 03/23] Add `new-order-note.json` file for unit tests --- Yosemite/Yosemite.xcodeproj/project.pbxproj | 10 +++++-- .../Resources/new-order-note.json | 28 +++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 Yosemite/YosemiteTests/Resources/new-order-note.json diff --git a/Yosemite/Yosemite.xcodeproj/project.pbxproj b/Yosemite/Yosemite.xcodeproj/project.pbxproj index 1936c9b783b..c16a0e455c2 100644 --- a/Yosemite/Yosemite.xcodeproj/project.pbxproj +++ b/Yosemite/Yosemite.xcodeproj/project.pbxproj @@ -49,6 +49,7 @@ B5EED1A820F4F3CF00652449 /* Account+ReadOnlyConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5EED1A720F4F3CF00652449 /* Account+ReadOnlyConvertible.swift */; }; B5F2AE9520EBAD6000FEDC59 /* ResultsControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F2AE9420EBAD6000FEDC59 /* ResultsControllerTests.swift */; }; B5F2AE9720EBB54A00FEDC59 /* FetchedResultsControllerDelegateWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F2AE9620EBB54A00FEDC59 /* FetchedResultsControllerDelegateWrapper.swift */; }; + CE21B3E5210678AA00A259D5 /* new-order-note.json in Resources */ = {isa = PBXBuildFile; fileRef = CE21B3E4210678A900A259D5 /* new-order-note.json */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -112,6 +113,7 @@ B5F2AE9420EBAD6000FEDC59 /* ResultsControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResultsControllerTests.swift; sourceTree = ""; }; B5F2AE9620EBB54A00FEDC59 /* FetchedResultsControllerDelegateWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchedResultsControllerDelegateWrapper.swift; sourceTree = ""; }; C25501C7F936D2FD32FAF3F4 /* Pods_Yosemite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Yosemite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CE21B3E4210678A900A259D5 /* new-order-note.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "new-order-note.json"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -184,12 +186,13 @@ B5BC736920D1AAE900B5B6FA /* Resources */ = { isa = PBXGroup; children = ( + 745D21C120D8043A00BBE7C3 /* generic_error.json */, B5BC736A20D1AAE900B5B6FA /* me.json */, - 74A7689120D47F9E00F9D437 /* orders.json */, + CE21B3E4210678A900A259D5 /* new-order-note.json */, 7424B49320EAD37C00CC62F6 /* order.json */, - B5B914C120EFE03200F2F832 /* sites.json */, 7499936B20EFC20100CF01CD /* order-notes.json */, - 745D21C120D8043A00BBE7C3 /* generic_error.json */, + 74A7689120D47F9E00F9D437 /* orders.json */, + B5B914C120EFE03200F2F832 /* sites.json */, ); path = Resources; sourceTree = ""; @@ -435,6 +438,7 @@ B5B914C220EFE03200F2F832 /* sites.json in Resources */, 7499936C20EFC20100CF01CD /* order-notes.json in Resources */, 7424B49420EAD37C00CC62F6 /* order.json in Resources */, + CE21B3E5210678AA00A259D5 /* new-order-note.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Yosemite/YosemiteTests/Resources/new-order-note.json b/Yosemite/YosemiteTests/Resources/new-order-note.json new file mode 100644 index 00000000000..d568cd79f31 --- /dev/null +++ b/Yosemite/YosemiteTests/Resources/new-order-note.json @@ -0,0 +1,28 @@ +{ + "data": [ + { + "id": 2235, + "date_created": "2018-06-22T11:36:20", + "date_created_gmt": "2018-06-22T15:36:20", + "note": "This order would be so much better with ketchup.", + "customer_note": true, + "_links": { + "self": [ + { + "href": "https://jamosova3.mystagingwebsite.com/wp-json/wc/v2/orders/1179/notes/2235" + } + ], + "collection": [ + { + "href": "https://jamosova3.mystagingwebsite.com/wp-json/wc/v2/orders/1179/notes" + } + ], + "up": [ + { + "href": "https://jamosova3.mystagingwebsite.com/wp-json/wc/v2/orders/1179" + } + ] + } + } + ] +} \ No newline at end of file From 069bfd7a043d74ab9327ceb781744373fde24b8a Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Mon, 23 Jul 2018 16:12:06 -0500 Subject: [PATCH 04/23] Write first addOrderNote network unit test --- .../Remote/OrdersRemoteTests.swift | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Networking/NetworkingTests/Remote/OrdersRemoteTests.swift b/Networking/NetworkingTests/Remote/OrdersRemoteTests.swift index b77c64094a4..01b3afe6197 100644 --- a/Networking/NetworkingTests/Remote/OrdersRemoteTests.swift +++ b/Networking/NetworkingTests/Remote/OrdersRemoteTests.swift @@ -166,4 +166,21 @@ class OrdersRemoteTests: XCTestCase { wait(for: [expectation], timeout: Constants.expectationTimeout) } + + /// Verifies that addOrderNote properly parses the `new-order-note` sample response. + /// + func testLoadAddOrderNoteProperlyReturnsParsedOrderNote() { + let remote = OrdersRemote(network: network) + let expectation = self.expectation(description: "Add Order Note") + let note = "This order would be so much better with ketchup." + + network.simulateResponse(requestUrlSuffix: "orders/\(sampleOrderID)/notes", filename: "new-order-note") + + remote.addOrderNote(for: sampleSiteID, orderID: sampleOrderID, isCustomerNote: true, with: note) { (orderNote, error) in + XCTAssertNil(error) + XCTAssertNotNil(orderNote) + expectation.fulfill() + } + wait(for: [expectation], timeout: Constants.expectationTimeout) + } } From 6a3944b79e56ff3fec1d6f19f3ba74464b3de97c Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Tue, 24 Jul 2018 07:54:07 -0500 Subject: [PATCH 05/23] Add JSON to Networking project --- .../Networking.xcodeproj/project.pbxproj | 4 +++ .../Responses/new-order-note.json | 28 +++++++++++++++++++ .../Resources/new-order-note.json | 2 +- 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 Networking/NetworkingTests/Responses/new-order-note.json diff --git a/Networking/Networking.xcodeproj/project.pbxproj b/Networking/Networking.xcodeproj/project.pbxproj index 281ba185ea8..b4ef70fad24 100644 --- a/Networking/Networking.xcodeproj/project.pbxproj +++ b/Networking/Networking.xcodeproj/project.pbxproj @@ -61,6 +61,7 @@ B5C6FCD420A373BB00A4F8E4 /* OrderMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C6FCD320A373BA00A4F8E4 /* OrderMapper.swift */; }; B5C6FCD620A3768900A4F8E4 /* order.json in Resources */ = {isa = PBXBuildFile; fileRef = B5C6FCD520A3768900A4F8E4 /* order.json */; }; CE20179320E3EFA7005B4C18 /* broken-orders.json in Resources */ = {isa = PBXBuildFile; fileRef = CE20179220E3EFA7005B4C18 /* broken-orders.json */; }; + CE21B3E72106811000A259D5 /* new-order-note.json in Resources */ = {isa = PBXBuildFile; fileRef = CE21B3E62106811000A259D5 /* new-order-note.json */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -133,6 +134,7 @@ BD9439D9B8F2C1ED2EADAA51 /* Pods-NetworkingTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NetworkingTests.debug.xcconfig"; path = "../Pods/Target Support Files/Pods-NetworkingTests/Pods-NetworkingTests.debug.xcconfig"; sourceTree = ""; }; C8F9A8CC6F90A8C9B5EF2EE2 /* Pods-Networking.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Networking.release.xcconfig"; path = "../Pods/Target Support Files/Pods-Networking/Pods-Networking.release.xcconfig"; sourceTree = ""; }; CE20179220E3EFA7005B4C18 /* broken-orders.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "broken-orders.json"; sourceTree = ""; }; + CE21B3E62106811000A259D5 /* new-order-note.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "new-order-note.json"; sourceTree = ""; }; F3F25DC15EC1D7C631169CB5 /* Pods_Networking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Networking.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F6CEE1CA2AD376C0C28AE9F6 /* Pods-NetworkingTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NetworkingTests.release.xcconfig"; path = "../Pods/Target Support Files/Pods-NetworkingTests/Pods-NetworkingTests.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -314,6 +316,7 @@ B559EBA820A0B5B100836CD4 /* Responses */ = { isa = PBXGroup; children = ( + CE21B3E62106811000A259D5 /* new-order-note.json */, B505F6D420BEE4E600BB1B69 /* me.json */, B559EBA920A0B5CD00836CD4 /* orders-load-all.json */, B5C6FCD520A3768900A4F8E4 /* order.json */, @@ -482,6 +485,7 @@ files = ( 74C8F06620EEB76400B6EDC9 /* order-notes.json in Resources */, 74C8F06C20EEBD5D00B6EDC9 /* broken-order.json in Resources */, + CE21B3E72106811000A259D5 /* new-order-note.json in Resources */, B505F6D520BEE4E700BB1B69 /* me.json in Resources */, B5C6FCD620A3768900A4F8E4 /* order.json in Resources */, B559EBAA20A0B5CD00836CD4 /* orders-load-all.json in Resources */, diff --git a/Networking/NetworkingTests/Responses/new-order-note.json b/Networking/NetworkingTests/Responses/new-order-note.json new file mode 100644 index 00000000000..d568cd79f31 --- /dev/null +++ b/Networking/NetworkingTests/Responses/new-order-note.json @@ -0,0 +1,28 @@ +{ + "data": [ + { + "id": 2235, + "date_created": "2018-06-22T11:36:20", + "date_created_gmt": "2018-06-22T15:36:20", + "note": "This order would be so much better with ketchup.", + "customer_note": true, + "_links": { + "self": [ + { + "href": "https://jamosova3.mystagingwebsite.com/wp-json/wc/v2/orders/1179/notes/2235" + } + ], + "collection": [ + { + "href": "https://jamosova3.mystagingwebsite.com/wp-json/wc/v2/orders/1179/notes" + } + ], + "up": [ + { + "href": "https://jamosova3.mystagingwebsite.com/wp-json/wc/v2/orders/1179" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/Yosemite/YosemiteTests/Resources/new-order-note.json b/Yosemite/YosemiteTests/Resources/new-order-note.json index d568cd79f31..8cbd5aa06b8 100644 --- a/Yosemite/YosemiteTests/Resources/new-order-note.json +++ b/Yosemite/YosemiteTests/Resources/new-order-note.json @@ -25,4 +25,4 @@ } } ] -} \ No newline at end of file +} From 1db376145c05cca76a612ff9c7da3a989d804591 Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Tue, 24 Jul 2018 08:38:22 -0500 Subject: [PATCH 06/23] Remove unused JSON response from Yosemite. Rename variable in a unit test. --- .../Remote/OrdersRemoteTests.swift | 4 +-- Yosemite/Yosemite.xcodeproj/project.pbxproj | 4 --- .../Resources/new-order-note.json | 28 ------------------- 3 files changed, 2 insertions(+), 34 deletions(-) delete mode 100644 Yosemite/YosemiteTests/Resources/new-order-note.json diff --git a/Networking/NetworkingTests/Remote/OrdersRemoteTests.swift b/Networking/NetworkingTests/Remote/OrdersRemoteTests.swift index 01b3afe6197..afba740082a 100644 --- a/Networking/NetworkingTests/Remote/OrdersRemoteTests.swift +++ b/Networking/NetworkingTests/Remote/OrdersRemoteTests.swift @@ -172,11 +172,11 @@ class OrdersRemoteTests: XCTestCase { func testLoadAddOrderNoteProperlyReturnsParsedOrderNote() { let remote = OrdersRemote(network: network) let expectation = self.expectation(description: "Add Order Note") - let note = "This order would be so much better with ketchup." + let noteData = "This order would be so much better with ketchup." network.simulateResponse(requestUrlSuffix: "orders/\(sampleOrderID)/notes", filename: "new-order-note") - remote.addOrderNote(for: sampleSiteID, orderID: sampleOrderID, isCustomerNote: true, with: note) { (orderNote, error) in + remote.addOrderNote(for: sampleSiteID, orderID: sampleOrderID, isCustomerNote: true, with: noteData) { (orderNote, error) in XCTAssertNil(error) XCTAssertNotNil(orderNote) expectation.fulfill() diff --git a/Yosemite/Yosemite.xcodeproj/project.pbxproj b/Yosemite/Yosemite.xcodeproj/project.pbxproj index c16a0e455c2..bdd277ae75c 100644 --- a/Yosemite/Yosemite.xcodeproj/project.pbxproj +++ b/Yosemite/Yosemite.xcodeproj/project.pbxproj @@ -49,7 +49,6 @@ B5EED1A820F4F3CF00652449 /* Account+ReadOnlyConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5EED1A720F4F3CF00652449 /* Account+ReadOnlyConvertible.swift */; }; B5F2AE9520EBAD6000FEDC59 /* ResultsControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F2AE9420EBAD6000FEDC59 /* ResultsControllerTests.swift */; }; B5F2AE9720EBB54A00FEDC59 /* FetchedResultsControllerDelegateWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5F2AE9620EBB54A00FEDC59 /* FetchedResultsControllerDelegateWrapper.swift */; }; - CE21B3E5210678AA00A259D5 /* new-order-note.json in Resources */ = {isa = PBXBuildFile; fileRef = CE21B3E4210678A900A259D5 /* new-order-note.json */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -113,7 +112,6 @@ B5F2AE9420EBAD6000FEDC59 /* ResultsControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResultsControllerTests.swift; sourceTree = ""; }; B5F2AE9620EBB54A00FEDC59 /* FetchedResultsControllerDelegateWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchedResultsControllerDelegateWrapper.swift; sourceTree = ""; }; C25501C7F936D2FD32FAF3F4 /* Pods_Yosemite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Yosemite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CE21B3E4210678A900A259D5 /* new-order-note.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "new-order-note.json"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -188,7 +186,6 @@ children = ( 745D21C120D8043A00BBE7C3 /* generic_error.json */, B5BC736A20D1AAE900B5B6FA /* me.json */, - CE21B3E4210678A900A259D5 /* new-order-note.json */, 7424B49320EAD37C00CC62F6 /* order.json */, 7499936B20EFC20100CF01CD /* order-notes.json */, 74A7689120D47F9E00F9D437 /* orders.json */, @@ -438,7 +435,6 @@ B5B914C220EFE03200F2F832 /* sites.json in Resources */, 7499936C20EFC20100CF01CD /* order-notes.json in Resources */, 7424B49420EAD37C00CC62F6 /* order.json in Resources */, - CE21B3E5210678AA00A259D5 /* new-order-note.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Yosemite/YosemiteTests/Resources/new-order-note.json b/Yosemite/YosemiteTests/Resources/new-order-note.json deleted file mode 100644 index 8cbd5aa06b8..00000000000 --- a/Yosemite/YosemiteTests/Resources/new-order-note.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "data": [ - { - "id": 2235, - "date_created": "2018-06-22T11:36:20", - "date_created_gmt": "2018-06-22T15:36:20", - "note": "This order would be so much better with ketchup.", - "customer_note": true, - "_links": { - "self": [ - { - "href": "https://jamosova3.mystagingwebsite.com/wp-json/wc/v2/orders/1179/notes/2235" - } - ], - "collection": [ - { - "href": "https://jamosova3.mystagingwebsite.com/wp-json/wc/v2/orders/1179/notes" - } - ], - "up": [ - { - "href": "https://jamosova3.mystagingwebsite.com/wp-json/wc/v2/orders/1179" - } - ] - } - } - ] -} From 224884153bd628309cf3f63f931141f8e67e3749 Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Tue, 24 Jul 2018 10:32:54 -0500 Subject: [PATCH 07/23] Add initial `AddaNoteViewController` Add nav bar, display nav buttons --- .../AddNote/AddaNoteViewController.swift | 41 +++++++++++++++++++ .../CustomerNoteTableViewCell.swift | 2 +- .../OrderDetailsViewController.swift | 6 ++- .../ViewRelated/Orders/Orders.storyboard | 31 +++++++++++++- .../WooCommerce.xcodeproj/project.pbxproj | 12 ++++++ 5 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddaNoteViewController.swift diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddaNoteViewController.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddaNoteViewController.swift new file mode 100644 index 00000000000..396ec2bd3e2 --- /dev/null +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddaNoteViewController.swift @@ -0,0 +1,41 @@ +import UIKit +import Yosemite + +class AddaNoteViewController: UIViewController { + + var order: Order! + + override func viewDidLoad() { + super.viewDidLoad() + configureNavigation() + } + + func configureNavigation() { + title = NSLocalizedString("Order #\(order.number)", comment: "Add a note screen - title. Example: Order #15") + + let dismissButtonTitle = NSLocalizedString("Dismiss", comment: "Add a note screen - button title for closing the view") + let leftBarButton = UIBarButtonItem(title: dismissButtonTitle, + style: .plain, + target: self, + action: #selector(dismissButtonTapped)) + leftBarButton.tintColor = .white + navigationItem.setLeftBarButton(leftBarButton, animated: false) + + let addButtonTitle = NSLocalizedString("Add", comment: "Add a note screen - button title to send the note") + let rightBarButton = UIBarButtonItem(title: addButtonTitle, + style: .done, + target: self, + action: #selector(addButtonTapped)) + rightBarButton.tintColor = .white + navigationItem.setRightBarButton(rightBarButton, animated: false) + } + + @objc func dismissButtonTapped() { + dismiss(animated: true, completion: nil) + } + + @objc func addButtonTapped() { + NSLog("Add button tapped!") + } + +} diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/CustomerNoteTableViewCell.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/CustomerNoteTableViewCell.swift index 44b82cb10e0..977a7e46883 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/CustomerNoteTableViewCell.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/CustomerNoteTableViewCell.swift @@ -7,6 +7,7 @@ class CustomerNoteTableViewCell: UITableViewCell { noteLabel.applyBodyStyle() } } + @IBOutlet private weak var iconImageView: UIImageView! { didSet { iconImageView.image = Gridicon.iconOfType(.quote) @@ -14,7 +15,6 @@ class CustomerNoteTableViewCell: UITableViewCell { } } - var quote: String? { get { return noteLabel.text diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/OrderDetailsViewController.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/OrderDetailsViewController.swift index 22c642b5f42..ee44f310c33 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/OrderDetailsViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/OrderDetailsViewController.swift @@ -402,7 +402,10 @@ extension OrderDetailsViewController: UITableViewDelegate { tableView.deselectRow(at: indexPath, animated: true) if sections[indexPath.section].rows[indexPath.row] == .addOrderNote { - // TODO: present modal for Add Note screen + let addaNoteViewController = self.storyboard!.instantiateViewController(withIdentifier: Constants.noteViewController) as! AddaNoteViewController + addaNoteViewController.order = viewModel.order + let navController = UINavigationController(rootViewController: addaNoteViewController) + present(navController, animated: true, completion: nil) } else if sections[indexPath.section].rows[indexPath.row] == .productDetails { performSegue(withIdentifier: Constants.productDetailsSegue, sender: nil) } @@ -475,6 +478,7 @@ private extension OrderDetailsViewController { static let rowHeight = CGFloat(38) static let sectionHeight = CGFloat(44) static let productDetailsSegue = "ShowProductListViewController" + static let noteViewController = "AddaNoteViewController" } private struct Section { diff --git a/WooCommerce/Classes/ViewRelated/Orders/Orders.storyboard b/WooCommerce/Classes/ViewRelated/Orders/Orders.storyboard index 75347030883..73810b14fe8 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/Orders.storyboard +++ b/WooCommerce/Classes/ViewRelated/Orders/Orders.storyboard @@ -145,7 +145,6 @@ - @@ -173,8 +172,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index a581742feb3..0b7c47f620e 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -109,6 +109,7 @@ CE34DA2520A1ECD6005D8523 /* ContactViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE34DA2420A1ECD6005D8523 /* ContactViewModel.swift */; }; CE4296B920A5E9E400B2AFBD /* CNContact+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4296B820A5E9E400B2AFBD /* CNContact+Helpers.swift */; }; CE4DDB7B20DD312400D32EC8 /* Date+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4DDB7A20DD312400D32EC8 /* Date+Helpers.swift */; }; + CE583A0421076C0100D73C1C /* AddaNoteViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE583A0321076C0100D73C1C /* AddaNoteViewController.swift */; }; CE85535D209B5BB700938BDC /* OrderDetailsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE85535C209B5BB700938BDC /* OrderDetailsViewModel.swift */; }; CE855364209BA6A700938BDC /* ShowHideSectionFooter.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE855360209BA6A700938BDC /* ShowHideSectionFooter.swift */; }; CE855365209BA6A700938BDC /* CustomerInfoTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE855361209BA6A700938BDC /* CustomerInfoTableViewCell.xib */; }; @@ -257,6 +258,7 @@ CE34DA2420A1ECD6005D8523 /* ContactViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactViewModel.swift; sourceTree = ""; }; CE4296B820A5E9E400B2AFBD /* CNContact+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CNContact+Helpers.swift"; sourceTree = ""; }; CE4DDB7A20DD312400D32EC8 /* Date+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+Helpers.swift"; sourceTree = ""; }; + CE583A0321076C0100D73C1C /* AddaNoteViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddaNoteViewController.swift; sourceTree = ""; }; CE85535C209B5BB700938BDC /* OrderDetailsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderDetailsViewModel.swift; sourceTree = ""; }; CE855360209BA6A700938BDC /* ShowHideSectionFooter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowHideSectionFooter.swift; sourceTree = ""; }; CE855361209BA6A700938BDC /* CustomerInfoTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CustomerInfoTableViewCell.xib; sourceTree = ""; }; @@ -536,6 +538,14 @@ path = Extensions; sourceTree = ""; }; + CE583A0221076BBE00D73C1C /* AddNote */ = { + isa = PBXGroup; + children = ( + CE583A0321076C0100D73C1C /* AddaNoteViewController.swift */, + ); + path = AddNote; + sourceTree = ""; + }; CE85535B209B5B6A00938BDC /* ViewModels */ = { isa = PBXGroup; children = ( @@ -592,6 +602,7 @@ CEE006022077D0F80079161F /* OrderDetails */ = { isa = PBXGroup; children = ( + CE583A0221076BBE00D73C1C /* AddNote */, CE17C2E020ACA06800AFBD20 /* BillingDetailsTableViewCell.swift */, CE17C2E120ACA06800AFBD20 /* BillingDetailsTableViewCell.xib */, CE855362209BA6A700938BDC /* CustomerInfoTableViewCell.swift */, @@ -923,6 +934,7 @@ CE21B3D720FE669A00A259D5 /* BasicDisclosureTableViewCell.swift in Sources */, B5DBF3CB20E149CC00B53AED /* AuthenticatedState.swift in Sources */, CE1EC8F120B8A408009762BF /* OrderNoteTableViewCell.swift in Sources */, + CE583A0421076C0100D73C1C /* AddaNoteViewController.swift in Sources */, CE4DDB7B20DD312400D32EC8 /* Date+Helpers.swift in Sources */, B50911322049E27A007D25DC /* SettingsViewController.swift in Sources */, B57C744720F55BC800EEFC87 /* UIView+Helpers.swift in Sources */, From effc64aacb6b35f2946caaf16fdbf3428c6691d6 Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Tue, 24 Jul 2018 11:01:42 -0500 Subject: [PATCH 08/23] Add tableview data source - grouped table style - section titles --- .../AddNote/AddaNoteViewController.swift | 49 +++++++++++++++++++ .../ViewRelated/Orders/Orders.storyboard | 11 ++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddaNoteViewController.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddaNoteViewController.swift index 396ec2bd3e2..7b2c5e6a542 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddaNoteViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddaNoteViewController.swift @@ -3,11 +3,18 @@ import Yosemite class AddaNoteViewController: UIViewController { + // MARK: - Properties + + @IBOutlet var tableView: UITableView! + var order: Order! + // MARK: - View Lifecycle + override func viewDidLoad() { super.viewDidLoad() configureNavigation() + configureTableView() } func configureNavigation() { @@ -37,5 +44,47 @@ class AddaNoteViewController: UIViewController { @objc func addButtonTapped() { NSLog("Add button tapped!") } +} + +// MARK: - TableView Configuration +// +private extension AddaNoteViewController { + /// Setup: TableView + /// + func configureTableView() { + tableView.estimatedRowHeight = Constants.rowHeight + tableView.rowHeight = UITableViewAutomaticDimension + } +} + +// MARK: - UITableViewDataSource Conformance +// +extension AddaNoteViewController: UITableViewDataSource { + func numberOfSections(in tableView: UITableView) -> Int { + return 2 + } + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 1 + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + return UITableViewCell() + } + + func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { + if section == 0 { + return NSLocalizedString("WRITE NOTE", comment: "Add a note screen - Write Note section title") + } + + return "" + } +} + +// MARK: - Constants +// +private extension AddaNoteViewController { + struct Constants { + static let rowHeight = CGFloat(44) + } } diff --git a/WooCommerce/Classes/ViewRelated/Orders/Orders.storyboard b/WooCommerce/Classes/ViewRelated/Orders/Orders.storyboard index 73810b14fe8..aca090cfc7a 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/Orders.storyboard +++ b/WooCommerce/Classes/ViewRelated/Orders/Orders.storyboard @@ -184,9 +184,13 @@ - + - + + + + + @@ -198,6 +202,9 @@ + + + From 96567e279e86f0e3927f0f4db4089dcc59da039e Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Tue, 24 Jul 2018 14:42:09 -0500 Subject: [PATCH 09/23] Add "Email note to customer" cell --- .../AddNote/AddaNoteViewController.swift | 72 +++++++++++++++++-- .../ToggleEmailCustomerTableViewCell.swift | 19 +++++ .../ToggleEmailCustomerTableViewCell.xib | 58 +++++++++++++++ .../WriteCustomerNoteTableViewCell.swift | 28 ++++++++ .../WriteCustomerNoteTableViewCell.xib | 53 ++++++++++++++ .../ViewRelated/Orders/Orders.storyboard | 2 +- .../WooCommerce.xcodeproj/project.pbxproj | 16 +++++ 7 files changed, 240 insertions(+), 8 deletions(-) create mode 100644 WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.swift create mode 100644 WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.xib create mode 100644 WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.swift create mode 100644 WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.xib diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddaNoteViewController.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddaNoteViewController.swift index 7b2c5e6a542..a76cb096d59 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddaNoteViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddaNoteViewController.swift @@ -9,12 +9,16 @@ class AddaNoteViewController: UIViewController { var order: Order! + private var sections = [Section]() + // MARK: - View Lifecycle override func viewDidLoad() { super.viewDidLoad() configureNavigation() configureTableView() + registerTableViewCells() + loadSections() } func configureNavigation() { @@ -51,10 +55,46 @@ class AddaNoteViewController: UIViewController { private extension AddaNoteViewController { /// Setup: TableView /// - func configureTableView() { + private func configureTableView() { tableView.estimatedRowHeight = Constants.rowHeight tableView.rowHeight = UITableViewAutomaticDimension } + + /// Registers all of the available TableViewCells + /// + private func registerTableViewCells() { + let cells = [ + WriteCustomerNoteTableViewCell.self, + ToggleEmailCustomerTableViewCell.self + ] + + for cell in cells { + tableView.register(cell.loadNib(), forCellReuseIdentifier: cell.reuseIdentifier) + } + } + + /// Setup: Sections + /// + private func loadSections() { + let writeNoteSectionTitle = NSLocalizedString("WRITE NOTE", comment: "Add a note screen - Write Note section title") + let writeNoteSection = Section(title: writeNoteSectionTitle, rows: [.writeNote]) + let emailCustomerSection = Section(title: nil, rows: [.emailCustomer]) + + sections = [writeNoteSection, emailCustomerSection] + } + + /// Cell Configuration + /// + private func configure(_ cell: UITableViewCell, for row: Row, at indexPath: IndexPath) { + switch cell { + case let cell as WriteCustomerNoteTableViewCell: + cell.configure(isNoteToCustomer: false) + case let cell as ToggleEmailCustomerTableViewCell: + cell.awakeFromNib() + default: + fatalError("Unidentified add a note row type") + } + } } // MARK: - UITableViewDataSource Conformance @@ -69,15 +109,14 @@ extension AddaNoteViewController: UITableViewDataSource { } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - return UITableViewCell() + let row = sections[indexPath.section].rows[indexPath.row] + let cell = tableView.dequeueReusableCell(withIdentifier: row.reuseIdentifier, for: indexPath) + configure(cell, for: row, at: indexPath) + return cell } func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { - if section == 0 { - return NSLocalizedString("WRITE NOTE", comment: "Add a note screen - Write Note section title") - } - - return "" + return sections[section].title } } @@ -87,4 +126,23 @@ private extension AddaNoteViewController { struct Constants { static let rowHeight = CGFloat(44) } + + private struct Section { + let title: String? + let rows: [Row] + } + + private enum Row { + case writeNote + case emailCustomer + + var reuseIdentifier: String { + switch self { + case .writeNote: + return WriteCustomerNoteTableViewCell.reuseIdentifier + case .emailCustomer: + return ToggleEmailCustomerTableViewCell.reuseIdentifier + } + } + } } diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.swift new file mode 100644 index 00000000000..7016bb0f826 --- /dev/null +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.swift @@ -0,0 +1,19 @@ +import UIKit + +class ToggleEmailCustomerTableViewCell: UITableViewCell { + + // MARK: - Properties + // + @IBOutlet var topLabel: UILabel! + @IBOutlet var bottomLabel: UILabel! + @IBOutlet var toggleSwitch: UISwitch! + + override func awakeFromNib() { + super.awakeFromNib() + topLabel.applyBodyStyle() + bottomLabel.applyFootnoteStyle() + + topLabel.text = NSLocalizedString("Email note to customer", comment: "Label for yes/no switch - emailing the note to customer.") + bottomLabel.text = NSLocalizedString("If disabled will add the note as private.", comment: "Detail label for yes/no switch.") + } +} diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.xib b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.xib new file mode 100644 index 00000000000..304966442af --- /dev/null +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.xib @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.swift new file mode 100644 index 00000000000..846e4230166 --- /dev/null +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.swift @@ -0,0 +1,28 @@ +import UIKit +import Gridicons + +class WriteCustomerNoteTableViewCell: UITableViewCell { + + @IBOutlet var noteIconButton: UIButton! { + didSet { + noteIconButton.layer.cornerRadius = noteIconButton.frame.width / 2 + noteIconButton.tintColor = .white + } + } + + @IBOutlet var noteTextView: UITextView! + + private var isCustomerNote: Bool = false { + didSet { + noteIconButton.backgroundColor = isCustomerNote ? StyleManager.statusPrimaryBoldColor : StyleManager.wooGreyMid + } + } + + override func awakeFromNib() { + super.awakeFromNib() + } + + func configure(isNoteToCustomer: Bool) { + isCustomerNote = isNoteToCustomer + } +} diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.xib b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.xib new file mode 100644 index 00000000000..598edd93543 --- /dev/null +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.xib @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WooCommerce/Classes/ViewRelated/Orders/Orders.storyboard b/WooCommerce/Classes/ViewRelated/Orders/Orders.storyboard index aca090cfc7a..5c59e94c83b 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/Orders.storyboard +++ b/WooCommerce/Classes/ViewRelated/Orders/Orders.storyboard @@ -184,7 +184,7 @@ - + diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index 0b7c47f620e..190be70799c 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -110,6 +110,10 @@ CE4296B920A5E9E400B2AFBD /* CNContact+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4296B820A5E9E400B2AFBD /* CNContact+Helpers.swift */; }; CE4DDB7B20DD312400D32EC8 /* Date+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4DDB7A20DD312400D32EC8 /* Date+Helpers.swift */; }; CE583A0421076C0100D73C1C /* AddaNoteViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE583A0321076C0100D73C1C /* AddaNoteViewController.swift */; }; + CE583A072107849F00D73C1C /* ToggleEmailCustomerTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE583A052107849F00D73C1C /* ToggleEmailCustomerTableViewCell.swift */; }; + CE583A082107849F00D73C1C /* ToggleEmailCustomerTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE583A062107849F00D73C1C /* ToggleEmailCustomerTableViewCell.xib */; }; + CE583A0B2107937F00D73C1C /* WriteCustomerNoteTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE583A092107937F00D73C1C /* WriteCustomerNoteTableViewCell.swift */; }; + CE583A0C2107937F00D73C1C /* WriteCustomerNoteTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE583A0A2107937F00D73C1C /* WriteCustomerNoteTableViewCell.xib */; }; CE85535D209B5BB700938BDC /* OrderDetailsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE85535C209B5BB700938BDC /* OrderDetailsViewModel.swift */; }; CE855364209BA6A700938BDC /* ShowHideSectionFooter.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE855360209BA6A700938BDC /* ShowHideSectionFooter.swift */; }; CE855365209BA6A700938BDC /* CustomerInfoTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE855361209BA6A700938BDC /* CustomerInfoTableViewCell.xib */; }; @@ -259,6 +263,10 @@ CE4296B820A5E9E400B2AFBD /* CNContact+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CNContact+Helpers.swift"; sourceTree = ""; }; CE4DDB7A20DD312400D32EC8 /* Date+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+Helpers.swift"; sourceTree = ""; }; CE583A0321076C0100D73C1C /* AddaNoteViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddaNoteViewController.swift; sourceTree = ""; }; + CE583A052107849F00D73C1C /* ToggleEmailCustomerTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToggleEmailCustomerTableViewCell.swift; sourceTree = ""; }; + CE583A062107849F00D73C1C /* ToggleEmailCustomerTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ToggleEmailCustomerTableViewCell.xib; sourceTree = ""; }; + CE583A092107937F00D73C1C /* WriteCustomerNoteTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WriteCustomerNoteTableViewCell.swift; sourceTree = ""; }; + CE583A0A2107937F00D73C1C /* WriteCustomerNoteTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = WriteCustomerNoteTableViewCell.xib; sourceTree = ""; }; CE85535C209B5BB700938BDC /* OrderDetailsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderDetailsViewModel.swift; sourceTree = ""; }; CE855360209BA6A700938BDC /* ShowHideSectionFooter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowHideSectionFooter.swift; sourceTree = ""; }; CE855361209BA6A700938BDC /* CustomerInfoTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CustomerInfoTableViewCell.xib; sourceTree = ""; }; @@ -542,6 +550,10 @@ isa = PBXGroup; children = ( CE583A0321076C0100D73C1C /* AddaNoteViewController.swift */, + CE583A052107849F00D73C1C /* ToggleEmailCustomerTableViewCell.swift */, + CE583A062107849F00D73C1C /* ToggleEmailCustomerTableViewCell.xib */, + CE583A092107937F00D73C1C /* WriteCustomerNoteTableViewCell.swift */, + CE583A0A2107937F00D73C1C /* WriteCustomerNoteTableViewCell.xib */, ); path = AddNote; sourceTree = ""; @@ -738,6 +750,7 @@ files = ( B56DB3D72049BFAA00D4AA8E /* LaunchScreen.storyboard in Resources */, CE85FD6020F7BE8D0080B73E /* LogOutTableViewCell.xib in Resources */, + CE583A0C2107937F00D73C1C /* WriteCustomerNoteTableViewCell.xib in Resources */, B5A8F8AF20B88DCC00D211DE /* LoginPrologueViewController.xib in Resources */, B5D1AFC820BC7B9600DB0E8C /* StorePickerViewController.xib in Resources */, B57C744320F54F1C00EEFC87 /* AccountHeaderView.xib in Resources */, @@ -746,6 +759,7 @@ 93BCF01F20DC2CE200EBF7A1 /* bash_secrets.tpl in Resources */, B56DB3D42049BFAA00D4AA8E /* Assets.xcassets in Resources */, B559EBAF20A0BF8F00836CD4 /* README.md in Resources */, + CE583A082107849F00D73C1C /* ToggleEmailCustomerTableViewCell.xib in Resources */, CE22571B20E16FBC0037F478 /* AddItemTableViewCell.xib in Resources */, B5D1AFB420BC445A00DB0E8C /* Images.xcassets in Resources */, CE1EC8CF20B6FD53009762BF /* FootnoteView.xib in Resources */, @@ -919,6 +933,7 @@ CE85FD5F20F7BE8D0080B73E /* LogOutTableViewCell.swift in Sources */, CE32B11A20BF8E32006FBCF4 /* UIButton+Helpers.swift in Sources */, CE263DE6206ACD220015A693 /* NotificationsViewController.swift in Sources */, + CE583A0B2107937F00D73C1C /* WriteCustomerNoteTableViewCell.swift in Sources */, B557652B20F681E800185843 /* StoreTableViewCell.swift in Sources */, B57C743D20F5493300EEFC87 /* AccountHeaderView.swift in Sources */, B50911312049E27A007D25DC /* OrdersViewController.swift in Sources */, @@ -953,6 +968,7 @@ B50911302049E27A007D25DC /* DashboardViewController.swift in Sources */, B5D1AFB820BC510200DB0E8C /* UIImage+Woo.swift in Sources */, CE1EC8E920B8A3F5009762BF /* OrderNoteViewModel.swift in Sources */, + CE583A072107849F00D73C1C /* ToggleEmailCustomerTableViewCell.swift in Sources */, CEE006082077D14C0079161F /* OrderDetailsViewController.swift in Sources */, CE34DA2520A1ECD6005D8523 /* ContactViewModel.swift in Sources */, CE1EC8C520B46819009762BF /* PaymentTableViewCell.swift in Sources */, From 9bfd55a1eeecb33dd8b505575c785a0106086a91 Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Wed, 25 Jul 2018 08:13:27 -0500 Subject: [PATCH 10/23] Rename `AddaNoteVC` to `AddANoteVC` --- ...eViewController.swift => AddANoteViewController.swift} | 8 ++++---- .../Orders/OrderDetails/OrderDetailsViewController.swift | 8 ++++---- WooCommerce/Classes/ViewRelated/Orders/Orders.storyboard | 4 ++-- WooCommerce/WooCommerce.xcodeproj/project.pbxproj | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) rename WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/{AddaNoteViewController.swift => AddANoteViewController.swift} (95%) diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddaNoteViewController.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift similarity index 95% rename from WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddaNoteViewController.swift rename to WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift index a76cb096d59..44ca884f7ab 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddaNoteViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift @@ -1,7 +1,7 @@ import UIKit import Yosemite -class AddaNoteViewController: UIViewController { +class AddANoteViewController: UIViewController { // MARK: - Properties @@ -52,7 +52,7 @@ class AddaNoteViewController: UIViewController { // MARK: - TableView Configuration // -private extension AddaNoteViewController { +private extension AddANoteViewController { /// Setup: TableView /// private func configureTableView() { @@ -99,7 +99,7 @@ private extension AddaNoteViewController { // MARK: - UITableViewDataSource Conformance // -extension AddaNoteViewController: UITableViewDataSource { +extension AddANoteViewController: UITableViewDataSource { func numberOfSections(in tableView: UITableView) -> Int { return 2 } @@ -122,7 +122,7 @@ extension AddaNoteViewController: UITableViewDataSource { // MARK: - Constants // -private extension AddaNoteViewController { +private extension AddANoteViewController { struct Constants { static let rowHeight = CGFloat(44) } diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/OrderDetailsViewController.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/OrderDetailsViewController.swift index ee44f310c33..79a55c7a591 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/OrderDetailsViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/OrderDetailsViewController.swift @@ -402,9 +402,9 @@ extension OrderDetailsViewController: UITableViewDelegate { tableView.deselectRow(at: indexPath, animated: true) if sections[indexPath.section].rows[indexPath.row] == .addOrderNote { - let addaNoteViewController = self.storyboard!.instantiateViewController(withIdentifier: Constants.noteViewController) as! AddaNoteViewController - addaNoteViewController.order = viewModel.order - let navController = UINavigationController(rootViewController: addaNoteViewController) + let addANoteViewController = self.storyboard!.instantiateViewController(withIdentifier: Constants.noteViewController) as! AddANoteViewController + addANoteViewController.order = viewModel.order + let navController = UINavigationController(rootViewController: addANoteViewController) present(navController, animated: true, completion: nil) } else if sections[indexPath.section].rows[indexPath.row] == .productDetails { performSegue(withIdentifier: Constants.productDetailsSegue, sender: nil) @@ -478,7 +478,7 @@ private extension OrderDetailsViewController { static let rowHeight = CGFloat(38) static let sectionHeight = CGFloat(44) static let productDetailsSegue = "ShowProductListViewController" - static let noteViewController = "AddaNoteViewController" + static let noteViewController = "AddANoteViewController" } private struct Section { diff --git a/WooCommerce/Classes/ViewRelated/Orders/Orders.storyboard b/WooCommerce/Classes/ViewRelated/Orders/Orders.storyboard index 5c59e94c83b..76b1e7fb18a 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/Orders.storyboard +++ b/WooCommerce/Classes/ViewRelated/Orders/Orders.storyboard @@ -176,10 +176,10 @@ - + - + diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index 190be70799c..a8ab628d8bb 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -109,7 +109,7 @@ CE34DA2520A1ECD6005D8523 /* ContactViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE34DA2420A1ECD6005D8523 /* ContactViewModel.swift */; }; CE4296B920A5E9E400B2AFBD /* CNContact+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4296B820A5E9E400B2AFBD /* CNContact+Helpers.swift */; }; CE4DDB7B20DD312400D32EC8 /* Date+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4DDB7A20DD312400D32EC8 /* Date+Helpers.swift */; }; - CE583A0421076C0100D73C1C /* AddaNoteViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE583A0321076C0100D73C1C /* AddaNoteViewController.swift */; }; + CE583A0421076C0100D73C1C /* AddANoteViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE583A0321076C0100D73C1C /* AddANoteViewController.swift */; }; CE583A072107849F00D73C1C /* ToggleEmailCustomerTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE583A052107849F00D73C1C /* ToggleEmailCustomerTableViewCell.swift */; }; CE583A082107849F00D73C1C /* ToggleEmailCustomerTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE583A062107849F00D73C1C /* ToggleEmailCustomerTableViewCell.xib */; }; CE583A0B2107937F00D73C1C /* WriteCustomerNoteTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE583A092107937F00D73C1C /* WriteCustomerNoteTableViewCell.swift */; }; @@ -262,7 +262,7 @@ CE34DA2420A1ECD6005D8523 /* ContactViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactViewModel.swift; sourceTree = ""; }; CE4296B820A5E9E400B2AFBD /* CNContact+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CNContact+Helpers.swift"; sourceTree = ""; }; CE4DDB7A20DD312400D32EC8 /* Date+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+Helpers.swift"; sourceTree = ""; }; - CE583A0321076C0100D73C1C /* AddaNoteViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddaNoteViewController.swift; sourceTree = ""; }; + CE583A0321076C0100D73C1C /* AddANoteViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddANoteViewController.swift; sourceTree = ""; }; CE583A052107849F00D73C1C /* ToggleEmailCustomerTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToggleEmailCustomerTableViewCell.swift; sourceTree = ""; }; CE583A062107849F00D73C1C /* ToggleEmailCustomerTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ToggleEmailCustomerTableViewCell.xib; sourceTree = ""; }; CE583A092107937F00D73C1C /* WriteCustomerNoteTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WriteCustomerNoteTableViewCell.swift; sourceTree = ""; }; @@ -549,7 +549,7 @@ CE583A0221076BBE00D73C1C /* AddNote */ = { isa = PBXGroup; children = ( - CE583A0321076C0100D73C1C /* AddaNoteViewController.swift */, + CE583A0321076C0100D73C1C /* AddANoteViewController.swift */, CE583A052107849F00D73C1C /* ToggleEmailCustomerTableViewCell.swift */, CE583A062107849F00D73C1C /* ToggleEmailCustomerTableViewCell.xib */, CE583A092107937F00D73C1C /* WriteCustomerNoteTableViewCell.swift */, @@ -949,7 +949,7 @@ CE21B3D720FE669A00A259D5 /* BasicDisclosureTableViewCell.swift in Sources */, B5DBF3CB20E149CC00B53AED /* AuthenticatedState.swift in Sources */, CE1EC8F120B8A408009762BF /* OrderNoteTableViewCell.swift in Sources */, - CE583A0421076C0100D73C1C /* AddaNoteViewController.swift in Sources */, + CE583A0421076C0100D73C1C /* AddANoteViewController.swift in Sources */, CE4DDB7B20DD312400D32EC8 /* Date+Helpers.swift in Sources */, B50911322049E27A007D25DC /* SettingsViewController.swift in Sources */, B57C744720F55BC800EEFC87 /* UIView+Helpers.swift in Sources */, From 106ed797bb24c9109285db763ffda679b88b60b4 Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Wed, 25 Jul 2018 11:42:55 -0500 Subject: [PATCH 11/23] Autolayout for note writing cell. Add note icon, `.aside` --- .../AddNote/AddANoteViewController.swift | 13 +++++++++++++ .../WriteCustomerNoteTableViewCell.swift | 1 + .../AddNote/WriteCustomerNoteTableViewCell.xib | 17 ++++++++++------- .../OrderDetails/OrderNoteTableViewCell.xib | 2 +- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift index 44ca884f7ab..aa68e885d23 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift @@ -118,6 +118,19 @@ extension AddANoteViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return sections[section].title } + + func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { + // iOS 11 table bug. Must return a tiny value to collapse `nil` or `empty` section footers. + return CGFloat.leastNonzeroMagnitude + } +} + +// MARK: - UITableViewDelegate Conformance +// +extension AddANoteViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectSelectedRowWithAnimation(true) + } } // MARK: - Constants diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.swift index 846e4230166..4974ef17382 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.swift @@ -7,6 +7,7 @@ class WriteCustomerNoteTableViewCell: UITableViewCell { didSet { noteIconButton.layer.cornerRadius = noteIconButton.frame.width / 2 noteIconButton.tintColor = .white + noteIconButton.setImage(Gridicon.iconOfType(.aside), for: .normal) } } diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.xib b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.xib index 598edd93543..66e8c9b9d65 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.xib +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.xib @@ -11,17 +11,19 @@ - - + + - + - + - Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. + + + @@ -31,12 +33,13 @@ + - + @@ -47,7 +50,7 @@ - + diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/OrderNoteTableViewCell.xib b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/OrderNoteTableViewCell.xib index 5b774b048d8..69f2dc0fd8c 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/OrderNoteTableViewCell.xib +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/OrderNoteTableViewCell.xib @@ -1,5 +1,5 @@ - + From 229ea51f5a96f83a015d5c95a9c75cd2b68186a9 Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Wed, 25 Jul 2018 12:19:02 -0500 Subject: [PATCH 12/23] toggling the "email note to customer?" control changes the note icon color --- .../AddNote/AddANoteViewController.swift | 43 +++++++++++++++---- .../ToggleEmailCustomerTableViewCell.swift | 6 +++ .../ToggleEmailCustomerTableViewCell.xib | 3 ++ .../WriteCustomerNoteTableViewCell.swift | 2 +- 4 files changed, 44 insertions(+), 10 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift index aa68e885d23..4998705ac3e 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift @@ -11,6 +11,8 @@ class AddANoteViewController: UIViewController { private var sections = [Section]() + private var isCustomerNote = false + // MARK: - View Lifecycle override func viewDidLoad() { @@ -83,16 +85,39 @@ private extension AddANoteViewController { sections = [writeNoteSection, emailCustomerSection] } + /// Switch between a private note and a customer note + /// + func toggleNoteType() { + isCustomerNote = !isCustomerNote + } + /// Cell Configuration /// - private func configure(_ cell: UITableViewCell, for row: Row, at indexPath: IndexPath) { - switch cell { - case let cell as WriteCustomerNoteTableViewCell: - cell.configure(isNoteToCustomer: false) - case let cell as ToggleEmailCustomerTableViewCell: - cell.awakeFromNib() - default: - fatalError("Unidentified add a note row type") + private func setup(cell: UITableViewCell, for row: Row) { + switch row { + case .writeNote: + setupWriteNoteCell(cell) + case .emailCustomer: + setupEmailCustomerCell(cell) + } + } + + private func setupWriteNoteCell(_ cell: UITableViewCell) { + guard let cell = cell as? WriteCustomerNoteTableViewCell else { + fatalError() + } + + cell.isCustomerNote = isCustomerNote + } + + private func setupEmailCustomerCell(_ cell: UITableViewCell) { + guard let cell = cell as? ToggleEmailCustomerTableViewCell else { + fatalError() + } + + cell.onToggleSwitchTouchUp = { [weak self] in + self?.toggleNoteType() + self?.tableView.reloadData() } } } @@ -111,7 +136,7 @@ extension AddANoteViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let row = sections[indexPath.section].rows[indexPath.row] let cell = tableView.dequeueReusableCell(withIdentifier: row.reuseIdentifier, for: indexPath) - configure(cell, for: row, at: indexPath) + setup(cell: cell, for: row) return cell } diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.swift index 7016bb0f826..a39daf922e0 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.swift @@ -8,6 +8,12 @@ class ToggleEmailCustomerTableViewCell: UITableViewCell { @IBOutlet var bottomLabel: UILabel! @IBOutlet var toggleSwitch: UISwitch! + @IBAction func toggleSwitchWasPressed() { + onToggleSwitchTouchUp?() + } + + var onToggleSwitchTouchUp: (() -> Void)? + override func awakeFromNib() { super.awakeFromNib() topLabel.applyBodyStyle() diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.xib b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.xib index 304966442af..8706b1cc164 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.xib +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.xib @@ -32,6 +32,9 @@ + + + diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.swift index 4974ef17382..1dbbc17c306 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.swift @@ -13,7 +13,7 @@ class WriteCustomerNoteTableViewCell: UITableViewCell { @IBOutlet var noteTextView: UITextView! - private var isCustomerNote: Bool = false { + public var isCustomerNote: Bool! { didSet { noteIconButton.backgroundColor = isCustomerNote ? StyleManager.statusPrimaryBoldColor : StyleManager.wooGreyMid } From a4afa4576ff9fd7537e11dbc69963281920fc9cf Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Wed, 25 Jul 2018 14:54:50 -0500 Subject: [PATCH 13/23] Add dispatch action to "Add" button --- .../AddNote/AddANoteViewController.swift | 25 ++++++++++++++++--- .../OrderDetailsViewController.swift | 2 +- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift index 4998705ac3e..f3a67e70fb6 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift @@ -1,5 +1,6 @@ import UIKit import Yosemite +import CocoaLumberjack class AddANoteViewController: UIViewController { @@ -7,7 +8,7 @@ class AddANoteViewController: UIViewController { @IBOutlet var tableView: UITableView! - var order: Order! + var viewModel: OrderDetailsViewModel! private var sections = [Section]() @@ -24,7 +25,7 @@ class AddANoteViewController: UIViewController { } func configureNavigation() { - title = NSLocalizedString("Order #\(order.number)", comment: "Add a note screen - title. Example: Order #15") + title = NSLocalizedString("Order #\(viewModel.order.number)", comment: "Add a note screen - title. Example: Order #15") let dismissButtonTitle = NSLocalizedString("Dismiss", comment: "Add a note screen - button title for closing the view") let leftBarButton = UIBarButtonItem(title: dismissButtonTitle, @@ -48,7 +49,25 @@ class AddANoteViewController: UIViewController { } @objc func addButtonTapped() { - NSLog("Add button tapped!") + let indexPath = IndexPath(row: 0, section: 0) + guard let cell = tableView.cellForRow(at: indexPath) as? WriteCustomerNoteTableViewCell else { + fatalError() + } + + guard let note = cell.noteTextView.text else { + return + } + + let action = OrderNoteAction.addOrderNote(siteID: viewModel.order.siteID, orderID: viewModel.order.orderID, isCustomerNote: isCustomerNote, note: note) { [weak self] (orderNote, error) in + guard orderNote != nil else { + DDLogError("⛔️ Error adding a note: \(error.debugDescription)") + // TODO: should this alert the user that there was an error? + return + } + self?.dismiss(animated: true, completion: nil) + } + + StoresManager.shared.dispatch(action) } } diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/OrderDetailsViewController.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/OrderDetailsViewController.swift index 79a55c7a591..818ba6149ea 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/OrderDetailsViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/OrderDetailsViewController.swift @@ -403,7 +403,7 @@ extension OrderDetailsViewController: UITableViewDelegate { if sections[indexPath.section].rows[indexPath.row] == .addOrderNote { let addANoteViewController = self.storyboard!.instantiateViewController(withIdentifier: Constants.noteViewController) as! AddANoteViewController - addANoteViewController.order = viewModel.order + addANoteViewController.viewModel = viewModel let navController = UINavigationController(rootViewController: addANoteViewController) present(navController, animated: true, completion: nil) } else if sections[indexPath.section].rows[indexPath.row] == .productDetails { From e6a10f1862ada90b237bcf365502c98834bd3cba Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Wed, 25 Jul 2018 15:50:58 -0500 Subject: [PATCH 14/23] Add single note mapper --- Networking/Networking.xcodeproj/project.pbxproj | 4 ++++ .../Networking/Mapper/OrderNoteMapper.swift | 17 +++++++++++++++++ Networking/Networking/Remote/OrdersRemote.swift | 4 ++-- Yosemite/Yosemite/Stores/OrderNoteStore.swift | 8 ++++---- 4 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 Networking/Networking/Mapper/OrderNoteMapper.swift diff --git a/Networking/Networking.xcodeproj/project.pbxproj b/Networking/Networking.xcodeproj/project.pbxproj index b4ef70fad24..1dbbfe83535 100644 --- a/Networking/Networking.xcodeproj/project.pbxproj +++ b/Networking/Networking.xcodeproj/project.pbxproj @@ -62,6 +62,7 @@ B5C6FCD620A3768900A4F8E4 /* order.json in Resources */ = {isa = PBXBuildFile; fileRef = B5C6FCD520A3768900A4F8E4 /* order.json */; }; CE20179320E3EFA7005B4C18 /* broken-orders.json in Resources */ = {isa = PBXBuildFile; fileRef = CE20179220E3EFA7005B4C18 /* broken-orders.json */; }; CE21B3E72106811000A259D5 /* new-order-note.json in Resources */ = {isa = PBXBuildFile; fileRef = CE21B3E62106811000A259D5 /* new-order-note.json */; }; + CE583A0E2109154500D73C1C /* OrderNoteMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE583A0D2109154500D73C1C /* OrderNoteMapper.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -135,6 +136,7 @@ C8F9A8CC6F90A8C9B5EF2EE2 /* Pods-Networking.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Networking.release.xcconfig"; path = "../Pods/Target Support Files/Pods-Networking/Pods-Networking.release.xcconfig"; sourceTree = ""; }; CE20179220E3EFA7005B4C18 /* broken-orders.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "broken-orders.json"; sourceTree = ""; }; CE21B3E62106811000A259D5 /* new-order-note.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "new-order-note.json"; sourceTree = ""; }; + CE583A0D2109154500D73C1C /* OrderNoteMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderNoteMapper.swift; sourceTree = ""; }; F3F25DC15EC1D7C631169CB5 /* Pods_Networking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Networking.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F6CEE1CA2AD376C0C28AE9F6 /* Pods-NetworkingTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NetworkingTests.release.xcconfig"; path = "../Pods/Target Support Files/Pods-NetworkingTests/Pods-NetworkingTests.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -338,6 +340,7 @@ B567AF2A20A0FA4200AB6C62 /* OrderListMapper.swift */, B56C1EB520EA757B00D749F9 /* SiteListMapper.swift */, 74C8F06720EEB7BC00B6EDC9 /* OrderNotesMapper.swift */, + CE583A0D2109154500D73C1C /* OrderNoteMapper.swift */, ); path = Mapper; sourceTree = ""; @@ -579,6 +582,7 @@ B518662220A097C200037A38 /* Network.swift in Sources */, B518662420A099BF00037A38 /* AlamofireNetwork.swift in Sources */, B557DA1820979D51005962F4 /* Credentials.swift in Sources */, + CE583A0E2109154500D73C1C /* OrderNoteMapper.swift in Sources */, B5C6FCCF20A3592900A4F8E4 /* OrderItem.swift in Sources */, B505F6EC20BEFDC200BB1B69 /* Loader.swift in Sources */, B5BB1D1220A255EC00112D92 /* OrderStatus.swift in Sources */, diff --git a/Networking/Networking/Mapper/OrderNoteMapper.swift b/Networking/Networking/Mapper/OrderNoteMapper.swift new file mode 100644 index 00000000000..d23257d2339 --- /dev/null +++ b/Networking/Networking/Mapper/OrderNoteMapper.swift @@ -0,0 +1,17 @@ +import Foundation + + +/// Mapper: OrderNote (Singular) +/// +class OrderNoteMapper: Mapper { + + /// (Attempts) to convert a dictionary into a single OrderNote + /// + func map(response: Data) throws -> OrderNote { + let decoder = JSONDecoder() + decoder.dateDecodingStrategy = .formatted(DateFormatter.Defaults.dateTimeFormatter) + + let decoded = try decoder.decode(OrderNote.self, from: response) + return decoded + } +} diff --git a/Networking/Networking/Remote/OrdersRemote.swift b/Networking/Networking/Remote/OrdersRemote.swift index d49354c903b..1a7940e1c79 100644 --- a/Networking/Networking/Remote/OrdersRemote.swift +++ b/Networking/Networking/Remote/OrdersRemote.swift @@ -79,11 +79,11 @@ public class OrdersRemote: Remote { /// - note: The note to be posted. /// - completion: Closure to be executed upon completion. /// - public func addOrderNote(for siteID: Int, orderID: Int, isCustomerNote: Bool, with note: String, completion: @escaping ([OrderNote]?, Error?) -> Void) { + public func addOrderNote(for siteID: Int, orderID: Int, isCustomerNote: Bool, with note: String, completion: @escaping (OrderNote?, Error?) -> Void) { let path = "\(Constants.ordersPath)/" + String(orderID) + "/" + "\(Constants.notesPath)" let parameters = [ParameterKeys.note: note, ParameterKeys.customerNote: String(isCustomerNote)] - let mapper = OrderNotesMapper() + let mapper = OrderNoteMapper() let request = JetpackRequest(wooApiVersion: .mark2, method: .post, siteID: siteID, path: path, parameters: parameters) enqueue(request, mapper: mapper, completion: completion) diff --git a/Yosemite/Yosemite/Stores/OrderNoteStore.swift b/Yosemite/Yosemite/Stores/OrderNoteStore.swift index a1d94a6758e..78f978fa654 100644 --- a/Yosemite/Yosemite/Stores/OrderNoteStore.swift +++ b/Yosemite/Yosemite/Stores/OrderNoteStore.swift @@ -54,14 +54,14 @@ private extension OrderNoteStore { /// func addOrderNote(siteID: Int, orderID: Int, isCustomerNote: Bool, note: String, onCompletion: @escaping (OrderNote?, Error?) -> Void) { let remote = OrdersRemote(network: network) - remote.addOrderNote(for: siteID, orderID: orderID, isCustomerNote: isCustomerNote, with: note) { [weak self] (orderNotes, error) in - guard let orderNote = orderNotes?.first else { + remote.addOrderNote(for: siteID, orderID: orderID, isCustomerNote: isCustomerNote, with: note) { [weak self] (orderNote, error) in + guard let note = orderNote else { onCompletion(nil, error) return } - self?.upsertStoredOrderNotes(readOnlyOrderNotes: [orderNote], orderID: orderID) - onCompletion(orderNote, nil) + self?.upsertStoredOrderNotes(readOnlyOrderNotes: [note], orderID: orderID) + onCompletion(note, nil) } } } From 27bc94bf0568fd4534550ba22d11ae7b313053ef Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Wed, 25 Jul 2018 16:17:58 -0500 Subject: [PATCH 15/23] Fix mapper --- .../Networking/Mapper/OrderNoteMapper.swift | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Networking/Networking/Mapper/OrderNoteMapper.swift b/Networking/Networking/Mapper/OrderNoteMapper.swift index d23257d2339..c6735c265c7 100644 --- a/Networking/Networking/Mapper/OrderNoteMapper.swift +++ b/Networking/Networking/Mapper/OrderNoteMapper.swift @@ -11,7 +11,19 @@ class OrderNoteMapper: Mapper { let decoder = JSONDecoder() decoder.dateDecodingStrategy = .formatted(DateFormatter.Defaults.dateTimeFormatter) - let decoded = try decoder.decode(OrderNote.self, from: response) - return decoded + return try decoder.decode(OrderNoteEnvelope.self, from: response).orderNote + } +} + + +/// OrderNote Disposable Entity: +/// `Add Order Note` endpoint the single added note within the `data` key. This entity +/// allows us to parse all the things with JSONDecoder. +/// +private struct OrderNoteEnvelope: Decodable { + let orderNote: OrderNote + + private enum CodingKeys: String, CodingKey { + case orderNote = "data" } } From eb5bb567a8584aa08c2614029e07e236911167db Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Thu, 26 Jul 2018 08:31:18 -0500 Subject: [PATCH 16/23] Fix unit test networking response --- .../Responses/new-order-note.json | 50 +++++++++---------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/Networking/NetworkingTests/Responses/new-order-note.json b/Networking/NetworkingTests/Responses/new-order-note.json index d568cd79f31..1e6a8140c17 100644 --- a/Networking/NetworkingTests/Responses/new-order-note.json +++ b/Networking/NetworkingTests/Responses/new-order-note.json @@ -1,28 +1,26 @@ { - "data": [ - { - "id": 2235, - "date_created": "2018-06-22T11:36:20", - "date_created_gmt": "2018-06-22T15:36:20", - "note": "This order would be so much better with ketchup.", - "customer_note": true, - "_links": { - "self": [ - { - "href": "https://jamosova3.mystagingwebsite.com/wp-json/wc/v2/orders/1179/notes/2235" - } - ], - "collection": [ - { - "href": "https://jamosova3.mystagingwebsite.com/wp-json/wc/v2/orders/1179/notes" - } - ], - "up": [ - { - "href": "https://jamosova3.mystagingwebsite.com/wp-json/wc/v2/orders/1179" - } - ] - } + "data": { + "id": 2235, + "date_created": "2018-06-22T11:36:20", + "date_created_gmt": "2018-06-22T15:36:20", + "note": "This order would be so much better with ketchup.", + "customer_note": true, + "_links": { + "self": [ + { + "href": "https://jamosova3.mystagingwebsite.com/wp-json/wc/v2/orders/1179/notes/2235" + } + ], + "collection": [ + { + "href": "https://jamosova3.mystagingwebsite.com/wp-json/wc/v2/orders/1179/notes" + } + ], + "up": [ + { + "href": "https://jamosova3.mystagingwebsite.com/wp-json/wc/v2/orders/1179" + } + ] } - ] -} \ No newline at end of file + } +} From 03295aa67fd4979abff07f1ad5bff695d406160c Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Thu, 26 Jul 2018 15:44:46 -0500 Subject: [PATCH 17/23] Code review - rename table view cells, create public new variables, configure cells within VC --- .../AddNote/AddANoteViewController.swift | 45 ++++++++++--------- .../ToggleEmailCustomerTableViewCell.swift | 25 ----------- .../WriteCustomerNoteTableViewCell.swift | 29 ------------ .../ReusableViews/SwitchTableViewCell.swift | 40 +++++++++++++++++ .../SwitchTableViewCell.xib} | 2 +- .../ReusableViews/TextViewTableViewCell.swift | 37 +++++++++++++++ .../TextViewTableViewCell.xib} | 2 +- .../WooCommerce.xcodeproj/project.pbxproj | 32 ++++++------- 8 files changed, 119 insertions(+), 93 deletions(-) delete mode 100644 WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.swift delete mode 100644 WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.swift create mode 100644 WooCommerce/Classes/ViewRelated/ReusableViews/SwitchTableViewCell.swift rename WooCommerce/Classes/ViewRelated/{Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.xib => ReusableViews/SwitchTableViewCell.xib} (98%) create mode 100644 WooCommerce/Classes/ViewRelated/ReusableViews/TextViewTableViewCell.swift rename WooCommerce/Classes/ViewRelated/{Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.xib => ReusableViews/TextViewTableViewCell.xib} (97%) diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift index f3a67e70fb6..dd44c0df1a6 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift @@ -1,5 +1,6 @@ import UIKit import Yosemite +import Gridicons import CocoaLumberjack class AddANoteViewController: UIViewController { @@ -14,6 +15,8 @@ class AddANoteViewController: UIViewController { private var isCustomerNote = false + private var noteText: String = "" + // MARK: - View Lifecycle override func viewDidLoad() { @@ -42,6 +45,7 @@ class AddANoteViewController: UIViewController { action: #selector(addButtonTapped)) rightBarButton.tintColor = .white navigationItem.setRightBarButton(rightBarButton, animated: false) + navigationItem.rightBarButtonItem?.isEnabled = false } @objc func dismissButtonTapped() { @@ -49,18 +53,9 @@ class AddANoteViewController: UIViewController { } @objc func addButtonTapped() { - let indexPath = IndexPath(row: 0, section: 0) - guard let cell = tableView.cellForRow(at: indexPath) as? WriteCustomerNoteTableViewCell else { - fatalError() - } - - guard let note = cell.noteTextView.text else { - return - } - - let action = OrderNoteAction.addOrderNote(siteID: viewModel.order.siteID, orderID: viewModel.order.orderID, isCustomerNote: isCustomerNote, note: note) { [weak self] (orderNote, error) in - guard orderNote != nil else { - DDLogError("⛔️ Error adding a note: \(error.debugDescription)") + let action = OrderNoteAction.addOrderNote(siteID: viewModel.order.siteID, orderID: viewModel.order.orderID, isCustomerNote: isCustomerNote, note: noteText) { [weak self] (orderNote, error) in + if let error = error { + DDLogError("⛔️ Error adding a note: \(error.localizedDescription)") // TODO: should this alert the user that there was an error? return } @@ -85,8 +80,8 @@ private extension AddANoteViewController { /// private func registerTableViewCells() { let cells = [ - WriteCustomerNoteTableViewCell.self, - ToggleEmailCustomerTableViewCell.self + TextViewTableViewCell.self, + SwitchTableViewCell.self ] for cell in cells { @@ -122,18 +117,26 @@ private extension AddANoteViewController { } private func setupWriteNoteCell(_ cell: UITableViewCell) { - guard let cell = cell as? WriteCustomerNoteTableViewCell else { + guard let cell = cell as? TextViewTableViewCell else { fatalError() } - cell.isCustomerNote = isCustomerNote + cell.iconImage = Gridicon.iconOfType(.aside) + cell.iconTint = isCustomerNote ? StyleManager.statusPrimaryBoldColor : StyleManager.wooGreyMid + cell.onTextChange = { [weak self] (text) in + self?.navigationItem.rightBarButtonItem?.isEnabled = !text.isEmpty + self?.noteText = text + } } private func setupEmailCustomerCell(_ cell: UITableViewCell) { - guard let cell = cell as? ToggleEmailCustomerTableViewCell else { + guard let cell = cell as? SwitchTableViewCell else { fatalError() } + cell.topText = NSLocalizedString("Email note to customer", comment: "Label for yes/no switch - emailing the note to customer.") + cell.bottomText = NSLocalizedString("If disabled will add the note as private.", comment: "Detail label for yes/no switch.") + cell.onToggleSwitchTouchUp = { [weak self] in self?.toggleNoteType() self?.tableView.reloadData() @@ -145,11 +148,11 @@ private extension AddANoteViewController { // extension AddANoteViewController: UITableViewDataSource { func numberOfSections(in tableView: UITableView) -> Int { - return 2 + return sections.count } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 1 + return sections[section].rows.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { @@ -196,9 +199,9 @@ private extension AddANoteViewController { var reuseIdentifier: String { switch self { case .writeNote: - return WriteCustomerNoteTableViewCell.reuseIdentifier + return TextViewTableViewCell.reuseIdentifier case .emailCustomer: - return ToggleEmailCustomerTableViewCell.reuseIdentifier + return SwitchTableViewCell.reuseIdentifier } } } diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.swift deleted file mode 100644 index a39daf922e0..00000000000 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.swift +++ /dev/null @@ -1,25 +0,0 @@ -import UIKit - -class ToggleEmailCustomerTableViewCell: UITableViewCell { - - // MARK: - Properties - // - @IBOutlet var topLabel: UILabel! - @IBOutlet var bottomLabel: UILabel! - @IBOutlet var toggleSwitch: UISwitch! - - @IBAction func toggleSwitchWasPressed() { - onToggleSwitchTouchUp?() - } - - var onToggleSwitchTouchUp: (() -> Void)? - - override func awakeFromNib() { - super.awakeFromNib() - topLabel.applyBodyStyle() - bottomLabel.applyFootnoteStyle() - - topLabel.text = NSLocalizedString("Email note to customer", comment: "Label for yes/no switch - emailing the note to customer.") - bottomLabel.text = NSLocalizedString("If disabled will add the note as private.", comment: "Detail label for yes/no switch.") - } -} diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.swift deleted file mode 100644 index 1dbbc17c306..00000000000 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.swift +++ /dev/null @@ -1,29 +0,0 @@ -import UIKit -import Gridicons - -class WriteCustomerNoteTableViewCell: UITableViewCell { - - @IBOutlet var noteIconButton: UIButton! { - didSet { - noteIconButton.layer.cornerRadius = noteIconButton.frame.width / 2 - noteIconButton.tintColor = .white - noteIconButton.setImage(Gridicon.iconOfType(.aside), for: .normal) - } - } - - @IBOutlet var noteTextView: UITextView! - - public var isCustomerNote: Bool! { - didSet { - noteIconButton.backgroundColor = isCustomerNote ? StyleManager.statusPrimaryBoldColor : StyleManager.wooGreyMid - } - } - - override func awakeFromNib() { - super.awakeFromNib() - } - - func configure(isNoteToCustomer: Bool) { - isCustomerNote = isNoteToCustomer - } -} diff --git a/WooCommerce/Classes/ViewRelated/ReusableViews/SwitchTableViewCell.swift b/WooCommerce/Classes/ViewRelated/ReusableViews/SwitchTableViewCell.swift new file mode 100644 index 00000000000..b1280eca476 --- /dev/null +++ b/WooCommerce/Classes/ViewRelated/ReusableViews/SwitchTableViewCell.swift @@ -0,0 +1,40 @@ +import UIKit + +class SwitchTableViewCell: UITableViewCell { + + // MARK: - Properties + // + @IBOutlet private var topLabel: UILabel! + @IBOutlet private var bottomLabel: UILabel! + @IBOutlet private var toggleSwitch: UISwitch! + + @IBAction func toggleSwitchWasPressed() { + onToggleSwitchTouchUp?() + } + + var topText: String? { + get { + return topLabel.text + } + set { + topLabel.text = newValue + } + } + + var bottomText: String? { + get { + return bottomLabel.text + } + set { + bottomLabel.text = newValue + } + } + + var onToggleSwitchTouchUp: (() -> Void)? + + override func awakeFromNib() { + super.awakeFromNib() + topLabel.applyBodyStyle() + bottomLabel.applyFootnoteStyle() + } +} diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.xib b/WooCommerce/Classes/ViewRelated/ReusableViews/SwitchTableViewCell.xib similarity index 98% rename from WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.xib rename to WooCommerce/Classes/ViewRelated/ReusableViews/SwitchTableViewCell.xib index 8706b1cc164..e51f03788ef 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/ToggleEmailCustomerTableViewCell.xib +++ b/WooCommerce/Classes/ViewRelated/ReusableViews/SwitchTableViewCell.xib @@ -11,7 +11,7 @@ - + diff --git a/WooCommerce/Classes/ViewRelated/ReusableViews/TextViewTableViewCell.swift b/WooCommerce/Classes/ViewRelated/ReusableViews/TextViewTableViewCell.swift new file mode 100644 index 00000000000..1040f4268d2 --- /dev/null +++ b/WooCommerce/Classes/ViewRelated/ReusableViews/TextViewTableViewCell.swift @@ -0,0 +1,37 @@ +import UIKit +import Gridicons + +class TextViewTableViewCell: UITableViewCell { + + @IBOutlet var noteIconButton: UIButton! + + @IBOutlet var noteTextView: UITextView! + + var iconImage: UIImage? { + get { + return noteIconButton.image(for: .normal) + } + set { + noteIconButton.setImage(newValue, for: .normal) + noteIconButton.tintColor = .white + noteIconButton.layer.cornerRadius = noteIconButton.frame.width / 2 + } + } + + var iconTint: UIColor? { + get { + return noteIconButton.backgroundColor + } + set { + noteIconButton.backgroundColor = newValue + } + } + + var onTextChange: ((String) -> Void)? +} + +extension TextViewTableViewCell: UITextViewDelegate { + func textViewDidChange() { + onTextChange?(noteTextView.text) + } +} diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.xib b/WooCommerce/Classes/ViewRelated/ReusableViews/TextViewTableViewCell.xib similarity index 97% rename from WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.xib rename to WooCommerce/Classes/ViewRelated/ReusableViews/TextViewTableViewCell.xib index 66e8c9b9d65..7971fade694 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/WriteCustomerNoteTableViewCell.xib +++ b/WooCommerce/Classes/ViewRelated/ReusableViews/TextViewTableViewCell.xib @@ -11,7 +11,7 @@ - + diff --git a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj index a887579f3c8..f915b2fc840 100644 --- a/WooCommerce/WooCommerce.xcodeproj/project.pbxproj +++ b/WooCommerce/WooCommerce.xcodeproj/project.pbxproj @@ -125,10 +125,10 @@ CE4296B920A5E9E400B2AFBD /* CNContact+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4296B820A5E9E400B2AFBD /* CNContact+Helpers.swift */; }; CE4DDB7B20DD312400D32EC8 /* Date+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4DDB7A20DD312400D32EC8 /* Date+Helpers.swift */; }; CE583A0421076C0100D73C1C /* AddANoteViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE583A0321076C0100D73C1C /* AddANoteViewController.swift */; }; - CE583A072107849F00D73C1C /* ToggleEmailCustomerTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE583A052107849F00D73C1C /* ToggleEmailCustomerTableViewCell.swift */; }; - CE583A082107849F00D73C1C /* ToggleEmailCustomerTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE583A062107849F00D73C1C /* ToggleEmailCustomerTableViewCell.xib */; }; - CE583A0B2107937F00D73C1C /* WriteCustomerNoteTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE583A092107937F00D73C1C /* WriteCustomerNoteTableViewCell.swift */; }; - CE583A0C2107937F00D73C1C /* WriteCustomerNoteTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE583A0A2107937F00D73C1C /* WriteCustomerNoteTableViewCell.xib */; }; + CE583A072107849F00D73C1C /* SwitchTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE583A052107849F00D73C1C /* SwitchTableViewCell.swift */; }; + CE583A082107849F00D73C1C /* SwitchTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE583A062107849F00D73C1C /* SwitchTableViewCell.xib */; }; + CE583A0B2107937F00D73C1C /* TextViewTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE583A092107937F00D73C1C /* TextViewTableViewCell.swift */; }; + CE583A0C2107937F00D73C1C /* TextViewTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE583A0A2107937F00D73C1C /* TextViewTableViewCell.xib */; }; CE85535D209B5BB700938BDC /* OrderDetailsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE85535C209B5BB700938BDC /* OrderDetailsViewModel.swift */; }; CE855364209BA6A700938BDC /* ShowHideSectionFooter.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE855360209BA6A700938BDC /* ShowHideSectionFooter.swift */; }; CE855365209BA6A700938BDC /* CustomerInfoTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE855361209BA6A700938BDC /* CustomerInfoTableViewCell.xib */; }; @@ -294,10 +294,10 @@ CE4296B820A5E9E400B2AFBD /* CNContact+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CNContact+Helpers.swift"; sourceTree = ""; }; CE4DDB7A20DD312400D32EC8 /* Date+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+Helpers.swift"; sourceTree = ""; }; CE583A0321076C0100D73C1C /* AddANoteViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddANoteViewController.swift; sourceTree = ""; }; - CE583A052107849F00D73C1C /* ToggleEmailCustomerTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToggleEmailCustomerTableViewCell.swift; sourceTree = ""; }; - CE583A062107849F00D73C1C /* ToggleEmailCustomerTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ToggleEmailCustomerTableViewCell.xib; sourceTree = ""; }; - CE583A092107937F00D73C1C /* WriteCustomerNoteTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WriteCustomerNoteTableViewCell.swift; sourceTree = ""; }; - CE583A0A2107937F00D73C1C /* WriteCustomerNoteTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = WriteCustomerNoteTableViewCell.xib; sourceTree = ""; }; + CE583A052107849F00D73C1C /* SwitchTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwitchTableViewCell.swift; sourceTree = ""; }; + CE583A062107849F00D73C1C /* SwitchTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SwitchTableViewCell.xib; sourceTree = ""; }; + CE583A092107937F00D73C1C /* TextViewTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextViewTableViewCell.swift; sourceTree = ""; }; + CE583A0A2107937F00D73C1C /* TextViewTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TextViewTableViewCell.xib; sourceTree = ""; }; CE85535C209B5BB700938BDC /* OrderDetailsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderDetailsViewModel.swift; sourceTree = ""; }; CE855360209BA6A700938BDC /* ShowHideSectionFooter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowHideSectionFooter.swift; sourceTree = ""; }; CE855361209BA6A700938BDC /* CustomerInfoTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CustomerInfoTableViewCell.xib; sourceTree = ""; }; @@ -629,10 +629,6 @@ isa = PBXGroup; children = ( CE583A0321076C0100D73C1C /* AddANoteViewController.swift */, - CE583A052107849F00D73C1C /* ToggleEmailCustomerTableViewCell.swift */, - CE583A062107849F00D73C1C /* ToggleEmailCustomerTableViewCell.xib */, - CE583A092107937F00D73C1C /* WriteCustomerNoteTableViewCell.swift */, - CE583A0A2107937F00D73C1C /* WriteCustomerNoteTableViewCell.xib */, ); path = AddNote; sourceTree = ""; @@ -687,6 +683,10 @@ CE32B10A20BEDE05006FBCF4 /* TwoColumnSectionHeaderView.xib */, CE1EC8C920B479F1009762BF /* TwoColumnLabelView.swift */, CE1EC8C720B478B6009762BF /* TwoColumnLabelView.xib */, + CE583A052107849F00D73C1C /* SwitchTableViewCell.swift */, + CE583A062107849F00D73C1C /* SwitchTableViewCell.xib */, + CE583A092107937F00D73C1C /* TextViewTableViewCell.swift */, + CE583A0A2107937F00D73C1C /* TextViewTableViewCell.xib */, ); path = ReusableViews; sourceTree = ""; @@ -830,7 +830,7 @@ files = ( B56DB3D72049BFAA00D4AA8E /* LaunchScreen.storyboard in Resources */, CE85FD6020F7BE8D0080B73E /* LogOutTableViewCell.xib in Resources */, - CE583A0C2107937F00D73C1C /* WriteCustomerNoteTableViewCell.xib in Resources */, + CE583A0C2107937F00D73C1C /* TextViewTableViewCell.xib in Resources */, B5A8F8AF20B88DCC00D211DE /* LoginPrologueViewController.xib in Resources */, B5D1AFC820BC7B9600DB0E8C /* StorePickerViewController.xib in Resources */, B57C744320F54F1C00EEFC87 /* AccountHeaderView.xib in Resources */, @@ -839,7 +839,7 @@ 93BCF01F20DC2CE200EBF7A1 /* bash_secrets.tpl in Resources */, B56DB3D42049BFAA00D4AA8E /* Assets.xcassets in Resources */, B559EBAF20A0BF8F00836CD4 /* README.md in Resources */, - CE583A082107849F00D73C1C /* ToggleEmailCustomerTableViewCell.xib in Resources */, + CE583A082107849F00D73C1C /* SwitchTableViewCell.xib in Resources */, CE22571B20E16FBC0037F478 /* LeftImageTableViewCell.xib in Resources */, B5D1AFB420BC445A00DB0E8C /* Images.xcassets in Resources */, CE1EC8CF20B6FD53009762BF /* FootnoteView.xib in Resources */, @@ -1014,7 +1014,7 @@ CE85FD5F20F7BE8D0080B73E /* LogOutTableViewCell.swift in Sources */, CE32B11A20BF8E32006FBCF4 /* UIButton+Helpers.swift in Sources */, CE263DE6206ACD220015A693 /* NotificationsViewController.swift in Sources */, - CE583A0B2107937F00D73C1C /* WriteCustomerNoteTableViewCell.swift in Sources */, + CE583A0B2107937F00D73C1C /* TextViewTableViewCell.swift in Sources */, B557652B20F681E800185843 /* StoreTableViewCell.swift in Sources */, B57C743D20F5493300EEFC87 /* AccountHeaderView.swift in Sources */, B50911312049E27A007D25DC /* OrdersViewController.swift in Sources */, @@ -1058,7 +1058,7 @@ B50911302049E27A007D25DC /* DashboardViewController.swift in Sources */, B5D1AFB820BC510200DB0E8C /* UIImage+Woo.swift in Sources */, CE1EC8E920B8A3F5009762BF /* OrderNoteViewModel.swift in Sources */, - CE583A072107849F00D73C1C /* ToggleEmailCustomerTableViewCell.swift in Sources */, + CE583A072107849F00D73C1C /* SwitchTableViewCell.swift in Sources */, CEE006082077D14C0079161F /* OrderDetailsViewController.swift in Sources */, CE34DA2520A1ECD6005D8523 /* ContactViewModel.swift in Sources */, B58B4AB62108F11C00076FDD /* Notice.swift in Sources */, From 5596d4aec0f2f70c314ae90093bb2baef4119bcd Mon Sep 17 00:00:00 2001 From: "Thuy.Copeland" Date: Fri, 27 Jul 2018 08:30:08 -0500 Subject: [PATCH 18/23] Add textview's delegate --- .../OrderDetails/AddNote/AddANoteViewController.swift | 1 + .../ViewRelated/ReusableViews/TextViewTableViewCell.swift | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift index dd44c0df1a6..13c19074ae4 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift @@ -123,6 +123,7 @@ private extension AddANoteViewController { cell.iconImage = Gridicon.iconOfType(.aside) cell.iconTint = isCustomerNote ? StyleManager.statusPrimaryBoldColor : StyleManager.wooGreyMid + cell.onTextChange = { [weak self] (text) in self?.navigationItem.rightBarButtonItem?.isEnabled = !text.isEmpty self?.noteText = text diff --git a/WooCommerce/Classes/ViewRelated/ReusableViews/TextViewTableViewCell.swift b/WooCommerce/Classes/ViewRelated/ReusableViews/TextViewTableViewCell.swift index 1040f4268d2..0f5ca8446b4 100644 --- a/WooCommerce/Classes/ViewRelated/ReusableViews/TextViewTableViewCell.swift +++ b/WooCommerce/Classes/ViewRelated/ReusableViews/TextViewTableViewCell.swift @@ -28,10 +28,15 @@ class TextViewTableViewCell: UITableViewCell { } var onTextChange: ((String) -> Void)? + + override func awakeFromNib() { + super.awakeFromNib() + noteTextView.delegate = self + } } extension TextViewTableViewCell: UITextViewDelegate { - func textViewDidChange() { + func textViewDidChange(_ textView: UITextView) { onTextChange?(noteTextView.text) } } From f9243d73bb78682017e79b341a5c6773b8bdec90 Mon Sep 17 00:00:00 2001 From: Jorge Leandro Perez Date: Fri, 27 Jul 2018 15:38:28 -0300 Subject: [PATCH 19/23] SwitchTableViewCell: selectionStyle = .none --- .../Classes/ViewRelated/ReusableViews/SwitchTableViewCell.xib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/Classes/ViewRelated/ReusableViews/SwitchTableViewCell.xib b/WooCommerce/Classes/ViewRelated/ReusableViews/SwitchTableViewCell.xib index e51f03788ef..e0bbfec762d 100644 --- a/WooCommerce/Classes/ViewRelated/ReusableViews/SwitchTableViewCell.xib +++ b/WooCommerce/Classes/ViewRelated/ReusableViews/SwitchTableViewCell.xib @@ -11,7 +11,7 @@ - + From 37c97363d1dcddf593456e563a837fc2bec21dca Mon Sep 17 00:00:00 2001 From: Jorge Leandro Perez Date: Fri, 27 Jul 2018 15:38:36 -0300 Subject: [PATCH 20/23] TextViewTableViewCell: selectionStyle = .none --- .../Classes/ViewRelated/ReusableViews/TextViewTableViewCell.xib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/Classes/ViewRelated/ReusableViews/TextViewTableViewCell.xib b/WooCommerce/Classes/ViewRelated/ReusableViews/TextViewTableViewCell.xib index 7971fade694..b803174208e 100644 --- a/WooCommerce/Classes/ViewRelated/ReusableViews/TextViewTableViewCell.xib +++ b/WooCommerce/Classes/ViewRelated/ReusableViews/TextViewTableViewCell.xib @@ -11,7 +11,7 @@ - + From 53339fb7be13841da271592504c59c4ae0844432 Mon Sep 17 00:00:00 2001 From: Jorge Leandro Perez Date: Fri, 27 Jul 2018 15:40:21 -0300 Subject: [PATCH 21/23] AddANoteViewController: becomeFirstResponder on viewDidAppear / resign on viewWillDisappear --- .../Classes/Extensions/UIView+Helpers.swift | 22 ++++++++++++++++++- .../AddNote/AddANoteViewController.swift | 10 +++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/WooCommerce/Classes/Extensions/UIView+Helpers.swift b/WooCommerce/Classes/Extensions/UIView+Helpers.swift index 5ad7dec60d4..12c72e9821a 100644 --- a/WooCommerce/Classes/Extensions/UIView+Helpers.swift +++ b/WooCommerce/Classes/Extensions/UIView+Helpers.swift @@ -2,7 +2,7 @@ import Foundation import UIKit -/// UIView Helper Methods +/// UIView Class Methods /// extension UIView { @@ -19,3 +19,23 @@ extension UIView { return loadNib().instantiate(withOwner: nil, options: nil).first as! T } } + + +/// UIView Extension Methods +/// +extension UIView { + + /// Returns the first Subview of the specified Type (if any). + /// + func firstSubview(ofType type: T.Type) -> T? { + for subview in subviews { + guard let target = (subview as? T) ?? subview.firstSubview(ofType: type) else { + continue + } + + return target + } + + return nil + } +} diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift index 13c19074ae4..5159d6e6940 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift @@ -27,6 +27,16 @@ class AddANoteViewController: UIViewController { loadSections() } + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + tableView.firstSubview(ofType: UITextView.self)?.becomeFirstResponder() + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + view.endEditing(true) + } + func configureNavigation() { title = NSLocalizedString("Order #\(viewModel.order.number)", comment: "Add a note screen - title. Example: Order #15") From bb6933f5e353e3029fcdc515ce7418b854ac1ef9 Mon Sep 17 00:00:00 2001 From: Jorge Leandro Perez Date: Fri, 27 Jul 2018 16:14:12 -0300 Subject: [PATCH 22/23] SwitchTableViewCell: Tap Support --- .../ReusableViews/SwitchTableViewCell.swift | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/ReusableViews/SwitchTableViewCell.swift b/WooCommerce/Classes/ViewRelated/ReusableViews/SwitchTableViewCell.swift index b1280eca476..a4c204d94e8 100644 --- a/WooCommerce/Classes/ViewRelated/ReusableViews/SwitchTableViewCell.swift +++ b/WooCommerce/Classes/ViewRelated/ReusableViews/SwitchTableViewCell.swift @@ -8,9 +8,7 @@ class SwitchTableViewCell: UITableViewCell { @IBOutlet private var bottomLabel: UILabel! @IBOutlet private var toggleSwitch: UISwitch! - @IBAction func toggleSwitchWasPressed() { - onToggleSwitchTouchUp?() - } + var onToggleSwitchTouchUp: (() -> Void)? var topText: String? { get { @@ -30,11 +28,34 @@ class SwitchTableViewCell: UITableViewCell { } } - var onToggleSwitchTouchUp: (() -> Void)? - override func awakeFromNib() { super.awakeFromNib() topLabel.applyBodyStyle() bottomLabel.applyFootnoteStyle() + setupGestureRecognizers() + } + + @IBAction func toggleSwitchWasPressed() { + onToggleSwitchTouchUp?() + } +} + + +// MARK: - Private Methods +// +private extension SwitchTableViewCell { + + func setupGestureRecognizers() { + let gestureRecognizer = UITapGestureRecognizer() + gestureRecognizer.on { [weak self] gesture in + self?.contentViewWasPressed() + } + + addGestureRecognizer(gestureRecognizer) + } + + func contentViewWasPressed() { + toggleSwitch.isOn = !toggleSwitch.isOn + onToggleSwitchTouchUp?() } } From 42886ac6aebb7cf456de21b0490985ae5eb59a12 Mon Sep 17 00:00:00 2001 From: Jorge Leandro Perez Date: Fri, 27 Jul 2018 16:34:49 -0300 Subject: [PATCH 23/23] AddANoteViewController: Preventing firstResponder dismissal upon switch --- .../AddNote/AddANoteViewController.swift | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift index 5159d6e6940..773e052f714 100644 --- a/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift +++ b/WooCommerce/Classes/ViewRelated/Orders/OrderDetails/AddNote/AddANoteViewController.swift @@ -149,10 +149,22 @@ private extension AddANoteViewController { cell.bottomText = NSLocalizedString("If disabled will add the note as private.", comment: "Detail label for yes/no switch.") cell.onToggleSwitchTouchUp = { [weak self] in - self?.toggleNoteType() - self?.tableView.reloadData() + guard let `self` = self else { + return + } + + self.toggleNoteType() + self.refreshTextViewCell() } } + + private func refreshTextViewCell() { + guard let cell = tableView.firstSubview(ofType: TextViewTableViewCell.self) else { + return + } + + setupWriteNoteCell(cell) + } } // MARK: - UITableViewDataSource Conformance