1
+ import { fetchI18nBundle , getI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js" ;
2
+
1
3
import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js" ;
2
4
import ItemNavigation from "@ui5/webcomponents-base/dist/delegate/ItemNavigation.js" ;
3
- import ItemNavigationBehavior from "@ui5/webcomponents-base/dist/types/ItemNavigationBehavior.js" ;
4
5
import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js" ;
5
6
import Integer from "@ui5/webcomponents-base/dist/types/Integer.js" ;
6
7
import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js" ;
8
+
9
+ import {
10
+ isDown ,
11
+ isUp ,
12
+ } from "@ui5/webcomponents-base/dist/Keys.js" ;
13
+
7
14
import ProductSwitchTemplate from "./generated/templates/ProductSwitchTemplate.lit.js" ;
8
15
16
+ import {
17
+ PRODUCT_SWITCH_CONTAINER_LABEL ,
18
+ } from "./generated/i18n/i18n-defaults.js" ;
19
+
9
20
// Styles
10
21
import ProductSwitchCss from "./generated/themes/ProductSwitch.css.js" ;
11
22
@@ -63,11 +74,15 @@ class ProductSwitch extends UI5Element {
63
74
constructor ( ) {
64
75
super ( ) ;
65
76
77
+ this . _currentIndex = 0 ;
78
+ this . _rowSize = 4 ;
79
+
66
80
this . _itemNavigation = new ItemNavigation ( this , {
67
- rowSize : 4 ,
68
- behavior : ItemNavigationBehavior . Cyclic ,
81
+ rowSize : this . _rowSize ,
69
82
getItemsCallback : ( ) => this . items ,
70
83
} ) ;
84
+
85
+ this . i18nBundle = getI18nBundle ( "@ui5/webcomponents" ) ;
71
86
}
72
87
73
88
static get metadata ( ) {
@@ -93,6 +108,14 @@ class ProductSwitch extends UI5Element {
93
108
} ;
94
109
}
95
110
111
+ static async onDefine ( ) {
112
+ await fetchI18nBundle ( "@ui5/webcomponents" ) ;
113
+ }
114
+
115
+ get _ariaLabelText ( ) {
116
+ return this . i18nBundle . getText ( PRODUCT_SWITCH_CONTAINER_LABEL ) ;
117
+ }
118
+
96
119
onEnterDOM ( ) {
97
120
this . _handleResizeBound = this . _handleResize . bind ( this ) ;
98
121
@@ -105,24 +128,59 @@ class ProductSwitch extends UI5Element {
105
128
106
129
onBeforeRendering ( ) {
107
130
this . desktopColumns = this . items . length > 6 ? 4 : 3 ;
131
+
132
+ this . items . forEach ( item => {
133
+ item . _accInfo = {
134
+ role : "listitem" ,
135
+ } ;
136
+ } ) ;
108
137
}
109
138
110
139
_handleResize ( ) {
111
140
const documentWidth = document . body . clientWidth ;
112
141
113
142
if ( documentWidth <= this . constructor . ROW_MIN_WIDTH . ONE_COLUMN ) {
114
- this . _itemNavigation . setRowSize ( 1 ) ;
143
+ this . _setRowSize ( 1 ) ;
115
144
} else if ( documentWidth <= this . constructor . ROW_MIN_WIDTH . THREE_COLUMN || this . items . length <= 6 ) {
116
- this . _itemNavigation . setRowSize ( 3 ) ;
145
+ this . _setRowSize ( 3 ) ;
117
146
} else {
118
- this . _itemNavigation . setRowSize ( 4 ) ;
147
+ this . _setRowSize ( 4 ) ;
119
148
}
120
149
}
121
150
122
151
_onfocusin ( event ) {
123
152
const target = event . target ;
124
153
125
154
this . _itemNavigation . setCurrentItem ( target ) ;
155
+ this . _currentIndex = this . items . indexOf ( target ) ;
156
+ }
157
+
158
+ _setRowSize ( size ) {
159
+ this . _rowSize = size ;
160
+ this . _itemNavigation . setRowSize ( size ) ;
161
+ }
162
+
163
+ _onkeydown ( event ) {
164
+ if ( isDown ( event ) ) {
165
+ this . _handleDown ( event ) ;
166
+ }
167
+
168
+ if ( isUp ( event ) ) {
169
+ this . _handleUp ( event ) ;
170
+ }
171
+ }
172
+
173
+ _handleDown ( event ) {
174
+ const itemsLength = this . items . length ;
175
+ if ( this . _currentIndex + this . _rowSize > itemsLength ) { // border reached, do nothing
176
+ event . stopPropagation ( ) ;
177
+ }
178
+ }
179
+
180
+ _handleUp ( event ) {
181
+ if ( this . _currentIndex - this . _rowSize < 0 ) { // border reached, do nothing
182
+ event . stopPropagation ( ) ;
183
+ }
126
184
}
127
185
}
128
186
0 commit comments