@syncfusion/ej2-navigations 17.2.55-1205479 → 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 (316) hide show
  1. package/.eslintrc.json +244 -0
  2. package/CHANGELOG.md +898 -786
  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 +512 -255
  7. package/dist/es6/ej2-navigations.es2015.js.map +1 -1
  8. package/dist/es6/ej2-navigations.es5.js +642 -385
  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 -145
  26. package/src/accordion/accordion-model.d.ts +162 -143
  27. package/src/accordion/accordion.d.ts +35 -6
  28. package/src/accordion/accordion.js +193 -71
  29. package/src/common/h-scroll-model.d.ts +5 -5
  30. package/src/common/h-scroll.js +19 -20
  31. package/src/common/index.d.ts +1 -0
  32. package/src/common/index.js +1 -0
  33. package/src/common/menu-base-model.d.ts +157 -157
  34. package/src/common/menu-base.d.ts +19 -0
  35. package/src/common/menu-base.js +97 -24
  36. package/src/common/v-scroll-model.d.ts +5 -5
  37. package/src/common/v-scroll.js +19 -19
  38. package/src/context-menu/context-menu-model.d.ts +15 -15
  39. package/src/context-menu/context-menu.js +19 -19
  40. package/src/menu/menu-model.d.ts +30 -30
  41. package/src/menu/menu.js +19 -19
  42. package/src/sidebar/sidebar-model.d.ts +136 -136
  43. package/src/sidebar/sidebar.js +19 -19
  44. package/src/tab/tab-model.d.ts +215 -215
  45. package/src/tab/tab.d.ts +3 -0
  46. package/src/tab/tab.js +120 -83
  47. package/src/toolbar/toolbar-model.d.ts +175 -175
  48. package/src/toolbar/toolbar.d.ts +2 -1
  49. package/src/toolbar/toolbar.js +30 -24
  50. package/src/treeview/treeview-model.d.ts +323 -323
  51. package/src/treeview/treeview.d.ts +3 -1
  52. package/src/treeview/treeview.js +107 -87
  53. package/styles/accordion/_all.scss +2 -2
  54. package/styles/accordion/_bootstrap-dark-definition.scss +69 -69
  55. package/styles/accordion/_bootstrap-definition.scss +76 -76
  56. package/styles/accordion/_bootstrap4-definition.scss +82 -82
  57. package/styles/accordion/_fabric-dark-definition.scss +74 -74
  58. package/styles/accordion/_fabric-definition.scss +78 -78
  59. package/styles/accordion/_highcontrast-definition.scss +106 -106
  60. package/styles/accordion/_highcontrast-light-definition.scss +104 -104
  61. package/styles/accordion/_layout.scss +447 -447
  62. package/styles/accordion/_material-dark-definition.scss +75 -75
  63. package/styles/accordion/_material-definition.scss +72 -72
  64. package/styles/accordion/_theme.scss +479 -479
  65. package/styles/accordion/icons/_bootstrap-dark.scss +17 -17
  66. package/styles/accordion/icons/_bootstrap.scss +17 -17
  67. package/styles/accordion/icons/_bootstrap4.scss +17 -17
  68. package/styles/accordion/icons/_fabric-dark.scss +17 -17
  69. package/styles/accordion/icons/_fabric.scss +17 -17
  70. package/styles/accordion/icons/_highcontrast-light.scss +17 -17
  71. package/styles/accordion/icons/_highcontrast.scss +17 -17
  72. package/styles/accordion/icons/_material-dark.scss +17 -17
  73. package/styles/accordion/icons/_material.scss +17 -17
  74. package/styles/accordion/material-dark.css +2 -2
  75. package/styles/bootstrap-dark.css +10 -9
  76. package/styles/bootstrap.css +10 -9
  77. package/styles/bootstrap4.css +10 -9
  78. package/styles/bootstrap5-dark.css +0 -0
  79. package/styles/bootstrap5-dark.scss +0 -0
  80. package/styles/bootstrap5.css +0 -0
  81. package/styles/bootstrap5.scss +0 -0
  82. package/styles/context-menu/_all.scss +2 -2
  83. package/styles/context-menu/_bootstrap-dark-definition.scss +54 -54
  84. package/styles/context-menu/_bootstrap-definition.scss +52 -52
  85. package/styles/context-menu/_bootstrap4-definition.scss +52 -52
  86. package/styles/context-menu/_fabric-dark-definition.scss +54 -54
  87. package/styles/context-menu/_fabric-definition.scss +52 -52
  88. package/styles/context-menu/_highcontrast-definition.scss +52 -52
  89. package/styles/context-menu/_highcontrast-light-definition.scss +54 -54
  90. package/styles/context-menu/_layout-mixin.scss +175 -174
  91. package/styles/context-menu/_layout.scss +70 -70
  92. package/styles/context-menu/_material-dark-definition.scss +54 -54
  93. package/styles/context-menu/_material-definition.scss +52 -52
  94. package/styles/context-menu/_theme-mixin.scss +59 -59
  95. package/styles/context-menu/_theme.scss +36 -36
  96. package/styles/context-menu/bootstrap-dark.css +1 -1
  97. package/styles/context-menu/bootstrap.css +1 -1
  98. package/styles/context-menu/bootstrap4.css +1 -1
  99. package/styles/context-menu/fabric-dark.css +1 -1
  100. package/styles/context-menu/fabric.css +1 -1
  101. package/styles/context-menu/highcontrast-light.css +1 -1
  102. package/styles/context-menu/highcontrast.css +1 -1
  103. package/styles/context-menu/icons/_bootstrap-dark.scss +30 -30
  104. package/styles/context-menu/icons/_bootstrap.scss +30 -30
  105. package/styles/context-menu/icons/_bootstrap4.scss +30 -30
  106. package/styles/context-menu/icons/_fabric-dark.scss +30 -30
  107. package/styles/context-menu/icons/_fabric.scss +30 -30
  108. package/styles/context-menu/icons/_highcontrast-light.scss +30 -30
  109. package/styles/context-menu/icons/_highcontrast.scss +30 -30
  110. package/styles/context-menu/icons/_material-dark.scss +30 -30
  111. package/styles/context-menu/icons/_material.scss +30 -30
  112. package/styles/context-menu/material-dark.css +1 -1
  113. package/styles/context-menu/material.css +4 -4
  114. package/styles/fabric-dark.css +10 -9
  115. package/styles/fabric.css +10 -9
  116. package/styles/h-scroll/_all.scss +2 -2
  117. package/styles/h-scroll/_bootstrap-dark-definition.scss +49 -49
  118. package/styles/h-scroll/_bootstrap-definition.scss +50 -50
  119. package/styles/h-scroll/_bootstrap4-definition.scss +49 -49
  120. package/styles/h-scroll/_fabric-dark-definition.scss +50 -50
  121. package/styles/h-scroll/_fabric-definition.scss +48 -48
  122. package/styles/h-scroll/_highcontrast-definition.scss +52 -52
  123. package/styles/h-scroll/_highcontrast-light-definition.scss +54 -54
  124. package/styles/h-scroll/_layout.scss +198 -198
  125. package/styles/h-scroll/_material-dark-definition.scss +77 -77
  126. package/styles/h-scroll/_material-definition.scss +77 -77
  127. package/styles/h-scroll/_theme.scss +157 -157
  128. package/styles/h-scroll/icons/_bootstrap-dark.scss +49 -49
  129. package/styles/h-scroll/icons/_bootstrap.scss +49 -49
  130. package/styles/h-scroll/icons/_bootstrap4.scss +49 -49
  131. package/styles/h-scroll/icons/_fabric-dark.scss +49 -49
  132. package/styles/h-scroll/icons/_fabric.scss +49 -49
  133. package/styles/h-scroll/icons/_highcontrast-light.scss +49 -49
  134. package/styles/h-scroll/icons/_highcontrast.scss +49 -49
  135. package/styles/h-scroll/icons/_material-dark.scss +49 -49
  136. package/styles/h-scroll/icons/_material.scss +49 -49
  137. package/styles/highcontrast-light.css +10 -9
  138. package/styles/highcontrast.css +10 -9
  139. package/styles/material-dark.css +12 -11
  140. package/styles/material.css +24 -14
  141. package/styles/menu/_all.scss +2 -2
  142. package/styles/menu/_bootstrap-dark-definition.scss +63 -63
  143. package/styles/menu/_bootstrap-definition.scss +65 -65
  144. package/styles/menu/_bootstrap4-definition.scss +64 -64
  145. package/styles/menu/_fabric-dark-definition.scss +63 -63
  146. package/styles/menu/_fabric-definition.scss +64 -64
  147. package/styles/menu/_highcontrast-definition.scss +65 -65
  148. package/styles/menu/_highcontrast-light-definition.scss +61 -61
  149. package/styles/menu/_layout.scss +638 -637
  150. package/styles/menu/_material-dark-definition.scss +63 -63
  151. package/styles/menu/_material-definition.scss +64 -64
  152. package/styles/menu/_theme.scss +243 -243
  153. package/styles/menu/bootstrap-dark.css +2 -1
  154. package/styles/menu/bootstrap.css +2 -1
  155. package/styles/menu/bootstrap.scss +1 -0
  156. package/styles/menu/bootstrap4.css +2 -1
  157. package/styles/menu/fabric-dark.css +2 -1
  158. package/styles/menu/fabric.css +2 -1
  159. package/styles/menu/fabric.scss +1 -0
  160. package/styles/menu/highcontrast-light.css +2 -1
  161. package/styles/menu/highcontrast.css +2 -1
  162. package/styles/menu/highcontrast.scss +1 -0
  163. package/styles/menu/icons/_bootstrap-dark.scss +127 -127
  164. package/styles/menu/icons/_bootstrap.scss +127 -127
  165. package/styles/menu/icons/_bootstrap4.scss +127 -127
  166. package/styles/menu/icons/_fabric-dark.scss +127 -127
  167. package/styles/menu/icons/_fabric.scss +127 -127
  168. package/styles/menu/icons/_highcontrast-light.scss +127 -127
  169. package/styles/menu/icons/_highcontrast.scss +127 -127
  170. package/styles/menu/icons/_material-dark.scss +127 -127
  171. package/styles/menu/icons/_material.scss +127 -127
  172. package/styles/menu/material-dark.css +2 -1
  173. package/styles/menu/material.css +4 -3
  174. package/styles/menu/material.scss +1 -0
  175. package/styles/sidebar/_all.scss +3 -3
  176. package/styles/sidebar/_bootstrap-dark-definition.scss +4 -4
  177. package/styles/sidebar/_bootstrap-definition.scss +4 -4
  178. package/styles/sidebar/_bootstrap4-definition.scss +4 -4
  179. package/styles/sidebar/_fabric-dark-definition.scss +4 -4
  180. package/styles/sidebar/_fabric-definition.scss +6 -6
  181. package/styles/sidebar/_highcontrast-definition.scss +4 -4
  182. package/styles/sidebar/_highcontrast-light-definition.scss +4 -4
  183. package/styles/sidebar/_icons.scss +1 -1
  184. package/styles/sidebar/_material-dark-definition.scss +4 -4
  185. package/styles/sidebar/_material-definition.scss +6 -6
  186. package/styles/sidebar/_theme.scss +168 -168
  187. package/styles/sidebar/bootstrap-dark.css +0 -1
  188. package/styles/sidebar/bootstrap.css +0 -1
  189. package/styles/sidebar/bootstrap4.css +0 -1
  190. package/styles/sidebar/fabric-dark.css +0 -1
  191. package/styles/sidebar/fabric.css +0 -1
  192. package/styles/sidebar/highcontrast-light.css +0 -1
  193. package/styles/sidebar/highcontrast.css +0 -1
  194. package/styles/sidebar/material-dark.css +0 -1
  195. package/styles/sidebar/material.css +0 -1
  196. package/styles/tab/_all.scss +2 -2
  197. package/styles/tab/_bootstrap-dark-definition.scss +386 -386
  198. package/styles/tab/_bootstrap-definition.scss +396 -396
  199. package/styles/tab/_bootstrap4-definition.scss +401 -401
  200. package/styles/tab/_fabric-dark-definition.scss +394 -394
  201. package/styles/tab/_fabric-definition.scss +410 -410
  202. package/styles/tab/_highcontrast-definition.scss +434 -434
  203. package/styles/tab/_highcontrast-light-definition.scss +423 -423
  204. package/styles/tab/_icons.scss +43 -43
  205. package/styles/tab/_layout.scss +3528 -3521
  206. package/styles/tab/_material-dark-definition.scss +407 -407
  207. package/styles/tab/_material-definition.scss +416 -416
  208. package/styles/tab/_theme.scss +1751 -1751
  209. package/styles/tab/bootstrap-dark.css +7 -2
  210. package/styles/tab/bootstrap.css +7 -2
  211. package/styles/tab/bootstrap4.css +7 -2
  212. package/styles/tab/fabric-dark.css +7 -2
  213. package/styles/tab/fabric.css +7 -2
  214. package/styles/tab/highcontrast-light.css +7 -2
  215. package/styles/tab/highcontrast.css +7 -2
  216. package/styles/tab/icons/_bootstrap-dark.scss +132 -132
  217. package/styles/tab/icons/_bootstrap.scss +132 -132
  218. package/styles/tab/icons/_bootstrap4.scss +132 -132
  219. package/styles/tab/icons/_fabric-dark.scss +132 -132
  220. package/styles/tab/icons/_fabric.scss +132 -132
  221. package/styles/tab/icons/_highcontrast-light.scss +132 -132
  222. package/styles/tab/icons/_highcontrast.scss +132 -132
  223. package/styles/tab/icons/_material-dark.scss +132 -132
  224. package/styles/tab/icons/_material.scss +132 -132
  225. package/styles/tab/material-dark.css +7 -2
  226. package/styles/tab/material.css +7 -2
  227. package/styles/tailwind-dark.css +0 -0
  228. package/styles/tailwind-dark.scss +0 -0
  229. package/styles/tailwind.css +0 -0
  230. package/styles/tailwind.scss +0 -0
  231. package/styles/toolbar/_all.scss +2 -2
  232. package/styles/toolbar/_bootstrap-dark-definition.scss +135 -135
  233. package/styles/toolbar/_bootstrap-definition.scss +134 -134
  234. package/styles/toolbar/_bootstrap4-definition.scss +139 -139
  235. package/styles/toolbar/_fabric-dark-definition.scss +155 -155
  236. package/styles/toolbar/_fabric-definition.scss +139 -139
  237. package/styles/toolbar/_highcontrast-definition.scss +149 -149
  238. package/styles/toolbar/_highcontrast-light-definition.scss +164 -164
  239. package/styles/toolbar/_layout.scss +1460 -1460
  240. package/styles/toolbar/_material-dark-definition.scss +180 -180
  241. package/styles/toolbar/_material-definition.scss +164 -164
  242. package/styles/toolbar/_theme.scss +451 -451
  243. package/styles/toolbar/bootstrap-dark.css +0 -1
  244. package/styles/toolbar/bootstrap.css +0 -1
  245. package/styles/toolbar/bootstrap.scss +1 -0
  246. package/styles/toolbar/bootstrap4.css +0 -1
  247. package/styles/toolbar/fabric-dark.css +0 -1
  248. package/styles/toolbar/fabric.css +0 -1
  249. package/styles/toolbar/fabric.scss +1 -0
  250. package/styles/toolbar/highcontrast-light.css +0 -1
  251. package/styles/toolbar/highcontrast.css +0 -1
  252. package/styles/toolbar/highcontrast.scss +1 -0
  253. package/styles/toolbar/icons/_bootstrap-dark.scss +16 -16
  254. package/styles/toolbar/icons/_bootstrap.scss +16 -16
  255. package/styles/toolbar/icons/_bootstrap4.scss +16 -16
  256. package/styles/toolbar/icons/_fabric-dark.scss +16 -16
  257. package/styles/toolbar/icons/_fabric.scss +16 -16
  258. package/styles/toolbar/icons/_highcontrast-light.scss +16 -16
  259. package/styles/toolbar/icons/_highcontrast.scss +16 -16
  260. package/styles/toolbar/icons/_material-dark.scss +16 -16
  261. package/styles/toolbar/icons/_material.scss +16 -16
  262. package/styles/toolbar/material-dark.css +0 -1
  263. package/styles/toolbar/material.css +0 -1
  264. package/styles/toolbar/material.scss +1 -0
  265. package/styles/treeview/_all.scss +2 -2
  266. package/styles/treeview/_bootstrap-dark-definition.scss +131 -131
  267. package/styles/treeview/_bootstrap-definition.scss +127 -127
  268. package/styles/treeview/_bootstrap4-definition.scss +153 -153
  269. package/styles/treeview/_fabric-dark-definition.scss +130 -130
  270. package/styles/treeview/_fabric-definition.scss +126 -126
  271. package/styles/treeview/_highcontrast-definition.scss +132 -132
  272. package/styles/treeview/_highcontrast-light-definition.scss +137 -137
  273. package/styles/treeview/_layout.scss +551 -551
  274. package/styles/treeview/_material-dark-definition.scss +126 -126
  275. package/styles/treeview/_material-definition.scss +126 -126
  276. package/styles/treeview/_theme.scss +331 -331
  277. package/styles/treeview/bootstrap-dark.css +0 -3
  278. package/styles/treeview/bootstrap.css +0 -3
  279. package/styles/treeview/bootstrap4.css +0 -3
  280. package/styles/treeview/fabric-dark.css +0 -3
  281. package/styles/treeview/fabric.css +0 -3
  282. package/styles/treeview/highcontrast-light.css +0 -3
  283. package/styles/treeview/highcontrast.css +0 -3
  284. package/styles/treeview/icons/_bootstrap-dark.scss +39 -39
  285. package/styles/treeview/icons/_bootstrap.scss +39 -39
  286. package/styles/treeview/icons/_bootstrap4.scss +39 -39
  287. package/styles/treeview/icons/_fabric-dark.scss +43 -43
  288. package/styles/treeview/icons/_fabric.scss +43 -43
  289. package/styles/treeview/icons/_highcontrast-light.scss +43 -43
  290. package/styles/treeview/icons/_highcontrast.scss +43 -43
  291. package/styles/treeview/icons/_material-dark.scss +43 -43
  292. package/styles/treeview/icons/_material.scss +43 -43
  293. package/styles/treeview/material-dark.css +0 -3
  294. package/styles/treeview/material.css +9 -3
  295. package/styles/v-scroll/_all.scss +2 -2
  296. package/styles/v-scroll/_bootstrap-dark-definition.scss +50 -50
  297. package/styles/v-scroll/_bootstrap-definition.scss +49 -49
  298. package/styles/v-scroll/_bootstrap4-definition.scss +49 -49
  299. package/styles/v-scroll/_fabric-dark-definition.scss +51 -51
  300. package/styles/v-scroll/_fabric-definition.scss +50 -50
  301. package/styles/v-scroll/_highcontrast-definition.scss +51 -51
  302. package/styles/v-scroll/_highcontrast-light-definition.scss +52 -52
  303. package/styles/v-scroll/_layout.scss +162 -162
  304. package/styles/v-scroll/_material-dark-definition.scss +78 -78
  305. package/styles/v-scroll/_material-definition.scss +77 -77
  306. package/styles/v-scroll/_theme.scss +133 -133
  307. package/styles/v-scroll/icons/_bootstrap-dark.scss +26 -26
  308. package/styles/v-scroll/icons/_bootstrap.scss +26 -26
  309. package/styles/v-scroll/icons/_bootstrap4.scss +26 -26
  310. package/styles/v-scroll/icons/_fabric-dark.scss +26 -26
  311. package/styles/v-scroll/icons/_fabric.scss +26 -26
  312. package/styles/v-scroll/icons/_highcontrast-light.scss +26 -26
  313. package/styles/v-scroll/icons/_highcontrast.scss +26 -26
  314. package/styles/v-scroll/icons/_material-dark.scss +26 -26
  315. package/styles/v-scroll/icons/_material.scss +26 -26
  316. package/tslint.json +111 -0
@@ -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
+ }