Skip to content

Commit 163bfe2

Browse files
author
Vladimir Enchev
committed
Merge pull request NativeScript#1170 from NativeScript/time-picker-interval
Time picker interval
2 parents 82c86ad + ea6fa31 commit 163bfe2

File tree

4 files changed

+95
-11
lines changed

4 files changed

+95
-11
lines changed

apps/tests/ui/time-picker/time-picker-tests.ts

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,21 @@ if (platform.device.os === platform.platformNames.ios) {
5858
}
5959
}
6060

61+
export function test_WhenCreated_MinuteIntervalIs1() {
62+
helper.buildUIAndRunTest(_createTimePicker(), function (views: Array<viewModule.View>) {
63+
var timePicker = <timePickerModule.TimePicker>views[0];
64+
var actualValue = timePicker.minuteInterval;
65+
var expectedValue = 1;
66+
TKUnit.assertEqual(actualValue, expectedValue);
67+
});
68+
}
69+
6170
export function test_WhenCreated_HourIsCurrentHour() {
6271
helper.buildUIAndRunTest(_createTimePicker(), function (views: Array<viewModule.View>) {
6372
var timePicker = <timePickerModule.TimePicker>views[0];
6473
var actualValue = timePicker.hour;
6574
var expectedValue = timePickerTestsNative.getNativeHour(timePicker);
66-
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
75+
TKUnit.assertEqual(actualValue, expectedValue);
6776
});
6877
}
6978

@@ -72,7 +81,7 @@ export function test_WhenCreated_MinHourIs0() {
7281
var timePicker = <timePickerModule.TimePicker>views[0];
7382
var actualValue = timePicker.minHour;
7483
var expectedValue = 0;
75-
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
84+
TKUnit.assertEqual(actualValue, expectedValue);
7685
});
7786
}
7887

@@ -81,7 +90,7 @@ export function test_WhenCreated_MaxHourIs23() {
8190
var timePicker = <timePickerModule.TimePicker>views[0];
8291
var actualValue = timePicker.maxHour;
8392
var expectedValue = 23;
84-
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
93+
TKUnit.assertEqual(actualValue, expectedValue);
8594
});
8695
}
8796

@@ -90,7 +99,7 @@ export function test_WhenCreated_MinuteIsCurrentMinute() {
9099
var timePicker = <timePickerModule.TimePicker>views[0];
91100
var actualValue = timePicker.minute;
92101
var expectedValue = timePickerTestsNative.getNativeMinute(timePicker);
93-
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
102+
TKUnit.assertEqual(actualValue, expectedValue);
94103
});
95104
}
96105

@@ -99,7 +108,7 @@ export function test_WhenCreated_MinMinuteIs0() {
99108
var timePicker = <timePickerModule.TimePicker>views[0];
100109
var actualValue = timePicker.minMinute;
101110
var expectedValue = 0;
102-
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
111+
TKUnit.assertEqual(actualValue, expectedValue);
103112
});
104113
}
105114

@@ -108,7 +117,34 @@ export function test_WhenCreated_MaxMinuteIs59() {
108117
var timePicker = <timePickerModule.TimePicker>views[0];
109118
var actualValue = timePicker.maxMinute;
110119
var expectedValue = 59;
111-
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
120+
TKUnit.assertEqual(actualValue, expectedValue);
121+
});
122+
}
123+
124+
export function testMinuteIntervalThrowExceptionWhenLessThan1() {
125+
helper.buildUIAndRunTest(_createTimePicker(), function (views: Array<viewModule.View>) {
126+
var timePicker = <timePickerModule.TimePicker>views[0];
127+
TKUnit.assertThrows(function () {
128+
timePicker.minuteInterval = 0;
129+
}, "Setting minuteInterval property to a value less than 1 should throw.");
130+
});
131+
}
132+
133+
export function testMinuteIntervalThrowExceptionWhenGreaterThan30() {
134+
helper.buildUIAndRunTest(_createTimePicker(), function (views: Array<viewModule.View>) {
135+
var timePicker = <timePickerModule.TimePicker>views[0];
136+
TKUnit.assertThrows(function () {
137+
timePicker.minuteInterval = 31;
138+
}, "Setting minuteInterval property to a value greater than 30 should throw.");
139+
});
140+
}
141+
142+
export function testMinuteIntervalThrowExceptionWhenNotFold60() {
143+
helper.buildUIAndRunTest(_createTimePicker(), function (views: Array<viewModule.View>) {
144+
var timePicker = <timePickerModule.TimePicker>views[0];
145+
TKUnit.assertThrows(function () {
146+
timePicker.minuteInterval = 7;
147+
}, "Setting minuteInterval property to a value not fold 60 should throw.");
112148
});
113149
}
114150

@@ -214,7 +250,7 @@ export function testHourFromLocalToNative() {
214250
var expectedValue = 13;
215251
timePicker.hour = expectedValue;
216252
var actualValue = timePickerTestsNative.getNativeHour(timePicker);
217-
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
253+
TKUnit.assertEqual(actualValue, expectedValue);
218254
});
219255
}
220256

@@ -224,7 +260,7 @@ export function testMinuteFromLocalToNative() {
224260
var expectedValue = 59;
225261
timePicker.minute = expectedValue;
226262
var actualValue = timePickerTestsNative.getNativeMinute(timePicker);
227-
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
263+
TKUnit.assertEqual(actualValue, expectedValue);
228264
});
229265
}
230266

@@ -234,7 +270,7 @@ export function testHourFromNativeToLocal() {
234270
var expectedValue = 14;
235271
timePickerTestsNative.setNativeHour(timePicker, expectedValue);
236272
var actualValue = timePicker.hour;
237-
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
273+
TKUnit.assertEqual(actualValue, expectedValue);
238274
});
239275
}
240276

@@ -244,7 +280,7 @@ export function testMinuteFromNativeToLocal() {
244280
var expectedValue = 33;
245281
timePickerTestsNative.setNativeMinute(timePicker, expectedValue);
246282
var actualValue = timePicker.minute;
247-
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
283+
TKUnit.assertEqual(actualValue, expectedValue);
248284
});
249285
}
250286

ui/time-picker/time-picker-common.ts

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ function isMinuteValid(value: number): boolean {
1212
return types.isNumber(value) && value >= 0 && value <= 59;
1313
}
1414

15+
function isMinuteIntervalValid(value: number): boolean {
16+
return types.isNumber(value) && value >= 1 && value <= 30 && 60 % value === 0;
17+
}
18+
1519
export interface Time {
1620
hour: number;
1721
minute: number;
@@ -33,7 +37,17 @@ export function isValidTime(picker: definition.TimePicker): boolean {
3337
return isGreaterThanMinTime(picker) && isLessThanMaxTime(picker);
3438
}
3539

36-
export function getValidTime(picker: definition.TimePicker, hour?: number, minute?: number): Time {
40+
export function getValidTime(picker: definition.TimePicker, hour: number, minute: number): Time {
41+
if (picker.minuteInterval > 1) {
42+
let minuteFloor = minute - (minute % picker.minuteInterval);
43+
minute = minuteFloor + (minute === minuteFloor + 1 ? picker.minuteInterval : 0);
44+
45+
if (minute === 60) {
46+
hour++;
47+
minute = 0;
48+
}
49+
}
50+
3751
let time = { hour: hour, minute: minute };
3852

3953
if (!isGreaterThanMinTime(picker, hour, minute)) {
@@ -119,6 +133,12 @@ function onMaxHourPropertyChanged(data: dependencyObservable.PropertyChangeData)
119133
}
120134
}
121135

136+
function onMinuteIntervalPropertyChanged(data: dependencyObservable.PropertyChangeData) {
137+
var picker = <definition.TimePicker>data.object;
138+
139+
picker._setNativeMinuteIntervalTime();
140+
}
141+
122142
export class TimePicker extends view.View implements definition.TimePicker {
123143
public static hourProperty = new dependencyObservable.Property("hour", "TimePicker",
124144
new proxy.PropertyMetadata(0, dependencyObservable.PropertyMetadataSettings.None, onHourPropertyChanged, isHourValid));
@@ -138,6 +158,9 @@ export class TimePicker extends view.View implements definition.TimePicker {
138158
public static maxMinuteProperty = new dependencyObservable.Property("maxMinute", "TimePicker",
139159
new proxy.PropertyMetadata(59, dependencyObservable.PropertyMetadataSettings.None, onMaxMinutePropertyChanged, isMinuteValid));
140160

161+
public static minuteIntervalProperty = new dependencyObservable.Property("minuteInterval", "TimePicker",
162+
new proxy.PropertyMetadata(1, dependencyObservable.PropertyMetadataSettings.None, onMinuteIntervalPropertyChanged, isMinuteIntervalValid));
163+
141164
constructor() {
142165
super();
143166
}
@@ -156,6 +179,13 @@ export class TimePicker extends view.View implements definition.TimePicker {
156179
this._setValue(TimePicker.minuteProperty, value);
157180
}
158181

182+
get minuteInterval(): number {
183+
return this._getValue(TimePicker.minuteIntervalProperty);
184+
}
185+
set minuteInterval(value: number) {
186+
this._setValue(TimePicker.minuteIntervalProperty, value);
187+
}
188+
159189
get maxHour(): number {
160190
return this._getValue(TimePicker.maxHourProperty);
161191
}
@@ -195,4 +225,8 @@ export class TimePicker extends view.View implements definition.TimePicker {
195225
public _setNativeMaxTime() {
196226
//
197227
}
228+
229+
public _setNativeMinuteIntervalTime() {
230+
//
231+
}
198232
}

ui/time-picker/time-picker.d.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,16 @@ declare module "ui/time-picker" {
5454
*/
5555
minMinute: number;
5656

57+
/**
58+
* Gets or sets the minute interval.
59+
*/
60+
minuteInterval: number;
61+
62+
//@private
5763
_setNativeTime(): void;
5864
_setNativeMinTime(): void;
5965
_setNativeMaxTime(): void;
66+
_setNativeMinuteIntervalTime(): void;
67+
//@endprivate
6068
}
6169
}

ui/time-picker/time-picker.ios.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ export class TimePicker extends common.TimePicker {
5555
this.ios.maximumDate = getDate(this.maxHour, this.maxMinute);
5656
}
5757
}
58+
59+
public _setNativeMinuteIntervalTime() {
60+
if (this.ios) {
61+
this.ios.minuteInterval = this.minuteInterval;
62+
}
63+
}
5864
}
5965

6066
class UITimePickerChangeHandlerImpl extends NSObject {

0 commit comments

Comments
 (0)