@ohos-ports/flowbite-datepicker 2.0.0-beta.0

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 (291) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc.js +73 -0
  3. package/.stylelintrc +12 -0
  4. package/CHANGELOG.md +72 -0
  5. package/LICENSE +21 -0
  6. package/README.md +71 -0
  7. package/demo/index.html +582 -0
  8. package/demo/live-demo.js +471 -0
  9. package/dist/DateRangePicker.cjs.js +2996 -0
  10. package/dist/DateRangePicker.esm.js +2994 -0
  11. package/dist/DateRangePicker.umd.js +3002 -0
  12. package/dist/Datepicker.cjs.js +2778 -0
  13. package/dist/Datepicker.esm.js +2776 -0
  14. package/dist/Datepicker.umd.js +2784 -0
  15. package/dist/css/datepicker-bs4.css +276 -0
  16. package/dist/css/datepicker-bs4.min.css +1 -0
  17. package/dist/css/datepicker-bs5.css +276 -0
  18. package/dist/css/datepicker-bs5.min.css +1 -0
  19. package/dist/css/datepicker-bulma.css +258 -0
  20. package/dist/css/datepicker-bulma.min.css +1 -0
  21. package/dist/css/datepicker-foundation.css +262 -0
  22. package/dist/css/datepicker-foundation.min.css +1 -0
  23. package/dist/css/datepicker.css +306 -0
  24. package/dist/css/datepicker.min.css +1403 -0
  25. package/dist/js/datepicker-full.js +2777 -0
  26. package/dist/js/datepicker-full.min.js +1 -0
  27. package/dist/js/datepicker.js +2569 -0
  28. package/dist/js/datepicker.min.js +1 -0
  29. package/dist/js/locales/ar-tn.js +15 -0
  30. package/dist/js/locales/ar.js +15 -0
  31. package/dist/js/locales/az.js +14 -0
  32. package/dist/js/locales/bg.js +14 -0
  33. package/dist/js/locales/bm.js +18 -0
  34. package/dist/js/locales/bn.js +19 -0
  35. package/dist/js/locales/br.js +18 -0
  36. package/dist/js/locales/bs.js +15 -0
  37. package/dist/js/locales/ca.js +18 -0
  38. package/dist/js/locales/cs.js +19 -0
  39. package/dist/js/locales/cy.js +14 -0
  40. package/dist/js/locales/da.js +19 -0
  41. package/dist/js/locales/de.js +18 -0
  42. package/dist/js/locales/el.js +16 -0
  43. package/dist/js/locales/en-AU.js +18 -0
  44. package/dist/js/locales/en-CA.js +18 -0
  45. package/dist/js/locales/en-GB.js +18 -0
  46. package/dist/js/locales/en-IE.js +17 -0
  47. package/dist/js/locales/en-NZ.js +17 -0
  48. package/dist/js/locales/en-ZA.js +17 -0
  49. package/dist/js/locales/eo.js +17 -0
  50. package/dist/js/locales/es.js +18 -0
  51. package/dist/js/locales/et.js +18 -0
  52. package/dist/js/locales/eu.js +18 -0
  53. package/dist/js/locales/fa.js +17 -0
  54. package/dist/js/locales/fi.js +17 -0
  55. package/dist/js/locales/fo.js +15 -0
  56. package/dist/js/locales/fr-CH.js +21 -0
  57. package/dist/js/locales/fr.js +18 -0
  58. package/dist/js/locales/gl.js +16 -0
  59. package/dist/js/locales/he.js +15 -0
  60. package/dist/js/locales/hi.js +18 -0
  61. package/dist/js/locales/hr.js +13 -0
  62. package/dist/js/locales/hu.js +18 -0
  63. package/dist/js/locales/hy.js +18 -0
  64. package/dist/js/locales/id.js +15 -0
  65. package/dist/js/locales/is.js +14 -0
  66. package/dist/js/locales/it-CH.js +20 -0
  67. package/dist/js/locales/it.js +18 -0
  68. package/dist/js/locales/ja.js +17 -0
  69. package/dist/js/locales/ka.js +17 -0
  70. package/dist/js/locales/kk.js +15 -0
  71. package/dist/js/locales/km.js +15 -0
  72. package/dist/js/locales/ko.js +18 -0
  73. package/dist/js/locales/lt.js +19 -0
  74. package/dist/js/locales/lv.js +18 -0
  75. package/dist/js/locales/me.js +17 -0
  76. package/dist/js/locales/mk.js +15 -0
  77. package/dist/js/locales/mn.js +17 -0
  78. package/dist/js/locales/mr.js +18 -0
  79. package/dist/js/locales/ms.js +15 -0
  80. package/dist/js/locales/nl-BE.js +18 -0
  81. package/dist/js/locales/nl.js +18 -0
  82. package/dist/js/locales/no.js +18 -0
  83. package/dist/js/locales/oc.js +17 -0
  84. package/dist/js/locales/pl.js +17 -0
  85. package/dist/js/locales/pt-BR.js +17 -0
  86. package/dist/js/locales/pt.js +18 -0
  87. package/dist/js/locales/ro.js +17 -0
  88. package/dist/js/locales/ru.js +18 -0
  89. package/dist/js/locales/si.js +18 -0
  90. package/dist/js/locales/sk.js +18 -0
  91. package/dist/js/locales/sl.js +15 -0
  92. package/dist/js/locales/sq.js +18 -0
  93. package/dist/js/locales/sr-latn.js +16 -0
  94. package/dist/js/locales/sr.js +16 -0
  95. package/dist/js/locales/sv.js +17 -0
  96. package/dist/js/locales/sw.js +15 -0
  97. package/dist/js/locales/ta.js +18 -0
  98. package/dist/js/locales/tg.js +19 -0
  99. package/dist/js/locales/th.js +14 -0
  100. package/dist/js/locales/tk.js +18 -0
  101. package/dist/js/locales/tr.js +17 -0
  102. package/dist/js/locales/uk.js +17 -0
  103. package/dist/js/locales/uz-cyrl.js +18 -0
  104. package/dist/js/locales/uz-latn.js +18 -0
  105. package/dist/js/locales/vi.js +16 -0
  106. package/dist/js/locales/zh-CN.js +19 -0
  107. package/dist/js/locales/zh-TW.js +18 -0
  108. package/dist/locales/index.cjs.js +1028 -0
  109. package/dist/locales/index.esm.js +1028 -0
  110. package/dist/main.cjs.js +2999 -0
  111. package/dist/main.esm.js +2994 -0
  112. package/dist/main.umd.js +3005 -0
  113. package/docs/.nojekyll +0 -0
  114. package/docs/README.md +266 -0
  115. package/docs/_sidebar.md +6 -0
  116. package/docs/api.md +284 -0
  117. package/docs/date-string+format.md +90 -0
  118. package/docs/i18n.md +99 -0
  119. package/docs/images/datepicker-inline.jpg +0 -0
  120. package/docs/images/datepicker.jpg +0 -0
  121. package/docs/images/multidate.jpg +0 -0
  122. package/docs/images/picker-structure.jpg +0 -0
  123. package/docs/images/rangepicker.jpg +0 -0
  124. package/docs/images/view-days.jpg +0 -0
  125. package/docs/images/view-decades.jpg +0 -0
  126. package/docs/images/view-months.jpg +0 -0
  127. package/docs/images/view-years.jpg +0 -0
  128. package/docs/index.html +26 -0
  129. package/docs/options.md +354 -0
  130. package/docs/overview.md +174 -0
  131. package/extras/twoDigitToFullYear/test/twoDigitToFullYear.js +58 -0
  132. package/extras/twoDigitToFullYear/twoDigitToFullYear.js +26 -0
  133. package/js/DateRangePicker.js +210 -0
  134. package/js/Datepicker.js +487 -0
  135. package/js/datepicker-full.js +5 -0
  136. package/js/events/functions.js +48 -0
  137. package/js/events/inputFieldListeners.js +206 -0
  138. package/js/events/otherListeners.js +15 -0
  139. package/js/events/pickerListeners.js +70 -0
  140. package/js/i18n/base-locales.js +13 -0
  141. package/js/i18n/locales/ar-tn.js +15 -0
  142. package/js/i18n/locales/ar.js +15 -0
  143. package/js/i18n/locales/az.js +14 -0
  144. package/js/i18n/locales/bg.js +14 -0
  145. package/js/i18n/locales/bm.js +18 -0
  146. package/js/i18n/locales/bn.js +19 -0
  147. package/js/i18n/locales/br.js +18 -0
  148. package/js/i18n/locales/bs.js +15 -0
  149. package/js/i18n/locales/ca.js +18 -0
  150. package/js/i18n/locales/cs.js +19 -0
  151. package/js/i18n/locales/cy.js +14 -0
  152. package/js/i18n/locales/da.js +19 -0
  153. package/js/i18n/locales/de.js +18 -0
  154. package/js/i18n/locales/el.js +16 -0
  155. package/js/i18n/locales/en-AU.js +18 -0
  156. package/js/i18n/locales/en-CA.js +18 -0
  157. package/js/i18n/locales/en-GB.js +18 -0
  158. package/js/i18n/locales/en-IE.js +17 -0
  159. package/js/i18n/locales/en-NZ.js +17 -0
  160. package/js/i18n/locales/en-ZA.js +17 -0
  161. package/js/i18n/locales/eo.js +17 -0
  162. package/js/i18n/locales/es.js +18 -0
  163. package/js/i18n/locales/et.js +18 -0
  164. package/js/i18n/locales/eu.js +18 -0
  165. package/js/i18n/locales/fa.js +17 -0
  166. package/js/i18n/locales/fi.js +17 -0
  167. package/js/i18n/locales/fo.js +15 -0
  168. package/js/i18n/locales/fr-CH.js +21 -0
  169. package/js/i18n/locales/fr.js +18 -0
  170. package/js/i18n/locales/gl.js +16 -0
  171. package/js/i18n/locales/he.js +15 -0
  172. package/js/i18n/locales/hi.js +18 -0
  173. package/js/i18n/locales/hr.js +13 -0
  174. package/js/i18n/locales/hu.js +18 -0
  175. package/js/i18n/locales/hy.js +18 -0
  176. package/js/i18n/locales/id.js +15 -0
  177. package/js/i18n/locales/is.js +14 -0
  178. package/js/i18n/locales/it-CH.js +20 -0
  179. package/js/i18n/locales/it.js +18 -0
  180. package/js/i18n/locales/ja.js +17 -0
  181. package/js/i18n/locales/ka.js +17 -0
  182. package/js/i18n/locales/kk.js +15 -0
  183. package/js/i18n/locales/km.js +15 -0
  184. package/js/i18n/locales/ko.js +18 -0
  185. package/js/i18n/locales/lt.js +19 -0
  186. package/js/i18n/locales/lv.js +18 -0
  187. package/js/i18n/locales/me.js +17 -0
  188. package/js/i18n/locales/mk.js +15 -0
  189. package/js/i18n/locales/mn.js +17 -0
  190. package/js/i18n/locales/mr.js +18 -0
  191. package/js/i18n/locales/ms.js +15 -0
  192. package/js/i18n/locales/nl-BE.js +18 -0
  193. package/js/i18n/locales/nl.js +18 -0
  194. package/js/i18n/locales/no.js +18 -0
  195. package/js/i18n/locales/oc.js +17 -0
  196. package/js/i18n/locales/pl.js +17 -0
  197. package/js/i18n/locales/pt-BR.js +17 -0
  198. package/js/i18n/locales/pt.js +18 -0
  199. package/js/i18n/locales/ro.js +17 -0
  200. package/js/i18n/locales/ru.js +18 -0
  201. package/js/i18n/locales/si.js +18 -0
  202. package/js/i18n/locales/sk.js +18 -0
  203. package/js/i18n/locales/sl.js +15 -0
  204. package/js/i18n/locales/sq.js +18 -0
  205. package/js/i18n/locales/sr-latn.js +16 -0
  206. package/js/i18n/locales/sr.js +16 -0
  207. package/js/i18n/locales/sv.js +17 -0
  208. package/js/i18n/locales/sw.js +15 -0
  209. package/js/i18n/locales/ta.js +18 -0
  210. package/js/i18n/locales/tg.js +19 -0
  211. package/js/i18n/locales/th.js +14 -0
  212. package/js/i18n/locales/tk.js +18 -0
  213. package/js/i18n/locales/tr.js +17 -0
  214. package/js/i18n/locales/uk.js +17 -0
  215. package/js/i18n/locales/uz-cyrl.js +18 -0
  216. package/js/i18n/locales/uz-latn.js +18 -0
  217. package/js/i18n/locales/vi.js +16 -0
  218. package/js/i18n/locales/zh-CN.js +19 -0
  219. package/js/i18n/locales/zh-TW.js +18 -0
  220. package/js/lib/date-format.js +185 -0
  221. package/js/lib/date.js +82 -0
  222. package/js/lib/dom.js +55 -0
  223. package/js/lib/event.js +68 -0
  224. package/js/lib/utils.js +61 -0
  225. package/js/main.js +4 -0
  226. package/js/options/defaultOptions.js +38 -0
  227. package/js/options/processOptions.js +263 -0
  228. package/js/picker/Picker.js +334 -0
  229. package/js/picker/templates/calendarWeeksTemplate.js +8 -0
  230. package/js/picker/templates/daysTemplate.js +8 -0
  231. package/js/picker/templates/pickerTemplate.js +23 -0
  232. package/js/picker/views/DaysView.js +250 -0
  233. package/js/picker/views/MonthsView.js +198 -0
  234. package/js/picker/views/View.js +55 -0
  235. package/js/picker/views/YearsView.js +170 -0
  236. package/package.json +81 -0
  237. package/postcss.config.js +5 -0
  238. package/rollup.config.js +75 -0
  239. package/sass/_mixins.scss +12 -0
  240. package/sass/datepicker-bs4.scss +91 -0
  241. package/sass/datepicker-bs5.scss +91 -0
  242. package/sass/datepicker-bulma.scss +69 -0
  243. package/sass/datepicker-foundation.scss +66 -0
  244. package/sass/datepicker.scss +436 -0
  245. package/sass/index-bs4.scss +5 -0
  246. package/sass/index-bs5.scss +5 -0
  247. package/sass/index-bulma.scss +6 -0
  248. package/sass/index-foundation.scss +3 -0
  249. package/scripts/build-css.js +39 -0
  250. package/scripts/build-locales.js +57 -0
  251. package/scripts/convert-bsdp-locales.js +65 -0
  252. package/scripts/minify-css.js +31 -0
  253. package/scripts/minify-js.js +17 -0
  254. package/style.css +10 -0
  255. package/tailwind.config.js +16 -0
  256. package/tailwind.css +1389 -0
  257. package/test/DateRangePicker/DateRangePicker.js +547 -0
  258. package/test/DateRangePicker/api-methods.js +415 -0
  259. package/test/DateRangePicker/date-selection.js +472 -0
  260. package/test/DateRangePicker/options.js +308 -0
  261. package/test/Datepicker/Datepicker-object.js +236 -0
  262. package/test/Datepicker/api-methods.js +328 -0
  263. package/test/_utils/date.js +102 -0
  264. package/test/_utils/dom.js +70 -0
  265. package/test/events.js +785 -0
  266. package/test/inline-mode.js +45 -0
  267. package/test/keyboard-operation/arrow-down.js +293 -0
  268. package/test/keyboard-operation/arrow-left.js +255 -0
  269. package/test/keyboard-operation/arrow-right.js +215 -0
  270. package/test/keyboard-operation/arrow-up.js +461 -0
  271. package/test/keyboard-operation/edit-mode.js +458 -0
  272. package/test/keyboard-operation/keyboard-operation.js +146 -0
  273. package/test/mouse-operation.js +580 -0
  274. package/test/options/before-show.js +635 -0
  275. package/test/options/bulma-datepicker.sublime-workspace +1280 -0
  276. package/test/options/buttons.js +383 -0
  277. package/test/options/date-restrictions.js +802 -0
  278. package/test/options/format.js +281 -0
  279. package/test/options/multidate.js +380 -0
  280. package/test/options/options.js +727 -0
  281. package/test/options/orientation.js +410 -0
  282. package/test/options/pick-levle+view.js +357 -0
  283. package/test/test.html +94 -0
  284. package/test/unit/DateRangePicker.js +192 -0
  285. package/test/unit/Datepicker.js +307 -0
  286. package/test/unit/_setup.js +28 -0
  287. package/test/unit/lib/date-format.js +310 -0
  288. package/test/unit/lib/date.js +211 -0
  289. package/test/unit/lib/dom.js +142 -0
  290. package/test/unit/lib/event.js +207 -0
  291. package/test/unit/lib/utils.js +135 -0
@@ -0,0 +1,580 @@
1
+ describe('mouse operation', function () {
2
+ let clock;
3
+ let input;
4
+
5
+ before(function () {
6
+ clock = sinon.useFakeTimers({now: new Date(2020, 1, 14)});
7
+ input = document.createElement('input');
8
+ testContainer.appendChild(input);
9
+ });
10
+
11
+ after(function () {
12
+ clock.restore();
13
+ testContainer.removeChild(input);
14
+ });
15
+
16
+ it('picker hides if mouse is pressed outside the picker or the input', function () {
17
+ const outsider = document.createElement('p');
18
+ testContainer.appendChild(outsider);
19
+
20
+ const {dp, picker} = createDP(input);
21
+ input.focus();
22
+
23
+ simulant.fire(picker.querySelector('.dow'), 'mousedown');
24
+ expect(isVisible(picker), 'to be true');
25
+
26
+ simulant.fire(input, 'mousedown');
27
+ expect(isVisible(picker), 'to be true');
28
+
29
+ simulant.fire(outsider, 'mousedown');
30
+ expect(isVisible(picker), 'to be false');
31
+
32
+ // hide() should not called when picker is hidden
33
+ // (issue #45)
34
+ const spyHide = sinon.spy(dp, 'hide');
35
+ input.blur();
36
+
37
+ simulant.fire(outsider, 'mousedown');
38
+ expect(spyHide.called, 'to be false');
39
+
40
+ spyHide.restore();
41
+
42
+ // picker shown programmatically should be closed by clicking outside
43
+ // (issue #52)
44
+ dp.show();
45
+
46
+ simulant.fire(outsider, 'mousedown');
47
+ expect(isVisible(picker), 'to be false');
48
+
49
+ dp.destroy();
50
+ testContainer.removeChild(outsider);
51
+ });
52
+
53
+ it('selection is updated with input\'s value if mouse is pressed outside the input', function () {
54
+ const outsider = document.createElement('p');
55
+ testContainer.appendChild(outsider);
56
+
57
+ const {dp, picker} = createDP(input);
58
+ // when picker is shown
59
+ input.focus();
60
+ input.value = 'foo';
61
+
62
+ simulant.fire(picker.querySelector('.dow'), 'mousedown');
63
+ expect(input.value, 'to be', 'foo');
64
+
65
+ simulant.fire(input, 'mousedown');
66
+ expect(input.value, 'to be', 'foo');
67
+
68
+ simulant.fire(outsider, 'mousedown');
69
+ expect(input.value, 'to be', '02/14/2020');
70
+ expect(dp.getDate().getTime(), 'to be', dateValue(2020, 1, 14));
71
+
72
+ // when picker is hidden
73
+ input.focus();
74
+ input.value = '04/22/2020';
75
+
76
+ simulant.fire(outsider, 'mousedown');
77
+ expect(input.value, 'to be', '04/22/2020');
78
+ expect(dp.getDate().getTime(), 'to be', dateValue(2020, 3, 22));
79
+
80
+ input.focus();
81
+ input.value = '';
82
+
83
+ simulant.fire(outsider, 'mousedown');
84
+ expect(input.value, 'to be', '');
85
+ expect(dp.getDate(), 'to be undefined');
86
+
87
+ dp.destroy();
88
+ testContainer.removeChild(outsider);
89
+ });
90
+
91
+ it('picker shows up if input field is clicked wheh picker is hidden', function () {
92
+ const {dp, picker} = createDP(input);
93
+ // when input field is not focued
94
+ simulant.fire(input, 'mousedown');
95
+ input.click();
96
+ expect(isVisible(picker), 'to be true');
97
+
98
+ dp.hide();
99
+
100
+ // when input has focus
101
+ simulant.fire(input, 'mousedown');
102
+ input.click();
103
+ expect(isVisible(picker), 'to be true');
104
+
105
+ dp.destroy();
106
+ });
107
+
108
+ describe('view-switch', function () {
109
+ it('changes the view to the next greater one', function () {
110
+ input.value = '04/22/2020';
111
+
112
+ const {dp, picker} = createDP(input);
113
+ const viewSwitch = getViewSwitch(picker);
114
+ dp.show();
115
+
116
+ viewSwitch.click();
117
+ expect(viewSwitch.textContent, 'to be', '2020');
118
+ expect(input.value, 'to be', '04/22/2020');
119
+
120
+ let cells = getCells(picker);
121
+ expect(cells.map(el => el.textContent), 'to equal', Datepicker.locales.en.monthsShort);
122
+ expect(cells[3].classList.contains('selected'), 'to be true');
123
+ expect(cells[3].classList.contains('focused'), 'to be true');
124
+
125
+ viewSwitch.click();
126
+ expect(viewSwitch.textContent, 'to be', '2020-2029');
127
+ expect(input.value, 'to be', '04/22/2020');
128
+
129
+ cells = getCells(picker);
130
+ expect(cells, 'to have length', 12);
131
+ expect(cells[0].textContent, 'to be', '2019');
132
+ expect(cells[0].classList.contains('prev'), 'to be true');
133
+ expect(cells[0].classList.contains('next'), 'to be false');
134
+ expect(cells[1].textContent, 'to be', '2020');
135
+ expect(cells[1].classList.contains('prev'), 'to be false');
136
+ expect(cells[1].classList.contains('next'), 'to be false');
137
+ expect(cells[10].textContent, 'to be', '2029');
138
+ expect(cells[10].classList.contains('prev'), 'to be false');
139
+ expect(cells[10].classList.contains('next'), 'to be false');
140
+ expect(cells[11].textContent, 'to be', '2030');
141
+ expect(cells[11].classList.contains('prev'), 'to be false');
142
+ expect(cells[11].classList.contains('next'), 'to be true');
143
+
144
+ expect(filterCells(cells, '.selected'), 'to equal', [cells[1]]);
145
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[1]]);
146
+
147
+ viewSwitch.click();
148
+ expect(viewSwitch.textContent, 'to be', '2000-2090');
149
+ expect(input.value, 'to be', '04/22/2020');
150
+
151
+ cells = getCells(picker);
152
+ expect(cells, 'to have length', 12);
153
+ expect(cells[0].textContent, 'to be', '1990');
154
+ expect(cells[0].classList.contains('prev'), 'to be true');
155
+ expect(cells[0].classList.contains('next'), 'to be false');
156
+ expect(cells[1].textContent, 'to be', '2000');
157
+ expect(cells[1].classList.contains('prev'), 'to be false');
158
+ expect(cells[1].classList.contains('next'), 'to be false');
159
+ expect(cells[10].textContent, 'to be', '2090');
160
+ expect(cells[10].classList.contains('prev'), 'to be false');
161
+ expect(cells[10].classList.contains('next'), 'to be false');
162
+ expect(cells[11].textContent, 'to be', '2100');
163
+ expect(cells[11].classList.contains('prev'), 'to be false');
164
+ expect(cells[11].classList.contains('next'), 'to be true');
165
+
166
+ expect(filterCells(cells, '.selected'), 'to equal', [cells[3]]);
167
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[3]]);
168
+ expect(cells[3].textContent, 'to be', '2020');
169
+
170
+ // does nothig if the view has reached to the max view
171
+ viewSwitch.click();
172
+ expect(viewSwitch.textContent, 'to be', '2000-2090');
173
+
174
+ dp.destroy();
175
+ input.value = '';
176
+ });
177
+ });
178
+
179
+ describe('prev-btn', function () {
180
+ it('changes the month/year/decade/century of the view to the previouse one', function () {
181
+ input.value = '04/22/2020';
182
+
183
+ const {dp, picker} = createDP(input);
184
+ const [viewSwitch, prevBtn] = getParts(picker, ['.view-switch', '.prev-btn']);
185
+ dp.show();
186
+
187
+ prevBtn.click();
188
+ expect(viewSwitch.textContent, 'to be', 'March 2020');
189
+ expect(input.value, 'to be', '04/22/2020');
190
+
191
+ // view date is changed to the same day of the previous month
192
+ let cells = getCells(picker);
193
+ expect(cells, 'to have length', 42);
194
+ expect(cells[0].textContent, 'to be', '1');
195
+ expect(cells[0].classList.contains('prev'), 'to be false');
196
+ expect(cells[0].classList.contains('next'), 'to be false');
197
+ expect(cells[30].textContent, 'to be', '31');
198
+ expect(cells[30].classList.contains('prev'), 'to be false');
199
+ expect(cells[30].classList.contains('next'), 'to be false');
200
+ expect(cells[31].textContent, 'to be', '1');
201
+ expect(cells[31].classList.contains('prev'), 'to be false');
202
+ expect(cells[31].classList.contains('next'), 'to be true');
203
+ expect(cells[41].textContent, 'to be', '11');
204
+ expect(cells[41].classList.contains('prev'), 'to be false');
205
+ expect(cells[41].classList.contains('next'), 'to be true');
206
+
207
+ expect(filterCells(cells, '.selected'), 'to equal', []);
208
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[21]]);
209
+ expect(cells[21].textContent, 'to be', '22');
210
+
211
+ viewSwitch.click();
212
+ expect(viewSwitch.textContent, 'to be', '2020');
213
+ cells = getCells(picker);
214
+ expect(filterCells(cells, '.selected'), 'to equal', [cells[3]]);
215
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[2]]);
216
+
217
+ prevBtn.click();
218
+ expect(viewSwitch.textContent, 'to be', '2019');
219
+ expect(input.value, 'to be', '04/22/2020');
220
+
221
+ // view date is changed to the same month of the previous year
222
+ cells = getCells(picker);
223
+ expect(cells.map(el => el.textContent), 'to equal', Datepicker.locales.en.monthsShort);
224
+ expect(filterCells(cells, '.selected'), 'to equal', []);
225
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[2]]);
226
+
227
+ viewSwitch.click();
228
+ expect(viewSwitch.textContent, 'to be', '2010-2019');
229
+ cells = getCells(picker);
230
+ expect(filterCells(cells, '.selected'), 'to equal', [cells[11]]);
231
+ expect(cells[11].textContent, 'to be', '2020');
232
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[10]]);
233
+ expect(cells[10].textContent, 'to be', '2019');
234
+
235
+ prevBtn.click();
236
+ expect(viewSwitch.textContent, 'to be', '2000-2009');
237
+ expect(input.value, 'to be', '04/22/2020');
238
+
239
+ cells = getCells(picker);
240
+ expect(cells, 'to have length', 12);
241
+ expect(cells[0].textContent, 'to be', '1999');
242
+ expect(cells[1].textContent, 'to be', '2000');
243
+ expect(cells[10].textContent, 'to be', '2009');
244
+ expect(cells[11].textContent, 'to be', '2010');
245
+
246
+ expect(filterCells(cells, '.selected'), 'to equal', []);
247
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[10]]);
248
+
249
+ viewSwitch.click();
250
+ expect(viewSwitch.textContent, 'to be', '2000-2090');
251
+ cells = getCells(picker);
252
+ expect(filterCells(cells, '.selected'), 'to equal', [cells[3]]);
253
+ expect(cells[3].textContent, 'to be', '2020');
254
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[1]]);
255
+ expect(cells[1].textContent, 'to be', '2000');
256
+
257
+ prevBtn.click();
258
+ expect(viewSwitch.textContent, 'to be', '1900-1990');
259
+ expect(input.value, 'to be', '04/22/2020');
260
+
261
+ cells = getCells(picker);
262
+ expect(cells, 'to have length', 12);
263
+ expect(cells[0].textContent, 'to be', '1890');
264
+ expect(cells[1].textContent, 'to be', '1900');
265
+ expect(cells[10].textContent, 'to be', '1990');
266
+ expect(cells[11].textContent, 'to be', '2000');
267
+
268
+ expect(filterCells(cells, '.selected'), 'to equal', []);
269
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[1]]);
270
+
271
+ dp.destroy();
272
+ input.value = '';
273
+ });
274
+
275
+ it('controls the view date in days view to be in the prev month when moving from a longer month to shorter', function () {
276
+ input.value = '03/31/2019';
277
+
278
+ const {dp, picker} = createDP(input);
279
+ const [viewSwitch, prevBtn] = getParts(picker, ['.view-switch', '.prev-btn']);
280
+ dp.show();
281
+
282
+ prevBtn.click();
283
+ expect(viewSwitch.textContent, 'to be', 'February 2019');
284
+
285
+ let cells = getCells(picker);
286
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[32]]);
287
+ expect(cells[32].textContent, 'to be', '28');
288
+
289
+ input.value = '03/31/2020';
290
+ dp.update();
291
+ prevBtn.click();
292
+ expect(viewSwitch.textContent, 'to be', 'February 2020');
293
+
294
+ cells = getCells(picker);
295
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[34]]);
296
+ expect(cells[34].textContent, 'to be', '29');
297
+
298
+ input.value = '10/31/2020';
299
+ dp.update();
300
+ prevBtn.click();
301
+ expect(viewSwitch.textContent, 'to be', 'September 2020');
302
+
303
+ cells = getCells(picker);
304
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[31]]);
305
+ expect(cells[31].textContent, 'to be', '30');
306
+
307
+ dp.destroy();
308
+ input.value = '';
309
+ });
310
+
311
+ it('becomes disabled if the view includes the decade/year/month/day of 0000-01-01', function () {
312
+ input.value = '01/04/0000';
313
+
314
+ const {dp, picker} = createDP(input);
315
+ const [viewSwitch, prevBtn] = getParts(picker, ['.view-switch', '.prev-btn']);
316
+ dp.show();
317
+
318
+ expect(prevBtn.disabled, 'to be true');
319
+ prevBtn.click();
320
+ expect(viewSwitch.textContent, 'to be', 'January 0');
321
+
322
+ viewSwitch.click();
323
+
324
+ expect(prevBtn.disabled, 'to be true');
325
+ prevBtn.click();
326
+ expect(viewSwitch.textContent, 'to be', '0');
327
+
328
+ viewSwitch.click();
329
+
330
+ expect(prevBtn.disabled, 'to be true');
331
+ prevBtn.click();
332
+ expect(viewSwitch.textContent, 'to be', '0-9');
333
+
334
+ viewSwitch.click();
335
+
336
+ expect(prevBtn.disabled, 'to be true');
337
+ prevBtn.click();
338
+ expect(viewSwitch.textContent, 'to be', '0-90');
339
+
340
+ dp.destroy();
341
+ input.value = '';
342
+ });
343
+ });
344
+
345
+ describe('next-btn', function () {
346
+ it('changes the month/year/decade/century of the view to the next one', function () {
347
+ input.value = '04/22/2020';
348
+
349
+ const {dp, picker} = createDP(input);
350
+ const [viewSwitch, nextBtn] = getParts(picker, ['.view-switch', '.next-btn']);
351
+ dp.show();
352
+
353
+ nextBtn.click();
354
+ expect(viewSwitch.textContent, 'to be', 'May 2020');
355
+ expect(input.value, 'to be', '04/22/2020');
356
+
357
+ // view date is changed to the same day of the next month
358
+ let cells = getCells(picker);
359
+ expect(cells, 'to have length', 42);
360
+ expect(cells[0].textContent, 'to be', '26');
361
+ expect(cells[0].classList.contains('prev'), 'to be true');
362
+ expect(cells[0].classList.contains('next'), 'to be false');
363
+ expect(cells[4].textContent, 'to be', '30');
364
+ expect(cells[4].classList.contains('prev'), 'to be true');
365
+ expect(cells[4].classList.contains('next'), 'to be false');
366
+ expect(cells[5].textContent, 'to be', '1');
367
+ expect(cells[5].classList.contains('prev'), 'to be false');
368
+ expect(cells[5].classList.contains('next'), 'to be false');
369
+ expect(cells[35].textContent, 'to be', '31');
370
+ expect(cells[35].classList.contains('prev'), 'to be false');
371
+ expect(cells[35].classList.contains('next'), 'to be false');
372
+ expect(cells[36].textContent, 'to be', '1');
373
+ expect(cells[36].classList.contains('prev'), 'to be false');
374
+ expect(cells[36].classList.contains('next'), 'to be true');
375
+ expect(cells[41].textContent, 'to be', '6');
376
+ expect(cells[41].classList.contains('prev'), 'to be false');
377
+ expect(cells[41].classList.contains('next'), 'to be true');
378
+
379
+ expect(filterCells(cells, '.selected'), 'to equal', []);
380
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[26]]);
381
+ expect(cells[26].textContent, 'to be', '22');
382
+
383
+ viewSwitch.click();
384
+ expect(viewSwitch.textContent, 'to be', '2020');
385
+ cells = getCells(picker);
386
+ expect(filterCells(cells, '.selected'), 'to equal', [cells[3]]);
387
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[4]]);
388
+
389
+ nextBtn.click();
390
+ expect(viewSwitch.textContent, 'to be', '2021');
391
+ expect(input.value, 'to be', '04/22/2020');
392
+
393
+ // view date is changed to the same month of the previous year
394
+ cells = getCells(picker);
395
+ expect(cells.map(el => el.textContent), 'to equal', Datepicker.locales.en.monthsShort);
396
+ expect(filterCells(cells, '.selected'), 'to equal', []);
397
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[4]]);
398
+
399
+ viewSwitch.click();
400
+ expect(viewSwitch.textContent, 'to be', '2020-2029');
401
+ cells = getCells(picker);
402
+ expect(filterCells(cells, '.selected'), 'to equal', [cells[1]]);
403
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[2]]);
404
+ expect(cells[1].textContent, 'to be', '2020');
405
+ expect(cells[2].textContent, 'to be', '2021');
406
+
407
+ nextBtn.click();
408
+ expect(viewSwitch.textContent, 'to be', '2030-2039');
409
+ expect(input.value, 'to be', '04/22/2020');
410
+
411
+ cells = getCells(picker);
412
+ expect(cells, 'to have length', 12);
413
+ expect(cells[0].textContent, 'to be', '2029');
414
+ expect(cells[1].textContent, 'to be', '2030');
415
+ expect(cells[10].textContent, 'to be', '2039');
416
+ expect(cells[11].textContent, 'to be', '2040');
417
+
418
+ expect(filterCells(cells, '.selected'), 'to equal', []);
419
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[2]]);
420
+ expect(cells[2].textContent, 'to be', '2031');
421
+
422
+ viewSwitch.click();
423
+ expect(viewSwitch.textContent, 'to be', '2000-2090');
424
+ cells = getCells(picker);
425
+ expect(filterCells(cells, '.selected'), 'to equal', [cells[3]]);
426
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[4]]);
427
+ expect(cells[3].textContent, 'to be', '2020');
428
+ expect(cells[4].textContent, 'to be', '2030');
429
+
430
+ nextBtn.click();
431
+ expect(viewSwitch.textContent, 'to be', '2100-2190');
432
+ expect(input.value, 'to be', '04/22/2020');
433
+
434
+ cells = getCells(picker);
435
+ expect(cells, 'to have length', 12);
436
+ expect(cells[0].textContent, 'to be', '2090');
437
+ expect(cells[1].textContent, 'to be', '2100');
438
+ expect(cells[10].textContent, 'to be', '2190');
439
+ expect(cells[11].textContent, 'to be', '2200');
440
+
441
+ expect(filterCells(cells, '.selected'), 'to equal', []);
442
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[4]]);
443
+ expect(cells[4].textContent, 'to be', '2130');
444
+
445
+ dp.destroy();
446
+ input.value = '';
447
+ });
448
+
449
+ it('controls the view date in days view to be in the next month when moving from a longer month to shorter', function () {
450
+ input.value = '01/31/2019';
451
+
452
+ const {dp, picker} = createDP(input);
453
+ const [viewSwitch, nextBtn] = getParts(picker, ['.view-switch', '.next-btn']);
454
+ dp.show();
455
+
456
+ nextBtn.click();
457
+ expect(viewSwitch.textContent, 'to be', 'February 2019');
458
+
459
+ let cells = getCells(picker);
460
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[32]]);
461
+ expect(cells[32].textContent, 'to be', '28');
462
+
463
+ input.value = '01/31/2020';
464
+ dp.update();
465
+ nextBtn.click();
466
+ expect(viewSwitch.textContent, 'to be', 'February 2020');
467
+
468
+ cells = getCells(picker);
469
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[34]]);
470
+ expect(cells[34].textContent, 'to be', '29');
471
+
472
+ input.value = '08/31/2020';
473
+ dp.update();
474
+ nextBtn.click();
475
+ expect(viewSwitch.textContent, 'to be', 'September 2020');
476
+
477
+ cells = getCells(picker);
478
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[31]]);
479
+ expect(cells[31].textContent, 'to be', '30');
480
+
481
+ dp.destroy();
482
+ input.value = '';
483
+ });
484
+ });
485
+
486
+ describe('datepicker-cell', function () {
487
+ let dp;
488
+ let picker;
489
+
490
+ beforeEach(function () {
491
+ ({dp, picker} = createDP(input));
492
+ dp.show();
493
+ });
494
+
495
+ afterEach(function () {
496
+ dp.destroy();
497
+ });
498
+
499
+ it('changes the selection to the clicked date if the current view = days', function () {
500
+ const targetCell = getCells(picker)[19];
501
+ targetCell.click();
502
+
503
+ expect(dp.dates, 'to equal', [new Date(2020, 1, 14).getTime()]);
504
+ expect(input.value, 'to be', '02/14/2020');
505
+ expect(getViewSwitch(picker).textContent, 'to be', 'February 2020');
506
+ expect(targetCell.classList.contains('selected'), 'to be true');
507
+ expect(targetCell.classList.contains('focused'), 'to be true');
508
+
509
+ dp.setDate({clear: true});
510
+ });
511
+
512
+ it('also changes the month of the view if a date of previous or next month is clicked', function () {
513
+ const viewSwitch = getViewSwitch(picker);
514
+ getCells(picker)[1].click();
515
+
516
+ expect(dp.dates, 'to equal', [new Date(2020, 0, 27).getTime()]);
517
+ expect(input.value, 'to be', '01/27/2020');
518
+ expect(viewSwitch.textContent, 'to be', 'January 2020');
519
+
520
+ let cells = getCells(picker);
521
+ expect(filterCells(cells, '.selected'), 'to equal', [cells[29]]);
522
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[29]]);
523
+ expect(cells[29].textContent, 'to be', '27');
524
+
525
+ expect(cells[40].textContent, 'to be', '7');
526
+ cells[40].click();
527
+
528
+ expect(dp.dates, 'to equal', [dateValue(2020, 1, 7)]);
529
+ expect(input.value, 'to be', '02/07/2020');
530
+ expect(viewSwitch.textContent, 'to be', 'February 2020');
531
+
532
+ cells = getCells(picker);
533
+ expect(filterCells(cells, '.selected'), 'to equal', [cells[12]]);
534
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[12]]);
535
+ expect(cells[12].textContent, 'to be', '7');
536
+
537
+ dp.setDate({clear: true});
538
+ });
539
+
540
+ it('changes the view year or month to the clicked one and moves to the next minor view if the current view != days', function () {
541
+ const viewSwitch = getViewSwitch(picker);
542
+ viewSwitch.click();
543
+ viewSwitch.click();
544
+ viewSwitch.click();
545
+ viewSwitch.click();
546
+
547
+ // on decades view: 2000-2090
548
+ let cells = getCells(picker);
549
+ // click "2010"
550
+ cells[2].click();
551
+ expect(dp.dates, 'to equal', []);
552
+ expect(input.value, 'to be', '');
553
+ expect(getViewSwitch(picker).textContent, 'to be', '2010-2019');
554
+
555
+ cells = getCells(picker);
556
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[1]]);
557
+ expect(cells[1].textContent, 'to be', '2010');
558
+
559
+ // click "2017"
560
+ cells[8].click();
561
+ expect(dp.dates, 'to equal', []);
562
+ expect(input.value, 'to be', '');
563
+ expect(getViewSwitch(picker).textContent, 'to be', '2017');
564
+
565
+ cells = getCells(picker);
566
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[1]]);
567
+ expect(cells[1].textContent, 'to be', 'Feb');
568
+
569
+ // click "Oct"
570
+ cells[9].click();
571
+ expect(dp.dates, 'to equal', []);
572
+ expect(input.value, 'to be', '');
573
+ expect(getViewSwitch(picker).textContent, 'to be', 'October 2017');
574
+
575
+ cells = getCells(picker);
576
+ expect(filterCells(cells, '.focused'), 'to equal', [cells[1]]);
577
+ expect(cells[10].textContent, 'to be', '11');
578
+ });
579
+ });
580
+ });