buefy 0.9.13 → 0.9.17

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 (265) hide show
  1. package/CHANGELOG.md +1706 -1639
  2. package/README.md +1 -1
  3. package/dist/buefy.css +313 -1
  4. package/dist/buefy.esm.js +4431 -2331
  5. package/dist/buefy.esm.min.js +2 -2
  6. package/dist/buefy.js +4467 -2364
  7. package/dist/buefy.min.css +1 -1
  8. package/dist/buefy.min.js +2 -2
  9. package/dist/cjs/autocomplete.js +5 -5
  10. package/dist/cjs/button.js +3 -3
  11. package/dist/cjs/carousel.js +4 -4
  12. package/dist/cjs/{chunk-34949503.js → chunk-0d6f213f.js} +2 -2
  13. package/dist/cjs/{chunk-2c7de785.js → chunk-0e3108f5.js} +2 -2
  14. package/dist/cjs/{chunk-2911aa4b.js → chunk-1438658c.js} +14 -11
  15. package/dist/cjs/{chunk-114191ae.js → chunk-1f7e4ed3.js} +3 -3
  16. package/dist/cjs/{chunk-a11294f9.js → chunk-334bc809.js} +1 -1
  17. package/dist/cjs/chunk-45739695.js +332 -0
  18. package/dist/cjs/{chunk-c7b2aa4b.js → chunk-4bcfaf1c.js} +0 -0
  19. package/dist/cjs/{chunk-f5106717.js → chunk-5058e659.js} +3 -3
  20. package/dist/cjs/{chunk-61023b09.js → chunk-545e1c7f.js} +102 -16
  21. package/dist/cjs/{chunk-30670fac.js → chunk-54b0042d.js} +19 -3
  22. package/dist/cjs/{chunk-fe2f57ee.js → chunk-5ed8a75a.js} +2 -2
  23. package/dist/cjs/{chunk-d120e215.js → chunk-73f8eef8.js} +8 -2
  24. package/dist/cjs/{chunk-2062216d.js → chunk-7c11fdde.js} +5 -4
  25. package/dist/cjs/{chunk-3cc5d9a6.js → chunk-841c0e0f.js} +1 -1
  26. package/dist/cjs/{chunk-9e4cf4c5.js → chunk-87a116d9.js} +0 -0
  27. package/dist/cjs/{chunk-fefd7b77.js → chunk-a53b7aff.js} +0 -0
  28. package/dist/cjs/{chunk-d0f8ea39.js → chunk-c0a093d7.js} +7 -7
  29. package/dist/cjs/{chunk-7da0c017.js → chunk-c8abb3ed.js} +21 -21
  30. package/dist/cjs/{chunk-c6fbc7b4.js → chunk-d0df905a.js} +15 -2
  31. package/dist/cjs/{chunk-d54e40f6.js → chunk-e86d3eeb.js} +1 -8
  32. package/dist/cjs/{chunk-6cb902f8.js → chunk-e872f5e2.js} +1 -1
  33. package/dist/cjs/{chunk-2ae50815.js → chunk-f5285f14.js} +4 -4
  34. package/dist/cjs/clockpicker.js +8 -8
  35. package/dist/cjs/colorpicker.js +1752 -0
  36. package/dist/cjs/config.js +1 -1
  37. package/dist/cjs/datepicker.js +11 -11
  38. package/dist/cjs/datetimepicker.js +30 -14
  39. package/dist/cjs/dialog.js +5 -5
  40. package/dist/cjs/dropdown.js +3 -3
  41. package/dist/cjs/field.js +2 -2
  42. package/dist/cjs/helpers.js +21 -1
  43. package/dist/cjs/icon.js +2 -2
  44. package/dist/cjs/image.js +2 -2
  45. package/dist/cjs/index.js +27 -22
  46. package/dist/cjs/input.js +4 -4
  47. package/dist/cjs/loading.js +5 -5
  48. package/dist/cjs/menu.js +2 -2
  49. package/dist/cjs/message.js +4 -9
  50. package/dist/cjs/modal.js +5 -5
  51. package/dist/cjs/navbar.js +4 -1
  52. package/dist/cjs/notification.js +7 -7
  53. package/dist/cjs/numberinput.js +30 -21
  54. package/dist/cjs/pagination.js +7 -7
  55. package/dist/cjs/progress.js +3 -3
  56. package/dist/cjs/rate.js +2 -2
  57. package/dist/cjs/select.js +4 -4
  58. package/dist/cjs/sidebar.js +1 -1
  59. package/dist/cjs/slider.js +3 -3
  60. package/dist/cjs/snackbar.js +5 -4
  61. package/dist/cjs/steps.js +5 -5
  62. package/dist/cjs/table.js +157 -146
  63. package/dist/cjs/tabs.js +7 -7
  64. package/dist/cjs/taginput.js +5 -5
  65. package/dist/cjs/timepicker.js +12 -12
  66. package/dist/cjs/toast.js +3 -3
  67. package/dist/cjs/tooltip.js +4 -4
  68. package/dist/cjs/upload.js +23 -9
  69. package/dist/components/autocomplete/index.js +24 -2
  70. package/dist/components/autocomplete/index.min.js +2 -2
  71. package/dist/components/breadcrumb/index.js +1 -1
  72. package/dist/components/breadcrumb/index.min.js +1 -1
  73. package/dist/components/button/index.js +8 -2
  74. package/dist/components/button/index.min.js +2 -2
  75. package/dist/components/carousel/index.js +8 -2
  76. package/dist/components/carousel/index.min.js +2 -2
  77. package/dist/components/checkbox/index.js +1 -1
  78. package/dist/components/checkbox/index.min.js +1 -1
  79. package/dist/components/clockpicker/index.js +41 -22
  80. package/dist/components/clockpicker/index.min.js +2 -2
  81. package/dist/components/collapse/index.js +1 -1
  82. package/dist/components/collapse/index.min.js +1 -1
  83. package/dist/components/colorpicker/index.js +4318 -0
  84. package/dist/components/colorpicker/index.min.js +2 -0
  85. package/dist/components/datepicker/index.js +48 -26
  86. package/dist/components/datepicker/index.min.js +2 -2
  87. package/dist/components/datetimepicker/index.js +66 -28
  88. package/dist/components/datetimepicker/index.min.js +2 -2
  89. package/dist/components/dialog/index.js +8 -2
  90. package/dist/components/dialog/index.min.js +2 -2
  91. package/dist/components/dropdown/index.js +14 -1
  92. package/dist/components/dropdown/index.min.js +2 -2
  93. package/dist/components/field/index.js +21 -21
  94. package/dist/components/field/index.min.js +1 -1
  95. package/dist/components/icon/index.js +8 -2
  96. package/dist/components/icon/index.min.js +2 -2
  97. package/dist/components/image/index.js +1 -1
  98. package/dist/components/image/index.min.js +1 -1
  99. package/dist/components/input/index.js +8 -2
  100. package/dist/components/input/index.min.js +2 -2
  101. package/dist/components/loading/index.js +1 -1
  102. package/dist/components/loading/index.min.js +1 -1
  103. package/dist/components/menu/index.js +8 -2
  104. package/dist/components/menu/index.min.js +2 -2
  105. package/dist/components/message/index.js +11 -9
  106. package/dist/components/message/index.min.js +2 -2
  107. package/dist/components/modal/index.js +1 -1
  108. package/dist/components/modal/index.min.js +1 -1
  109. package/dist/components/navbar/index.js +4 -1
  110. package/dist/components/navbar/index.min.js +2 -2
  111. package/dist/components/notification/index.js +13 -13
  112. package/dist/components/notification/index.min.js +2 -2
  113. package/dist/components/numberinput/index.js +34 -19
  114. package/dist/components/numberinput/index.min.js +2 -2
  115. package/dist/components/pagination/index.js +107 -16
  116. package/dist/components/pagination/index.min.js +2 -2
  117. package/dist/components/progress/index.js +2 -2
  118. package/dist/components/progress/index.min.js +2 -2
  119. package/dist/components/radio/index.js +1 -1
  120. package/dist/components/radio/index.min.js +1 -1
  121. package/dist/components/rate/index.js +8 -2
  122. package/dist/components/rate/index.min.js +2 -2
  123. package/dist/components/select/index.js +8 -2
  124. package/dist/components/select/index.min.js +2 -2
  125. package/dist/components/sidebar/index.js +1 -1
  126. package/dist/components/sidebar/index.min.js +1 -1
  127. package/dist/components/skeleton/index.js +1 -1
  128. package/dist/components/skeleton/index.min.js +1 -1
  129. package/dist/components/slider/index.js +2 -2
  130. package/dist/components/slider/index.min.js +2 -2
  131. package/dist/components/snackbar/index.js +4 -10
  132. package/dist/components/snackbar/index.min.js +2 -2
  133. package/dist/components/steps/index.js +8 -2
  134. package/dist/components/steps/index.min.js +2 -2
  135. package/dist/components/switch/index.js +1 -1
  136. package/dist/components/switch/index.min.js +1 -1
  137. package/dist/components/table/index.js +253 -133
  138. package/dist/components/table/index.min.js +2 -2
  139. package/dist/components/tabs/index.js +10 -4
  140. package/dist/components/tabs/index.min.js +2 -2
  141. package/dist/components/tag/index.js +1 -1
  142. package/dist/components/tag/index.min.js +1 -1
  143. package/dist/components/taginput/index.js +24 -2
  144. package/dist/components/taginput/index.min.js +2 -2
  145. package/dist/components/timepicker/index.js +41 -22
  146. package/dist/components/timepicker/index.min.js +2 -2
  147. package/dist/components/toast/index.js +2 -9
  148. package/dist/components/toast/index.min.js +2 -2
  149. package/dist/components/tooltip/index.js +2 -2
  150. package/dist/components/tooltip/index.min.js +2 -2
  151. package/dist/components/upload/index.js +20 -6
  152. package/dist/components/upload/index.min.js +2 -2
  153. package/dist/esm/autocomplete.js +6 -6
  154. package/dist/esm/button.js +4 -4
  155. package/dist/esm/carousel.js +4 -4
  156. package/dist/esm/{chunk-18e8b067.js → chunk-1a4fde6d.js} +102 -17
  157. package/dist/esm/{chunk-3773c62d.js → chunk-22cf6667.js} +2 -2
  158. package/dist/esm/{chunk-ece062a7.js → chunk-262b3f82.js} +1 -1
  159. package/dist/esm/chunk-455cdeae.js +317 -0
  160. package/dist/esm/{chunk-d7f92d97.js → chunk-5435bd9a.js} +5 -4
  161. package/dist/esm/{chunk-e7c9b2cb.js → chunk-58cdbf2b.js} +2 -2
  162. package/dist/esm/{chunk-29ca0df8.js → chunk-60a03517.js} +1 -1
  163. package/dist/esm/{chunk-21fc0948.js → chunk-66cef090.js} +7 -7
  164. package/dist/esm/{chunk-71a547bc.js → chunk-690d5be4.js} +1 -1
  165. package/dist/esm/{chunk-83eb0d37.js → chunk-6adc5c5d.js} +3 -3
  166. package/dist/esm/{chunk-c9c58d0c.js → chunk-6d0f2352.js} +0 -0
  167. package/dist/esm/{chunk-8d0f95b8.js → chunk-6d96579e.js} +4 -4
  168. package/dist/esm/{chunk-22e9f916.js → chunk-6fb4a069.js} +14 -11
  169. package/dist/esm/{chunk-75a5af93.js → chunk-84c6dfd6.js} +0 -0
  170. package/dist/esm/{chunk-ae8ab23a.js → chunk-a628d44d.js} +3 -3
  171. package/dist/esm/{chunk-b0c0c6b0.js → chunk-c9c18b2f.js} +0 -0
  172. package/dist/esm/{chunk-9f7f7441.js → chunk-d35985c7.js} +0 -0
  173. package/dist/esm/{chunk-799e084d.js → chunk-d9232770.js} +1 -8
  174. package/dist/esm/{chunk-4b67a181.js → chunk-dbd43ef1.js} +15 -2
  175. package/dist/esm/{chunk-d92f0cd9.js → chunk-e044aa02.js} +8 -2
  176. package/dist/esm/{chunk-b07e3182.js → chunk-effa4d25.js} +21 -21
  177. package/dist/esm/{chunk-6019fd7a.js → chunk-f9eaeac4.js} +19 -3
  178. package/dist/esm/clockpicker.js +8 -8
  179. package/dist/esm/colorpicker.js +1748 -0
  180. package/dist/esm/config.js +1 -1
  181. package/dist/esm/datepicker.js +10 -10
  182. package/dist/esm/datetimepicker.js +29 -13
  183. package/dist/esm/dialog.js +4 -4
  184. package/dist/esm/dropdown.js +4 -4
  185. package/dist/esm/field.js +3 -3
  186. package/dist/esm/helpers.js +20 -2
  187. package/dist/esm/icon.js +3 -3
  188. package/dist/esm/image.js +3 -3
  189. package/dist/esm/index.js +94 -91
  190. package/dist/esm/input.js +5 -5
  191. package/dist/esm/loading.js +3 -3
  192. package/dist/esm/menu.js +2 -2
  193. package/dist/esm/message.js +3 -8
  194. package/dist/esm/modal.js +3 -3
  195. package/dist/esm/navbar.js +4 -1
  196. package/dist/esm/notification.js +5 -5
  197. package/dist/esm/numberinput.js +30 -21
  198. package/dist/esm/pagination.js +4 -4
  199. package/dist/esm/progress.js +3 -3
  200. package/dist/esm/rate.js +2 -2
  201. package/dist/esm/select.js +5 -5
  202. package/dist/esm/sidebar.js +1 -1
  203. package/dist/esm/slider.js +2 -2
  204. package/dist/esm/snackbar.js +4 -3
  205. package/dist/esm/steps.js +5 -5
  206. package/dist/esm/table.js +155 -144
  207. package/dist/esm/tabs.js +7 -7
  208. package/dist/esm/taginput.js +5 -5
  209. package/dist/esm/timepicker.js +11 -11
  210. package/dist/esm/toast.js +2 -2
  211. package/dist/esm/tooltip.js +3 -3
  212. package/dist/esm/upload.js +21 -7
  213. package/dist/vetur/attributes.json +96 -0
  214. package/dist/vetur/tags.json +30 -1
  215. package/package.json +1 -1
  216. package/src/components/autocomplete/Autocomplete.vue +10 -0
  217. package/src/components/breadcrumb/__snapshots__/BreadcrumbItem.spec.js.snap +1 -5
  218. package/src/components/carousel/__snapshots__/CarouselList.spec.js.snap +48 -48
  219. package/src/components/colorpicker/Colorpicker.spec.js +10 -0
  220. package/src/components/colorpicker/Colorpicker.vue +354 -0
  221. package/src/components/colorpicker/ColorpickerAlphaSlider.spec.js +14 -0
  222. package/src/components/colorpicker/ColorpickerAlphaSlider.vue +194 -0
  223. package/src/components/colorpicker/ColorpickerHSLRepresentationSquare.spec.js +22 -0
  224. package/src/components/colorpicker/ColorpickerHSLRepresentationSquare.vue +366 -0
  225. package/src/components/colorpicker/ColorpickerHSLRepresentationTriangle.spec.js +22 -0
  226. package/src/components/colorpicker/ColorpickerHSLRepresentationTriangle.vue +442 -0
  227. package/src/components/colorpicker/__snapshots__/ColorPickerHSLRepresentationSquare.spec.js.snap +12 -0
  228. package/src/components/colorpicker/__snapshots__/Colorpicker.spec.js.snap +32 -0
  229. package/src/components/colorpicker/__snapshots__/ColorpickerAlphaSlider.spec.js.snap +11 -0
  230. package/src/components/colorpicker/__snapshots__/ColorpickerHSLRepresentationTriangle.spec.js.snap +36 -0
  231. package/src/components/colorpicker/index.js +17 -0
  232. package/src/components/datepicker/DatepickerTableRow.spec.js +26 -0
  233. package/src/components/datepicker/DatepickerTableRow.vue +4 -5
  234. package/src/components/datetimepicker/Datetimepicker.vue +17 -1
  235. package/src/components/dropdown/Dropdown.vue +13 -0
  236. package/src/components/field/Field.vue +271 -271
  237. package/src/components/index.js +2 -0
  238. package/src/components/message/Message.vue +0 -5
  239. package/src/components/navbar/NavbarDropdown.vue +4 -0
  240. package/src/components/notification/Notification.vue +1 -1
  241. package/src/components/numberinput/Numberinput.spec.js +62 -0
  242. package/src/components/numberinput/Numberinput.vue +22 -15
  243. package/src/components/pagination/Pagination.vue +141 -51
  244. package/src/components/progress/Progress.vue +1 -1
  245. package/src/components/snackbar/index.js +2 -1
  246. package/src/components/table/Table.spec.js +17 -3
  247. package/src/components/table/Table.vue +1436 -1409
  248. package/src/components/table/TablePagination.vue +10 -2
  249. package/src/components/tabs/Tabs.vue +2 -0
  250. package/src/components/timepicker/__snapshots__/Timepicker.spec.js.snap +18 -47
  251. package/src/components/tooltip/Tooltip.vue +2 -2
  252. package/src/components/upload/Upload.vue +19 -7
  253. package/src/scss/buefy.scss +1 -0
  254. package/src/scss/components/_colorpicker.scss +283 -0
  255. package/src/scss/components/_pagination.scss +38 -0
  256. package/src/utils/MessageMixin.js +2 -1
  257. package/src/utils/NoticeMixin.js +1 -5
  258. package/src/utils/color.js +441 -0
  259. package/src/utils/color.spec.js +52 -0
  260. package/src/utils/helpers.js +16 -0
  261. package/src/utils/icons.js +7 -1
  262. package/types/components.d.ts +7 -2
  263. package/types/helpers.d.ts +2 -1
  264. package/dist/cjs/chunk-92621ff7.js +0 -141
  265. package/dist/esm/chunk-2452e3d3.js +0 -134
@@ -1,271 +1,271 @@
1
- <template>
2
- <div class="field" :class="rootClasses">
3
- <div
4
- v-if="horizontal"
5
- class="field-label"
6
- :class="[customClass, fieldLabelSize]">
7
- <label
8
- v-if="hasLabel"
9
- :for="labelFor"
10
- :class="customClass"
11
- class="label" >
12
- <slot v-if="$slots.label" name="label"/>
13
- <template v-else>{{ label }}</template>
14
- </label>
15
- </div>
16
- <template v-else>
17
- <label
18
- v-if="hasLabel"
19
- :for="labelFor"
20
- :class="customClass"
21
- class="label">
22
- <slot v-if="$slots.label" name="label"/>
23
- <template v-else>{{ label }}</template>
24
- </label>
25
- </template>
26
- <b-field-body
27
- v-if="horizontal"
28
- :message="newMessage ? formattedMessage : ''"
29
- :type="newType">
30
- <slot/>
31
- </b-field-body>
32
- <div v-else-if="hasInnerField" class="field-body">
33
- <b-field
34
- :addons="false"
35
- :class="innerFieldClasses">
36
- <slot/>
37
- </b-field>
38
- </div>
39
- <template v-else>
40
- <slot/>
41
- </template>
42
- <p
43
- v-if="hasMessage && !horizontal"
44
- class="help"
45
- :class="newType"
46
- >
47
- <slot v-if="$slots.message" name="message"/>
48
- <template v-else>
49
- <template v-for="(mess, i) in formattedMessage">
50
- {{ mess }}
51
- <br :key="i" v-if="(i + 1) < formattedMessage.length">
52
- </template>
53
- </template>
54
- </p>
55
- </div>
56
- </template>
57
-
58
- <script>
59
- import config from '../../utils/config'
60
- import FieldBody from './FieldBody'
61
-
62
- export default {
63
- name: 'BField',
64
- components: {
65
- [FieldBody.name]: FieldBody
66
- },
67
- provide() {
68
- return {
69
- 'BField': this
70
- }
71
- },
72
- inject: {
73
- parent: {
74
- from: 'BField',
75
- default: false
76
- }
77
- }, // Used internally only when using Field in Field
78
- props: {
79
- type: [String, Object],
80
- label: String,
81
- labelFor: String,
82
- message: [String, Array, Object],
83
- grouped: Boolean,
84
- groupMultiline: Boolean,
85
- position: String,
86
- expanded: Boolean,
87
- horizontal: Boolean,
88
- addons: {
89
- type: Boolean,
90
- default: true
91
- },
92
- customClass: String,
93
- labelPosition: {
94
- type: String,
95
- default: () => { return config.defaultFieldLabelPosition }
96
- }
97
- },
98
- data() {
99
- return {
100
- newType: this.type,
101
- newMessage: this.message,
102
- fieldLabelSize: null,
103
- _isField: true // Used internally by Input and Select
104
- }
105
- },
106
- computed: {
107
- rootClasses() {
108
- return [{
109
- 'is-expanded': this.expanded,
110
- 'is-horizontal': this.horizontal,
111
- 'is-floating-in-label': this.hasLabel && !this.horizontal &&
112
- this.labelPosition === 'inside',
113
- 'is-floating-label': this.hasLabel && !this.horizontal &&
114
- this.labelPosition === 'on-border'
115
- },
116
- this.numberInputClasses]
117
- },
118
- innerFieldClasses() {
119
- return [
120
- this.fieldType(),
121
- this.newPosition,
122
- {
123
- 'is-grouped-multiline': this.groupMultiline
124
- }
125
- ]
126
- },
127
- hasInnerField() {
128
- return this.grouped || this.groupMultiline || this.hasAddons()
129
- },
130
- /**
131
- * Correct Bulma class for the side of the addon or group.
132
- *
133
- * This is not kept like the others (is-small, etc.),
134
- * because since 'has-addons' is set automatically it
135
- * doesn't make sense to teach users what addons are exactly.
136
- */
137
- newPosition() {
138
- if (this.position === undefined) return
139
-
140
- const position = this.position.split('-')
141
- if (position.length < 1) return
142
-
143
- const prefix = this.grouped
144
- ? 'is-grouped-'
145
- : 'has-addons-'
146
-
147
- if (this.position) return prefix + position[1]
148
- },
149
- /**
150
- * Formatted message in case it's an array
151
- * (each element is separated by <br> tag)
152
- */
153
- formattedMessage() {
154
- if (this.parent && this.parent.hasInnerField) {
155
- return '' // Message will be displayed in parent field
156
- }
157
- if (typeof this.newMessage === 'string') {
158
- return [this.newMessage]
159
- }
160
- let messages = []
161
- if (Array.isArray(this.newMessage)) {
162
- this.newMessage.forEach((message) => {
163
- if (typeof message === 'string') {
164
- messages.push(message)
165
- } else {
166
- for (let key in message) {
167
- if (message[key]) {
168
- messages.push(key)
169
- }
170
- }
171
- }
172
- })
173
- } else {
174
- for (let key in this.newMessage) {
175
- if (this.newMessage[key]) {
176
- messages.push(key)
177
- }
178
- }
179
- }
180
- return messages.filter((m) => { if (m) return m })
181
- },
182
- hasLabel() {
183
- return this.label || this.$slots.label
184
- },
185
- hasMessage() {
186
- return ((!this.parent || !this.parent.hasInnerField) && this.newMessage) ||
187
- this.$slots.message
188
- },
189
- numberInputClasses() {
190
- if (this.$slots.default) {
191
- const numberinput = this.$slots.default.filter((node) => node.tag && node.tag.toLowerCase().indexOf('numberinput') >= 0)[0]
192
- if (numberinput) {
193
- const classes = ['has-numberinput']
194
- const controlsPosition = numberinput.componentOptions.propsData.controlsPosition
195
- const size = numberinput.componentOptions.propsData.size
196
- if (controlsPosition) {
197
- classes.push(`has-numberinput-${controlsPosition}`)
198
- }
199
- if (size) {
200
- classes.push(`has-numberinput-${size}`)
201
- }
202
- return classes
203
- }
204
- }
205
- return null
206
- }
207
- },
208
- watch: {
209
- /**
210
- * Set internal type when prop change.
211
- */
212
- type(value) {
213
- this.newType = value
214
- },
215
-
216
- /**
217
- * Set internal message when prop change.
218
- */
219
- message(value) {
220
- this.newMessage = value
221
- },
222
-
223
- /**
224
- * Set parent message if we use Field in Field.
225
- */
226
- newMessage(value) {
227
- if (this.parent && this.parent.hasInnerField) {
228
- if (!this.parent.type) {
229
- this.parent.newType = this.newType
230
- }
231
- if (!this.parent.message) {
232
- this.parent.newMessage = value
233
- }
234
- }
235
- }
236
- },
237
- methods: {
238
- /**
239
- * Field has addons if there are more than one slot
240
- * (element / component) in the Field.
241
- * Or is grouped when prop is set.
242
- * Is a method to be called when component re-render.
243
- */
244
- fieldType() {
245
- if (this.grouped) return 'is-grouped'
246
- if (this.hasAddons()) return 'has-addons'
247
- },
248
- hasAddons() {
249
- let renderedNode = 0
250
- if (this.$slots.default) {
251
- renderedNode = this.$slots.default.reduce((i, node) => node.tag ? i + 1 : i, 0)
252
- }
253
- return (
254
- renderedNode > 1 &&
255
- this.addons &&
256
- !this.horizontal
257
- )
258
- }
259
- },
260
- mounted() {
261
- if (this.horizontal) {
262
- // Bulma docs: .is-normal for any .input or .button
263
- const elements = this.$el.querySelectorAll('.input, .select, .button, .textarea, .b-slider')
264
- if (elements.length > 0) {
265
- this.fieldLabelSize = 'is-normal'
266
- }
267
- }
268
- }
269
- }
270
-
271
- </script>
1
+ <template>
2
+ <div class="field" :class="rootClasses">
3
+ <div
4
+ v-if="horizontal"
5
+ class="field-label"
6
+ :class="[customClass, fieldLabelSize]">
7
+ <label
8
+ v-if="hasLabel"
9
+ :for="labelFor"
10
+ :class="customClass"
11
+ class="label" >
12
+ <slot v-if="$slots.label" name="label"/>
13
+ <template v-else>{{ label }}</template>
14
+ </label>
15
+ </div>
16
+ <template v-else>
17
+ <label
18
+ v-if="hasLabel"
19
+ :for="labelFor"
20
+ :class="customClass"
21
+ class="label">
22
+ <slot v-if="$slots.label" name="label"/>
23
+ <template v-else>{{ label }}</template>
24
+ </label>
25
+ </template>
26
+ <b-field-body
27
+ v-if="horizontal"
28
+ :message="newMessage ? formattedMessage : ''"
29
+ :type="newType">
30
+ <slot/>
31
+ </b-field-body>
32
+ <div v-else-if="hasInnerField" class="field-body">
33
+ <b-field
34
+ :addons="false"
35
+ :class="innerFieldClasses">
36
+ <slot/>
37
+ </b-field>
38
+ </div>
39
+ <template v-else>
40
+ <slot/>
41
+ </template>
42
+ <p
43
+ v-if="hasMessage && !horizontal"
44
+ class="help"
45
+ :class="newType"
46
+ >
47
+ <slot v-if="$slots.message" name="message"/>
48
+ <template v-else>
49
+ <template v-for="(mess, i) in formattedMessage">
50
+ {{ mess }}
51
+ <br :key="i" v-if="(i + 1) < formattedMessage.length">
52
+ </template>
53
+ </template>
54
+ </p>
55
+ </div>
56
+ </template>
57
+
58
+ <script>
59
+ import config from '../../utils/config'
60
+ import FieldBody from './FieldBody'
61
+
62
+ export default {
63
+ name: 'BField',
64
+ components: {
65
+ [FieldBody.name]: FieldBody
66
+ },
67
+ provide() {
68
+ return {
69
+ 'BField': this
70
+ }
71
+ },
72
+ inject: {
73
+ parent: {
74
+ from: 'BField',
75
+ default: false
76
+ }
77
+ }, // Used internally only when using Field in Field
78
+ props: {
79
+ type: [String, Object],
80
+ label: String,
81
+ labelFor: String,
82
+ message: [String, Array, Object],
83
+ grouped: Boolean,
84
+ groupMultiline: Boolean,
85
+ position: String,
86
+ expanded: Boolean,
87
+ horizontal: Boolean,
88
+ addons: {
89
+ type: Boolean,
90
+ default: true
91
+ },
92
+ customClass: String,
93
+ labelPosition: {
94
+ type: String,
95
+ default: () => { return config.defaultFieldLabelPosition }
96
+ }
97
+ },
98
+ data() {
99
+ return {
100
+ newType: this.type,
101
+ newMessage: this.message,
102
+ fieldLabelSize: null,
103
+ _isField: true // Used internally by Input and Select
104
+ }
105
+ },
106
+ computed: {
107
+ rootClasses() {
108
+ return [{
109
+ 'is-expanded': this.expanded,
110
+ 'is-horizontal': this.horizontal,
111
+ 'is-floating-in-label': this.hasLabel && !this.horizontal &&
112
+ this.labelPosition === 'inside',
113
+ 'is-floating-label': this.hasLabel && !this.horizontal &&
114
+ this.labelPosition === 'on-border'
115
+ },
116
+ this.numberInputClasses]
117
+ },
118
+ innerFieldClasses() {
119
+ return [
120
+ this.fieldType(),
121
+ this.newPosition,
122
+ {
123
+ 'is-grouped-multiline': this.groupMultiline
124
+ }
125
+ ]
126
+ },
127
+ hasInnerField() {
128
+ return this.grouped || this.groupMultiline || this.hasAddons()
129
+ },
130
+ /**
131
+ * Correct Bulma class for the side of the addon or group.
132
+ *
133
+ * This is not kept like the others (is-small, etc.),
134
+ * because since 'has-addons' is set automatically it
135
+ * doesn't make sense to teach users what addons are exactly.
136
+ */
137
+ newPosition() {
138
+ if (this.position === undefined) return
139
+
140
+ const position = this.position.split('-')
141
+ if (position.length < 1) return
142
+
143
+ const prefix = this.grouped
144
+ ? 'is-grouped-'
145
+ : 'has-addons-'
146
+
147
+ if (this.position) return prefix + position[1]
148
+ },
149
+ /**
150
+ * Formatted message in case it's an array
151
+ * (each element is separated by <br> tag)
152
+ */
153
+ formattedMessage() {
154
+ if (this.parent && this.parent.hasInnerField) {
155
+ return '' // Message will be displayed in parent field
156
+ }
157
+ if (typeof this.newMessage === 'string') {
158
+ return [this.newMessage]
159
+ }
160
+ let messages = []
161
+ if (Array.isArray(this.newMessage)) {
162
+ this.newMessage.forEach((message) => {
163
+ if (typeof message === 'string') {
164
+ messages.push(message)
165
+ } else {
166
+ for (let key in message) {
167
+ if (message[key]) {
168
+ messages.push(key)
169
+ }
170
+ }
171
+ }
172
+ })
173
+ } else {
174
+ for (let key in this.newMessage) {
175
+ if (this.newMessage[key]) {
176
+ messages.push(key)
177
+ }
178
+ }
179
+ }
180
+ return messages.filter((m) => { if (m) return m })
181
+ },
182
+ hasLabel() {
183
+ return this.label || this.$slots.label
184
+ },
185
+ hasMessage() {
186
+ return ((!this.parent || !this.parent.hasInnerField) && this.newMessage) ||
187
+ this.$slots.message
188
+ },
189
+ numberInputClasses() {
190
+ if (this.$slots.default) {
191
+ const numberinput = this.$slots.default.filter((node) => node.tag && node.tag.toLowerCase().indexOf('numberinput') >= 0)[0]
192
+ if (numberinput) {
193
+ const classes = ['has-numberinput']
194
+ const controlsPosition = numberinput.componentOptions.propsData.controlsPosition
195
+ const size = numberinput.componentOptions.propsData.size
196
+ if (controlsPosition) {
197
+ classes.push(`has-numberinput-${controlsPosition}`)
198
+ }
199
+ if (size) {
200
+ classes.push(`has-numberinput-${size}`)
201
+ }
202
+ return classes
203
+ }
204
+ }
205
+ return null
206
+ }
207
+ },
208
+ watch: {
209
+ /**
210
+ * Set internal type when prop change.
211
+ */
212
+ type(value) {
213
+ this.newType = value
214
+ },
215
+
216
+ /**
217
+ * Set internal message when prop change.
218
+ */
219
+ message(value) {
220
+ this.newMessage = value
221
+ },
222
+
223
+ /**
224
+ * Set parent message if we use Field in Field.
225
+ */
226
+ newMessage(value) {
227
+ if (this.parent && this.parent.hasInnerField) {
228
+ if (!this.parent.type) {
229
+ this.parent.newType = this.newType
230
+ }
231
+ if (!this.parent.message) {
232
+ this.parent.newMessage = value
233
+ }
234
+ }
235
+ }
236
+ },
237
+ methods: {
238
+ /**
239
+ * Field has addons if there are more than one slot
240
+ * (element / component) in the Field.
241
+ * Or is grouped when prop is set.
242
+ * Is a method to be called when component re-render.
243
+ */
244
+ fieldType() {
245
+ if (this.grouped) return 'is-grouped'
246
+ if (this.hasAddons()) return 'has-addons'
247
+ },
248
+ hasAddons() {
249
+ let renderedNode = 0
250
+ if (this.$slots.default) {
251
+ renderedNode = this.$slots.default.reduce((i, node) => node.tag ? i + 1 : i, 0)
252
+ }
253
+ return (
254
+ renderedNode > 1 &&
255
+ this.addons &&
256
+ !this.horizontal
257
+ )
258
+ }
259
+ },
260
+ mounted() {
261
+ if (this.horizontal) {
262
+ // Bulma docs: .is-normal for any .input or .button
263
+ const elements = this.$el.querySelectorAll('.input, .select, .button, .textarea, .b-slider')
264
+ if (elements.length > 0) {
265
+ this.fieldLabelSize = 'is-normal'
266
+ }
267
+ }
268
+ }
269
+ }
270
+
271
+ </script>
@@ -5,6 +5,7 @@ import Carousel from './carousel'
5
5
  import Checkbox from './checkbox'
6
6
  import Collapse from './collapse'
7
7
  import Clockpicker from './clockpicker'
8
+ import Colorpicker from './colorpicker'
8
9
  import Datepicker from './datepicker'
9
10
  import Datetimepicker from './datetimepicker'
10
11
  import Dialog from './dialog'
@@ -48,6 +49,7 @@ export {
48
49
  Checkbox,
49
50
  Clockpicker,
50
51
  Collapse,
52
+ Colorpicker,
51
53
  Datepicker,
52
54
  Datetimepicker,
53
55
  Dialog,
@@ -50,11 +50,6 @@ export default {
50
50
  mixins: [MessageMixin],
51
51
  props: {
52
52
  ariaCloseLabel: String
53
- },
54
- data() {
55
- return {
56
- newIconSize: this.iconSize || this.size || 'is-large'
57
- }
58
53
  }
59
54
  }
60
55
  </script>
@@ -74,6 +74,10 @@ export default {
74
74
  watch: {
75
75
  active(value) {
76
76
  this.newActive = value
77
+ },
78
+
79
+ newActive(value) {
80
+ this.$emit('active-change', value)
77
81
  }
78
82
  },
79
83
  methods: {
@@ -18,8 +18,8 @@
18
18
  <b-icon
19
19
  :icon="computedIcon"
20
20
  :pack="iconPack"
21
+ :size="newIconSize"
21
22
  both
22
- size="is-large"
23
23
  aria-hidden/>
24
24
  </div>
25
25
  <div class="media-content">
@@ -101,6 +101,26 @@ describe('BNumberinput', () => {
101
101
 
102
102
  expect(wrapper.vm.computedValue).toEqual(BASE_VALUE)
103
103
  })
104
+
105
+ it('is invalid when step / minStep decimals and value decimals lengths are different', () => {
106
+ wrapper.setProps({step: 1, value: 1.15})
107
+ expect(wrapper.find('input').element.checkValidity()).toEqual(false)
108
+ wrapper.setProps({step: 1.15, value: 1.154})
109
+ expect(wrapper.find('input').element.checkValidity()).toEqual(false)
110
+ wrapper.setProps({step: 1.15, value: 1.11541, minStep: 0.0001})
111
+ expect(wrapper.find('input').element.checkValidity()).toEqual(false)
112
+ })
113
+
114
+ it('is valid when step is "any"', () => {
115
+ wrapper.setProps({step: 'any', value: 1.15})
116
+ expect(wrapper.find('input').element.checkValidity()).toEqual(true)
117
+ wrapper.setProps({step: 'any', value: 1.054878})
118
+ expect(wrapper.find('input').element.checkValidity()).toEqual(true)
119
+ wrapper.setProps({step: 'any', value: 1})
120
+ expect(wrapper.find('input').element.checkValidity()).toEqual(true)
121
+ wrapper.setProps({step: 'any', value: ''})
122
+ expect(wrapper.find('input').element.checkValidity()).toEqual(true)
123
+ })
104
124
  })
105
125
 
106
126
  describe('Rendered (shallow)', () => {
@@ -221,6 +241,26 @@ describe('BNumberinput', () => {
221
241
  expect(wrapper.vm.computedValue).toBe(start - (step * 2))
222
242
  })
223
243
 
244
+ it('can increment / decrement with a "any" step', () => {
245
+ const start = 5
246
+ const step = 'any'
247
+ const min = -5
248
+ wrapper.vm.computedValue = start
249
+ wrapper.setProps({ step, min })
250
+ wrapper.vm.decrement()
251
+ expect(wrapper.vm.computedValue).toBe(start - 1)
252
+ wrapper.vm.decrement()
253
+ expect(wrapper.vm.computedValue).toBe(start - (1 * 2))
254
+
255
+ const decimalStart = 5.15
256
+ wrapper.vm.computedValue = decimalStart
257
+ wrapper.setProps({ step, min })
258
+ wrapper.vm.decrement()
259
+ expect(wrapper.vm.computedValue).toBe(start - 1)
260
+ wrapper.vm.decrement()
261
+ expect(wrapper.vm.computedValue).toBe(start - (1 * 2))
262
+ })
263
+
224
264
  it('can increment / decrement with minStep', () => {
225
265
  const start = 5.51
226
266
  const step = 0.2
@@ -243,6 +283,28 @@ describe('BNumberinput', () => {
243
283
  expect(wrapper.vm.computedValue).toBe(5.3)
244
284
  })
245
285
 
286
+ it('can increment / decrement with minStep and "any" as step', () => {
287
+ const start = 5.51
288
+ const step = 'any'
289
+ const minStep = 0.01
290
+ const min = -5
291
+ wrapper.vm.computedValue = start
292
+ wrapper.setProps({ step, min, minStep })
293
+ wrapper.vm.decrement()
294
+ expect(wrapper.vm.computedValue).toBe(4.51)
295
+ wrapper.vm.decrement()
296
+ expect(wrapper.vm.computedValue).toBe(3.51)
297
+ wrapper.vm.increment()
298
+ expect(wrapper.vm.computedValue).toBe(4.51)
299
+ wrapper.vm.increment()
300
+ expect(wrapper.vm.computedValue).toBe(5.51)
301
+
302
+ const newMinStep = 0.1
303
+ wrapper.setProps({ minStep: newMinStep })
304
+ wrapper.vm.decrement()
305
+ expect(wrapper.vm.computedValue).toBe(4.5)
306
+ })
307
+
246
308
  it('manages empty value', () => {
247
309
  wrapper.vm.computedValue = ''
248
310
  expect(wrapper.vm.computedValue).toBeNull()