@syncfusion/ej2-navigations 17.3.9-beta → 17.3.14-96615

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/.eslintrc.json +244 -0
  2. package/CHANGELOG.md +898 -800
  3. package/README.md +163 -163
  4. package/dist/ej2-navigations.umd.min.js +1 -10
  5. package/dist/ej2-navigations.umd.min.js.map +1 -1
  6. package/dist/es6/ej2-navigations.es2015.js +325 -170
  7. package/dist/es6/ej2-navigations.es2015.js.map +1 -1
  8. package/dist/es6/ej2-navigations.es5.js +455 -300
  9. package/dist/es6/ej2-navigations.es5.js.map +1 -1
  10. package/dist/global/ej2-navigations.min.js +1 -10
  11. package/dist/global/ej2-navigations.min.js.map +1 -1
  12. package/dist/global/index.d.ts +0 -9
  13. package/dist/ts/accordion/accordion.ts +1312 -0
  14. package/dist/ts/common/h-scroll.ts +459 -0
  15. package/dist/ts/common/menu-base.ts +2131 -0
  16. package/dist/ts/common/v-scroll.ts +430 -0
  17. package/dist/ts/context-menu/context-menu.ts +119 -0
  18. package/dist/ts/menu/menu.ts +270 -0
  19. package/dist/ts/sidebar/sidebar.ts +817 -0
  20. package/dist/ts/tab/tab.ts +1761 -0
  21. package/dist/ts/toolbar/toolbar.ts +2076 -0
  22. package/dist/ts/treeview/treeview.ts +5050 -0
  23. package/helpers/e2e/index.js +3 -3
  24. package/license +10 -10
  25. package/package.json +135 -149
  26. package/src/accordion/accordion-model.d.ts +156 -156
  27. package/src/accordion/accordion.d.ts +1 -0
  28. package/src/accordion/accordion.js +40 -41
  29. package/src/common/h-scroll-model.d.ts +5 -5
  30. package/src/common/h-scroll.js +19 -20
  31. package/src/common/menu-base-model.d.ts +157 -157
  32. package/src/common/menu-base.d.ts +19 -0
  33. package/src/common/menu-base.js +94 -24
  34. package/src/common/v-scroll-model.d.ts +5 -5
  35. package/src/common/v-scroll.js +19 -19
  36. package/src/context-menu/context-menu-model.d.ts +15 -15
  37. package/src/context-menu/context-menu.js +19 -19
  38. package/src/menu/menu-model.d.ts +30 -30
  39. package/src/menu/menu.js +19 -19
  40. package/src/sidebar/sidebar-model.d.ts +136 -136
  41. package/src/sidebar/sidebar.js +19 -19
  42. package/src/tab/tab-model.d.ts +215 -215
  43. package/src/tab/tab.d.ts +3 -0
  44. package/src/tab/tab.js +117 -82
  45. package/src/toolbar/toolbar-model.d.ts +175 -175
  46. package/src/toolbar/toolbar.d.ts +1 -0
  47. package/src/toolbar/toolbar.js +30 -24
  48. package/src/treeview/treeview-model.d.ts +323 -323
  49. package/src/treeview/treeview.js +79 -33
  50. package/styles/accordion/_all.scss +2 -2
  51. package/styles/accordion/_bootstrap-dark-definition.scss +69 -69
  52. package/styles/accordion/_bootstrap-definition.scss +76 -76
  53. package/styles/accordion/_bootstrap4-definition.scss +82 -82
  54. package/styles/accordion/_fabric-dark-definition.scss +74 -74
  55. package/styles/accordion/_fabric-definition.scss +78 -78
  56. package/styles/accordion/_highcontrast-definition.scss +106 -106
  57. package/styles/accordion/_highcontrast-light-definition.scss +104 -104
  58. package/styles/accordion/_layout.scss +447 -447
  59. package/styles/accordion/_material-dark-definition.scss +75 -75
  60. package/styles/accordion/_material-definition.scss +72 -72
  61. package/styles/accordion/_theme.scss +479 -479
  62. package/styles/accordion/icons/_bootstrap-dark.scss +17 -17
  63. package/styles/accordion/icons/_bootstrap.scss +17 -17
  64. package/styles/accordion/icons/_bootstrap4.scss +17 -17
  65. package/styles/accordion/icons/_fabric-dark.scss +17 -17
  66. package/styles/accordion/icons/_fabric.scss +17 -17
  67. package/styles/accordion/icons/_highcontrast-light.scss +17 -17
  68. package/styles/accordion/icons/_highcontrast.scss +17 -17
  69. package/styles/accordion/icons/_material-dark.scss +17 -17
  70. package/styles/accordion/icons/_material.scss +17 -17
  71. package/styles/bootstrap-dark.css +7 -9
  72. package/styles/bootstrap.css +7 -9
  73. package/styles/bootstrap4.css +7 -9
  74. package/styles/bootstrap5-dark.css +0 -0
  75. package/styles/bootstrap5-dark.scss +0 -0
  76. package/styles/bootstrap5.css +0 -0
  77. package/styles/bootstrap5.scss +0 -0
  78. package/styles/context-menu/_all.scss +2 -2
  79. package/styles/context-menu/_bootstrap-dark-definition.scss +54 -54
  80. package/styles/context-menu/_bootstrap-definition.scss +52 -52
  81. package/styles/context-menu/_bootstrap4-definition.scss +52 -52
  82. package/styles/context-menu/_fabric-dark-definition.scss +54 -54
  83. package/styles/context-menu/_fabric-definition.scss +52 -52
  84. package/styles/context-menu/_highcontrast-definition.scss +52 -52
  85. package/styles/context-menu/_highcontrast-light-definition.scss +54 -54
  86. package/styles/context-menu/_layout-mixin.scss +175 -175
  87. package/styles/context-menu/_layout.scss +70 -70
  88. package/styles/context-menu/_material-dark-definition.scss +54 -54
  89. package/styles/context-menu/_material-definition.scss +52 -52
  90. package/styles/context-menu/_theme-mixin.scss +59 -59
  91. package/styles/context-menu/_theme.scss +36 -36
  92. package/styles/context-menu/bootstrap-dark.css +0 -1
  93. package/styles/context-menu/bootstrap.css +0 -1
  94. package/styles/context-menu/bootstrap4.css +0 -1
  95. package/styles/context-menu/fabric-dark.css +0 -1
  96. package/styles/context-menu/fabric.css +0 -1
  97. package/styles/context-menu/highcontrast-light.css +0 -1
  98. package/styles/context-menu/highcontrast.css +0 -1
  99. package/styles/context-menu/icons/_bootstrap-dark.scss +30 -30
  100. package/styles/context-menu/icons/_bootstrap.scss +30 -30
  101. package/styles/context-menu/icons/_bootstrap4.scss +30 -30
  102. package/styles/context-menu/icons/_fabric-dark.scss +30 -30
  103. package/styles/context-menu/icons/_fabric.scss +30 -30
  104. package/styles/context-menu/icons/_highcontrast-light.scss +30 -30
  105. package/styles/context-menu/icons/_highcontrast.scss +30 -30
  106. package/styles/context-menu/icons/_material-dark.scss +30 -30
  107. package/styles/context-menu/icons/_material.scss +30 -30
  108. package/styles/context-menu/material-dark.css +0 -1
  109. package/styles/context-menu/material.css +3 -4
  110. package/styles/fabric-dark.css +7 -9
  111. package/styles/fabric.css +7 -9
  112. package/styles/h-scroll/_all.scss +2 -2
  113. package/styles/h-scroll/_bootstrap-dark-definition.scss +49 -49
  114. package/styles/h-scroll/_bootstrap-definition.scss +50 -50
  115. package/styles/h-scroll/_bootstrap4-definition.scss +49 -49
  116. package/styles/h-scroll/_fabric-dark-definition.scss +50 -50
  117. package/styles/h-scroll/_fabric-definition.scss +48 -48
  118. package/styles/h-scroll/_highcontrast-definition.scss +52 -52
  119. package/styles/h-scroll/_highcontrast-light-definition.scss +54 -54
  120. package/styles/h-scroll/_layout.scss +198 -198
  121. package/styles/h-scroll/_material-dark-definition.scss +77 -77
  122. package/styles/h-scroll/_material-definition.scss +77 -77
  123. package/styles/h-scroll/_theme.scss +157 -157
  124. package/styles/h-scroll/icons/_bootstrap-dark.scss +49 -49
  125. package/styles/h-scroll/icons/_bootstrap.scss +49 -49
  126. package/styles/h-scroll/icons/_bootstrap4.scss +49 -49
  127. package/styles/h-scroll/icons/_fabric-dark.scss +49 -49
  128. package/styles/h-scroll/icons/_fabric.scss +49 -49
  129. package/styles/h-scroll/icons/_highcontrast-light.scss +49 -49
  130. package/styles/h-scroll/icons/_highcontrast.scss +49 -49
  131. package/styles/h-scroll/icons/_material-dark.scss +49 -49
  132. package/styles/h-scroll/icons/_material.scss +49 -49
  133. package/styles/highcontrast-light.css +7 -9
  134. package/styles/highcontrast.css +7 -9
  135. package/styles/material-dark.css +7 -9
  136. package/styles/material.css +21 -14
  137. package/styles/menu/_all.scss +2 -2
  138. package/styles/menu/_bootstrap-dark-definition.scss +63 -63
  139. package/styles/menu/_bootstrap-definition.scss +65 -65
  140. package/styles/menu/_bootstrap4-definition.scss +64 -64
  141. package/styles/menu/_fabric-dark-definition.scss +63 -63
  142. package/styles/menu/_fabric-definition.scss +64 -64
  143. package/styles/menu/_highcontrast-definition.scss +65 -65
  144. package/styles/menu/_highcontrast-light-definition.scss +61 -61
  145. package/styles/menu/_layout.scss +638 -638
  146. package/styles/menu/_material-dark-definition.scss +63 -63
  147. package/styles/menu/_material-definition.scss +64 -64
  148. package/styles/menu/_theme.scss +243 -243
  149. package/styles/menu/bootstrap-dark.css +0 -1
  150. package/styles/menu/bootstrap.css +0 -1
  151. package/styles/menu/bootstrap.scss +1 -0
  152. package/styles/menu/bootstrap4.css +0 -1
  153. package/styles/menu/fabric-dark.css +0 -1
  154. package/styles/menu/fabric.css +0 -1
  155. package/styles/menu/fabric.scss +1 -0
  156. package/styles/menu/highcontrast-light.css +0 -1
  157. package/styles/menu/highcontrast.css +0 -1
  158. package/styles/menu/highcontrast.scss +1 -0
  159. package/styles/menu/icons/_bootstrap-dark.scss +127 -127
  160. package/styles/menu/icons/_bootstrap.scss +127 -127
  161. package/styles/menu/icons/_bootstrap4.scss +127 -127
  162. package/styles/menu/icons/_fabric-dark.scss +127 -127
  163. package/styles/menu/icons/_fabric.scss +127 -127
  164. package/styles/menu/icons/_highcontrast-light.scss +127 -127
  165. package/styles/menu/icons/_highcontrast.scss +127 -127
  166. package/styles/menu/icons/_material-dark.scss +127 -127
  167. package/styles/menu/icons/_material.scss +127 -127
  168. package/styles/menu/material-dark.css +0 -1
  169. package/styles/menu/material.css +2 -3
  170. package/styles/menu/material.scss +1 -0
  171. package/styles/sidebar/_all.scss +3 -3
  172. package/styles/sidebar/_bootstrap-dark-definition.scss +4 -4
  173. package/styles/sidebar/_bootstrap-definition.scss +4 -4
  174. package/styles/sidebar/_bootstrap4-definition.scss +4 -4
  175. package/styles/sidebar/_fabric-dark-definition.scss +4 -4
  176. package/styles/sidebar/_fabric-definition.scss +6 -6
  177. package/styles/sidebar/_highcontrast-definition.scss +4 -4
  178. package/styles/sidebar/_highcontrast-light-definition.scss +4 -4
  179. package/styles/sidebar/_icons.scss +1 -1
  180. package/styles/sidebar/_material-dark-definition.scss +4 -4
  181. package/styles/sidebar/_material-definition.scss +6 -6
  182. package/styles/sidebar/_theme.scss +168 -168
  183. package/styles/sidebar/bootstrap-dark.css +0 -1
  184. package/styles/sidebar/bootstrap.css +0 -1
  185. package/styles/sidebar/bootstrap4.css +0 -1
  186. package/styles/sidebar/fabric-dark.css +0 -1
  187. package/styles/sidebar/fabric.css +0 -1
  188. package/styles/sidebar/highcontrast-light.css +0 -1
  189. package/styles/sidebar/highcontrast.css +0 -1
  190. package/styles/sidebar/material-dark.css +0 -1
  191. package/styles/sidebar/material.css +0 -1
  192. package/styles/tab/_all.scss +2 -2
  193. package/styles/tab/_bootstrap-dark-definition.scss +386 -386
  194. package/styles/tab/_bootstrap-definition.scss +396 -396
  195. package/styles/tab/_bootstrap4-definition.scss +401 -401
  196. package/styles/tab/_fabric-dark-definition.scss +394 -394
  197. package/styles/tab/_fabric-definition.scss +410 -410
  198. package/styles/tab/_highcontrast-definition.scss +434 -434
  199. package/styles/tab/_highcontrast-light-definition.scss +423 -423
  200. package/styles/tab/_icons.scss +43 -43
  201. package/styles/tab/_layout.scss +3528 -3521
  202. package/styles/tab/_material-dark-definition.scss +407 -407
  203. package/styles/tab/_material-definition.scss +416 -416
  204. package/styles/tab/_theme.scss +1751 -1751
  205. package/styles/tab/bootstrap-dark.css +7 -2
  206. package/styles/tab/bootstrap.css +7 -2
  207. package/styles/tab/bootstrap4.css +7 -2
  208. package/styles/tab/fabric-dark.css +7 -2
  209. package/styles/tab/fabric.css +7 -2
  210. package/styles/tab/highcontrast-light.css +7 -2
  211. package/styles/tab/highcontrast.css +7 -2
  212. package/styles/tab/icons/_bootstrap-dark.scss +132 -132
  213. package/styles/tab/icons/_bootstrap.scss +132 -132
  214. package/styles/tab/icons/_bootstrap4.scss +132 -132
  215. package/styles/tab/icons/_fabric-dark.scss +132 -132
  216. package/styles/tab/icons/_fabric.scss +132 -132
  217. package/styles/tab/icons/_highcontrast-light.scss +132 -132
  218. package/styles/tab/icons/_highcontrast.scss +132 -132
  219. package/styles/tab/icons/_material-dark.scss +132 -132
  220. package/styles/tab/icons/_material.scss +132 -132
  221. package/styles/tab/material-dark.css +7 -2
  222. package/styles/tab/material.css +7 -2
  223. package/styles/tailwind-dark.css +0 -0
  224. package/styles/tailwind-dark.scss +0 -0
  225. package/styles/tailwind.css +0 -0
  226. package/styles/tailwind.scss +0 -0
  227. package/styles/toolbar/_all.scss +2 -2
  228. package/styles/toolbar/_bootstrap-dark-definition.scss +135 -135
  229. package/styles/toolbar/_bootstrap-definition.scss +134 -134
  230. package/styles/toolbar/_bootstrap4-definition.scss +139 -139
  231. package/styles/toolbar/_fabric-dark-definition.scss +155 -155
  232. package/styles/toolbar/_fabric-definition.scss +139 -139
  233. package/styles/toolbar/_highcontrast-definition.scss +149 -149
  234. package/styles/toolbar/_highcontrast-light-definition.scss +164 -164
  235. package/styles/toolbar/_layout.scss +1460 -1460
  236. package/styles/toolbar/_material-dark-definition.scss +180 -180
  237. package/styles/toolbar/_material-definition.scss +164 -164
  238. package/styles/toolbar/_theme.scss +451 -451
  239. package/styles/toolbar/bootstrap-dark.css +0 -1
  240. package/styles/toolbar/bootstrap.css +0 -1
  241. package/styles/toolbar/bootstrap.scss +1 -0
  242. package/styles/toolbar/bootstrap4.css +0 -1
  243. package/styles/toolbar/fabric-dark.css +0 -1
  244. package/styles/toolbar/fabric.css +0 -1
  245. package/styles/toolbar/fabric.scss +1 -0
  246. package/styles/toolbar/highcontrast-light.css +0 -1
  247. package/styles/toolbar/highcontrast.css +0 -1
  248. package/styles/toolbar/highcontrast.scss +1 -0
  249. package/styles/toolbar/icons/_bootstrap-dark.scss +16 -16
  250. package/styles/toolbar/icons/_bootstrap.scss +16 -16
  251. package/styles/toolbar/icons/_bootstrap4.scss +16 -16
  252. package/styles/toolbar/icons/_fabric-dark.scss +16 -16
  253. package/styles/toolbar/icons/_fabric.scss +16 -16
  254. package/styles/toolbar/icons/_highcontrast-light.scss +16 -16
  255. package/styles/toolbar/icons/_highcontrast.scss +16 -16
  256. package/styles/toolbar/icons/_material-dark.scss +16 -16
  257. package/styles/toolbar/icons/_material.scss +16 -16
  258. package/styles/toolbar/material-dark.css +0 -1
  259. package/styles/toolbar/material.css +0 -1
  260. package/styles/toolbar/material.scss +1 -0
  261. package/styles/treeview/_all.scss +2 -2
  262. package/styles/treeview/_bootstrap-dark-definition.scss +131 -131
  263. package/styles/treeview/_bootstrap-definition.scss +127 -127
  264. package/styles/treeview/_bootstrap4-definition.scss +153 -153
  265. package/styles/treeview/_fabric-dark-definition.scss +130 -130
  266. package/styles/treeview/_fabric-definition.scss +126 -126
  267. package/styles/treeview/_highcontrast-definition.scss +132 -132
  268. package/styles/treeview/_highcontrast-light-definition.scss +137 -137
  269. package/styles/treeview/_layout.scss +551 -551
  270. package/styles/treeview/_material-dark-definition.scss +126 -126
  271. package/styles/treeview/_material-definition.scss +126 -126
  272. package/styles/treeview/_theme.scss +331 -331
  273. package/styles/treeview/bootstrap-dark.css +0 -3
  274. package/styles/treeview/bootstrap.css +0 -3
  275. package/styles/treeview/bootstrap4.css +0 -3
  276. package/styles/treeview/fabric-dark.css +0 -3
  277. package/styles/treeview/fabric.css +0 -3
  278. package/styles/treeview/highcontrast-light.css +0 -3
  279. package/styles/treeview/highcontrast.css +0 -3
  280. package/styles/treeview/icons/_bootstrap-dark.scss +39 -39
  281. package/styles/treeview/icons/_bootstrap.scss +39 -39
  282. package/styles/treeview/icons/_bootstrap4.scss +39 -39
  283. package/styles/treeview/icons/_fabric-dark.scss +43 -43
  284. package/styles/treeview/icons/_fabric.scss +43 -43
  285. package/styles/treeview/icons/_highcontrast-light.scss +43 -43
  286. package/styles/treeview/icons/_highcontrast.scss +43 -43
  287. package/styles/treeview/icons/_material-dark.scss +43 -43
  288. package/styles/treeview/icons/_material.scss +43 -43
  289. package/styles/treeview/material-dark.css +0 -3
  290. package/styles/treeview/material.css +9 -3
  291. package/styles/v-scroll/_all.scss +2 -2
  292. package/styles/v-scroll/_bootstrap-dark-definition.scss +50 -50
  293. package/styles/v-scroll/_bootstrap-definition.scss +49 -49
  294. package/styles/v-scroll/_bootstrap4-definition.scss +49 -49
  295. package/styles/v-scroll/_fabric-dark-definition.scss +51 -51
  296. package/styles/v-scroll/_fabric-definition.scss +50 -50
  297. package/styles/v-scroll/_highcontrast-definition.scss +51 -51
  298. package/styles/v-scroll/_highcontrast-light-definition.scss +52 -52
  299. package/styles/v-scroll/_layout.scss +162 -162
  300. package/styles/v-scroll/_material-dark-definition.scss +78 -78
  301. package/styles/v-scroll/_material-definition.scss +77 -77
  302. package/styles/v-scroll/_theme.scss +133 -133
  303. package/styles/v-scroll/icons/_bootstrap-dark.scss +26 -26
  304. package/styles/v-scroll/icons/_bootstrap.scss +26 -26
  305. package/styles/v-scroll/icons/_bootstrap4.scss +26 -26
  306. package/styles/v-scroll/icons/_fabric-dark.scss +26 -26
  307. package/styles/v-scroll/icons/_fabric.scss +26 -26
  308. package/styles/v-scroll/icons/_highcontrast-light.scss +26 -26
  309. package/styles/v-scroll/icons/_highcontrast.scss +26 -26
  310. package/styles/v-scroll/icons/_material-dark.scss +26 -26
  311. package/styles/v-scroll/icons/_material.scss +26 -26
  312. package/tslint.json +111 -0
  313. package/.gitlab/merge_request_templates/Bug.md +0 -63
  314. package/.gitlab/merge_request_templates/feature.md +0 -39
@@ -0,0 +1,459 @@
1
+ import { Touch, ScrollEventArgs, TouchEventArgs, Component, EventHandler, selectAll, getUniqueID } from '@syncfusion/ej2-base';
2
+ import { NotifyPropertyChanges, INotifyPropertyChanged, Property, Browser, detach } from '@syncfusion/ej2-base';
3
+ import { classList, SwipeEventArgs, isNullOrUndefined} from '@syncfusion/ej2-base';
4
+ import { HScrollModel } from './h-scroll-model';
5
+
6
+ type HTEle = HTMLElement;
7
+ type Str = string;
8
+
9
+ const CLS_ROOT: Str = 'e-hscroll';
10
+ const CLS_RTL: Str = 'e-rtl';
11
+ const CLS_DISABLE: Str = 'e-overlay';
12
+ const CLS_HSCROLLBAR: Str = 'e-hscroll-bar';
13
+ const CLS_HSCROLLCON: Str = 'e-hscroll-content';
14
+ const CLS_NAVARROW: Str = 'e-nav-arrow';
15
+ const CLS_NAVRIGHTARROW: Str = 'e-nav-right-arrow';
16
+ const CLS_NAVLEFTARROW: Str = 'e-nav-left-arrow';
17
+ const CLS_HSCROLLNAV: Str = 'e-scroll-nav';
18
+ const CLS_HSCROLLNAVRIGHT: Str = 'e-scroll-right-nav';
19
+ const CLS_HSCROLLNAVLEFT: Str = 'e-scroll-left-nav';
20
+ const CLS_DEVICE: Str = 'e-scroll-device';
21
+ const CLS_OVERLAY: Str = 'e-scroll-overlay';
22
+ const CLS_RIGHTOVERLAY: Str = 'e-scroll-right-overlay';
23
+ const CLS_LEFTOVERLAY: Str = 'e-scroll-left-overlay';
24
+ const OVERLAY_MAXWID: number = 40;
25
+
26
+ interface TapEventArgs {
27
+ name: string;
28
+ originalEvent: TouchEventArgs | TouchEvent | KeyboardEvent;
29
+ }
30
+ /**
31
+ * HScroll module is introduces horizontal scroller when content exceeds the current viewing area.
32
+ * It can be useful for the components like Toolbar, Tab which needs horizontal scrolling alone.
33
+ * Hidden content can be view by touch moving or icon click.
34
+ * ```html
35
+ * <div id="scroll"/>
36
+ * <script>
37
+ * var scrollObj = new HScroll();
38
+ * scrollObj.appendTo("#scroll");
39
+ * </script>
40
+ * ```
41
+ */
42
+ @NotifyPropertyChanges
43
+ export class HScroll extends Component<HTMLElement> implements INotifyPropertyChanged {
44
+ private touchModule: Touch;
45
+ private scrollEle: HTEle;
46
+ private scrollItems: HTEle;
47
+ private uniqueId: Boolean;
48
+ private timeout: number;
49
+ private keyTimeout: Boolean;
50
+ private keyTimer: number;
51
+ private browser: String;
52
+ private browserCheck: Boolean;
53
+ private ieCheck: Boolean;
54
+ private isDevice: Boolean;
55
+ private customStep: Boolean;
56
+
57
+ /**
58
+ * Specifies the left or right scrolling distance of the horizontal scrollbar moving.
59
+ * @default null
60
+ */
61
+ @Property(null)
62
+ public scrollStep: number;
63
+ /**
64
+ * Initialize the event handler
65
+ * @private
66
+ */
67
+ protected preRender(): void {
68
+ this.browser = Browser.info.name;
69
+ this.browserCheck = this.browser === 'mozilla';
70
+ this.isDevice = Browser.isDevice;
71
+ this.customStep = true;
72
+ let element: HTEle = this.element;
73
+ this.ieCheck = this.browser === 'edge' || this.browser === 'msie';
74
+ this.initialize();
75
+ if (element.id === '') {
76
+ element.id = getUniqueID('hscroll');
77
+ this.uniqueId = true;
78
+ }
79
+ element.style.display = 'block';
80
+ if (this.enableRtl) {
81
+ element.classList.add(CLS_RTL);
82
+ }
83
+ }
84
+ /**
85
+ * To Initialize the horizontal scroll rendering
86
+ * @private
87
+ */
88
+ protected render(): void {
89
+ this.touchModule = new Touch(this.element, { scroll: this.touchHandler.bind(this), swipe: this.swipeHandler.bind(this) });
90
+ EventHandler.add(this.scrollEle, 'scroll', this.scrollHandler, this);
91
+ if ( !this.isDevice) {
92
+ this.createNavIcon(this.element);
93
+ } else {
94
+ this.element.classList.add(CLS_DEVICE);
95
+ this.createOverlay(this.element);
96
+ }
97
+ this.setScrollState();
98
+ }
99
+ private setScrollState(): void {
100
+ if (isNullOrUndefined(this.scrollStep) || this.scrollStep < 0) {
101
+ this.scrollStep = this.scrollEle.offsetWidth;
102
+ this.customStep = false;
103
+ } else {
104
+ this.customStep = true;
105
+ }
106
+ }
107
+ /**
108
+ * Initializes a new instance of the HScroll class.
109
+ * @param options - Specifies HScroll model properties as options.
110
+ * @param element - Specifies the element for which horizontal scrolling applies.
111
+ */
112
+ constructor(options?: HScrollModel, element?: string | HTMLElement) {
113
+ super(options, <HTEle | string>element);
114
+ }
115
+ private initialize(): void {
116
+ let scrollEle: HTEle = this.createElement('div', { className: CLS_HSCROLLCON });
117
+ let scrollDiv: HTEle = this.createElement('div', { className: CLS_HSCROLLBAR });
118
+ scrollDiv.setAttribute('tabindex', '-1');
119
+ let ele: HTEle = this.element;
120
+ let innerEle: HTEle[] = [].slice.call(ele.children);
121
+ for (let ele of innerEle) {
122
+ scrollEle.appendChild(ele);
123
+ }
124
+ scrollDiv.appendChild(scrollEle);
125
+ ele.appendChild(scrollDiv);
126
+ scrollDiv.style.overflowX = 'hidden';
127
+ this.scrollEle = scrollDiv;
128
+ this.scrollItems = scrollEle;
129
+ }
130
+ protected getPersistData(): string {
131
+ let keyEntity: string[] = ['scrollStep'];
132
+ return this.addOnPersist(keyEntity);
133
+ }
134
+ /**
135
+ * Returns the current module name.
136
+ * @returns string
137
+ * @private
138
+ */
139
+ protected getModuleName(): string {
140
+ return 'hScroll';
141
+ }
142
+ /**
143
+ * Removes the control from the DOM and also removes all its related events.
144
+ * @returns void
145
+ */
146
+ public destroy(): void {
147
+ let ele: HTEle = this.element;
148
+ ele.style.display = '';
149
+ ele.classList.remove(CLS_ROOT);
150
+ ele.classList.remove(CLS_DEVICE);
151
+ let nav: HTEle[] = selectAll('.e-' + ele.id + '_nav.' + CLS_HSCROLLNAV, ele);
152
+ let overlay: HTEle[] = selectAll('.' + CLS_OVERLAY, ele);
153
+ [].slice.call(overlay).forEach((ele: HTEle) => {
154
+ detach(ele);
155
+ });
156
+ for (let elem of [].slice.call(this.scrollItems.children)) {
157
+ ele.appendChild(elem);
158
+ }
159
+ if (this.uniqueId) {
160
+ this.element.removeAttribute('id'); }
161
+ detach(this.scrollEle);
162
+ if (nav.length > 0) {
163
+ detach(nav[0]);
164
+ if (!isNullOrUndefined(nav[1])) { detach(nav[1]); } }
165
+ EventHandler.remove(this.scrollEle, 'scroll', this.scrollHandler);
166
+ this.touchModule.destroy();
167
+ this.touchModule = null;
168
+ super.destroy();
169
+ }
170
+ /**
171
+ * Specifies the value to disable/enable the HScroll component.
172
+ * When set to `true` , the component will be disabled.
173
+ * @param {boolean} value - Based on this Boolean value, HScroll will be enabled (false) or disabled (true).
174
+ * @returns void.
175
+ */
176
+ public disable(value: boolean): void {
177
+ let navEles: HTMLElement[] = selectAll('.e-scroll-nav:not(.' + CLS_DISABLE + ')', this.element );
178
+ value ? this.element.classList.add(CLS_DISABLE) : this.element.classList.remove(CLS_DISABLE);
179
+ [].slice.call(navEles).forEach((el: HTMLElement) => {
180
+ el.setAttribute('tabindex', !value ? '0' : '-1');
181
+ });
182
+ }
183
+ private createOverlay(element: HTEle): void {
184
+ let id: string = element.id.concat('_nav');
185
+ let rightOverlayEle: HTEle = this.createElement('div', {className: CLS_OVERLAY + ' ' + CLS_RIGHTOVERLAY});
186
+ let clsRight: string = 'e-' + element.id.concat('_nav ' + CLS_HSCROLLNAV + ' ' + CLS_HSCROLLNAVRIGHT);
187
+ let rightEle: HTEle = this.createElement('div', { id: id.concat('_right'), className: clsRight });
188
+ let navItem: HTEle = this.createElement('div', { className: CLS_NAVRIGHTARROW + ' ' + CLS_NAVARROW + ' e-icons' });
189
+ rightEle.appendChild(navItem);
190
+ let leftEle: HTEle = this.createElement('div', {className: CLS_OVERLAY + ' ' + CLS_LEFTOVERLAY});
191
+ if (this.ieCheck ) {
192
+ rightEle.classList.add('e-ie-align'); }
193
+ element.appendChild(rightOverlayEle);
194
+ element.appendChild(rightEle);
195
+ element.insertBefore(leftEle, element.firstChild);
196
+ this.eventBinding([rightEle]);
197
+ }
198
+ private createNavIcon(element: HTEle): void {
199
+ let id: string = element.id.concat('_nav');
200
+ let clsRight: string = 'e-' + element.id.concat('_nav ' + CLS_HSCROLLNAV + ' ' + CLS_HSCROLLNAVRIGHT);
201
+ let nav: HTEle = this.createElement('div', { id: id.concat('_right'), className: clsRight });
202
+ nav.setAttribute('aria-disabled', 'false');
203
+ let navItem: HTEle = this.createElement('div', { className: CLS_NAVRIGHTARROW + ' ' + CLS_NAVARROW + ' e-icons' });
204
+ let clsLeft: string = 'e-' + element.id.concat('_nav ' + CLS_HSCROLLNAV + ' ' + CLS_HSCROLLNAVLEFT);
205
+ let navEle: HTEle = this.createElement('div', { id: id.concat('_left'), className: clsLeft + ' ' + CLS_DISABLE });
206
+ navEle.setAttribute('aria-disabled', 'true');
207
+ let navLeftItem: HTEle = this.createElement('div', { className: CLS_NAVLEFTARROW + ' ' + CLS_NAVARROW + ' e-icons' });
208
+ navEle.appendChild(navLeftItem);
209
+ nav.appendChild(navItem);
210
+ element.appendChild(nav);
211
+ element.insertBefore(navEle, element.firstChild);
212
+ if (this.ieCheck ) {
213
+ nav.classList.add('e-ie-align');
214
+ navEle.classList.add('e-ie-align'); }
215
+ this.eventBinding([nav, navEle]);
216
+ }
217
+ private onKeyPress(e: KeyboardEvent): void {
218
+ if (e.key === 'Enter') {
219
+ let timeoutFun: Function = () => {
220
+ this.keyTimeout = true;
221
+ this.eleScrolling(10, <HTEle>e.target, true);
222
+ };
223
+ this.keyTimer = window.setTimeout(
224
+ () => {
225
+ timeoutFun();
226
+ }, 100);
227
+ }}
228
+ private onKeyUp(e: KeyboardEvent): void {
229
+ if (e.key !== 'Enter') { return; }
230
+ if (this.keyTimeout) {
231
+ this.keyTimeout = false;
232
+ } else {
233
+ (<HTEle>e.target).click();
234
+ }
235
+ clearTimeout(this.keyTimer);
236
+ }
237
+ private eventBinding(ele: HTEle[]): void {
238
+ [].slice.call(ele).forEach((el: HTEle) => {
239
+ new Touch(el, {tapHold: this.tabHoldHandler.bind(this), tapHoldThreshold: 500 });
240
+ el.addEventListener('keydown' , this.onKeyPress.bind(this));
241
+ el.addEventListener('keyup', this.onKeyUp.bind(this));
242
+ el.addEventListener('mouseup', this.repeatScroll.bind(this));
243
+ el.addEventListener('touchend', this.repeatScroll.bind(this));
244
+ el.addEventListener('contextmenu', (e: Event) => {
245
+ e.preventDefault();
246
+ });
247
+ EventHandler.add(el, 'click', this.clickEventHandler, this);
248
+ });
249
+ }
250
+ private repeatScroll(): void {
251
+ clearInterval (this.timeout);
252
+ }
253
+ private tabHoldHandler(e: TapEventArgs): void {
254
+ let trgt: HTEle = e.originalEvent.target as HTEle;
255
+ trgt = this.contains(trgt, CLS_HSCROLLNAV) ? <HTEle>trgt.firstElementChild : trgt;
256
+ let scrollDis: number = 10;
257
+ let timeoutFun: Function = () => {
258
+ this.eleScrolling(scrollDis, trgt, true);
259
+ };
260
+ this.timeout = window.setInterval(
261
+ () => {
262
+ timeoutFun();
263
+ }, 50);
264
+ }
265
+ private contains(ele: HTEle, className: string): boolean {
266
+ return ele.classList.contains(className);
267
+ }
268
+ private eleScrolling(scrollDis: number, trgt: HTEle, isContinuous: boolean ): void {
269
+ let element: HTEle = this.scrollEle;
270
+ let rootEle: HTEle = this.element;
271
+ let classList: DOMTokenList = trgt.classList;
272
+ if (classList.contains(CLS_HSCROLLNAV)) {
273
+ classList = trgt.querySelector('.' + CLS_NAVARROW).classList;
274
+ }
275
+ if (this.contains(rootEle, CLS_RTL) && this.browserCheck) {
276
+ scrollDis = - scrollDis;
277
+ }
278
+ let scrlLeft: number = element.scrollLeft;
279
+ if ((!this.contains(rootEle, CLS_RTL) || this.browserCheck) || this.ieCheck) {
280
+ if (classList.contains(CLS_NAVRIGHTARROW)) {
281
+ this.frameScrollRequest(scrollDis, 'add', isContinuous);
282
+ } else {
283
+ this.frameScrollRequest(scrollDis, '', isContinuous);
284
+ }
285
+ } else {
286
+ if (classList.contains(CLS_NAVLEFTARROW)) {
287
+ this.frameScrollRequest(scrollDis, 'add', isContinuous);
288
+ } else {
289
+ this.frameScrollRequest(scrollDis, '', isContinuous);
290
+ }
291
+ }
292
+ }
293
+ private clickEventHandler(e: Event): void {
294
+ this.eleScrolling(this.scrollStep , <HTEle>e.target, false);
295
+ }
296
+
297
+ private swipeHandler(e: SwipeEventArgs): void {
298
+ let swipeEle: HTEle = this.scrollEle;
299
+ let distance: number;
300
+ if (e.velocity <= 1) {
301
+ distance = e.distanceX / (e.velocity * 10);
302
+ } else {
303
+ distance = e.distanceX / e.velocity;
304
+ }
305
+ let start: number = 0.5;
306
+ let animate: Function = () => {
307
+ let step: number = Math.sin(start);
308
+ if (step <= 0) {
309
+ window.cancelAnimationFrame(step);
310
+ } else {
311
+ if (e.swipeDirection === 'Left') {
312
+ swipeEle.scrollLeft += distance * step;
313
+ } else if (e.swipeDirection === 'Right') {
314
+ swipeEle.scrollLeft -= distance * step;
315
+ }
316
+ start -= 0.02;
317
+ window.requestAnimationFrame(animate as FrameRequestCallback);
318
+ }
319
+ };
320
+ animate();
321
+ }
322
+
323
+ private scrollUpdating(scrollVal: number, action: string): void {
324
+ if (action === 'add') {
325
+ this.scrollEle.scrollLeft += scrollVal;
326
+ } else {
327
+ this.scrollEle.scrollLeft -= scrollVal; }
328
+ }
329
+
330
+ private frameScrollRequest(scrollVal: number, action: string, isContinuous: boolean): void {
331
+ let step: number = 10;
332
+ if (isContinuous) {
333
+ this.scrollUpdating(scrollVal, action);
334
+ return;
335
+ }
336
+ if (!this.customStep) {
337
+ [].slice.call(selectAll('.' + CLS_OVERLAY, this.element)).forEach((el: HTMLElement) => {
338
+ scrollVal -= el.offsetWidth; }); }
339
+ let animate: Function = () => {
340
+ let scrollValue: number;
341
+ let scrollStep: number;
342
+ if (this.contains(this.element, CLS_RTL) && this.browserCheck) {
343
+ scrollValue = - scrollVal;
344
+ scrollStep = - step;
345
+ } else {
346
+ scrollValue = scrollVal;
347
+ scrollStep = step;
348
+ }
349
+ if (scrollValue < step) {
350
+ window.cancelAnimationFrame(scrollStep);
351
+ } else {
352
+ this.scrollUpdating(scrollStep, action);
353
+ scrollVal -= scrollStep;
354
+ window.requestAnimationFrame(animate as FrameRequestCallback);
355
+ }
356
+ };
357
+ animate();
358
+ }
359
+
360
+ private touchHandler(e: ScrollEventArgs): void {
361
+ let ele: HTEle = this.scrollEle;
362
+ let distance: number;
363
+ distance = e.distanceX;
364
+ if ((this.ieCheck) && this.contains(this.element, CLS_RTL)) {
365
+ distance = - distance;
366
+ }
367
+ if (e.scrollDirection === 'Left') {
368
+ ele.scrollLeft = ele.scrollLeft + distance;
369
+ } else if (e.scrollDirection === 'Right') {
370
+ ele.scrollLeft = ele.scrollLeft - distance;
371
+ }
372
+ }
373
+ private arrowDisabling(addDisable: HTEle, removeDisable: HTEle): void {
374
+ if (this.isDevice) {
375
+ let arrowEle: HTMLElement = isNullOrUndefined(addDisable) ? removeDisable : addDisable;
376
+ let arrowIcon: HTMLElement = arrowEle.querySelector('.' + CLS_NAVARROW) as HTMLElement;
377
+ if (isNullOrUndefined(addDisable)) {
378
+ classList(arrowIcon, [CLS_NAVRIGHTARROW], [CLS_NAVLEFTARROW]);
379
+ } else {
380
+ classList(arrowIcon, [CLS_NAVLEFTARROW], [CLS_NAVRIGHTARROW]);
381
+ }
382
+ } else {
383
+ addDisable.classList.add(CLS_DISABLE);
384
+ addDisable.setAttribute('aria-disabled' , 'true');
385
+ addDisable.removeAttribute('tabindex');
386
+ removeDisable.classList.remove(CLS_DISABLE);
387
+ removeDisable.setAttribute('aria-disabled' , 'false');
388
+ removeDisable.setAttribute('tabindex', '0');
389
+ }
390
+ this.repeatScroll();
391
+ }
392
+ private scrollHandler(e: Event): void {
393
+ let target: HTEle = <HTEle>e.target;
394
+ let width: number = target.offsetWidth;
395
+ let rootEle: HTEle = this.element;
396
+ let navLeftEle: HTEle = (<HTEle>this.element.querySelector('.' + CLS_HSCROLLNAVLEFT));
397
+ let navRightEle: HTEle = (<HTEle>this.element.querySelector('.' + CLS_HSCROLLNAVRIGHT));
398
+ let leftOverlay: HTEle = (<HTEle>this.element.querySelector('.' + CLS_LEFTOVERLAY));
399
+ let rightOverlay: HTEle = (<HTEle>this.element.querySelector('.' + CLS_RIGHTOVERLAY));
400
+ let scrollLeft: number = target.scrollLeft;
401
+ if (scrollLeft <= 0) {
402
+ scrollLeft = -scrollLeft;
403
+ }
404
+ if (this.isDevice) {
405
+ if (this.enableRtl && !(this.browserCheck || this.ieCheck)) {
406
+ leftOverlay = (<HTEle>this.element.querySelector('.' + CLS_RIGHTOVERLAY));
407
+ rightOverlay = (<HTEle>this.element.querySelector('.' + CLS_LEFTOVERLAY)); }
408
+ if (scrollLeft < OVERLAY_MAXWID) {
409
+ leftOverlay.style.width = scrollLeft + 'px';
410
+ } else {
411
+ leftOverlay.style.width = '40px';
412
+ }
413
+ if (( target.scrollWidth - Math.ceil(width + scrollLeft)) < OVERLAY_MAXWID ) {
414
+ rightOverlay.style.width = ( target.scrollWidth - Math.ceil(width + scrollLeft)) + 'px';
415
+ } else {
416
+ rightOverlay.style.width = '40px';
417
+ }
418
+ }
419
+ if (scrollLeft === 0) {
420
+ if ((!this.contains(rootEle, CLS_RTL) || this.browserCheck) || this.ieCheck) {
421
+ this.arrowDisabling(navLeftEle, navRightEle);
422
+ } else {
423
+ this.arrowDisabling(navRightEle, navLeftEle);
424
+ }
425
+ } else if (Math.ceil(width + scrollLeft + .1) >= target.scrollWidth) {
426
+ if ((!this.contains(rootEle, CLS_RTL) || this.browserCheck) || this.ieCheck) {
427
+ this.arrowDisabling(navRightEle, navLeftEle);
428
+ } else {
429
+ this.arrowDisabling(navLeftEle, navRightEle);
430
+ }
431
+ } else {
432
+ let disEle: HTEle = <HTEle>this.element.querySelector('.' + CLS_HSCROLLNAV + '.' + CLS_DISABLE);
433
+ if (disEle) {
434
+ disEle.classList.remove(CLS_DISABLE);
435
+ disEle.setAttribute('aria-disabled', 'false');
436
+ disEle.setAttribute('tabindex', '0');
437
+ }
438
+ }
439
+ }
440
+ /**
441
+ * Gets called when the model property changes.The data that describes the old and new values of property that changed.
442
+ * @param {HScrollModel} newProp
443
+ * @param {HScrollModel} oldProp
444
+ * @returns void
445
+ * @private
446
+ */
447
+ public onPropertyChanged(newProp: HScrollModel, oldProp: HScrollModel): void {
448
+ for (let prop of Object.keys(newProp)) {
449
+ switch (prop) {
450
+ case 'scrollStep':
451
+ this.setScrollState();
452
+ break;
453
+ case 'enableRtl':
454
+ newProp.enableRtl ? this.element.classList.add(CLS_RTL) : this.element.classList.remove(CLS_RTL);
455
+ break;
456
+ }
457
+ }
458
+ }
459
+ }