From ea6fa315e124f2f351b7598a9841765d63971b36 Mon Sep 17 00:00:00 2001 From: Vladimir Enchev Date: Thu, 26 Nov 2015 17:18:41 +0200 Subject: [PATCH] minuteInterval added --- .../tests/ui/time-picker/time-picker-tests.ts | 56 +++++++++++++++---- ui/time-picker/time-picker-common.ts | 36 +++++++++++- ui/time-picker/time-picker.d.ts | 8 +++ ui/time-picker/time-picker.ios.ts | 6 ++ 4 files changed, 95 insertions(+), 11 deletions(-) diff --git a/apps/tests/ui/time-picker/time-picker-tests.ts b/apps/tests/ui/time-picker/time-picker-tests.ts index 4af8757f9..5670e24bc 100644 --- a/apps/tests/ui/time-picker/time-picker-tests.ts +++ b/apps/tests/ui/time-picker/time-picker-tests.ts @@ -58,12 +58,21 @@ if (platform.device.os === platform.platformNames.ios) { } } +export function test_WhenCreated_MinuteIntervalIs1() { + helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { + var timePicker = views[0]; + var actualValue = timePicker.minuteInterval; + var expectedValue = 1; + TKUnit.assertEqual(actualValue, expectedValue); + }); +} + export function test_WhenCreated_HourIsCurrentHour() { helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { var timePicker = views[0]; var actualValue = timePicker.hour; var expectedValue = timePickerTestsNative.getNativeHour(timePicker); - TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + TKUnit.assertEqual(actualValue, expectedValue); }); } @@ -72,7 +81,7 @@ export function test_WhenCreated_MinHourIs0() { var timePicker = views[0]; var actualValue = timePicker.minHour; var expectedValue = 0; - TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + TKUnit.assertEqual(actualValue, expectedValue); }); } @@ -81,7 +90,7 @@ export function test_WhenCreated_MaxHourIs23() { var timePicker = views[0]; var actualValue = timePicker.maxHour; var expectedValue = 23; - TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + TKUnit.assertEqual(actualValue, expectedValue); }); } @@ -90,7 +99,7 @@ export function test_WhenCreated_MinuteIsCurrentMinute() { var timePicker = views[0]; var actualValue = timePicker.minute; var expectedValue = timePickerTestsNative.getNativeMinute(timePicker); - TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + TKUnit.assertEqual(actualValue, expectedValue); }); } @@ -99,7 +108,7 @@ export function test_WhenCreated_MinMinuteIs0() { var timePicker = views[0]; var actualValue = timePicker.minMinute; var expectedValue = 0; - TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + TKUnit.assertEqual(actualValue, expectedValue); }); } @@ -108,7 +117,34 @@ export function test_WhenCreated_MaxMinuteIs59() { var timePicker = views[0]; var actualValue = timePicker.maxMinute; var expectedValue = 59; - TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + TKUnit.assertEqual(actualValue, expectedValue); + }); +} + +export function testMinuteIntervalThrowExceptionWhenLessThan1() { + helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { + var timePicker = views[0]; + TKUnit.assertThrows(function () { + timePicker.minuteInterval = 0; + }, "Setting minuteInterval property to a value less than 1 should throw."); + }); +} + +export function testMinuteIntervalThrowExceptionWhenGreaterThan30() { + helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { + var timePicker = views[0]; + TKUnit.assertThrows(function () { + timePicker.minuteInterval = 31; + }, "Setting minuteInterval property to a value greater than 30 should throw."); + }); +} + +export function testMinuteIntervalThrowExceptionWhenNotFold60() { + helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { + var timePicker = views[0]; + TKUnit.assertThrows(function () { + timePicker.minuteInterval = 7; + }, "Setting minuteInterval property to a value not fold 60 should throw."); }); } @@ -214,7 +250,7 @@ export function testHourFromLocalToNative() { var expectedValue = 13; timePicker.hour = expectedValue; var actualValue = timePickerTestsNative.getNativeHour(timePicker); - TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + TKUnit.assertEqual(actualValue, expectedValue); }); } @@ -224,7 +260,7 @@ export function testMinuteFromLocalToNative() { var expectedValue = 59; timePicker.minute = expectedValue; var actualValue = timePickerTestsNative.getNativeMinute(timePicker); - TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + TKUnit.assertEqual(actualValue, expectedValue); }); } @@ -234,7 +270,7 @@ export function testHourFromNativeToLocal() { var expectedValue = 14; timePickerTestsNative.setNativeHour(timePicker, expectedValue); var actualValue = timePicker.hour; - TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + TKUnit.assertEqual(actualValue, expectedValue); }); } @@ -244,7 +280,7 @@ export function testMinuteFromNativeToLocal() { var expectedValue = 33; timePickerTestsNative.setNativeMinute(timePicker, expectedValue); var actualValue = timePicker.minute; - TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + TKUnit.assertEqual(actualValue, expectedValue); }); } diff --git a/ui/time-picker/time-picker-common.ts b/ui/time-picker/time-picker-common.ts index 51c213125..850edae52 100644 --- a/ui/time-picker/time-picker-common.ts +++ b/ui/time-picker/time-picker-common.ts @@ -12,6 +12,10 @@ function isMinuteValid(value: number): boolean { return types.isNumber(value) && value >= 0 && value <= 59; } +function isMinuteIntervalValid(value: number): boolean { + return types.isNumber(value) && value >= 1 && value <= 30 && 60 % value === 0; +} + export interface Time { hour: number; minute: number; @@ -33,7 +37,17 @@ export function isValidTime(picker: definition.TimePicker): boolean { return isGreaterThanMinTime(picker) && isLessThanMaxTime(picker); } -export function getValidTime(picker: definition.TimePicker, hour?: number, minute?: number): Time { +export function getValidTime(picker: definition.TimePicker, hour: number, minute: number): Time { + if (picker.minuteInterval > 1) { + let minuteFloor = minute - (minute % picker.minuteInterval); + minute = minuteFloor + (minute === minuteFloor + 1 ? picker.minuteInterval : 0); + + if (minute === 60) { + hour++; + minute = 0; + } + } + let time = { hour: hour, minute: minute }; if (!isGreaterThanMinTime(picker, hour, minute)) { @@ -119,6 +133,12 @@ function onMaxHourPropertyChanged(data: dependencyObservable.PropertyChangeData) } } +function onMinuteIntervalPropertyChanged(data: dependencyObservable.PropertyChangeData) { + var picker = data.object; + + picker._setNativeMinuteIntervalTime(); +} + export class TimePicker extends view.View implements definition.TimePicker { public static hourProperty = new dependencyObservable.Property("hour", "TimePicker", new proxy.PropertyMetadata(0, dependencyObservable.PropertyMetadataSettings.None, onHourPropertyChanged, isHourValid)); @@ -138,6 +158,9 @@ export class TimePicker extends view.View implements definition.TimePicker { public static maxMinuteProperty = new dependencyObservable.Property("maxMinute", "TimePicker", new proxy.PropertyMetadata(59, dependencyObservable.PropertyMetadataSettings.None, onMaxMinutePropertyChanged, isMinuteValid)); + public static minuteIntervalProperty = new dependencyObservable.Property("minuteInterval", "TimePicker", + new proxy.PropertyMetadata(1, dependencyObservable.PropertyMetadataSettings.None, onMinuteIntervalPropertyChanged, isMinuteIntervalValid)); + constructor() { super(); } @@ -156,6 +179,13 @@ export class TimePicker extends view.View implements definition.TimePicker { this._setValue(TimePicker.minuteProperty, value); } + get minuteInterval(): number { + return this._getValue(TimePicker.minuteIntervalProperty); + } + set minuteInterval(value: number) { + this._setValue(TimePicker.minuteIntervalProperty, value); + } + get maxHour(): number { return this._getValue(TimePicker.maxHourProperty); } @@ -195,4 +225,8 @@ export class TimePicker extends view.View implements definition.TimePicker { public _setNativeMaxTime() { // } + + public _setNativeMinuteIntervalTime() { + // + } } \ No newline at end of file diff --git a/ui/time-picker/time-picker.d.ts b/ui/time-picker/time-picker.d.ts index 1cfbcad56..2fb93205c 100644 --- a/ui/time-picker/time-picker.d.ts +++ b/ui/time-picker/time-picker.d.ts @@ -54,8 +54,16 @@ declare module "ui/time-picker" { */ minMinute: number; + /** + * Gets or sets the minute interval. + */ + minuteInterval: number; + + //@private _setNativeTime(): void; _setNativeMinTime(): void; _setNativeMaxTime(): void; + _setNativeMinuteIntervalTime(): void; + //@endprivate } } diff --git a/ui/time-picker/time-picker.ios.ts b/ui/time-picker/time-picker.ios.ts index ee925928f..a88e6a3c0 100644 --- a/ui/time-picker/time-picker.ios.ts +++ b/ui/time-picker/time-picker.ios.ts @@ -55,6 +55,12 @@ export class TimePicker extends common.TimePicker { this.ios.maximumDate = getDate(this.maxHour, this.maxMinute); } } + + public _setNativeMinuteIntervalTime() { + if (this.ios) { + this.ios.minuteInterval = this.minuteInterval; + } + } } class UITimePickerChangeHandlerImpl extends NSObject {