Skip to content

Commit d647f44

Browse files
[Bookings] Add clear option for date filter (#16408)
2 parents 745c03f + 045ba00 commit d647f44

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed

WooCommerce/Classes/Bookings/BookingFilters/BookingDateTimeFilterView.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,14 @@ struct BookingDateTimeFilterView: View {
5555
.listStyle(.plain)
5656
.navigationTitle(Localization.title)
5757
.navigationBarTitleDisplayMode(.inline)
58+
.toolbar {
59+
ToolbarItem(placement: .navigationBarTrailing) {
60+
Button(Localization.clear) {
61+
clearDateRange()
62+
}
63+
.renderedIf(selectedFromDate != nil || selectedToDate != nil)
64+
}
65+
}
5866
.background(Color(.listBackground))
5967
.environment(\.timeZone, TimeZone(identifier: "UTC")!) // API treats dates as no timezone so use UTC to display and select dates
6068
.onChange(of: fromDate) { _, newValue in
@@ -157,6 +165,12 @@ private extension BookingDateTimeFilterView {
157165
return fromDate...Date.distantFuture
158166
}
159167
}
168+
169+
func clearDateRange() {
170+
selectedFromDate = nil
171+
selectedToDate = nil
172+
expandedPicker = nil
173+
}
160174
}
161175

162176
private extension BookingDateTimeFilterView {
@@ -186,6 +200,11 @@ private extension BookingDateTimeFilterView {
186200
value: "Time",
187201
comment: "Title of the Time row in the date time picker for booking filter"
188202
)
203+
static let clear = NSLocalizedString(
204+
"bookingDateTimeFilterView.clear",
205+
value: "Clear",
206+
comment: "Title of the Clear button in the date time picker for booking filter"
207+
)
189208
}
190209
}
191210

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -998,6 +998,7 @@
998998
2D05FE962E8D71EA004111FD /* UpdateAttendanceStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D05FE952E8D71EA004111FD /* UpdateAttendanceStatusView.swift */; };
999999
2D09E0D12E61BC7F005C26F3 /* ApplicationPasswordsExperimentState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D09E0D02E61BC7D005C26F3 /* ApplicationPasswordsExperimentState.swift */; };
10001000
2D09E0D52E65C9B9005C26F3 /* ApplicationPasswordsExperimentStateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D09E0D42E65C9B9005C26F3 /* ApplicationPasswordsExperimentStateTests.swift */; };
1001+
2D200F072ED7245000DD6EBF /* BookingDateTimeFilterViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D200F062ED7245000DD6EBF /* BookingDateTimeFilterViewTests.swift */; };
10011002
2D7A3E232E7891DB00C46401 /* CIABEligibilityCheckerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D7A3E222E7891D200C46401 /* CIABEligibilityCheckerTests.swift */; };
10021003
2D880B492DFB2F3F00A6FB2C /* OptionalBinding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D880B482DFB2F3D00A6FB2C /* OptionalBinding.swift */; };
10031004
2D88C1112DF883C300A6FB2C /* AttributedString+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D88C1102DF883BD00A6FB2C /* AttributedString+Helpers.swift */; };
@@ -3887,6 +3888,7 @@
38873888
2D05FE952E8D71EA004111FD /* UpdateAttendanceStatusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateAttendanceStatusView.swift; sourceTree = "<group>"; };
38883889
2D09E0D02E61BC7D005C26F3 /* ApplicationPasswordsExperimentState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationPasswordsExperimentState.swift; sourceTree = "<group>"; };
38893890
2D09E0D42E65C9B9005C26F3 /* ApplicationPasswordsExperimentStateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationPasswordsExperimentStateTests.swift; sourceTree = "<group>"; };
3891+
2D200F062ED7245000DD6EBF /* BookingDateTimeFilterViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookingDateTimeFilterViewTests.swift; sourceTree = "<group>"; };
38903892
2D49A80B2ECDCD4500AF1749 /* RequestAuthenticatorPressureTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; name = RequestAuthenticatorPressureTests.xctestplan; path = ../Modules/Tests/NetworkingTests/RequestAuthenticatorPressureTests.xctestplan; sourceTree = "<group>"; };
38913893
2D7A3E222E7891D200C46401 /* CIABEligibilityCheckerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIABEligibilityCheckerTests.swift; sourceTree = "<group>"; };
38923894
2D880B482DFB2F3D00A6FB2C /* OptionalBinding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionalBinding.swift; sourceTree = "<group>"; };
@@ -12519,6 +12521,7 @@
1251912521
DED1E3162E8556270089909C /* Bookings */ = {
1252012522
isa = PBXGroup;
1252112523
children = (
12524+
2D200F062ED7245000DD6EBF /* BookingDateTimeFilterViewTests.swift */,
1252212525
DE8C39FF2EB3527300C69F35 /* SyncableListSelectorViewModelTests.swift */,
1252312526
DE49CD212E966814006DCB07 /* BookingSearchViewModelTests.swift */,
1252412527
DED1E3152E8556270089909C /* BookingListViewModelTests.swift */,
@@ -15962,6 +15965,7 @@
1596215965
FEEB2F61268A215E0075A6E0 /* StorageEligibilityErrorInfoWooTests.swift in Sources */,
1596315966
31F21B02263C8E150035B50A /* CardReaderSettingsSearchingViewModelTests.swift in Sources */,
1596415967
DEACB8852A64F74A00253F0F /* MediaPickingCoordinatorTests.swift in Sources */,
15968+
2D200F072ED7245000DD6EBF /* BookingDateTimeFilterViewTests.swift in Sources */,
1596515969
45EF798624509B4C00B22BA2 /* ArrayIndexPathTests.swift in Sources */,
1596615970
D8610BDD256F5ABF00A5DF27 /* JetpackErrorViewModelTests.swift in Sources */,
1596715971
746791632108D7C0007CF1DC /* WooAnalyticsTests.swift in Sources */,
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import XCTest
2+
import ViewInspector
3+
import SwiftUI
4+
import Combine
5+
@testable import WooCommerce
6+
7+
final class BookingDateTimeFilterViewTests: XCTestCase {
8+
func test_clear_button_is_not_rendered_initially_when_no_dates_selected() throws {
9+
let sut = BookingDateTimeFilterView(startDate: nil, endDate: nil, onSelection: { _, _ in })
10+
let view = try sut.inspect()
11+
12+
XCTAssertThrowsError(try view.find(button: "Clear"))
13+
}
14+
15+
func test_clear_button_is_rendered_when_dates_selected() throws {
16+
let date = Date()
17+
let sut = BookingDateTimeFilterView(startDate: date, endDate: date, onSelection: { _, _ in })
18+
let view = try sut.inspect()
19+
20+
_ = try view.find(button: "Clear")
21+
}
22+
}

0 commit comments

Comments
 (0)