@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,635 @@
1
+ describe('options - beforeShow hooks', function () {
2
+ let clock;
3
+ let input;
4
+
5
+ beforeEach(function () {
6
+ clock = sinon.useFakeTimers({now: new Date(2020, 1, 14)});
7
+ input = document.createElement('input');
8
+ testContainer.appendChild(input);
9
+ });
10
+
11
+ afterEach(function () {
12
+ testContainer.removeChild(input);
13
+ clock.restore();
14
+ });
15
+
16
+ describe('beforeShowDay', function () {
17
+ it('disables the date when it returns false', function () {
18
+ const beforeShowDay = date => !!(date.getDate() % 10);
19
+ const {dp, picker} = createDP(input, {beforeShowDay});
20
+ let cells = getCells(picker);
21
+ let disabledCells = filterCells(cells, '.disabled');
22
+
23
+ expect(disabledCells, 'to equal', [cells[4], cells[15], cells[25]]);
24
+ expect(disabledCells.map(el => el.textContent), 'to equal', ['30', '10', '20']);
25
+
26
+ picker.querySelector('.next-btn').click();
27
+
28
+ cells = getCells(picker);
29
+ disabledCells = filterCells(cells, '.disabled');
30
+
31
+ expect(disabledCells, 'to equal', [cells[9], cells[19], cells[29], cells[40]]);
32
+ expect(disabledCells.map(el => el.textContent), 'to equal', ['10', '20', '30', '10']);
33
+
34
+ dp.destroy();
35
+ });
36
+
37
+ it('adds classes to the date when it returns spece separated classes', function () {
38
+ const beforeShowDay = date => date.getDate() % 10 ? undefined : 'foo bar';
39
+ const {dp, picker} = createDP(input, {beforeShowDay});
40
+ let cells = getCells(picker);
41
+ let fooCells = filterCells(cells, '.foo');
42
+ let barCells = filterCells(cells, '.bar');
43
+
44
+ expect(fooCells, 'to equal', [cells[4], cells[15], cells[25]]);
45
+ expect(barCells, 'to equal', fooCells);
46
+ expect(fooCells.map(el => el.textContent), 'to equal', ['30', '10', '20']);
47
+
48
+ picker.querySelector('.next-btn').click();
49
+
50
+ cells = getCells(picker);
51
+ fooCells = filterCells(cells, '.foo');
52
+ barCells = filterCells(cells, '.bar');
53
+
54
+ expect(fooCells, 'to equal', [cells[9], cells[19], cells[29], cells[40]]);
55
+ expect(barCells, 'to equal', fooCells);
56
+ expect(fooCells.map(el => el.textContent), 'to equal', ['10', '20', '30', '10']);
57
+
58
+ dp.destroy();
59
+ });
60
+
61
+ it('disables the date when the return contains enabled: false', function () {
62
+ const beforeShowDay = date => ({enabled: !!(date.getDate() % 10)});
63
+ const {dp, picker} = createDP(input, {beforeShowDay});
64
+ let cells = getCells(picker);
65
+ let disabledCells = filterCells(cells, '.disabled');
66
+
67
+ expect(disabledCells, 'to equal', [cells[4], cells[15], cells[25]]);
68
+
69
+ picker.querySelector('.next-btn').click();
70
+
71
+ cells = getCells(picker);
72
+ disabledCells = filterCells(cells, '.disabled');
73
+
74
+ expect(disabledCells, 'to equal', [cells[9], cells[19], cells[29], cells[40]]);
75
+
76
+ dp.destroy();
77
+ });
78
+
79
+ it('adds classes to the date when the return contains space separated classes in the classes property', function () {
80
+ const beforeShowDay = date => date.getDate() % 10 ? undefined : {classes: 'foo bar'};
81
+ const {dp, picker} = createDP(input, {beforeShowDay});
82
+ let cells = getCells(picker);
83
+ let fooCells = filterCells(cells, '.foo');
84
+ let barCells = filterCells(cells, '.bar');
85
+
86
+ expect(fooCells, 'to equal', [cells[4], cells[15], cells[25]]);
87
+ expect(barCells, 'to equal', fooCells);
88
+
89
+ picker.querySelector('.next-btn').click();
90
+
91
+ cells = getCells(picker);
92
+ fooCells = filterCells(cells, '.foo');
93
+ barCells = filterCells(cells, '.bar');
94
+
95
+ expect(fooCells, 'to equal', [cells[9], cells[19], cells[29], cells[40]]);
96
+ expect(barCells, 'to equal', fooCells);
97
+
98
+ dp.destroy();
99
+ });
100
+
101
+ it('uses custom content to the date cell when the return contains text/html in the content property', function () {
102
+ const beforeShowDay = (date) => date.getDate() % 10 === 4 ? {content: '<em>❤️</em>'} : undefined;
103
+ const {dp, picker} = createDP(input, {beforeShowDay});
104
+ let cells = getCells(picker);
105
+ let ccCells = cells.filter(el => el.children.length > 0);
106
+
107
+ expect(ccCells, 'to equal', [cells[9], cells[19], cells[29], cells[38]]);
108
+ ccCells.forEach((cell) => {
109
+ expect(cell.innerHTML, 'to be', '<em>❤️</em>');
110
+ });
111
+
112
+ picker.querySelector('.next-btn').click();
113
+
114
+ cells = getCells(picker);
115
+ ccCells = cells.filter(el => el.children.length > 0);
116
+
117
+ expect(ccCells, 'to equal', [cells[3], cells[13], cells[23], cells[34]]);
118
+ ccCells.forEach((cell) => {
119
+ expect(cell.innerHTML, 'to be', '<em>❤️</em>');
120
+ });
121
+
122
+ dp.destroy();
123
+ });
124
+
125
+ it('can be updated with setOptions()', function () {
126
+ const {dp, picker} = createDP(input);
127
+ dp.setOptions({beforeShowDay: date => !!(date.getDate() % 10)});
128
+ dp.show();
129
+
130
+ let cells = getCells(picker);
131
+ let disabledCells = filterCells(cells, '.disabled');
132
+
133
+ expect(disabledCells, 'to equal', [cells[4], cells[15], cells[25]]);
134
+
135
+ dp.hide();
136
+ dp.setOptions({beforeShowDay: null});
137
+ dp.show();
138
+
139
+ cells = getCells(picker);
140
+ disabledCells = filterCells(cells, '.disabled');
141
+ expect(disabledCells, 'to equal', []);
142
+
143
+ dp.destroy();
144
+ });
145
+ });
146
+
147
+ describe('beforeShowMonth', function () {
148
+ it('disables the month on months view when it returns false', function () {
149
+ const beforeShowMonth = date => !!(date.getMonth() % 5);
150
+ const {dp, picker} = createDP(input, {beforeShowMonth});
151
+ const viewSwitch = getViewSwitch(picker);
152
+ dp.show();
153
+ viewSwitch.click();
154
+
155
+ let cells = getCells(picker);
156
+ let disabledCells = filterCells(cells, '.disabled');
157
+
158
+ expect(disabledCells, 'to equal', [cells[0], cells[5], cells[10]]);
159
+ expect(disabledCells.map(el => el.textContent), 'to equal', ['Jan', 'Jun', 'Nov']);
160
+
161
+ picker.querySelector('.next-btn').click();
162
+
163
+ cells = getCells(picker);
164
+ disabledCells = filterCells(cells, '.disabled');
165
+
166
+ expect(disabledCells, 'to equal', [cells[0], cells[5], cells[10]]);
167
+ expect(disabledCells.map(el => el.textContent), 'to equal', ['Jan', 'Jun', 'Nov']);
168
+
169
+ dp.destroy();
170
+ });
171
+
172
+ it('adds classes to the month on months view when it returns spece separated classes', function () {
173
+ const beforeShowMonth = date => date.getMonth() % 5 ? undefined : 'foo bar';
174
+ const {dp, picker} = createDP(input, {beforeShowMonth});
175
+ const viewSwitch = getViewSwitch(picker);
176
+ dp.show();
177
+ viewSwitch.click();
178
+
179
+ let cells = getCells(picker);
180
+ let fooCells = filterCells(cells, '.foo');
181
+ let barCells = filterCells(cells, '.bar');
182
+
183
+ expect(fooCells, 'to equal', [cells[0], cells[5], cells[10]]);
184
+ expect(barCells, 'to equal', fooCells);
185
+ expect(fooCells.map(el => el.textContent), 'to equal', ['Jan', 'Jun', 'Nov']);
186
+
187
+ picker.querySelector('.next-btn').click();
188
+
189
+ cells = getCells(picker);
190
+ fooCells = filterCells(cells, '.foo');
191
+ barCells = filterCells(cells, '.bar');
192
+
193
+ expect(fooCells, 'to equal', [cells[0], cells[5], cells[10]]);
194
+ expect(barCells, 'to equal', fooCells);
195
+ expect(fooCells.map(el => el.textContent), 'to equal', ['Jan', 'Jun', 'Nov']);
196
+
197
+ dp.destroy();
198
+ });
199
+
200
+ it('disables the month on months view when the return contains enabled: false', function () {
201
+ const beforeShowMonth = date => ({enabled: !!(date.getMonth() % 5)});
202
+ const {dp, picker} = createDP(input, {beforeShowMonth});
203
+ const viewSwitch = getViewSwitch(picker);
204
+ dp.show();
205
+ viewSwitch.click();
206
+
207
+ let cells = getCells(picker);
208
+ let disabledCells = filterCells(cells, '.disabled');
209
+
210
+ expect(disabledCells, 'to equal', [cells[0], cells[5], cells[10]]);
211
+
212
+ picker.querySelector('.next-btn').click();
213
+
214
+ cells = getCells(picker);
215
+ disabledCells = filterCells(cells, '.disabled');
216
+
217
+ expect(disabledCells, 'to equal', [cells[0], cells[5], cells[10]]);
218
+
219
+ dp.destroy();
220
+ });
221
+
222
+ it('adds classes to the month on months view when the return contains space separated classes in the classes property', function () {
223
+ const beforeShowMonth = date => date.getMonth() % 5 ? undefined : {classes: 'foo bar'};
224
+ const {dp, picker} = createDP(input, {beforeShowMonth});
225
+ const viewSwitch = getViewSwitch(picker);
226
+ dp.show();
227
+ viewSwitch.click();
228
+
229
+ let cells = getCells(picker);
230
+ let fooCells = filterCells(cells, '.foo');
231
+ let barCells = filterCells(cells, '.bar');
232
+
233
+ expect(fooCells, 'to equal', [cells[0], cells[5], cells[10]]);
234
+ expect(barCells, 'to equal', fooCells);
235
+
236
+ picker.querySelector('.next-btn').click();
237
+
238
+ cells = getCells(picker);
239
+ fooCells = filterCells(cells, '.foo');
240
+ barCells = filterCells(cells, '.bar');
241
+
242
+ expect(fooCells, 'to equal', [cells[0], cells[5], cells[10]]);
243
+ expect(barCells, 'to equal', fooCells);
244
+
245
+ dp.destroy();
246
+ });
247
+
248
+ it('uses custom content to the month cell when the return contains text/html in the content property', function () {
249
+ const beforeShowMonth = (date) => (date.getMonth() + date.getFullYear() % 10) % 10 ? undefined : {content: '🍀'};
250
+ const {dp, picker} = createDP(input, {beforeShowMonth});
251
+ const viewSwitch = getViewSwitch(picker);
252
+ dp.show();
253
+ viewSwitch.click();
254
+
255
+ let cells = getCells(picker);
256
+ let ccCells = cells.filter(el => el.textContent.length < 3);
257
+
258
+ expect(ccCells, 'to equal', [cells[0], cells[10]]);
259
+ ccCells.forEach((cell) => {
260
+ expect(cell.textContent, 'to be', '🍀');
261
+ });
262
+
263
+ picker.querySelector('.next-btn').click();
264
+
265
+ cells = getCells(picker);
266
+ ccCells = cells.filter(el => el.textContent.length < 3);
267
+
268
+ expect(ccCells, 'to equal', [cells[9]]);
269
+ ccCells.forEach((cell) => {
270
+ expect(cell.textContent, 'to be', '🍀');
271
+ });
272
+
273
+ dp.destroy();
274
+ });
275
+
276
+ it('can be updated with setOptions()', function () {
277
+ const {dp, picker} = createDP(input);
278
+ const viewSwitch = getViewSwitch(picker);
279
+ dp.setOptions({beforeShowMonth: date => !!(date.getMonth() % 5)});
280
+ dp.show();
281
+ viewSwitch.click();
282
+
283
+ let cells = getCells(picker);
284
+ let disabledCells = filterCells(cells, '.disabled');
285
+
286
+ expect(disabledCells, 'to equal', [cells[0], cells[5], cells[10]]);
287
+
288
+ dp.hide();
289
+ dp.setOptions({beforeShowMonth: null});
290
+ dp.show();
291
+ viewSwitch.click();
292
+
293
+ cells = getCells(picker);
294
+ disabledCells = filterCells(cells, '.disabled');
295
+ expect(disabledCells, 'to equal', []);
296
+
297
+ dp.destroy();
298
+ });
299
+ });
300
+
301
+ describe('beforeShowYear', function () {
302
+ it('disables the year on years view when it returns false', function () {
303
+ const beforeShowYear = date => !!(date.getFullYear() % 4);
304
+ const {dp, picker} = createDP(input, {beforeShowYear});
305
+ const viewSwitch = getViewSwitch(picker);
306
+ dp.show();
307
+ viewSwitch.click();
308
+ viewSwitch.click();
309
+
310
+ let cells = getCells(picker);
311
+ let disabledCells = filterCells(cells, '.disabled');
312
+
313
+ expect(disabledCells, 'to equal', [cells[1], cells[5], cells[9]]);
314
+ expect(disabledCells.map(el => el.textContent), 'to equal', ['2020', '2024', '2028',]);
315
+
316
+ picker.querySelector('.next-btn').click();
317
+
318
+ cells = getCells(picker);
319
+ disabledCells = filterCells(cells, '.disabled');
320
+
321
+ expect(disabledCells, 'to equal', [cells[3], cells[7], cells[11]]);
322
+ expect(disabledCells.map(el => el.textContent), 'to equal', ['2032', '2036', '2040']);
323
+
324
+ dp.destroy();
325
+ });
326
+
327
+ it('adds classes to the year on years view when it returns spece separated classes', function () {
328
+ const beforeShowYear = date => date.getFullYear() % 4 ? undefined : 'foo bar';
329
+ const {dp, picker} = createDP(input, {beforeShowYear});
330
+ const viewSwitch = getViewSwitch(picker);
331
+ dp.show();
332
+ viewSwitch.click();
333
+ viewSwitch.click();
334
+
335
+ let cells = getCells(picker);
336
+ let fooCells = filterCells(cells, '.foo');
337
+ let barCells = filterCells(cells, '.bar');
338
+
339
+ expect(fooCells, 'to equal', [cells[1], cells[5], cells[9]]);
340
+ expect(barCells, 'to equal', fooCells);
341
+ expect(fooCells.map(el => el.textContent), 'to equal', ['2020', '2024', '2028']);
342
+
343
+ picker.querySelector('.next-btn').click();
344
+
345
+ cells = getCells(picker);
346
+ fooCells = filterCells(cells, '.foo');
347
+ barCells = filterCells(cells, '.bar');
348
+
349
+ expect(fooCells, 'to equal', [cells[3], cells[7], cells[11]]);
350
+ expect(barCells, 'to equal', fooCells);
351
+ expect(fooCells.map(el => el.textContent), 'to equal', ['2032', '2036', '2040']);
352
+
353
+ dp.destroy();
354
+ });
355
+
356
+ it('disables the year on years view when the return contains enabled: false', function () {
357
+ const beforeShowYear = date => ({enabled: !!(date.getFullYear() % 4)});
358
+ const {dp, picker} = createDP(input, {beforeShowYear});
359
+ const viewSwitch = getViewSwitch(picker);
360
+ dp.show();
361
+ viewSwitch.click();
362
+ viewSwitch.click();
363
+
364
+ let cells = getCells(picker);
365
+ let disabledCells = filterCells(cells, '.disabled');
366
+
367
+ expect(disabledCells, 'to equal', [cells[1], cells[5], cells[9]]);
368
+
369
+ picker.querySelector('.next-btn').click();
370
+
371
+ cells = getCells(picker);
372
+ disabledCells = filterCells(cells, '.disabled');
373
+
374
+ expect(disabledCells, 'to equal', [cells[3], cells[7], cells[11]]);
375
+
376
+ dp.destroy();
377
+ });
378
+
379
+ it('adds classes to the year on years view when the return contains space separated classes in the classes property', function () {
380
+ const beforeShowYear = date => date.getFullYear() % 4 ? undefined : {classes: 'foo bar'};
381
+ const {dp, picker} = createDP(input, {beforeShowYear});
382
+ const viewSwitch = getViewSwitch(picker);
383
+ dp.show();
384
+ viewSwitch.click();
385
+ viewSwitch.click();
386
+
387
+ let cells = getCells(picker);
388
+ let fooCells = filterCells(cells, '.foo');
389
+ let barCells = filterCells(cells, '.bar');
390
+
391
+ expect(fooCells, 'to equal', [cells[1], cells[5], cells[9]]);
392
+ expect(barCells, 'to equal', fooCells);
393
+
394
+ picker.querySelector('.next-btn').click();
395
+
396
+ cells = getCells(picker);
397
+ fooCells = filterCells(cells, '.foo');
398
+ barCells = filterCells(cells, '.bar');
399
+
400
+ expect(fooCells, 'to equal', [cells[3], cells[7], cells[11]]);
401
+ expect(barCells, 'to equal', fooCells);
402
+
403
+ dp.destroy();
404
+ });
405
+
406
+ it('uses custom content to the year cell when the return contains text/html in the content property', function () {
407
+ const beforeShowYear = (date) => {
408
+ const year = date.getFullYear();
409
+ return (year + Math.floor(year / 10) % 10) % 4 ? undefined : {content: '<i class="icn-x"></i>'};
410
+ };
411
+ const {dp, picker} = createDP(input, {beforeShowYear});
412
+ const viewSwitch = getViewSwitch(picker);
413
+ dp.show();
414
+ viewSwitch.click();
415
+ viewSwitch.click();
416
+
417
+ let cells = getCells(picker);
418
+ let ccCells = cells.filter(el => el.children.length > 0);
419
+
420
+ expect(ccCells, 'to equal', [cells[1], cells[5], cells[9]]);
421
+ ccCells.forEach((cell) => {
422
+ expect(cell.innerHTML, 'to be', '<i class="icn-x"></i>');
423
+ });
424
+
425
+ picker.querySelector('.next-btn').click();
426
+
427
+ cells = getCells(picker);
428
+ ccCells = cells.filter(el => el.children.length > 0);
429
+
430
+ expect(ccCells, 'to equal', [cells[2], cells[6], cells[10]]);
431
+ ccCells.forEach((cell) => {
432
+ expect(cell.innerHTML, 'to be', '<i class="icn-x"></i>');
433
+ });
434
+
435
+ dp.destroy();
436
+ });
437
+
438
+ it('can be updated with setOptions()', function () {
439
+ const {dp, picker} = createDP(input);
440
+ const viewSwitch = getViewSwitch(picker);
441
+ dp.setOptions({beforeShowYear: date => !!(date.getFullYear() % 4)});
442
+ dp.show();
443
+ viewSwitch.click();
444
+ viewSwitch.click();
445
+
446
+ let cells = getCells(picker);
447
+ let disabledCells = filterCells(cells, '.disabled');
448
+
449
+ expect(disabledCells, 'to equal', [cells[1], cells[5], cells[9]]);
450
+
451
+ dp.hide();
452
+ dp.setOptions({beforeShowYear: null});
453
+ dp.show();
454
+ viewSwitch.click();
455
+ viewSwitch.click();
456
+
457
+ cells = getCells(picker);
458
+ disabledCells = filterCells(cells, '.disabled');
459
+ expect(disabledCells, 'to equal', []);
460
+
461
+ dp.destroy();
462
+ });
463
+ });
464
+
465
+ describe('beforeShowDecade', function () {
466
+ it('disables the decade on decades view when it returns false', function () {
467
+ const beforeShowDecade = date => !!((date.getFullYear() / 10) % 4);
468
+ const {dp, picker} = createDP(input, {beforeShowDecade});
469
+ const viewSwitch = getViewSwitch(picker);
470
+ dp.show();
471
+ viewSwitch.click();
472
+ viewSwitch.click();
473
+ viewSwitch.click();
474
+
475
+ let cells = getCells(picker);
476
+ let disabledCells = filterCells(cells, '.disabled');
477
+
478
+ expect(disabledCells, 'to equal', [cells[1], cells[5], cells[9]]);
479
+ expect(disabledCells.map(el => el.textContent), 'to equal', ['2000', '2040', '2080',]);
480
+
481
+ picker.querySelector('.next-btn').click();
482
+
483
+ cells = getCells(picker);
484
+ disabledCells = filterCells(cells, '.disabled');
485
+
486
+ expect(disabledCells, 'to equal', [cells[3], cells[7], cells[11]]);
487
+ expect(disabledCells.map(el => el.textContent), 'to equal', ['2120', '2160', '2200']);
488
+
489
+ dp.destroy();
490
+ });
491
+
492
+ it('adds classes to the decade on decades view when it returns spece separated classes', function () {
493
+ const beforeShowDecade = date => (date.getFullYear() / 10) % 4 ? undefined : 'foo bar';
494
+ const {dp, picker} = createDP(input, {beforeShowDecade});
495
+ const viewSwitch = getViewSwitch(picker);
496
+ dp.show();
497
+ viewSwitch.click();
498
+ viewSwitch.click();
499
+ viewSwitch.click();
500
+
501
+ let cells = getCells(picker);
502
+ let fooCells = filterCells(cells, '.foo');
503
+ let barCells = filterCells(cells, '.bar');
504
+
505
+ expect(fooCells, 'to equal', [cells[1], cells[5], cells[9]]);
506
+ expect(barCells, 'to equal', fooCells);
507
+ expect(fooCells.map(el => el.textContent), 'to equal', ['2000', '2040', '2080']);
508
+
509
+ picker.querySelector('.next-btn').click();
510
+
511
+ cells = getCells(picker);
512
+ fooCells = filterCells(cells, '.foo');
513
+ barCells = filterCells(cells, '.bar');
514
+
515
+ expect(fooCells, 'to equal', [cells[3], cells[7], cells[11]]);
516
+ expect(barCells, 'to equal', fooCells);
517
+ expect(fooCells.map(el => el.textContent), 'to equal', ['2120', '2160', '2200']);
518
+
519
+ dp.destroy();
520
+ });
521
+
522
+ it('disables the decade on decades view when the return contains enabled: false', function () {
523
+ const beforeShowDecade = date => ({enabled: !!((date.getFullYear() / 10) % 4)});
524
+ const {dp, picker} = createDP(input, {beforeShowDecade});
525
+ const viewSwitch = getViewSwitch(picker);
526
+ dp.show();
527
+ viewSwitch.click();
528
+ viewSwitch.click();
529
+ viewSwitch.click();
530
+
531
+ let cells = getCells(picker);
532
+ let disabledCells = filterCells(cells, '.disabled');
533
+
534
+ expect(disabledCells, 'to equal', [cells[1], cells[5], cells[9]]);
535
+
536
+ picker.querySelector('.next-btn').click();
537
+
538
+ cells = getCells(picker);
539
+ disabledCells = filterCells(cells, '.disabled');
540
+
541
+ expect(disabledCells, 'to equal', [cells[3], cells[7], cells[11]]);
542
+
543
+ dp.destroy();
544
+ });
545
+
546
+ it('adds classes to the decade on decades view when the return contains space separated classes in the classes property', function () {
547
+ const beforeShowDecade = date => (date.getFullYear() / 10) % 4 ? undefined : {classes: 'foo bar'};
548
+ const {dp, picker} = createDP(input, {beforeShowDecade});
549
+ const viewSwitch = getViewSwitch(picker);
550
+ dp.show();
551
+ viewSwitch.click();
552
+ viewSwitch.click();
553
+ viewSwitch.click();
554
+
555
+ let cells = getCells(picker);
556
+ let fooCells = filterCells(cells, '.foo');
557
+ let barCells = filterCells(cells, '.bar');
558
+
559
+ expect(fooCells, 'to equal', [cells[1], cells[5], cells[9]]);
560
+ expect(barCells, 'to equal', fooCells);
561
+
562
+ picker.querySelector('.next-btn').click();
563
+
564
+ cells = getCells(picker);
565
+ fooCells = filterCells(cells, '.foo');
566
+ barCells = filterCells(cells, '.bar');
567
+
568
+ expect(fooCells, 'to equal', [cells[3], cells[7], cells[11]]);
569
+ expect(barCells, 'to equal', fooCells);
570
+
571
+ dp.destroy();
572
+ });
573
+
574
+ it('uses custom content to the decade cell when the return contains text/html in the content property', function () {
575
+ const beforeShowDecade = (date) => {
576
+ const dec = date.getFullYear() / 10;
577
+ return (dec + Math.floor(dec / 10) % 10) % 5 ? undefined : {content: '<strong>X</strong>'};
578
+ };
579
+ const {dp, picker} = createDP(input, {beforeShowDecade});
580
+ const viewSwitch = getViewSwitch(picker);
581
+ dp.show();
582
+ viewSwitch.click();
583
+ viewSwitch.click();
584
+ viewSwitch.click();
585
+
586
+ let cells = getCells(picker);
587
+ let ccCells = cells.filter(el => el.children.length > 0);
588
+
589
+ expect(ccCells, 'to equal', [cells[1], cells[6]]);
590
+ ccCells.forEach((cell) => {
591
+ expect(cell.innerHTML, 'to be', '<strong>X</strong>');
592
+ });
593
+
594
+ picker.querySelector('.next-btn').click();
595
+
596
+ cells = getCells(picker);
597
+ ccCells = cells.filter(el => el.children.length > 0);
598
+
599
+ expect(ccCells, 'to equal', [cells[5], cells[10]]);
600
+ ccCells.forEach((cell) => {
601
+ expect(cell.innerHTML, 'to be', '<strong>X</strong>');
602
+ });
603
+
604
+ dp.destroy();
605
+ });
606
+
607
+ it('can be updated with setOptions()', function () {
608
+ const {dp, picker} = createDP(input);
609
+ const viewSwitch = getViewSwitch(picker);
610
+ dp.setOptions({beforeShowDecade: date => !!((date.getFullYear() / 10) % 4)});
611
+ dp.show();
612
+ viewSwitch.click();
613
+ viewSwitch.click();
614
+ viewSwitch.click();
615
+
616
+ let cells = getCells(picker);
617
+ let disabledCells = filterCells(cells, '.disabled');
618
+
619
+ expect(disabledCells, 'to equal', [cells[1], cells[5], cells[9]]);
620
+
621
+ dp.hide();
622
+ dp.setOptions({beforeShowDecade: null});
623
+ dp.show();
624
+ viewSwitch.click();
625
+ viewSwitch.click();
626
+ viewSwitch.click();
627
+
628
+ cells = getCells(picker);
629
+ disabledCells = filterCells(cells, '.disabled');
630
+ expect(disabledCells, 'to equal', []);
631
+
632
+ dp.destroy();
633
+ });
634
+ });
635
+ });