diff --git a/CrossPlatformModules.csproj b/CrossPlatformModules.csproj
index 7e4c48402..03ab93a8d 100644
--- a/CrossPlatformModules.csproj
+++ b/CrossPlatformModules.csproj
@@ -131,6 +131,14 @@
segmented-bar-tests-native.d.ts
+
+ date-picker-tests-native.d.ts
+
+
+
+ date-picker-tests-native.d.ts
+
+
list-picker-tests-native.d.ts
@@ -1483,7 +1491,7 @@
False
-
+
\ No newline at end of file
diff --git a/apps/pickers-demo/main-page.ts b/apps/pickers-demo/main-page.ts
index 0affea7de..58be20b9a 100644
--- a/apps/pickers-demo/main-page.ts
+++ b/apps/pickers-demo/main-page.ts
@@ -18,16 +18,26 @@ export function onPageLoaded(args: observableModule.EventData) {
page = args.object;
page.bindingContext = viewModel;
- viewModel.items = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
- viewModel.selectedIndex = 5;
-
label = page.getViewById("label");
listPicker = page.getViewById("listPicker");
datePicker = page.getViewById("datePicker");
timePicker = page.getViewById("timePicker");
+
+ viewModel.items = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
+ viewModel.selectedIndex = 5;
+
+ //viewModel.day = 9;
+ //viewModel.month = 2;
+ //viewModel.year = 1980;
}
export function onTap(args: observableModule.EventData) {
console.log("onTap");
+
viewModel.items = ["Male", "Female"];
+ viewModel.selectedIndex = 1;
+
+ viewModel.day = viewModel.day + 1;
+ viewModel.month = viewModel.month + 1;
+ viewModel.year = viewModel.year + 1;
}
\ No newline at end of file
diff --git a/apps/pickers-demo/main-page.xml b/apps/pickers-demo/main-page.xml
index 8a8c03ae6..a386bb99c 100644
--- a/apps/pickers-demo/main-page.xml
+++ b/apps/pickers-demo/main-page.xml
@@ -3,7 +3,7 @@
-
+
\ No newline at end of file
diff --git a/apps/pickers-demo/model.ts b/apps/pickers-demo/model.ts
index 0b7d457a9..73a9c2761 100644
--- a/apps/pickers-demo/model.ts
+++ b/apps/pickers-demo/model.ts
@@ -24,4 +24,34 @@ export class WebViewModel extends observable.Observable {
this._items = value;
this.notify({ object: this, eventName: observable.knownEvents.propertyChange, propertyName: "items", value: value });
}
+
+ private _day: number;
+ get day(): number {
+ return this._day;
+ }
+ set day(value: number) {
+ console.log("day:" + value);
+ this._day = value;
+ this.notify({ object: this, eventName: observable.knownEvents.propertyChange, propertyName: "day", value: value });
+ }
+
+ private _month: number;
+ get month(): number {
+ return this._month;
+ }
+ set month(value: number) {
+ console.log("month:" + value);
+ this._month = value;
+ this.notify({ object: this, eventName: observable.knownEvents.propertyChange, propertyName: "month", value: value });
+ }
+
+ private _year: number;
+ get year(): number {
+ return this._year;
+ }
+ set year(value: number) {
+ console.log("year:" + value);
+ this._year = value;
+ this.notify({ object: this, eventName: observable.knownEvents.propertyChange, propertyName: "year", value: value });
+ }
}
\ No newline at end of file
diff --git a/apps/tests/testRunner.ts b/apps/tests/testRunner.ts
index 997234e35..0c08b188d 100644
--- a/apps/tests/testRunner.ts
+++ b/apps/tests/testRunner.ts
@@ -48,6 +48,7 @@ allTests["FORMATTEDSTRING"] = require("./text/formatted-string-tests");
allTests["FILE-SYSTEM-ACCESS"] = require("./file-system-access-tests/file-system-access-tests");
allTests["XML-DECLARATION"] = require("./xml-declaration/xml-declaration-tests");
allTests["LIST-PICKER"] = require("./ui/list-picker/list-picker-tests");
+allTests["DATE-PICKER"] = require("./ui/date-picker/date-picker-tests");
var testsWithLongDelay = {
testLocation: 10000,
diff --git a/apps/tests/ui/date-picker/date-picker-tests-native.android.ts b/apps/tests/ui/date-picker/date-picker-tests-native.android.ts
new file mode 100644
index 000000000..6ec9f870a
--- /dev/null
+++ b/apps/tests/ui/date-picker/date-picker-tests-native.android.ts
@@ -0,0 +1,25 @@
+import datePickerModule = require("ui/date-picker");
+
+export function getNativeYear(datePicker: datePickerModule.DatePicker): number {
+ return datePicker.android.getYear();
+}
+
+export function getNativeMonth(datePicker: datePickerModule.DatePicker): number {
+ return datePicker.android.getMonth() + 1;
+}
+
+export function getNativeDay(datePicker: datePickerModule.DatePicker): number {
+ return datePicker.android.getDayOfMonth();
+}
+
+export function setNativeYear(datePicker: datePickerModule.DatePicker, value: number): void {
+ datePicker.android.updateDate(value, datePicker.android.getMonth(), datePicker.android.getDayOfMonth());
+}
+
+export function setNativeMonth(datePicker: datePickerModule.DatePicker, value: number): void {
+ datePicker.android.updateDate(datePicker.android.getYear(), value - 1, datePicker.android.getDayOfMonth());
+}
+
+export function setNativeDay(datePicker: datePickerModule.DatePicker, value: number): void {
+ datePicker.android.updateDate(datePicker.android.getYear(), datePicker.android.getMonth(), value);
+}
diff --git a/apps/tests/ui/date-picker/date-picker-tests-native.d.ts b/apps/tests/ui/date-picker/date-picker-tests-native.d.ts
new file mode 100644
index 000000000..567f2f9bd
--- /dev/null
+++ b/apps/tests/ui/date-picker/date-picker-tests-native.d.ts
@@ -0,0 +1,10 @@
+//@private
+import datePickerModule = require("ui/date-picker");
+
+export declare function getNativeYear(datePicker: datePickerModule.DatePicker): number;
+export declare function getNativeMonth(datePicker: datePickerModule.DatePicker): number;
+export declare function getNativeDay(datePicker: datePickerModule.DatePicker): number;
+
+export declare function setNativeYear(datePicker: datePickerModule.DatePicker, value: number): void;
+export declare function setNativeMonth(datePicker: datePickerModule.DatePicker, value: number): void;
+export declare function setNativeDay(datePicker: datePickerModule.DatePicker, value: number): void;
\ No newline at end of file
diff --git a/apps/tests/ui/date-picker/date-picker-tests-native.ios.ts b/apps/tests/ui/date-picker/date-picker-tests-native.ios.ts
new file mode 100644
index 000000000..34f444e08
--- /dev/null
+++ b/apps/tests/ui/date-picker/date-picker-tests-native.ios.ts
@@ -0,0 +1,36 @@
+import datePickerModule = require("ui/date-picker");
+
+export function getNativeYear(datePicker: datePickerModule.DatePicker): number {
+ return NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, datePicker.ios.date).year;
+}
+
+export function getNativeMonth(datePicker: datePickerModule.DatePicker): number {
+ return NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, datePicker.ios.date).month;
+}
+
+export function getNativeDay(datePicker: datePickerModule.DatePicker): number {
+ return NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, datePicker.ios.date).day;
+}
+
+export function setNativeYear(datePicker: datePickerModule.DatePicker, value: number): void {
+ var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, datePicker.ios.date);
+ comps.year = value;
+ datePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false);
+ (datePicker)._changeHandler.valueChanged(datePicker.ios);
+}
+
+export function setNativeMonth(datePicker: datePickerModule.DatePicker, value: number): void {
+ var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, datePicker.ios.date);
+ comps.month = value;
+ datePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false);
+ (datePicker)._changeHandler.valueChanged(datePicker.ios);
+}
+
+export function setNativeDay(datePicker: datePickerModule.DatePicker, value: number): void {
+ var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitYear | NSCalendarUnit.NSCalendarUnitMonth | NSCalendarUnit.NSCalendarUnitDay, datePicker.ios.date);
+ comps.day = value;
+ datePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false);
+ (datePicker)._changeHandler.valueChanged(datePicker.ios);
+}
+
+
\ No newline at end of file
diff --git a/apps/tests/ui/date-picker/date-picker-tests.ts b/apps/tests/ui/date-picker/date-picker-tests.ts
new file mode 100644
index 000000000..de5ee16a0
--- /dev/null
+++ b/apps/tests/ui/date-picker/date-picker-tests.ts
@@ -0,0 +1,109 @@
+import TKUnit = require("../../TKUnit");
+import helper = require("../helper");
+import viewModule = require("ui/core/view");
+import datePickerTestsNative = require("./date-picker-tests-native");
+
+//
+// # DatePicker
+
+// Using a DatePicker requires the "ui/date-picker" module.
+// ``` JavaScript
+import datePickerModule = require("ui/date-picker");
+
+function _createDatePicker(): datePickerModule.DatePicker {
+ //
+ // ## Creating a DatePicker
+ // ``` JavaScript
+ var datePicker = new datePickerModule.DatePicker();
+ // ```
+ //
+ datePicker.id = "DatePicker";
+ return datePicker;
+}
+
+export var test_WhenCreated_YearIsUndefined = function () {
+ helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) {
+ var datePicker = views[0];
+ var actualValue = datePicker.year;
+ var expectedValue = undefined;
+ TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
+ });
+}
+
+export var test_WhenCreated_MonthIsUndefined = function () {
+ helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) {
+ var datePicker = views[0];
+ var actualValue = datePicker.month;
+ var expectedValue = undefined;
+ TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
+ });
+}
+
+export var test_WhenCreated_DayIsUndefined = function () {
+ helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) {
+ var datePicker = views[0];
+ var actualValue = datePicker.day;
+ var expectedValue = undefined;
+ TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
+ });
+}
+
+export var testYearFromLocalToNative = function () {
+ helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) {
+ var datePicker = views[0];
+ var expectedValue = 1980;
+ datePicker.year = expectedValue;
+ var actualValue = datePickerTestsNative.getNativeYear(datePicker);
+ TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
+ });
+}
+
+export var testMonthFromLocalToNative = function () {
+ helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) {
+ var datePicker = views[0];
+ var expectedValue = 5;
+ datePicker.month = expectedValue;
+ var actualValue = datePickerTestsNative.getNativeMonth(datePicker);
+ TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
+ });
+}
+
+export var testDayFromLocalToNative = function () {
+ helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) {
+ var datePicker = views[0];
+ var expectedValue = 19;
+ datePicker.day = expectedValue;
+ var actualValue = datePickerTestsNative.getNativeDay(datePicker);
+ TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
+ });
+}
+
+export var testYearFromNativeToLocal = function () {
+ helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) {
+ var datePicker = views[0];
+ var expectedValue = 1981;
+ datePickerTestsNative.setNativeYear(datePicker, expectedValue);
+ var actualValue = datePicker.year;
+ TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
+ });
+}
+
+export var testMonthFromNativeToLocal = function () {
+ helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) {
+ var datePicker = views[0];
+ var expectedValue = 6;
+ datePickerTestsNative.setNativeMonth(datePicker, expectedValue);
+ var actualValue = datePicker.month;
+ TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
+ });
+}
+
+export var testDayFromNativeToLocal = function () {
+ helper.buildUIAndRunTest(_createDatePicker(), function (views: Array) {
+ var datePicker = views[0];
+ var expectedValue = 20;
+ datePickerTestsNative.setNativeDay(datePicker, expectedValue);
+ var actualValue = datePicker.day;
+ TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
+ });
+}
\ No newline at end of file
diff --git a/apps/tests/ui/list-picker/list-picker-tests.ts b/apps/tests/ui/list-picker/list-picker-tests.ts
index e16bf8b43..51c51c93c 100644
--- a/apps/tests/ui/list-picker/list-picker-tests.ts
+++ b/apps/tests/ui/list-picker/list-picker-tests.ts
@@ -167,7 +167,7 @@ export var testSettingSelectedIndexLargerThanCountShouldThrow = function () {
listPicker.items = _createItems(10);
TKUnit.assertThrows(function () {
listPicker.selectedIndex = 10;
- }, "Setting selectedIndex to a negative number should throw.");
+ }, "Setting selectedIndex to a number larger than item count should throw.");
});
}
diff --git a/ui/date-picker/date-picker-common.ts b/ui/date-picker/date-picker-common.ts
index 3d26c0aa8..fa11c0727 100644
--- a/ui/date-picker/date-picker-common.ts
+++ b/ui/date-picker/date-picker-common.ts
@@ -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();
diff --git a/ui/date-picker/date-picker.android.ts b/ui/date-picker/date-picker.android.ts
index 5e6b5307d..3c941e87a 100644
--- a/ui/date-picker/date-picker.android.ts
+++ b/ui/date-picker/date-picker.android.ts
@@ -5,8 +5,8 @@ import proxy = require("ui/core/proxy");
function onYearPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var picker = 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 = 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 = 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);
}
}
\ No newline at end of file
diff --git a/ui/date-picker/date-picker.d.ts b/ui/date-picker/date-picker.d.ts
index f96e050b8..aa8c3baa9 100644
--- a/ui/date-picker/date-picker.d.ts
+++ b/ui/date-picker/date-picker.d.ts
@@ -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;
}
diff --git a/ui/date-picker/date-picker.ios.ts b/ui/date-picker/date-picker.ios.ts
index 57e6b9324..170ab0d85 100644
--- a/ui/date-picker/date-picker.ios.ts
+++ b/ui/date-picker/date-picker.ios.ts
@@ -6,7 +6,9 @@ function onYearPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var picker = 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 = 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 = 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);
}
\ No newline at end of file
diff --git a/ui/list-picker/list-picker-common.ts b/ui/list-picker/list-picker-common.ts
index ea39484c3..988885e93 100644
--- a/ui/list-picker/list-picker-common.ts
+++ b/ui/list-picker/list-picker-common.ts
@@ -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]");
}
}
}