@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,430 @@
1
+ import { Touch, ScrollEventArgs, TouchEventArgs, Component, EventHandler, selectAll, getUniqueID, removeClass } from '@syncfusion/ej2-base';
2
+ import { NotifyPropertyChanges, INotifyPropertyChanged, Property, Browser, detach, createElement as buildTag } from '@syncfusion/ej2-base';
3
+ import { classList, SwipeEventArgs, isNullOrUndefined } from '@syncfusion/ej2-base';
4
+ import { VScrollModel } from './v-scroll-model';
5
+
6
+ type HTEle = HTMLElement;
7
+ type Str = string;
8
+
9
+ const CLS_ROOT: Str = 'e-vscroll';
10
+ const CLS_RTL: Str = 'e-rtl';
11
+ const CLS_DISABLE: Str = 'e-overlay';
12
+ const CLS_VSCROLLBAR: Str = 'e-vscroll-bar';
13
+ const CLS_VSCROLLCON: Str = 'e-vscroll-content';
14
+ const CLS_NAVARROW: Str = 'e-nav-arrow';
15
+ const CLS_NAVUPARROW: Str = 'e-nav-up-arrow';
16
+ const CLS_NAVDOWNARROW: Str = 'e-nav-down-arrow';
17
+ const CLS_VSCROLLNAV: Str = 'e-scroll-nav';
18
+ const CLS_VSCROLLNAVUP: Str = 'e-scroll-up-nav';
19
+ const CLS_VSCROLLNAVDOWN: Str = 'e-scroll-down-nav';
20
+ const CLS_DEVICE: Str = 'e-scroll-device';
21
+ const CLS_OVERLAY: Str = 'e-scroll-overlay';
22
+ const CLS_UPOVERLAY: Str = 'e-scroll-up-overlay';
23
+ const CLS_DOWNOVERLAY: Str = 'e-scroll-down-overlay';
24
+ const OVERLAY_MAXWID: number = 40;
25
+
26
+ interface TapEventArgs {
27
+ name: string;
28
+ originalEvent: TouchEventArgs | TouchEvent | KeyboardEvent;
29
+ }
30
+ /**
31
+ * VScroll module is introduces vertical scroller when content exceeds the current viewing area.
32
+ * It can be useful for the components like Toolbar, Tab which needs vertical 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 VScroll();
38
+ * scrollObj.appendTo("#scroll");
39
+ * </script>
40
+ * ```
41
+ */
42
+ @NotifyPropertyChanges
43
+ export class VScroll 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 up or down scrolling distance of the vertical 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 ele: HTEle = this.element;
73
+ this.ieCheck = this.browser === 'edge' || this.browser === 'msie';
74
+ this.initialize();
75
+ if (ele.id === '') {
76
+ ele.id = getUniqueID('vscroll');
77
+ this.uniqueId = true;
78
+ }
79
+ ele.style.display = 'block';
80
+ if (this.enableRtl) {
81
+ ele.classList.add(CLS_RTL);
82
+ }
83
+ }
84
+ /**
85
+ * To Initialize the vertical 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.scrollEventHandler, this);
91
+ if (!this.isDevice) {
92
+ this.createNavIcon(this.element);
93
+ } else {
94
+ this.element.classList.add(CLS_DEVICE);
95
+ this.createOverlayElement(this.element);
96
+ }
97
+ this.setScrollState();
98
+ EventHandler.add(this.element, 'wheel', this.wheelEventHandler, this);
99
+ }
100
+ private setScrollState(): void {
101
+ if (isNullOrUndefined(this.scrollStep) || this.scrollStep < 0) {
102
+ this.scrollStep = this.scrollEle.offsetHeight;
103
+ this.customStep = false;
104
+ } else {
105
+ this.customStep = true;
106
+ }
107
+ }
108
+ /**
109
+ * Initializes a new instance of the VScroll class.
110
+ * @param options - Specifies VScroll model properties as options.
111
+ * @param element - Specifies the element for which vertical scrolling applies.
112
+ */
113
+ constructor(options?: VScrollModel, element?: string | HTMLElement) {
114
+ super(options, <HTEle | string>element);
115
+ }
116
+ private initialize(): void {
117
+ let scrollCnt: HTEle = buildTag('div', { className: CLS_VSCROLLCON });
118
+ let scrollBar: HTEle = buildTag('div', { className: CLS_VSCROLLBAR });
119
+ scrollBar.setAttribute('tabindex', '-1');
120
+ let ele: HTEle = this.element;
121
+ let innerEle: HTEle[] = [].slice.call(ele.children);
122
+ for (let ele of innerEle) {
123
+ scrollCnt.appendChild(ele);
124
+ }
125
+ scrollBar.appendChild(scrollCnt);
126
+ ele.appendChild(scrollBar);
127
+ scrollBar.style.overflowY = 'hidden';
128
+ this.scrollEle = scrollBar;
129
+ this.scrollItems = scrollCnt;
130
+ }
131
+ protected getPersistData(): string {
132
+ let keyEntity: string[] = ['scrollStep'];
133
+ return this.addOnPersist(keyEntity);
134
+ }
135
+ /**
136
+ * Returns the current module name.
137
+ * @returns string
138
+ * @private
139
+ */
140
+ protected getModuleName(): string {
141
+ return 'vScroll';
142
+ }
143
+ /**
144
+ * Removes the control from the DOM and also removes all its related events.
145
+ * @returns void
146
+ */
147
+ public destroy(): void {
148
+ let el: HTEle = this.element;
149
+ el.style.display = '';
150
+ removeClass([this.element], [CLS_ROOT, CLS_DEVICE]);
151
+ let navs: HTEle[] = selectAll('.e-' + el.id + '_nav.' + CLS_VSCROLLNAV, el);
152
+ let overlays: HTEle[] = selectAll('.' + CLS_OVERLAY, el);
153
+ [].slice.call(overlays).forEach((ele: HTMLElement) => {
154
+ detach(ele);
155
+ });
156
+ for (let elem of [].slice.call(this.scrollItems.children)) {
157
+ el.appendChild(elem);
158
+ }
159
+ if (this.uniqueId) {
160
+ this.element.removeAttribute('id');
161
+ }
162
+ detach(this.scrollEle);
163
+ if (navs.length > 0) {
164
+ detach(navs[0]);
165
+ if (!isNullOrUndefined(navs[1])) { detach(navs[1]); }
166
+ }
167
+ EventHandler.remove(this.scrollEle, 'scroll', this.scrollEventHandler);
168
+ this.touchModule.destroy();
169
+ this.touchModule = null;
170
+ super.destroy();
171
+ }
172
+ /**
173
+ * Specifies the value to disable/enable the VScroll component.
174
+ * When set to `true` , the component will be disabled.
175
+ * @param {boolean} value - Based on this Boolean value, VScroll will be enabled (false) or disabled (true).
176
+ * @returns void.
177
+ */
178
+ public disable(value: boolean): void {
179
+ let navEle: HTMLElement[] = selectAll('.e-scroll-nav:not(.' + CLS_DISABLE + ')', this.element);
180
+ value ? this.element.classList.add(CLS_DISABLE) : this.element.classList.remove(CLS_DISABLE);
181
+ [].slice.call(navEle).forEach((el: HTMLElement) => {
182
+ el.setAttribute('tabindex', !value ? '0' : '-1');
183
+ });
184
+ }
185
+ private createOverlayElement(element: HTEle): void {
186
+ let id: string = element.id.concat('_nav');
187
+ let downOverlayEle: HTEle = buildTag('div', { className: CLS_OVERLAY + ' ' + CLS_DOWNOVERLAY });
188
+ let clsDown: string = 'e-' + element.id.concat('_nav ' + CLS_VSCROLLNAV + ' ' + CLS_VSCROLLNAVDOWN);
189
+ let downEle: HTEle = buildTag('div', { id: id.concat('down'), className: clsDown });
190
+ let navItem: HTEle = buildTag('div', { className: CLS_NAVDOWNARROW + ' ' + CLS_NAVARROW + ' e-icons' });
191
+ downEle.appendChild(navItem);
192
+ let upEle: HTEle = buildTag('div', { className: CLS_OVERLAY + ' ' + CLS_UPOVERLAY });
193
+ if (this.ieCheck) {
194
+ downEle.classList.add('e-ie-align');
195
+ }
196
+ element.appendChild(downOverlayEle);
197
+ element.appendChild(downEle);
198
+ element.insertBefore(upEle, element.firstChild);
199
+ this.eventBinding([downEle]);
200
+ }
201
+ private createNavIcon(element: HTEle): void {
202
+ let id: string = element.id.concat('_nav');
203
+ let clsDown: string = 'e-' + element.id.concat('_nav ' + CLS_VSCROLLNAV + ' ' + CLS_VSCROLLNAVDOWN);
204
+ let nav: HTEle = buildTag('div', { id: id.concat('_down'), className: clsDown });
205
+ nav.setAttribute('aria-disabled', 'false');
206
+ let navItem: HTEle = buildTag('div', { className: CLS_NAVDOWNARROW + ' ' + CLS_NAVARROW + ' e-icons' });
207
+ let clsUp: string = 'e-' + element.id.concat('_nav ' + CLS_VSCROLLNAV + ' ' + CLS_VSCROLLNAVUP);
208
+ let navElement: HTEle = buildTag('div', { id: id.concat('_up'), className: clsUp + ' ' + CLS_DISABLE });
209
+ navElement.setAttribute('aria-disabled', 'true');
210
+ let navUpItem: HTEle = buildTag('div', { className: CLS_NAVUPARROW + ' ' + CLS_NAVARROW + ' e-icons' });
211
+ navElement.appendChild(navUpItem);
212
+ nav.appendChild(navItem);
213
+ nav.setAttribute('tabindex', '0');
214
+ element.appendChild(nav);
215
+ element.insertBefore(navElement, element.firstChild);
216
+ if (this.ieCheck) {
217
+ nav.classList.add('e-ie-align');
218
+ navElement.classList.add('e-ie-align');
219
+ }
220
+ this.eventBinding([nav, navElement]);
221
+ }
222
+ private onKeyPress(ev: KeyboardEvent): void {
223
+ if (ev.key === 'Enter') {
224
+ let timeoutFun: Function = () => {
225
+ this.keyTimeout = true;
226
+ this.eleScrolling(10, <HTEle>ev.target, true);
227
+ };
228
+ this.keyTimer = window.setTimeout(() => { timeoutFun(); }, 100);
229
+ }
230
+ }
231
+ private onKeyUp(ev: KeyboardEvent): void {
232
+ if (ev.key !== 'Enter') { return; }
233
+ if (this.keyTimeout) {
234
+ this.keyTimeout = false;
235
+ } else {
236
+ (<HTEle>ev.target).click();
237
+ }
238
+ clearTimeout(this.keyTimer);
239
+ }
240
+ private eventBinding(element: HTEle[]): void {
241
+ [].slice.call(element).forEach((ele: HTEle) => {
242
+ new Touch(ele, { tapHold: this.tabHoldHandler.bind(this), tapHoldThreshold: 500 });
243
+ ele.addEventListener('keydown', this.onKeyPress.bind(this));
244
+ ele.addEventListener('keyup', this.onKeyUp.bind(this));
245
+ ele.addEventListener('mouseup', this.repeatScroll.bind(this));
246
+ ele.addEventListener('touchend', this.repeatScroll.bind(this));
247
+ ele.addEventListener('contextmenu', (e: Event) => {
248
+ e.preventDefault();
249
+ });
250
+ EventHandler.add(ele, 'click', this.clickEventHandler, this);
251
+ });
252
+ }
253
+ private repeatScroll(): void {
254
+ clearInterval(this.timeout);
255
+ }
256
+ private tabHoldHandler(ev: TapEventArgs): void {
257
+ let trgt: HTEle = ev.originalEvent.target as HTEle;
258
+ trgt = this.contains(trgt, CLS_VSCROLLNAV) ? <HTEle>trgt.firstElementChild : trgt;
259
+ let scrollDistance: number = 10;
260
+ let timeoutFun: Function = () => {
261
+ this.eleScrolling(scrollDistance, trgt, true);
262
+ };
263
+ this.timeout = window.setInterval(() => { timeoutFun(); }, 50);
264
+ }
265
+ private contains(element: HTEle, className: string): boolean {
266
+ return element.classList.contains(className);
267
+ }
268
+ private eleScrolling(scrollDis: number, trgt: HTEle, isContinuous: boolean): void {
269
+ let rootElement: HTEle = this.element;
270
+ let classList: DOMTokenList = trgt.classList;
271
+ if (classList.contains(CLS_VSCROLLNAV)) {
272
+ classList = trgt.querySelector('.' + CLS_NAVARROW).classList;
273
+ }
274
+ if (classList.contains(CLS_NAVDOWNARROW)) {
275
+ this.frameScrollRequest(scrollDis, 'add', isContinuous);
276
+ } else if (classList.contains(CLS_NAVUPARROW)) {
277
+ this.frameScrollRequest(scrollDis, '', isContinuous);
278
+ }
279
+ }
280
+ private clickEventHandler(event: Event): void {
281
+ this.eleScrolling(this.scrollStep, <HTEle>event.target, false);
282
+ }
283
+ private wheelEventHandler(e: WheelEvent): void {
284
+ e.preventDefault();
285
+ this.frameScrollRequest(this.scrollStep, (e.deltaY > 0 ? 'add' : ''), false);
286
+ }
287
+
288
+ private swipeHandler(e: SwipeEventArgs): void {
289
+ let swipeElement: HTEle = this.scrollEle;
290
+ let distance: number;
291
+ if (e.velocity <= 1) {
292
+ distance = e.distanceY / (e.velocity * 10);
293
+ } else {
294
+ distance = e.distanceY / e.velocity;
295
+ }
296
+ let start: number = 0.5;
297
+ let animate: Function = () => {
298
+ let step: number = Math.sin(start);
299
+ if (step <= 0) {
300
+ window.cancelAnimationFrame(step);
301
+ } else {
302
+ if (e.swipeDirection === 'Up') {
303
+ swipeElement.scrollTop += distance * step;
304
+ } else if (e.swipeDirection === 'Down') {
305
+ swipeElement.scrollTop -= distance * step;
306
+ }
307
+ start -= 0.02;
308
+ window.requestAnimationFrame(animate as FrameRequestCallback);
309
+ }
310
+ };
311
+ animate();
312
+ }
313
+
314
+ private scrollUpdating(scrollVal: number, action: string): void {
315
+ if (action === 'add') {
316
+ this.scrollEle.scrollTop += scrollVal;
317
+ } else {
318
+ this.scrollEle.scrollTop -= scrollVal;
319
+ }
320
+ }
321
+
322
+ private frameScrollRequest(scrollValue: number, action: string, isContinuous: boolean): void {
323
+ let step: number = 10;
324
+ if (isContinuous) {
325
+ this.scrollUpdating(scrollValue, action);
326
+ return;
327
+ }
328
+ if (!this.customStep) {
329
+ [].slice.call(selectAll('.' + CLS_OVERLAY, this.element)).forEach((el: HTMLElement) => {
330
+ scrollValue -= el.offsetHeight;
331
+ });
332
+ }
333
+ let animate: Function = () => {
334
+ if (scrollValue < step) {
335
+ window.cancelAnimationFrame(step);
336
+ } else {
337
+ this.scrollUpdating(step, action);
338
+ scrollValue -= step;
339
+ window.requestAnimationFrame(animate as FrameRequestCallback);
340
+ }
341
+ };
342
+ animate();
343
+ }
344
+
345
+ private touchHandler(e: ScrollEventArgs): void {
346
+ let el: HTEle = this.scrollEle;
347
+ let distance: number;
348
+ distance = e.distanceY;
349
+ if (e.scrollDirection === 'Up') {
350
+ el.scrollTop = el.scrollTop + distance;
351
+ } else if (e.scrollDirection === 'Down') {
352
+ el.scrollTop = el.scrollTop - distance;
353
+ }
354
+ }
355
+ private arrowDisabling(addDisableCls: HTEle, removeDisableCls: HTEle): void {
356
+ if (this.isDevice) {
357
+ let arrowEle: HTMLElement = isNullOrUndefined(addDisableCls) ? removeDisableCls : addDisableCls;
358
+ let arrowIcon: HTMLElement = arrowEle.querySelector('.' + CLS_NAVARROW) as HTMLElement;
359
+ if (isNullOrUndefined(addDisableCls)) {
360
+ classList(arrowIcon, [CLS_NAVDOWNARROW], [CLS_NAVUPARROW]);
361
+ } else {
362
+ classList(arrowIcon, [CLS_NAVUPARROW], [CLS_NAVDOWNARROW]);
363
+ }
364
+ } else {
365
+ addDisableCls.classList.add(CLS_DISABLE);
366
+ addDisableCls.setAttribute('aria-disabled', 'true');
367
+ addDisableCls.removeAttribute('tabindex');
368
+ removeDisableCls.classList.remove(CLS_DISABLE);
369
+ removeDisableCls.setAttribute('aria-disabled', 'false');
370
+ removeDisableCls.setAttribute('tabindex', '0');
371
+ }
372
+ this.repeatScroll();
373
+ }
374
+ private scrollEventHandler(e: Event): void {
375
+ let target: HTEle = <HTEle>e.target;
376
+ let height: number = target.offsetHeight;
377
+ let rootEle: HTEle = this.element;
378
+ let navUpEle: HTEle = (<HTEle>this.element.querySelector('.' + CLS_VSCROLLNAVUP));
379
+ let navDownEle: HTEle = (<HTEle>this.element.querySelector('.' + CLS_VSCROLLNAVDOWN));
380
+ let upOverlay: HTEle = (<HTEle>this.element.querySelector('.' + CLS_UPOVERLAY));
381
+ let downOverlay: HTEle = (<HTEle>this.element.querySelector('.' + CLS_DOWNOVERLAY));
382
+ let scrollTop: number = target.scrollTop;
383
+ if (scrollTop <= 0) {
384
+ scrollTop = -scrollTop;
385
+ }
386
+ if (this.isDevice) {
387
+ if (scrollTop < OVERLAY_MAXWID) {
388
+ upOverlay.style.height = scrollTop + 'px';
389
+ } else {
390
+ upOverlay.style.height = '40px';
391
+ }
392
+ if ((target.scrollHeight - Math.ceil(height + scrollTop)) < OVERLAY_MAXWID) {
393
+ downOverlay.style.height = (target.scrollHeight - Math.ceil(height + scrollTop)) + 'px';
394
+ } else {
395
+ downOverlay.style.height = '40px';
396
+ }
397
+ }
398
+ if (scrollTop === 0) {
399
+ this.arrowDisabling(navUpEle, navDownEle);
400
+ } else if (Math.ceil(height + scrollTop + .1) >= target.scrollHeight) {
401
+ this.arrowDisabling(navDownEle, navUpEle);
402
+ } else {
403
+ let disEle: HTEle = <HTEle>this.element.querySelector('.' + CLS_VSCROLLNAV + '.' + CLS_DISABLE);
404
+ if (disEle) {
405
+ disEle.classList.remove(CLS_DISABLE);
406
+ disEle.setAttribute('aria-disabled', 'false');
407
+ disEle.setAttribute('tabindex', '0');
408
+ }
409
+ }
410
+ }
411
+ /**
412
+ * Gets called when the model property changes.The data that describes the old and new values of property that changed.
413
+ * @param {VScrollModel} newProp
414
+ * @param {VScrollModel} oldProp
415
+ * @returns void
416
+ * @private
417
+ */
418
+ public onPropertyChanged(newProp: VScrollModel, oldProp: VScrollModel): void {
419
+ for (let prop of Object.keys(newProp)) {
420
+ switch (prop) {
421
+ case 'scrollStep':
422
+ this.setScrollState();
423
+ break;
424
+ case 'enableRtl':
425
+ newProp.enableRtl ? this.element.classList.add(CLS_RTL) : this.element.classList.remove(CLS_RTL);
426
+ break;
427
+ }
428
+ }
429
+ }
430
+ }
@@ -0,0 +1,119 @@
1
+ /// <reference path='../common/menu-base-model.d.ts'/>
2
+ import { attributes, getUniqueID, Collection, NotifyPropertyChanges, INotifyPropertyChanged, Property } from '@syncfusion/ej2-base';
3
+ import { getZindexPartial } from '@syncfusion/ej2-popups';
4
+ import { ContextMenuModel } from './context-menu-model';
5
+ import { MenuBase, MenuItem } from '../common/menu-base';
6
+ import { MenuItemModel } from './../common/menu-base-model';
7
+
8
+ /**
9
+ * The ContextMenu is a graphical user interface that appears on the user right click/touch hold operation.
10
+ * ```html
11
+ * <div id = 'target'></div>
12
+ * <ul id = 'contextmenu'></ul>
13
+ * ```
14
+ * ```typescript
15
+ * <script>
16
+ * var contextMenuObj = new ContextMenu({items: [{ text: 'Cut' }, { text: 'Copy' },{ text: 'Paste' }], target: '#target'});
17
+ * </script>
18
+ * ```
19
+ */
20
+ @NotifyPropertyChanges
21
+ export class ContextMenu extends MenuBase implements INotifyPropertyChanged {
22
+ /**
23
+ * Constructor for creating the widget.
24
+ * @private
25
+ */
26
+ constructor(options?: ContextMenuModel, element?: string | HTMLUListElement) {
27
+ super(options, <HTMLUListElement | string>element);
28
+ }
29
+
30
+ /**
31
+ * Specifies target element selector in which the ContextMenu should be opened.
32
+ * @default ''
33
+ */
34
+ @Property('')
35
+ public target: string;
36
+
37
+ /**
38
+ * Specifies the filter selector for elements inside the target in that the context menu will be opened.
39
+ * @default ''
40
+ */
41
+ @Property('')
42
+ public filter: string;
43
+
44
+ /**
45
+ * Specifies menu items with its properties which will be rendered as ContextMenu.
46
+ * @default []
47
+ * @aspType object
48
+ * @blazorType object
49
+ */
50
+ @Collection<MenuItemModel>([], MenuItem)
51
+ public items: MenuItemModel[];
52
+
53
+ /**
54
+ * For internal use only - prerender processing.
55
+ * @private
56
+ */
57
+ protected preRender(): void {
58
+ this.isMenu = false;
59
+ this.element.id = this.element.id || getUniqueID('ej2-contextmenu');
60
+ super.preRender();
61
+ }
62
+
63
+ protected initialize(): void {
64
+ super.initialize();
65
+ attributes(this.element, <{ [key: string]: string }>{ 'role': 'menu', 'tabindex': '0' });
66
+ this.element.style.zIndex = getZindexPartial(this.element).toString();
67
+ }
68
+
69
+ /**
70
+ * This method is used to open the ContextMenu in specified position.
71
+ * @param top - To specify ContextMenu vertical positioning.
72
+ * @param left - To specify ContextMenu horizontal positioning.
73
+ * @param target - To calculate z-index for ContextMenu based upon the specified target.
74
+ * @method open
75
+ * @returns void
76
+ */
77
+ public open(top: number, left: number, target?: HTMLElement): void {
78
+ super.openMenu(null, null, top, left, null, target);
79
+ }
80
+
81
+ /**
82
+ * Closes the ContextMenu if it is opened.
83
+ */
84
+ public close(): void {
85
+ super.closeMenu();
86
+ }
87
+
88
+ /**
89
+ * Called internally if any of the property value changed
90
+ * @private
91
+ * @param {ContextMenuModel} newProp
92
+ * @param {ContextMenuModel} oldProp
93
+ * @returns void
94
+ */
95
+ public onPropertyChanged(newProp: ContextMenuModel, oldProp: ContextMenuModel): void {
96
+ super.onPropertyChanged(newProp, oldProp);
97
+ for (let prop of Object.keys(newProp)) {
98
+ switch (prop) {
99
+ case 'filter':
100
+ this.close();
101
+ this.filter = newProp.filter;
102
+ break;
103
+ case 'target':
104
+ this.unWireEvents(oldProp.target);
105
+ this.wireEvents();
106
+ break;
107
+ }
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Get module name.
113
+ * @returns string
114
+ * @private
115
+ */
116
+ protected getModuleName(): string {
117
+ return 'contextmenu';
118
+ }
119
+ }