Fixed all DatePicker issues in both platforms and covered with tests.

This commit is contained in:
Rossen Hristov
2015-03-17 12:27:37 +02:00
parent 9399aa78f2
commit 222087a077
15 changed files with 282 additions and 41 deletions

View File

@@ -4,9 +4,9 @@ import proxy = require("ui/core/proxy");
import view = require("ui/core/view");
export class DatePicker extends view.View implements definition.DatePicker {
public static yearProperty = new dependencyObservable.Property("year", "DatePicker", new proxy.PropertyMetadata(0));
public static monthProperty = new dependencyObservable.Property("month", "DatePicker", new proxy.PropertyMetadata(0));
public static dayProperty = new dependencyObservable.Property("day", "DatePicker", new proxy.PropertyMetadata(0));
public static yearProperty = new dependencyObservable.Property("year", "DatePicker", new proxy.PropertyMetadata(undefined));
public static monthProperty = new dependencyObservable.Property("month", "DatePicker", new proxy.PropertyMetadata(undefined));
public static dayProperty = new dependencyObservable.Property("day", "DatePicker", new proxy.PropertyMetadata(undefined));
constructor() {
super();

View File

@@ -5,8 +5,8 @@ import proxy = require("ui/core/proxy");
function onYearPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var picker = <DatePicker>data.object;
if (picker.android) {
picker.android.init(data.newValue, picker.month, picker.day, picker._listener);
if (picker.android && picker.android.getYear() !== data.newValue) {
picker.android.updateDate(data.newValue, picker.android.getMonth(), picker.android.getDayOfMonth());
}
}
@@ -15,8 +15,8 @@ function onYearPropertyChanged(data: dependencyObservable.PropertyChangeData) {
function onMonthPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var picker = <DatePicker>data.object;
if (picker.android) {
picker.android.init(picker.year, data.newValue, picker.day, picker._listener);
if (picker.android && picker.android.getMonth() !== (data.newValue - 1)) {
picker.android.updateDate(picker.android.getYear(), data.newValue - 1, picker.android.getDayOfMonth());
}
}
@@ -25,8 +25,8 @@ function onMonthPropertyChanged(data: dependencyObservable.PropertyChangeData) {
function onDayPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var picker = <DatePicker>data.object;
if (picker.android) {
picker.android.init(picker.year, picker.month, data.newValue, picker._listener);
if (picker.android && picker.android.getDayOfMonth !== data.newValue) {
picker.android.updateDate(picker.android.getYear(), picker.android.getMonth(), data.newValue);
}
}
@@ -54,11 +54,20 @@ export class DatePicker extends common.DatePicker {
return that.get();
},
onDateChanged: function (picker: android.widget.DatePicker, monthOfYear: number, dayOfMonth: number) {
onDateChanged: function (picker: android.widget.DatePicker, year: number, month: number, day: number) {
if (this.owner) {
this.owner._onPropertyChangedFromNative(common.DatePicker.yearProperty, picker.getYear());
this.owner._onPropertyChangedFromNative(common.DatePicker.monthProperty, monthOfYear);
this.owner._onPropertyChangedFromNative(common.DatePicker.dayProperty, dayOfMonth);
if (year !== this.owner.year) {
this.owner._onPropertyChangedFromNative(common.DatePicker.yearProperty, year);
}
if ((month + 1) !== this.owner.month) {
this.owner._onPropertyChangedFromNative(common.DatePicker.monthProperty, month + 1);
}
if (day !== this.owner.day) {
this.owner._onPropertyChangedFromNative(common.DatePicker.dayProperty, day);
}
}
}
});
@@ -67,5 +76,6 @@ export class DatePicker extends common.DatePicker {
public _createUI() {
this._android = new android.widget.DatePicker(this._context);
this._android.setCalendarViewShown(false);
this._android.init(0, 0, 0, this._listener);
}
}

View File

@@ -31,12 +31,12 @@ declare module "ui/date-picker" {
year: number;
/**
* Gets or sets the month.
* Gets or sets the month. The months start from 1.
*/
month: number;
/**
* Gets or sets the day.
* Gets or sets the day. The days start from 1.
*/
day: number;
}

View File

@@ -6,7 +6,9 @@ function onYearPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var picker = <DatePicker>data.object;
if (picker.ios) {
setYearMonthDay(picker.ios, data.newValue, picker.month, picker.day);
var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, picker.ios.date);
comps.year = data.newValue;
picker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false);
}
}
@@ -16,7 +18,9 @@ function onMonthPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var picker = <DatePicker>data.object;
if (picker.ios) {
setYearMonthDay(picker.ios, picker.year, data.newValue, picker.day);
var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, picker.ios.date);
comps.month = data.newValue;
picker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false);
}
}
@@ -26,7 +30,9 @@ function onDayPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var picker = <DatePicker>data.object;
if (picker.ios) {
setYearMonthDay(picker.ios, picker.year, picker.month, data.newValue);
var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, picker.ios.date);
comps.day = data.newValue;
picker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false);
}
}
@@ -68,26 +74,22 @@ class UIDatePickerChangeHandlerImpl extends NSObject {
}
public valueChanged(sender: UIDatePicker) {
var calendar = NSCalendar.currentCalendar();
var comp = calendar.componentsFromDate(NSCalendarUnit.NSHourCalendarUnit | NSCalendarUnit.NSMinuteCalendarUnit, sender.date);
var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, sender.date);
if (comps.year !== this._owner.year) {
this._owner._onPropertyChangedFromNative(common.DatePicker.yearProperty, comps.year);
}
this._owner._onPropertyChangedFromNative(common.DatePicker.yearProperty, comp.year);
this._owner._onPropertyChangedFromNative(common.DatePicker.monthProperty, comp.month);
this._owner._onPropertyChangedFromNative(common.DatePicker.dayProperty, comp.day);
if (comps.month !== this._owner.month) {
this._owner._onPropertyChangedFromNative(common.DatePicker.monthProperty, comps.month);
}
if (comps.day !== this._owner.day) {
this._owner._onPropertyChangedFromNative(common.DatePicker.dayProperty, comps.day);
}
}
public static ObjCExposedMethods = {
'valueChanged': { returns: interop.types.void, params: [UIDatePicker] }
};
}
function setYearMonthDay(picker: UIDatePicker, year: number, month: number, day: number) {
var calendar = NSCalendar.currentCalendar();
var comps = new NSDateComponents();
comps.year = year;
comps.month = month;
comps.day = day;
picker.setDateAnimated(calendar.dateFromComponents(comps), false);
}

View File

@@ -53,7 +53,7 @@ export class ListPicker extends view.View implements definition.ListPicker {
if (types.isDefined(this.items)) {
if (index < 0 || index >= this.items.length) {
this.selectedIndex = undefined;
throw new Error("SelectedIndex should be between [0, items.length)");
throw new Error("selectedIndex should be between [0, items.length - 1]");
}
}
}