Skip to content

Commit 1cb0832

Browse files
authored
feat(item navigation): add paging behaviour (#1116)
1 parent d93ab87 commit 1cb0832

File tree

7 files changed

+42
-10
lines changed

7 files changed

+42
-10
lines changed

packages/base/src/delegate/ItemNavigation.js

+14-5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
import EventProvider from "../EventProvider.js";
1111
import UI5Element from "../UI5Element.js";
1212
import NavigationMode from "../types/NavigationMode.js";
13+
import ItemNavigationBehavior from "../types/ItemNavigationBehavior.js";
1314

1415
// navigatable items must have id and tabindex
1516
class ItemNavigation extends EventProvider {
@@ -19,6 +20,7 @@ class ItemNavigation extends EventProvider {
1920
this.currentIndex = options.currentIndex || 0;
2021
this.rowSize = options.rowSize || 1;
2122
this.cyclic = options.cyclic || false;
23+
this.behavior = options.behavior || ItemNavigationBehavior.Static;
2224

2325
const navigationMode = options.navigationMode;
2426
const autoNavigation = !navigationMode || navigationMode === NavigationMode.Auto;
@@ -48,17 +50,24 @@ class ItemNavigation extends EventProvider {
4850

4951
_onKeyPress(event) {
5052
const items = this._getItems();
51-
5253
if (this.currentIndex >= items.length) {
53-
if (!this.cyclic) {
54-
this.currentIndex = items.length - 1;
54+
if (this.behavior !== ItemNavigationBehavior.Cyclic) {
55+
if (this.behavior === ItemNavigationBehavior.Paging) {
56+
this.currentIndex = this.currentIndex - items.length;
57+
} else {
58+
this.currentIndex = items.length - 1;
59+
}
5560
this.fireEvent(ItemNavigation.BORDER_REACH, { start: false, end: true, offset: this.currentIndex });
5661
} else {
5762
this.currentIndex = this.currentIndex - items.length;
5863
}
5964
} else if (this.currentIndex < 0) {
60-
if (!this.cyclic) {
61-
this.currentIndex = 0;
65+
if (this.behavior !== ItemNavigationBehavior.Cyclic) {
66+
if (this.behavior === ItemNavigationBehavior.Paging) {
67+
this.currentIndex = items.length + this.currentIndex - this.rowSize + (this.rowSize - (this._getItems().length % this.rowSize));
68+
} else {
69+
this.currentIndex = 0;
70+
}
6271
this.fireEvent(ItemNavigation.BORDER_REACH, { start: true, end: false, offset: this.currentIndex });
6372
} else {
6473
this.currentIndex = items.length + this.currentIndex;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* @private
3+
* Different behavior for ItemNavigation.
4+
*/
5+
const ItemNavigationBehavior = {
6+
/**
7+
* Static behavior: when border of the items is reached, you can't go out of the cage.
8+
*/
9+
Static: "Static",
10+
11+
/**
12+
* Cycling behavior: when border of the items is reached, you can cycle through the items.
13+
*/
14+
Cyclic: "Cyclic",
15+
16+
/**
17+
* Paging behavior: when border of the items is reached, tou can go up/down based on the rowsize(e.g. DayPicker)
18+
*/
19+
Paging: "Paging",
20+
};
21+
export default ItemNavigationBehavior;

packages/core/overlay/sap/ui/core/date/UniversalDate.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ sap.ui.define(['sap/ui/base/Object', 'sap/ui/core/LocaleData', 'sap/ui/core/date
239239
oFirstDay = getFirstDayOfFirstWeek(clDate, iYear),
240240
oDate = new clDate(oFirstDay.valueOf() + iWeek * iMillisecondsInWeek);
241241
//If first day of week is in last year and region is US, return the
242-
//1st of January instead for symmetric behaviour
242+
//1st of January instead for symmetric behavior
243243
if (oLocale.getRegion() === "US" && iWeek === 0 && oFirstDay.getUTCFullYear() < iYear) {
244244
return {
245245
year: iYear,

packages/fiori/test/specs/ShellBar.spec.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const assert = require("chai").assert;
22

3-
describe("Component Behaviour", () => {
3+
describe("Component Behavior", () => {
44
browser.url("http://localhost:8081/test-resources/pages/ShellBar.html");
55

66
describe("Responsiveness", () => {

packages/main/src/DayPicker.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import LocaleData from "@ui5/webcomponents-utils/dist/sap/ui/core/LocaleData.js"
1111
import CalendarDate from "@ui5/webcomponents-base/dist/dates/CalendarDate.js";
1212
import { calculateWeekNumber } from "@ui5/webcomponents-base/dist/dates/CalendarUtils.js";
1313
import CalendarType from "@ui5/webcomponents-base/dist/dates/CalendarType.js";
14+
import ItemNavigationBehavior from "@ui5/webcomponents-base/dist/types/ItemNavigationBehavior.js";
1415
import DayPickerTemplate from "./generated/templates/DayPickerTemplate.lit.js";
1516

1617
// Styles
@@ -118,7 +119,7 @@ class DayPicker extends UI5Element {
118119
this._oLocale = getFormatLocale();
119120
this._oLocaleData = new LocaleData(this._oLocale);
120121

121-
this._itemNav = new ItemNavigation(this, { rowSize: 7 });
122+
this._itemNav = new ItemNavigation(this, { rowSize: 7, behavior: ItemNavigationBehavior.Paging });
122123
this._itemNav.getItemsCallback = function getItemsCallback() {
123124
return [].concat(...this._weeks);
124125
}.bind(this);

packages/main/src/MonthPicker.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import LocaleData from "@ui5/webcomponents-utils/dist/sap/ui/core/LocaleData.js"
99
import { getLocale } from "@ui5/webcomponents-base/dist/LocaleProvider.js";
1010
import CalendarType from "@ui5/webcomponents-base/dist/dates/CalendarType.js";
1111
import CalendarDate from "@ui5/webcomponents-base/dist/dates/CalendarDate.js";
12+
import ItemNavigationBehavior from "@ui5/webcomponents-base/dist/types/ItemNavigationBehavior.js";
1213
import MonthPickerTemplate from "./generated/templates/MonthPickerTemplate.lit.js";
1314

1415
// Styles
@@ -91,7 +92,7 @@ class MonthPicker extends UI5Element {
9192
this._oLocale = getFormatLocale();
9293
this._oLocaleData = new LocaleData(this._oLocale);
9394

94-
this._itemNav = new ItemNavigation(this, { rowSize: 3, cyclic: true });
95+
this._itemNav = new ItemNavigation(this, { rowSize: 3, behavior: ItemNavigationBehavior.Cyclic });
9596
this._itemNav.getItemsCallback = function getItemsCallback() {
9697
return [].concat(...this._quarters);
9798
}.bind(this);

packages/utils/overlay/sap/ui/core/date/UniversalDate.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ sap.ui.define(['sap/ui/base/Object', 'sap/ui/core/LocaleData', 'sap/ui/core/date
239239
oFirstDay = getFirstDayOfFirstWeek(clDate, iYear),
240240
oDate = new clDate(oFirstDay.valueOf() + iWeek * iMillisecondsInWeek);
241241
//If first day of week is in last year and region is US, return the
242-
//1st of January instead for symmetric behaviour
242+
//1st of January instead for symmetric behavior
243243
if (oLocale.getRegion() === "US" && iWeek === 0 && oFirstDay.getUTCFullYear() < iYear) {
244244
return {
245245
year: iYear,

0 commit comments

Comments
 (0)