buefy 0.7.9 → 0.8.2

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 (347) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/dist/buefy.css +13759 -8263
  3. package/dist/buefy.js +9073 -14866
  4. package/dist/buefy.min.css +1 -5
  5. package/dist/buefy.min.js +2 -2
  6. package/dist/cjs/autocomplete.js +22 -0
  7. package/dist/cjs/button.js +106 -0
  8. package/dist/cjs/checkbox.js +135 -0
  9. package/dist/cjs/chunk-07fe6fc0.js +247 -0
  10. package/dist/cjs/chunk-0af453a7.js +105 -0
  11. package/dist/cjs/chunk-0e89e51b.js +394 -0
  12. package/dist/cjs/chunk-13e039f5.js +104 -0
  13. package/dist/cjs/chunk-143d9e6d.js +404 -0
  14. package/dist/cjs/chunk-19ebd649.js +114 -0
  15. package/dist/cjs/chunk-1b1231ce.js +94 -0
  16. package/dist/cjs/chunk-1e6abfcf.js +94 -0
  17. package/dist/cjs/chunk-28d164b1.js +172 -0
  18. package/dist/cjs/chunk-3396605d.js +394 -0
  19. package/dist/cjs/chunk-364a37a0.js +404 -0
  20. package/dist/cjs/chunk-3b066933.js +103 -0
  21. package/dist/cjs/chunk-3dffe6e7.js +54 -0
  22. package/dist/cjs/chunk-4a03b064.js +199 -0
  23. package/dist/cjs/chunk-50b06939.js +153 -0
  24. package/dist/cjs/chunk-52623128.js +105 -0
  25. package/dist/cjs/chunk-53d4f332.js +94 -0
  26. package/dist/cjs/chunk-544a95da.js +404 -0
  27. package/dist/cjs/chunk-545f01b1.js +49 -0
  28. package/dist/cjs/chunk-59b91990.js +64 -0
  29. package/dist/cjs/chunk-5b2a3329.js +394 -0
  30. package/dist/cjs/chunk-60061aa8.js +172 -0
  31. package/dist/cjs/chunk-67658e54.js +404 -0
  32. package/dist/cjs/chunk-6963026a.js +86 -0
  33. package/dist/cjs/chunk-6cece6b7.js +140 -0
  34. package/dist/cjs/chunk-6d6465c1.js +140 -0
  35. package/dist/cjs/chunk-6e9c0aca.js +94 -0
  36. package/dist/cjs/chunk-77f69fca.js +106 -0
  37. package/dist/cjs/chunk-7a25d736.js +114 -0
  38. package/dist/cjs/chunk-876befa8.js +247 -0
  39. package/dist/cjs/chunk-8985ffff.js +105 -0
  40. package/dist/cjs/chunk-8a05c8c9.js +207 -0
  41. package/dist/cjs/chunk-90407463.js +258 -0
  42. package/dist/cjs/chunk-956525c9.js +106 -0
  43. package/dist/cjs/chunk-96ce35a2.js +114 -0
  44. package/dist/cjs/chunk-9da1d120.js +86 -0
  45. package/dist/cjs/chunk-9f6a8079.js +54 -0
  46. package/dist/cjs/chunk-a60dc21d.js +281 -0
  47. package/dist/cjs/chunk-b628277d.js +199 -0
  48. package/dist/cjs/chunk-c146745e.js +153 -0
  49. package/dist/cjs/chunk-c2aec7a9.js +547 -0
  50. package/dist/cjs/chunk-c9641331.js +86 -0
  51. package/dist/cjs/chunk-d492406b.js +172 -0
  52. package/dist/cjs/chunk-e0aa62a0.js +404 -0
  53. package/dist/cjs/chunk-e45e0329.js +48 -0
  54. package/dist/cjs/chunk-e5de6583.js +207 -0
  55. package/dist/cjs/chunk-e85cceb6.js +258 -0
  56. package/dist/cjs/chunk-ed5addd6.js +547 -0
  57. package/dist/cjs/chunk-ef4753d5.js +283 -0
  58. package/dist/cjs/chunk-f0c597f9.js +199 -0
  59. package/dist/cjs/chunk-f1df1c63.js +9 -0
  60. package/dist/cjs/chunk-f1ee2f5c.js +207 -0
  61. package/dist/cjs/chunk-fbd4d545.js +247 -0
  62. package/dist/cjs/clockpicker.js +447 -0
  63. package/dist/cjs/collapse.js +102 -0
  64. package/dist/cjs/datepicker.js +1281 -0
  65. package/dist/cjs/dialog.js +237 -0
  66. package/dist/cjs/dropdown.js +19 -0
  67. package/dist/cjs/field.js +18 -0
  68. package/dist/cjs/icon.js +17 -0
  69. package/dist/cjs/index.js +164 -0
  70. package/dist/cjs/input.js +20 -0
  71. package/dist/cjs/loading.js +166 -0
  72. package/dist/cjs/menu.js +231 -0
  73. package/dist/cjs/message.js +65 -0
  74. package/dist/cjs/modal.js +48 -0
  75. package/dist/cjs/navbar.js +258 -0
  76. package/dist/cjs/notification.js +142 -0
  77. package/dist/cjs/numberinput.js +191 -0
  78. package/dist/cjs/pagination.js +19 -0
  79. package/dist/cjs/progress.js +151 -0
  80. package/dist/cjs/radio.js +224 -0
  81. package/dist/cjs/select.js +20 -0
  82. package/dist/cjs/slider.js +511 -0
  83. package/dist/cjs/snackbar.js +114 -0
  84. package/dist/cjs/steps.js +352 -0
  85. package/dist/cjs/switch.js +144 -0
  86. package/dist/cjs/table.js +877 -0
  87. package/dist/cjs/tabs.js +258 -0
  88. package/dist/cjs/tag.js +63 -0
  89. package/dist/cjs/taginput.js +297 -0
  90. package/dist/cjs/timepicker.js +75 -0
  91. package/dist/cjs/toast.js +89 -0
  92. package/dist/cjs/tooltip.js +17 -0
  93. package/dist/cjs/upload.js +210 -0
  94. package/dist/components/autocomplete/index.js +1084 -2
  95. package/dist/components/autocomplete/index.min.js +2 -0
  96. package/dist/components/button/index.js +425 -2
  97. package/dist/components/button/index.min.js +2 -0
  98. package/dist/components/checkbox/index.js +342 -2
  99. package/dist/components/checkbox/index.min.js +2 -0
  100. package/dist/components/clockpicker/index.js +2340 -2
  101. package/dist/components/clockpicker/index.min.js +2 -0
  102. package/dist/components/collapse/index.js +201 -2
  103. package/dist/components/collapse/index.min.js +2 -0
  104. package/dist/components/datepicker/index.js +2720 -2
  105. package/dist/components/datepicker/index.min.js +2 -0
  106. package/dist/components/dialog/index.js +768 -2
  107. package/dist/components/dialog/index.min.js +2 -0
  108. package/dist/components/dropdown/index.js +555 -2
  109. package/dist/components/dropdown/index.min.js +2 -0
  110. package/dist/components/field/index.js +447 -2
  111. package/dist/components/field/index.min.js +2 -0
  112. package/dist/components/icon/index.js +322 -2
  113. package/dist/components/icon/index.min.js +2 -0
  114. package/dist/components/input/index.js +675 -2
  115. package/dist/components/input/index.min.js +2 -0
  116. package/dist/components/loading/index.js +282 -2
  117. package/dist/components/loading/index.min.js +2 -0
  118. package/dist/components/menu/index.js +550 -2
  119. package/dist/components/menu/index.min.js +2 -0
  120. package/dist/components/message/index.js +482 -2
  121. package/dist/components/message/index.min.js +2 -0
  122. package/dist/components/modal/index.js +400 -2
  123. package/dist/components/modal/index.min.js +2 -0
  124. package/dist/components/navbar/index.js +371 -0
  125. package/dist/components/navbar/index.min.js +2 -0
  126. package/dist/components/notification/index.js +705 -2
  127. package/dist/components/notification/index.min.js +2 -0
  128. package/dist/components/numberinput/index.js +846 -2
  129. package/dist/components/numberinput/index.min.js +2 -0
  130. package/dist/components/pagination/index.js +577 -2
  131. package/dist/components/pagination/index.min.js +2 -0
  132. package/dist/components/progress/index.js +250 -0
  133. package/dist/components/progress/index.min.js +2 -0
  134. package/dist/components/radio/index.js +323 -2
  135. package/dist/components/radio/index.min.js +2 -0
  136. package/dist/components/select/index.js +571 -2
  137. package/dist/components/select/index.min.js +2 -0
  138. package/dist/components/slider/index.js +764 -0
  139. package/dist/components/slider/index.min.js +2 -0
  140. package/dist/components/snackbar/index.js +397 -2
  141. package/dist/components/snackbar/index.min.js +2 -0
  142. package/dist/components/steps/index.js +721 -2
  143. package/dist/components/steps/index.min.js +2 -0
  144. package/dist/components/switch/index.js +243 -2
  145. package/dist/components/switch/index.min.js +2 -0
  146. package/dist/components/table/index.js +1870 -2
  147. package/dist/components/table/index.min.js +2 -0
  148. package/dist/components/tabs/index.js +627 -2
  149. package/dist/components/tabs/index.min.js +2 -0
  150. package/dist/components/tag/index.js +262 -2
  151. package/dist/components/tag/index.min.js +2 -0
  152. package/dist/components/taginput/index.js +1459 -2
  153. package/dist/components/taginput/index.min.js +2 -0
  154. package/dist/components/timepicker/index.js +2053 -2
  155. package/dist/components/timepicker/index.min.js +2 -0
  156. package/dist/components/toast/index.js +372 -2
  157. package/dist/components/toast/index.min.js +2 -0
  158. package/dist/components/tooltip/index.js +236 -2
  159. package/dist/components/tooltip/index.min.js +2 -0
  160. package/dist/components/upload/index.js +501 -2
  161. package/dist/components/upload/index.min.js +2 -0
  162. package/dist/esm/autocomplete.js +18 -0
  163. package/dist/esm/button.js +102 -0
  164. package/dist/esm/checkbox.js +131 -0
  165. package/dist/esm/chunk-00e3e67f.js +401 -0
  166. package/dist/esm/chunk-051f8b06.js +105 -0
  167. package/dist/esm/chunk-0566c90d.js +152 -0
  168. package/dist/esm/chunk-07e19446.js +545 -0
  169. package/dist/esm/chunk-085a700d.js +7 -0
  170. package/dist/esm/chunk-0ad6938a.js +53 -0
  171. package/dist/esm/chunk-0e3f4fb5.js +52 -0
  172. package/dist/esm/chunk-10c85529.js +151 -0
  173. package/dist/esm/chunk-121b1efa.js +197 -0
  174. package/dist/esm/chunk-19dad95e.js +256 -0
  175. package/dist/esm/chunk-231b6066.js +113 -0
  176. package/dist/esm/chunk-24d1a01f.js +279 -0
  177. package/dist/esm/chunk-297bff6b.js +393 -0
  178. package/dist/esm/chunk-2b2ae5c6.js +245 -0
  179. package/dist/esm/chunk-2cb6f867.js +46 -0
  180. package/dist/esm/chunk-33717194.js +392 -0
  181. package/dist/esm/chunk-3b811b77.js +139 -0
  182. package/dist/esm/chunk-3e47308f.js +104 -0
  183. package/dist/esm/chunk-411d6eea.js +84 -0
  184. package/dist/esm/chunk-4535dec5.js +92 -0
  185. package/dist/esm/chunk-47a5f3a1.js +103 -0
  186. package/dist/esm/chunk-4a5384da.js +205 -0
  187. package/dist/esm/chunk-4b663574.js +112 -0
  188. package/dist/esm/chunk-4d393f09.js +170 -0
  189. package/dist/esm/chunk-4d695899.js +257 -0
  190. package/dist/esm/chunk-4f508891.js +171 -0
  191. package/dist/esm/chunk-531b8274.js +281 -0
  192. package/dist/esm/chunk-591ee4a2.js +151 -0
  193. package/dist/esm/chunk-5d3bf82e.js +170 -0
  194. package/dist/esm/chunk-5e0b0665.js +104 -0
  195. package/dist/esm/chunk-648b9aa4.js +45 -0
  196. package/dist/esm/chunk-666940cf.js +546 -0
  197. package/dist/esm/chunk-67c97e13.js +246 -0
  198. package/dist/esm/chunk-6844653e.js +401 -0
  199. package/dist/esm/chunk-699b7cb4.js +245 -0
  200. package/dist/esm/chunk-6f881e7d.js +51 -0
  201. package/dist/esm/chunk-7123d158.js +256 -0
  202. package/dist/esm/chunk-7cf87590.js +60 -0
  203. package/dist/esm/chunk-823177ac.js +545 -0
  204. package/dist/esm/chunk-8838757a.js +401 -0
  205. package/dist/esm/chunk-8ca878c0.js +198 -0
  206. package/dist/esm/chunk-8fc2e874.js +85 -0
  207. package/dist/esm/chunk-912ed715.js +92 -0
  208. package/dist/esm/chunk-92acc21f.js +392 -0
  209. package/dist/esm/chunk-98e86f40.js +197 -0
  210. package/dist/esm/chunk-99a1f9df.js +92 -0
  211. package/dist/esm/chunk-9a776697.js +112 -0
  212. package/dist/esm/chunk-9e3207cc.js +46 -0
  213. package/dist/esm/chunk-9ec14e09.js +112 -0
  214. package/dist/esm/chunk-a5ea70d0.js +205 -0
  215. package/dist/esm/chunk-ac3f4847.js +138 -0
  216. package/dist/esm/chunk-b5376f3e.js +92 -0
  217. package/dist/esm/chunk-b56eb2c8.js +197 -0
  218. package/dist/esm/chunk-b796d1b2.js +392 -0
  219. package/dist/esm/chunk-b822a5db.js +205 -0
  220. package/dist/esm/chunk-b9bdb0e4.js +6 -0
  221. package/dist/esm/chunk-bfe15983.js +401 -0
  222. package/dist/esm/chunk-c9039f68.js +104 -0
  223. package/dist/esm/chunk-cc718c15.js +245 -0
  224. package/dist/esm/chunk-cca88db8.js +99 -0
  225. package/dist/esm/chunk-d6200087.js +50 -0
  226. package/dist/esm/chunk-daeac852.js +138 -0
  227. package/dist/esm/chunk-db31c548.js +103 -0
  228. package/dist/esm/chunk-e5568f45.js +84 -0
  229. package/dist/esm/chunk-e5fce48f.js +59 -0
  230. package/dist/esm/chunk-e84b4047.js +170 -0
  231. package/dist/esm/chunk-e8d90b72.js +98 -0
  232. package/dist/esm/chunk-e932bb68.js +206 -0
  233. package/dist/esm/chunk-edd8ff91.js +103 -0
  234. package/dist/esm/chunk-f0465d8d.js +84 -0
  235. package/dist/esm/chunk-f743d154.js +93 -0
  236. package/dist/esm/chunk-f8036b32.js +402 -0
  237. package/dist/esm/chunk-f984748f.js +401 -0
  238. package/dist/esm/chunk-fd5b0e1e.js +99 -0
  239. package/dist/esm/clockpicker.js +443 -0
  240. package/dist/esm/collapse.js +98 -0
  241. package/dist/esm/datepicker.js +1277 -0
  242. package/dist/esm/dialog.js +231 -0
  243. package/dist/esm/dropdown.js +14 -0
  244. package/dist/esm/field.js +14 -0
  245. package/dist/esm/icon.js +13 -0
  246. package/dist/esm/index.js +154 -0
  247. package/dist/esm/input.js +16 -0
  248. package/dist/esm/loading.js +159 -0
  249. package/dist/esm/menu.js +225 -0
  250. package/dist/esm/message.js +61 -0
  251. package/dist/esm/modal.js +42 -0
  252. package/dist/esm/navbar.js +253 -0
  253. package/dist/esm/notification.js +135 -0
  254. package/dist/esm/numberinput.js +187 -0
  255. package/dist/esm/pagination.js +15 -0
  256. package/dist/esm/progress.js +147 -0
  257. package/dist/esm/radio.js +219 -0
  258. package/dist/esm/select.js +16 -0
  259. package/dist/esm/slider.js +506 -0
  260. package/dist/esm/snackbar.js +108 -0
  261. package/dist/esm/steps.js +347 -0
  262. package/dist/esm/switch.js +140 -0
  263. package/dist/esm/table.js +872 -0
  264. package/dist/esm/tabs.js +253 -0
  265. package/dist/esm/tag.js +59 -0
  266. package/dist/esm/taginput.js +293 -0
  267. package/dist/esm/timepicker.js +71 -0
  268. package/dist/esm/toast.js +83 -0
  269. package/dist/esm/tooltip.js +13 -0
  270. package/dist/esm/upload.js +206 -0
  271. package/package.json +26 -4
  272. package/src/components/checkbox/Checkbox.vue +12 -4
  273. package/src/components/checkbox/CheckboxButton.vue +10 -2
  274. package/src/components/clockpicker/Clockpicker.vue +0 -5
  275. package/src/components/datepicker/Datepicker.spec.js +60 -0
  276. package/src/components/datepicker/Datepicker.vue +46 -19
  277. package/src/components/datepicker/DatepickerTable.spec.js +107 -2
  278. package/src/components/datepicker/DatepickerTable.vue +73 -4
  279. package/src/components/datepicker/DatepickerTableRow.spec.js +127 -17
  280. package/src/components/datepicker/DatepickerTableRow.vue +103 -4
  281. package/src/components/dialog/Dialog.vue +5 -3
  282. package/src/components/dialog/index.js +2 -2
  283. package/src/components/dropdown/Dropdown.vue +1 -4
  284. package/src/components/dropdown/DropdownItem.vue +7 -3
  285. package/src/components/field/Field.spec.js +18 -0
  286. package/src/components/field/Field.vue +21 -2
  287. package/src/components/index.js +6 -0
  288. package/src/components/input/Input.vue +2 -2
  289. package/src/components/loading/index.js +1 -1
  290. package/src/components/modal/index.js +1 -1
  291. package/src/components/navbar/NavBar.spec.js +76 -0
  292. package/src/components/navbar/Navbar.vue +127 -0
  293. package/src/components/navbar/NavbarBurger.vue +25 -0
  294. package/src/components/navbar/NavbarItem.vue +21 -0
  295. package/src/components/navbar/index.js +20 -0
  296. package/src/components/notification/index.js +1 -1
  297. package/src/components/pagination/Pagination.vue +28 -6
  298. package/src/components/progress/Progress.spec.js +77 -0
  299. package/src/components/progress/Progress.vue +108 -0
  300. package/src/components/progress/__snapshots__/Progress.spec.js.snap +7 -0
  301. package/src/components/progress/index.js +17 -0
  302. package/src/components/radio/Radio.spec.js +18 -1
  303. package/src/components/radio/Radio.vue +11 -5
  304. package/src/components/radio/RadioButton.spec.js +18 -1
  305. package/src/components/radio/RadioButton.vue +20 -8
  306. package/src/components/select/Select.spec.js +22 -1
  307. package/src/components/select/Select.vue +2 -1
  308. package/src/components/select/__snapshots__/Select.spec.js.snap +7 -0
  309. package/src/components/slider/Slider.spec.js +10 -0
  310. package/src/components/slider/Slider.vue +240 -0
  311. package/src/components/slider/SliderThumb.vue +188 -0
  312. package/src/components/slider/SliderTick.vue +43 -0
  313. package/src/components/slider/index.js +20 -0
  314. package/src/components/snackbar/index.js +2 -2
  315. package/src/components/steps/StepItem.vue +2 -3
  316. package/src/components/steps/Steps.vue +7 -5
  317. package/src/components/switch/Switch.spec.js +29 -0
  318. package/src/components/switch/Switch.vue +29 -5
  319. package/src/components/switch/__snapshots__/Switch.spec.js.snap +3 -0
  320. package/src/components/table/Table.vue +30 -8
  321. package/src/components/table/TableColumn.vue +2 -2
  322. package/src/components/tag/Tag.vue +4 -1
  323. package/src/components/taginput/Taginput.spec.js +10 -0
  324. package/src/components/taginput/Taginput.vue +8 -3
  325. package/src/components/toast/index.js +2 -2
  326. package/src/components/tooltip/Tooltip.vue +5 -5
  327. package/src/components/upload/Upload.vue +15 -8
  328. package/src/index.js +11 -4
  329. package/src/scss/buefy-build.scss +3 -3
  330. package/src/scss/buefy.scss +4 -0
  331. package/src/scss/components/_datepicker.scss +40 -1
  332. package/src/scss/components/_form.scss +52 -1
  333. package/src/scss/components/_progress.scss +45 -0
  334. package/src/scss/components/_radio.scss +14 -14
  335. package/src/scss/components/_slider.scss +138 -0
  336. package/src/scss/components/_steps.scss +4 -4
  337. package/src/scss/components/_switch.scss +54 -2
  338. package/src/scss/components/_taginput.scss +3 -0
  339. package/src/scss/components/_upload.scss +1 -3
  340. package/src/utils/SlotComponent.js +9 -2
  341. package/src/utils/TimepickerMixin.js +17 -6
  342. package/src/utils/config.js +4 -1
  343. package/src/utils/helpers.spec.js +67 -0
  344. package/src/utils/plugins.js +2 -1
  345. package/types/components.d.ts +3 -3
  346. package/types/index.d.ts +24 -11
  347. package/dist/components/index.js +0 -2
@@ -107,6 +107,7 @@
107
107
  :day-names="dayNames"
108
108
  :month-names="monthNames"
109
109
  :first-day-of-week="firstDayOfWeek"
110
+ :rules-for-first-week="rulesForFirstWeek"
110
111
  :min-date="minDate"
111
112
  :max-date="maxDate"
112
113
  :focused="focusedDateData"
@@ -120,6 +121,8 @@
120
121
  :type-month="isTypeMonth"
121
122
  :nearby-month-days="nearbyMonthDays"
122
123
  :nearby-selectable-month-days="nearbySelectableMonthDays"
124
+ :show-week-number="showWeekNumber"
125
+ :range="range"
123
126
  @close="togglePicker(false)"/>
124
127
  </div>
125
128
  <div v-else>
@@ -162,6 +165,7 @@
162
165
  :min="formatNative(minDate)"
163
166
  :disabled="disabled"
164
167
  :readonly="false"
168
+ :show-week-number="showWeekNumber"
165
169
  v-bind="$attrs"
166
170
  :use-html5-validation="useHtml5Validation"
167
171
  @change.native="onChangeNativePicker"
@@ -186,12 +190,15 @@ import DatepickerTable from './DatepickerTable'
186
190
  import DatepickerMonth from './DatepickerMonth'
187
191
 
188
192
  const defaultDateFormatter = (date, vm) => {
189
- const yyyyMMdd = date.getFullYear() +
190
- '/' + (date.getMonth() + 1) +
191
- '/' + date.getDate()
192
- const d = new Date(yyyyMMdd)
193
- return !vm.isTypeMonth ? d.toLocaleDateString()
194
- : d.toLocaleDateString(undefined, { year: 'numeric', month: '2-digit' })
193
+ const targetDates = Array.isArray(date) ? date : [date]
194
+ return targetDates.map((date) => {
195
+ const yyyyMMdd = date.getFullYear() +
196
+ '/' + (date.getMonth() + 1) +
197
+ '/' + date.getDate()
198
+ const d = new Date(yyyyMMdd)
199
+ return !vm.isTypeMonth ? d.toLocaleDateString()
200
+ : d.toLocaleDateString(undefined, { year: 'numeric', month: '2-digit' })
201
+ }).join(' - ')
195
202
  }
196
203
 
197
204
  const defaultDateParser = (date, vm) => {
@@ -222,7 +229,9 @@ export default {
222
229
  mixins: [FormElementMixin],
223
230
  inheritAttrs: false,
224
231
  props: {
225
- value: Date,
232
+ value: {
233
+ type: [Date, Array]
234
+ },
226
235
  dayNames: {
227
236
  type: Array,
228
237
  default: () => {
@@ -351,10 +360,24 @@ export default {
351
360
  nearbySelectableMonthDays: {
352
361
  type: Boolean,
353
362
  default: () => config.defaultDatepickerNearbySelectableMonthDays
363
+ },
364
+ showWeekNumber: {
365
+ type: Boolean,
366
+ default: () => config.defaultDatepickerShowWeekNumber
367
+ },
368
+ rulesForFirstWeek: {
369
+ type: Number,
370
+ default: () => 4
371
+ },
372
+ range: {
373
+ type: Boolean,
374
+ default: false
354
375
  }
355
376
  },
356
377
  data() {
357
- const focusedDate = this.value || this.focusedDate || this.dateCreator()
378
+ const focusedDate = Array.isArray(this.value)
379
+ ? this.value[0]
380
+ : (this.value || this.focusedDate || this.dateCreator())
358
381
 
359
382
  return {
360
383
  dateSelected: this.value,
@@ -384,12 +407,12 @@ export default {
384
407
  listOfYears() {
385
408
  let latestYear = this.focusedDateData.year + this.yearsRange[1]
386
409
  if (this.maxDate && this.maxDate.getFullYear() < latestYear) {
387
- latestYear = this.maxDate.getFullYear()
410
+ latestYear = Math.max(this.maxDate.getFullYear(), this.focusedDateData.year)
388
411
  }
389
412
 
390
413
  let earliestYear = this.focusedDateData.year + this.yearsRange[0]
391
414
  if (this.minDate && this.minDate.getFullYear() > earliestYear) {
392
- earliestYear = this.minDate.getFullYear()
415
+ earliestYear = Math.min(this.minDate.getFullYear(), this.focusedDateData.year)
393
416
  }
394
417
 
395
418
  const arrayOfYears = []
@@ -478,11 +501,11 @@ export default {
478
501
  * Format date into string
479
502
  */
480
503
  formatValue(value) {
481
- if (value && !isNaN(value)) {
482
- return this.dateFormatter(value, this)
483
- } else {
484
- return null
504
+ if (Array.isArray(value)) {
505
+ const isArrayWithValidDates = Array.isArray(value) && value.every((v) => !isNaN(v))
506
+ return isArrayWithValidDates ? this.dateFormatter(value, this) : null
485
507
  }
508
+ return (value && !isNaN(value)) ? this.dateFormatter(value, this) : null
486
509
  },
487
510
 
488
511
  /*
@@ -563,11 +586,13 @@ export default {
563
586
  */
564
587
  onChangeNativePicker(event) {
565
588
  const date = event.target.value
566
- this.computedValue = date ? new Date(date) : null
589
+ this.computedValue = date ? new Date(date + ' 00:00:00') : null
567
590
  },
568
591
 
569
592
  updateInternalState(value) {
570
- const currentDate = !value ? this.dateCreator() : value
593
+ const currentDate = Array.isArray(value)
594
+ ? value[0]
595
+ : (!value ? this.dateCreator() : value)
571
596
  this.focusedDateData = {
572
597
  month: currentDate.getMonth(),
573
598
  year: currentDate.getFullYear()
@@ -601,7 +626,9 @@ export default {
601
626
  */
602
627
  toggle() {
603
628
  if (this.mobileNative && this.isMobile) {
604
- this.$refs.input.$el.click()
629
+ const input = this.$refs.input.$refs.input
630
+ input.focus()
631
+ input.click()
605
632
  return
606
633
  }
607
634
  this.$refs.dropdown.toggle()
@@ -617,8 +644,8 @@ export default {
617
644
  },
618
645
 
619
646
  /**
620
- * Keypress event that is bound to the document.
621
- */
647
+ * Keypress event that is bound to the document.
648
+ */
622
649
  keyPress(event) {
623
650
  // Esc key
624
651
  if (this.$refs.dropdown && this.$refs.dropdown.isActive && event.keyCode === 27) {
@@ -1,6 +1,5 @@
1
1
  import { shallowMount } from '@vue/test-utils'
2
2
  import BDatepickerTable from '@components/datepicker/DatepickerTable'
3
-
4
3
  import config, {setOptions} from '@utils/config'
5
4
 
6
5
  describe('BDatepickerTable', () => {
@@ -36,12 +35,118 @@ describe('BDatepickerTable', () => {
36
35
  dayNames: config.defaultDayNames,
37
36
  monthNames: config.defaultMonthNames,
38
37
  events: [new Date('July 22, 2018 07:22:13'), new Date('July 23, 2018 00:00:00')],
38
+ focused: {
39
+ month: 6,
40
+ year: 2018
41
+ }
42
+ }
43
+ })
44
+ expect(wrapper.vm.eventsInThisWeek(wrapper.vm.weeksInThisMonth[3]).length).toEqual(2)
45
+ })
46
+
47
+ it('emit input event with selected date as payload when updateSelectedDate is called', () => {
48
+ const wrapper = shallowMount(BDatepickerTable, {
49
+ propsData: {
50
+ dayNames: config.defaultDayNames,
51
+ monthNames: config.defaultMonthNames,
39
52
  focused: {
40
53
  month: config.focusedDate.getMonth(),
41
54
  year: config.focusedDate.getFullYear()
42
55
  }
43
56
  }
44
57
  })
45
- expect(wrapper.vm.eventsInThisWeek(wrapper.vm.weeksInThisMonth[3]).length).toEqual(2)
58
+ const newDate = new Date()
59
+ wrapper.vm.updateSelectedDate(newDate)
60
+ const valueEmitted = wrapper.emitted()['input'][0]
61
+ expect(valueEmitted).toContainEqual(newDate)
62
+ })
63
+
64
+ describe('#hoveredDateRange', () => {
65
+ const selectedBeginDate = new Date(2019, 3, 10)
66
+ const threeDaysAfterBeginDate = new Date(2019, 3, 13)
67
+ const threeDaysBeforeBeginDate = new Date(2019, 3, 7)
68
+
69
+ const defaultProps = () => ({
70
+ dayNames: config.defaultDayNames,
71
+ monthNames: config.defaultMonthNames,
72
+ focused: {
73
+ month: config.focusedDate.getMonth(),
74
+ year: config.focusedDate.getFullYear()
75
+ }
76
+ })
77
+
78
+ it('should return an empty array when props range is false', () => {
79
+ const wrapper = shallowMount(BDatepickerTable, {
80
+ propsData: {
81
+ ...defaultProps(),
82
+ range: false
83
+ }
84
+ })
85
+ expect(wrapper.vm.hoveredDateRange).toEqual([])
86
+ })
87
+
88
+ it('should return an empty array when selectedEndDate exists', () => {
89
+ const wrapper = shallowMount(BDatepickerTable, {
90
+ propsData: {
91
+ ...defaultProps(),
92
+ range: true
93
+ }
94
+ })
95
+ wrapper.setData({
96
+ selectedBeginDate,
97
+ selectedEndDate: threeDaysAfterBeginDate
98
+ })
99
+ expect(wrapper.vm.hoveredDateRange).toEqual([])
100
+ })
101
+
102
+ it('should return an array of two dates', () => {
103
+ const wrapper = shallowMount(BDatepickerTable, {
104
+ propsData: {
105
+ ...defaultProps(),
106
+ range: true
107
+ }
108
+ })
109
+ wrapper.setData({
110
+ selectedBeginDate,
111
+ hoveredEndDate: threeDaysAfterBeginDate
112
+ })
113
+ expect(wrapper.vm.hoveredDateRange).toEqual([
114
+ selectedBeginDate,
115
+ threeDaysAfterBeginDate
116
+ ])
117
+ })
118
+
119
+ it('should return the earlier date as the first element', () => {
120
+ const wrapper = shallowMount(BDatepickerTable, {
121
+ propsData: {
122
+ ...defaultProps(),
123
+ range: true
124
+ }
125
+ })
126
+ wrapper.setData({
127
+ selectedBeginDate,
128
+ hoveredEndDate: threeDaysBeforeBeginDate
129
+ })
130
+ expect(wrapper.vm.hoveredDateRange).toEqual([
131
+ threeDaysBeforeBeginDate,
132
+ selectedBeginDate
133
+ ])
134
+ })
135
+
136
+ it('should filter only defined values', () => {
137
+ const wrapper = shallowMount(BDatepickerTable, {
138
+ propsData: {
139
+ ...defaultProps(),
140
+ range: true
141
+ }
142
+ })
143
+ wrapper.setData({
144
+ selectedBeginDate,
145
+ hoveredEndDate: undefined
146
+ })
147
+ expect(wrapper.vm.hoveredDateRange).toEqual([
148
+ selectedBeginDate
149
+ ])
150
+ })
46
151
  })
47
152
  })
@@ -26,7 +26,13 @@
26
26
  :date-creator="dateCreator"
27
27
  :nearby-month-days="nearbyMonthDays"
28
28
  :nearby-selectable-month-days="nearbySelectableMonthDays"
29
- @select="updateSelectedDate"/>
29
+ :show-week-number="showWeekNumber"
30
+ :first-day-of-week="firstDayOfWeek"
31
+ :rules-for-first-week="rulesForFirstWeek"
32
+ :range="range"
33
+ :hovered-date-range="hoveredDateRange"
34
+ @select="updateSelectedDate"
35
+ @rangeHoverEndDate="setRangeHoverEndDate"/>
30
36
  </div>
31
37
  </section>
32
38
  </template>
@@ -34,13 +40,17 @@
34
40
  <script>
35
41
  import DatepickerTableRow from './DatepickerTableRow'
36
42
 
43
+ const isDefined = (d) => d !== undefined
44
+
37
45
  export default {
38
46
  name: 'BDatepickerTable',
39
47
  components: {
40
48
  [DatepickerTableRow.name]: DatepickerTableRow
41
49
  },
42
50
  props: {
43
- value: Date,
51
+ value: {
52
+ type: [Date, Array]
53
+ },
44
54
  dayNames: Array,
45
55
  monthNames: Array,
46
56
  firstDayOfWeek: Number,
@@ -55,7 +65,23 @@ export default {
55
65
  unselectableDaysOfWeek: Array,
56
66
  selectableDates: Array,
57
67
  nearbyMonthDays: Boolean,
58
- nearbySelectableMonthDays: Boolean
68
+ nearbySelectableMonthDays: Boolean,
69
+ showWeekNumber: {
70
+ type: Boolean,
71
+ default: () => false
72
+ },
73
+ rulesForFirstWeek: {
74
+ type: Number,
75
+ default: () => 4
76
+ },
77
+ range: Boolean
78
+ },
79
+ data() {
80
+ return {
81
+ selectedBeginDate: undefined,
82
+ selectedEndDate: undefined,
83
+ hoveredEndDate: undefined
84
+ }
59
85
  },
60
86
  computed: {
61
87
  visibleDayNames() {
@@ -66,6 +92,7 @@ export default {
66
92
  visibleDayNames.push(currentDayName)
67
93
  index++
68
94
  }
95
+ if (this.showWeekNumber) visibleDayNames.unshift('')
69
96
  return visibleDayNames
70
97
  },
71
98
 
@@ -129,6 +156,18 @@ export default {
129
156
  }
130
157
 
131
158
  return weeksInThisMonth
159
+ },
160
+ hoveredDateRange() {
161
+ if (!this.range) {
162
+ return []
163
+ }
164
+ if (!isNaN(this.selectedEndDate)) {
165
+ return []
166
+ }
167
+ if (this.hoveredEndDate < this.selectedBeginDate) {
168
+ return [this.hoveredEndDate, this.selectedBeginDate].filter(isDefined)
169
+ }
170
+ return [this.selectedBeginDate, this.hoveredEndDate].filter(isDefined)
132
171
  }
133
172
  },
134
173
  methods: {
@@ -136,7 +175,33 @@ export default {
136
175
  * Emit input event with selected date as payload for v-model in parent
137
176
  */
138
177
  updateSelectedDate(date) {
139
- this.$emit('input', date)
178
+ if (!this.range) {
179
+ this.$emit('input', date)
180
+ } else {
181
+ this.handleSelectRangeDate(date)
182
+ }
183
+ },
184
+
185
+ /*
186
+ * If both begin and end dates are set, reset the end date and set the begin date.
187
+ * If only begin date is selected, emit an array of the begin date and the new date.
188
+ * If not set, only set the begin date.
189
+ */
190
+ handleSelectRangeDate(date) {
191
+ if (this.selectedBeginDate && this.selectedEndDate) {
192
+ this.selectedBeginDate = date
193
+ this.selectedEndDate = undefined
194
+ } else if (this.selectedBeginDate && !this.selectedEndDate) {
195
+ if (this.selectedBeginDate > date) {
196
+ this.selectedEndDate = this.selectedBeginDate
197
+ this.selectedBeginDate = date
198
+ } else {
199
+ this.selectedEndDate = date
200
+ }
201
+ this.$emit('input', [this.selectedBeginDate, this.selectedEndDate])
202
+ } else {
203
+ this.selectedBeginDate = date
204
+ }
140
205
  },
141
206
 
142
207
  /*
@@ -185,6 +250,10 @@ export default {
185
250
 
186
251
  return week.some((weekDate) => weekDate.getTime() === timed)
187
252
  })
253
+ },
254
+
255
+ setRangeHoverEndDate(day) {
256
+ this.hoveredEndDate = day
188
257
  }
189
258
  }
190
259
  }
@@ -1,26 +1,136 @@
1
1
  import { shallowMount } from '@vue/test-utils'
2
2
  import BDatepickerTableRow from '@components/datepicker/DatepickerTableRow'
3
3
 
4
+ const propsData = {
5
+ week: [
6
+ new Date('Sun Dec 31 2017 00:00:00 GMT-0200 (-02)'),
7
+ new Date('Mon Jan 01 2018 00:00:00 GMT-0200 (-02)'),
8
+ new Date('Tue Jan 02 2018 00:00:00 GMT-0200 (-02)'),
9
+ new Date('Wed Jan 03 2018 00:00:00 GMT-0200 (-02)'),
10
+ new Date('Thu Jan 04 2018 00:00:00 GMT-0200 (-02)'),
11
+ new Date('Fri Jan 05 2018 00:00:00 GMT-0200 (-02)'),
12
+ new Date('Sat Jan 06 2018 00:00:00 GMT-0200 (-02)')
13
+ ],
14
+ month: 12,
15
+ dateCreator: function () {
16
+ return new Date()
17
+ }
18
+ }
19
+
4
20
  describe('BDatepickerTableRow', () => {
5
21
  it('is called', () => {
6
- const wrapper = shallowMount(BDatepickerTableRow, {
7
- propsData: {
8
- week: [
9
- new Date('Sun Dec 31 2017 00:00:00 GMT-0200 (-02)'),
10
- new Date('Mon Jan 01 2018 00:00:00 GMT-0200 (-02)'),
11
- new Date('Tue Jan 02 2018 00:00:00 GMT-0200 (-02)'),
12
- new Date('Wed Jan 03 2018 00:00:00 GMT-0200 (-02)'),
13
- new Date('Thu Jan 04 2018 00:00:00 GMT-0200 (-02)'),
14
- new Date('Fri Jan 05 2018 00:00:00 GMT-0200 (-02)'),
15
- new Date('Sat Jan 06 2018 00:00:00 GMT-0200 (-02)')
16
- ],
17
- month: 12,
18
- dateCreator: function () {
19
- return new Date()
20
- }
21
- }
22
- })
22
+ const wrapper = shallowMount(BDatepickerTableRow, { propsData })
23
23
  expect(wrapper.name()).toBe('BDatepickerTableRow')
24
24
  expect(wrapper.isVueInstance()).toBeTruthy()
25
25
  })
26
+
27
+ describe('classObject', function () {
28
+ it('should have is-selected class for all range of dates selected', function () {
29
+ const wrapper = shallowMount(BDatepickerTableRow, {
30
+ propsData: {
31
+ ...propsData,
32
+ selectedDate: [propsData.week[1], propsData.week[5]]
33
+ }
34
+ })
35
+ expect(wrapper.findAll('.is-selected').length).toBe(5)
36
+ })
37
+
38
+ it('should have is-first-selected class for the first date selected within the range', function () {
39
+ const wrapper = shallowMount(BDatepickerTableRow, {
40
+ propsData: {
41
+ ...propsData,
42
+ selectedDate: [propsData.week[1], propsData.week[5]]
43
+ }
44
+ })
45
+ const {wrappers: [firstSelectedCell]} = wrapper.findAll('.is-selected')
46
+ expect(firstSelectedCell.classes()).toContain('is-first-selected')
47
+ })
48
+
49
+ it('should have is-within-selected class for the dates selected within the range', function () {
50
+ const wrapper = shallowMount(BDatepickerTableRow, {
51
+ propsData: {
52
+ ...propsData,
53
+ selectedDate: [propsData.week[1], propsData.week[5]]
54
+ }
55
+ })
56
+ const withinSelectedRangeCells = wrapper.findAll('.is-selected.is-within-selected')
57
+ expect(withinSelectedRangeCells.length).toBe(3)
58
+ })
59
+
60
+ it('should have is-last-selected class for the last date selected within the range', function () {
61
+ const wrapper = shallowMount(BDatepickerTableRow, {
62
+ propsData: {
63
+ ...propsData,
64
+ selectedDate: [propsData.week[1], propsData.week[5]]
65
+ }
66
+ })
67
+ // wrappers should return 5 elements. Destructure to get the last one
68
+ const {wrappers: [, , , , lastSelectedCell]} = wrapper.findAll('.is-selected')
69
+ expect(lastSelectedCell.classes()).toContain('is-last-selected')
70
+ })
71
+
72
+ it('should has is-selected class for all range of dates selected', function () {
73
+ const wrapper = shallowMount(BDatepickerTableRow, {
74
+ propsData: {
75
+ ...propsData,
76
+ selectedDate: [propsData.week[1], propsData.week[5]]
77
+ }
78
+ })
79
+ expect(wrapper.findAll('.is-selected').length).toBe(5)
80
+ })
81
+
82
+ it('should have is-within-hovered-range class for all range of dates hovered', function () {
83
+ const wrapper = shallowMount(BDatepickerTableRow, {
84
+ propsData: {
85
+ ...propsData,
86
+ selectedDate: [propsData.week[1], propsData.week[5]]
87
+ }
88
+ })
89
+ expect(wrapper.findAll('.is-selected').length).toBe(5)
90
+ })
91
+
92
+ it('should have is-first-hovered class for the first date hovered within the range', function () {
93
+ const wrapper = shallowMount(BDatepickerTableRow, {
94
+ propsData: {
95
+ ...propsData,
96
+ hoveredDateRange: [propsData.week[1], propsData.week[2]]
97
+ }
98
+ })
99
+ const {wrappers: [firstHoveredCell]} = wrapper.findAll('.is-within-hovered-range')
100
+ expect(firstHoveredCell.classes()).toContain('is-first-hovered')
101
+ })
102
+
103
+ it('should have is-within-hovered class for the dates hovered within the range', function () {
104
+ const wrapper = shallowMount(BDatepickerTableRow, {
105
+ propsData: {
106
+ ...propsData,
107
+ hoveredDateRange: [propsData.week[1], propsData.week[5]]
108
+ }
109
+ })
110
+ const withinHoveredRangeCells = wrapper.findAll('.is-within-hovered-range.is-within-hovered')
111
+ expect(withinHoveredRangeCells.length).toBe(3)
112
+ })
113
+
114
+ it('should have is-last-hovered class for the last date hovered within the range', function () {
115
+ const wrapper = shallowMount(BDatepickerTableRow, {
116
+ propsData: {
117
+ ...propsData,
118
+ hoveredDateRange: [propsData.week[1], propsData.week[5]]
119
+ }
120
+ })
121
+ // wrappers should return 5 elements. Destructure to get the last one
122
+ const {wrappers: [, , , , lastHoveredCell]} = wrapper.findAll('.is-within-hovered-range')
123
+ expect(lastHoveredCell.classes()).toContain('is-last-hovered')
124
+ })
125
+
126
+ it('should has is-within-hovered-range class for all range of dates hovered', function () {
127
+ const wrapper = shallowMount(BDatepickerTableRow, {
128
+ propsData: {
129
+ ...propsData,
130
+ hoveredDateRange: [propsData.week[1], propsData.week[5]]
131
+ }
132
+ })
133
+ expect(wrapper.findAll('.is-within-hovered-range').length).toBe(5)
134
+ })
135
+ })
26
136
  })