buefy 0.9.9 → 0.9.13

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 (278) hide show
  1. package/CHANGELOG.md +1639 -1609
  2. package/dist/buefy.css +20 -2
  3. package/dist/buefy.esm.js +2227 -1869
  4. package/dist/buefy.esm.min.js +2 -2
  5. package/dist/buefy.js +2266 -1907
  6. package/dist/buefy.min.css +1 -1
  7. package/dist/buefy.min.js +2 -2
  8. package/dist/cjs/autocomplete.js +6 -6
  9. package/dist/cjs/breadcrumb.js +127 -0
  10. package/dist/cjs/button.js +6 -107
  11. package/dist/cjs/carousel.js +9 -7
  12. package/dist/cjs/checkbox.js +5 -5
  13. package/dist/cjs/{chunk-d33a8a78.js → chunk-114191ae.js} +3 -3
  14. package/dist/cjs/{chunk-dafdb70c.js → chunk-2062216d.js} +39 -3
  15. package/dist/cjs/{chunk-64efc596.js → chunk-2911aa4b.js} +20 -16
  16. package/dist/cjs/{chunk-96ab31c1.js → chunk-2ae50815.js} +7 -7
  17. package/dist/cjs/{chunk-c3032504.js → chunk-2c7de785.js} +3 -3
  18. package/dist/cjs/{chunk-50ff3a78.js → chunk-30670fac.js} +96 -15
  19. package/dist/cjs/{chunk-e57b3891.js → chunk-34949503.js} +2 -2
  20. package/dist/cjs/{chunk-0abd2223.js → chunk-3b43d77a.js} +2 -2
  21. package/dist/cjs/{chunk-dcdbe2e8.js → chunk-3cc5d9a6.js} +1 -1
  22. package/dist/cjs/{chunk-0b57168e.js → chunk-61023b09.js} +3 -3
  23. package/dist/cjs/chunk-6cb902f8.js +314 -0
  24. package/dist/cjs/{chunk-adb01a93.js → chunk-7da0c017.js} +26 -24
  25. package/dist/cjs/{chunk-60255743.js → chunk-9103eeda.js} +4 -0
  26. package/dist/cjs/{chunk-14c82365.js → chunk-92621ff7.js} +37 -0
  27. package/dist/cjs/{chunk-816cba7a.js → chunk-9e4cf4c5.js} +1 -1
  28. package/dist/cjs/{chunk-33b9d1cf.js → chunk-a11294f9.js} +27 -26
  29. package/dist/cjs/{chunk-430b5370.js → chunk-bfcad370.js} +25 -2
  30. package/dist/cjs/{chunk-cc470e7c.js → chunk-c6fbc7b4.js} +7 -7
  31. package/dist/cjs/{chunk-993f89de.js → chunk-c7b2aa4b.js} +5 -4
  32. package/dist/cjs/{chunk-6474e963.js → chunk-d0f8ea39.js} +9 -9
  33. package/dist/cjs/{chunk-3acb500b.js → chunk-d120e215.js} +2 -2
  34. package/dist/cjs/{chunk-f5baaa70.js → chunk-d54e40f6.js} +2 -1
  35. package/dist/cjs/{chunk-916a2858.js → chunk-f5106717.js} +4 -4
  36. package/dist/cjs/chunk-fe2f57ee.js +110 -0
  37. package/dist/cjs/{chunk-2571dc7c.js → chunk-fefd7b77.js} +0 -0
  38. package/dist/cjs/clockpicker.js +11 -11
  39. package/dist/cjs/config.js +2 -2
  40. package/dist/cjs/datepicker.js +12 -12
  41. package/dist/cjs/datetimepicker.js +22 -15
  42. package/dist/cjs/dialog.js +13 -11
  43. package/dist/cjs/dropdown.js +8 -8
  44. package/dist/cjs/field.js +5 -5
  45. package/dist/cjs/helpers.js +2 -3
  46. package/dist/cjs/icon.js +3 -3
  47. package/dist/cjs/image.js +6 -311
  48. package/dist/cjs/index.js +29 -23
  49. package/dist/cjs/input.js +5 -5
  50. package/dist/cjs/loading.js +6 -6
  51. package/dist/cjs/menu.js +3 -3
  52. package/dist/cjs/message.js +6 -6
  53. package/dist/cjs/modal.js +6 -6
  54. package/dist/cjs/navbar.js +16 -4
  55. package/dist/cjs/notification.js +23 -11
  56. package/dist/cjs/numberinput.js +9 -7
  57. package/dist/cjs/pagination.js +8 -8
  58. package/dist/cjs/progress.js +10 -6
  59. package/dist/cjs/radio.js +3 -3
  60. package/dist/cjs/rate.js +3 -3
  61. package/dist/cjs/select.js +7 -7
  62. package/dist/cjs/sidebar.js +2 -2
  63. package/dist/cjs/slider.js +4 -4
  64. package/dist/cjs/snackbar.js +5 -5
  65. package/dist/cjs/steps.js +8 -8
  66. package/dist/cjs/switch.js +1 -1
  67. package/dist/cjs/table.js +13 -13
  68. package/dist/cjs/tabs.js +8 -8
  69. package/dist/cjs/tag.js +3 -3
  70. package/dist/cjs/taginput.js +34 -22
  71. package/dist/cjs/timepicker.js +13 -13
  72. package/dist/cjs/toast.js +5 -5
  73. package/dist/cjs/tooltip.js +5 -5
  74. package/dist/cjs/upload.js +5 -5
  75. package/dist/components/autocomplete/index.js +98 -13
  76. package/dist/components/autocomplete/index.min.js +2 -2
  77. package/dist/components/breadcrumb/index.js +293 -0
  78. package/dist/components/breadcrumb/index.min.js +2 -0
  79. package/dist/components/button/index.js +5 -1
  80. package/dist/components/button/index.min.js +2 -2
  81. package/dist/components/carousel/index.js +348 -15
  82. package/dist/components/carousel/index.min.js +2 -2
  83. package/dist/components/checkbox/index.js +1 -1
  84. package/dist/components/checkbox/index.min.js +1 -1
  85. package/dist/components/clockpicker/index.js +54 -47
  86. package/dist/components/clockpicker/index.min.js +2 -2
  87. package/dist/components/collapse/index.js +1 -1
  88. package/dist/components/collapse/index.min.js +1 -1
  89. package/dist/components/datepicker/index.js +41 -32
  90. package/dist/components/datepicker/index.min.js +2 -2
  91. package/dist/components/datetimepicker/index.js +75 -58
  92. package/dist/components/datetimepicker/index.min.js +2 -2
  93. package/dist/components/dialog/index.js +126 -18
  94. package/dist/components/dialog/index.min.js +2 -2
  95. package/dist/components/dropdown/index.js +5 -1
  96. package/dist/components/dropdown/index.min.js +1 -1
  97. package/dist/components/field/index.js +29 -23
  98. package/dist/components/field/index.min.js +2 -2
  99. package/dist/components/icon/index.js +5 -1
  100. package/dist/components/icon/index.min.js +2 -2
  101. package/dist/components/image/index.js +463 -444
  102. package/dist/components/image/index.min.js +2 -2
  103. package/dist/components/input/index.js +5 -1
  104. package/dist/components/input/index.min.js +2 -2
  105. package/dist/components/loading/index.js +2 -2
  106. package/dist/components/loading/index.min.js +2 -2
  107. package/dist/components/menu/index.js +5 -1
  108. package/dist/components/menu/index.min.js +2 -2
  109. package/dist/components/message/index.js +43 -3
  110. package/dist/components/message/index.min.js +2 -2
  111. package/dist/components/modal/index.js +7 -2
  112. package/dist/components/modal/index.min.js +2 -2
  113. package/dist/components/navbar/index.js +16 -4
  114. package/dist/components/navbar/index.min.js +2 -2
  115. package/dist/components/notification/index.js +59 -6
  116. package/dist/components/notification/index.min.js +2 -2
  117. package/dist/components/numberinput/index.js +9 -3
  118. package/dist/components/numberinput/index.min.js +2 -2
  119. package/dist/components/pagination/index.js +5 -1
  120. package/dist/components/pagination/index.min.js +2 -2
  121. package/dist/components/progress/index.js +10 -2
  122. package/dist/components/progress/index.min.js +2 -2
  123. package/dist/components/radio/index.js +1 -1
  124. package/dist/components/radio/index.min.js +1 -1
  125. package/dist/components/rate/index.js +5 -1
  126. package/dist/components/rate/index.min.js +2 -2
  127. package/dist/components/select/index.js +5 -1
  128. package/dist/components/select/index.min.js +2 -2
  129. package/dist/components/sidebar/index.js +5 -1
  130. package/dist/components/sidebar/index.min.js +1 -1
  131. package/dist/components/skeleton/index.js +1 -1
  132. package/dist/components/skeleton/index.min.js +1 -1
  133. package/dist/components/slider/index.js +5 -1
  134. package/dist/components/slider/index.min.js +2 -2
  135. package/dist/components/snackbar/index.js +7 -2
  136. package/dist/components/snackbar/index.min.js +2 -2
  137. package/dist/components/steps/index.js +5 -1
  138. package/dist/components/steps/index.min.js +2 -2
  139. package/dist/components/switch/index.js +5 -1
  140. package/dist/components/switch/index.min.js +1 -1
  141. package/dist/components/table/index.js +6 -2
  142. package/dist/components/table/index.min.js +2 -2
  143. package/dist/components/tabs/index.js +5 -1
  144. package/dist/components/tabs/index.min.js +2 -2
  145. package/dist/components/tag/index.js +26 -3
  146. package/dist/components/tag/index.min.js +2 -2
  147. package/dist/components/taginput/index.js +185 -29
  148. package/dist/components/taginput/index.min.js +2 -2
  149. package/dist/components/timepicker/index.js +54 -47
  150. package/dist/components/timepicker/index.min.js +2 -2
  151. package/dist/components/toast/index.js +7 -2
  152. package/dist/components/toast/index.min.js +2 -2
  153. package/dist/components/tooltip/index.js +5 -1
  154. package/dist/components/tooltip/index.min.js +1 -1
  155. package/dist/components/upload/index.js +5 -1
  156. package/dist/components/upload/index.min.js +2 -2
  157. package/dist/esm/autocomplete.js +7 -7
  158. package/dist/esm/breadcrumb.js +122 -0
  159. package/dist/esm/button.js +6 -107
  160. package/dist/esm/carousel.js +7 -5
  161. package/dist/esm/{chunk-56040896.js → chunk-18e8b067.js} +3 -3
  162. package/dist/esm/{chunk-fa404a2c.js → chunk-21fc0948.js} +7 -7
  163. package/dist/esm/{chunk-f9299099.js → chunk-22e9f916.js} +19 -15
  164. package/dist/esm/{chunk-1fafdf15.js → chunk-2452e3d3.js} +37 -1
  165. package/dist/esm/{chunk-1297c2c9.js → chunk-29ca0df8.js} +1 -1
  166. package/dist/esm/{chunk-3c2169d7.js → chunk-2f2f0a74.js} +25 -2
  167. package/dist/esm/{chunk-cf72ce36.js → chunk-3773c62d.js} +2 -2
  168. package/dist/esm/{chunk-2c957994.js → chunk-4b67a181.js} +3 -3
  169. package/dist/esm/{chunk-45740cdc.js → chunk-6019fd7a.js} +96 -15
  170. package/dist/esm/chunk-71a547bc.js +312 -0
  171. package/dist/esm/{chunk-516e4877.js → chunk-75a5af93.js} +1 -1
  172. package/dist/esm/{chunk-4e380ee2.js → chunk-799e084d.js} +2 -1
  173. package/dist/esm/{chunk-37678809.js → chunk-83eb0d37.js} +3 -3
  174. package/dist/esm/{chunk-34c74085.js → chunk-8d0f95b8.js} +4 -4
  175. package/dist/esm/{chunk-652f2dad.js → chunk-8ed29c41.js} +4 -0
  176. package/dist/esm/{chunk-742a9694.js → chunk-9f7f7441.js} +3 -2
  177. package/dist/esm/{chunk-f160efb9.js → chunk-ae8ab23a.js} +4 -4
  178. package/dist/esm/{chunk-c3b09672.js → chunk-b07e3182.js} +26 -24
  179. package/dist/esm/{chunk-e36a4f2c.js → chunk-b0c0c6b0.js} +0 -0
  180. package/dist/esm/{chunk-ee935ae6.js → chunk-c9c58d0c.js} +1 -1
  181. package/dist/esm/{chunk-1d62828e.js → chunk-d7f92d97.js} +39 -3
  182. package/dist/esm/{chunk-7fd02ffe.js → chunk-d92f0cd9.js} +2 -2
  183. package/dist/esm/chunk-e7c9b2cb.js +108 -0
  184. package/dist/esm/{chunk-0e22ae0a.js → chunk-ece062a7.js} +27 -26
  185. package/dist/esm/clockpicker.js +9 -9
  186. package/dist/esm/config.js +2 -2
  187. package/dist/esm/datepicker.js +11 -11
  188. package/dist/esm/datetimepicker.js +21 -14
  189. package/dist/esm/dialog.js +10 -8
  190. package/dist/esm/dropdown.js +5 -5
  191. package/dist/esm/field.js +4 -4
  192. package/dist/esm/helpers.js +2 -3
  193. package/dist/esm/icon.js +4 -4
  194. package/dist/esm/image.js +6 -311
  195. package/dist/esm/index.js +106 -100
  196. package/dist/esm/input.js +6 -6
  197. package/dist/esm/loading.js +4 -4
  198. package/dist/esm/menu.js +3 -3
  199. package/dist/esm/message.js +5 -5
  200. package/dist/esm/modal.js +4 -4
  201. package/dist/esm/navbar.js +16 -4
  202. package/dist/esm/notification.js +22 -10
  203. package/dist/esm/numberinput.js +9 -7
  204. package/dist/esm/pagination.js +5 -5
  205. package/dist/esm/progress.js +8 -4
  206. package/dist/esm/rate.js +3 -3
  207. package/dist/esm/select.js +6 -6
  208. package/dist/esm/sidebar.js +2 -2
  209. package/dist/esm/slider.js +3 -3
  210. package/dist/esm/snackbar.js +4 -4
  211. package/dist/esm/steps.js +6 -6
  212. package/dist/esm/switch.js +1 -1
  213. package/dist/esm/table.js +9 -9
  214. package/dist/esm/tabs.js +6 -6
  215. package/dist/esm/tag.js +2 -2
  216. package/dist/esm/taginput.js +33 -21
  217. package/dist/esm/timepicker.js +12 -12
  218. package/dist/esm/toast.js +4 -4
  219. package/dist/esm/tooltip.js +4 -4
  220. package/dist/esm/upload.js +3 -3
  221. package/dist/vetur/attributes.json +95 -19
  222. package/dist/vetur/tags.json +37 -4
  223. package/package.json +2 -2
  224. package/src/components/autocomplete/Autocomplete.spec.js +70 -0
  225. package/src/components/autocomplete/Autocomplete.vue +93 -18
  226. package/src/components/breadcrumb/Breadcrumb.spec.js +63 -0
  227. package/src/components/breadcrumb/Breadcrumb.vue +43 -0
  228. package/src/components/breadcrumb/BreadcrumbItem.spec.js +25 -0
  229. package/src/components/breadcrumb/BreadcrumbItem.vue +33 -0
  230. package/src/components/breadcrumb/__snapshots__/Breadcrumb.spec.js.snap +7 -0
  231. package/src/components/breadcrumb/__snapshots__/BreadcrumbItem.spec.js.snap +7 -0
  232. package/src/components/breadcrumb/index.js +20 -0
  233. package/src/components/carousel/CarouselList.vue +3 -1
  234. package/src/components/carousel/__snapshots__/CarouselList.spec.js.snap +128 -8
  235. package/src/components/clockpicker/Clockpicker.vue +259 -259
  236. package/src/components/datepicker/Datepicker.vue +10 -6
  237. package/src/components/datetimepicker/Datetimepicker.vue +8 -1
  238. package/src/components/dialog/Dialog.vue +10 -10
  239. package/src/components/field/Field.vue +271 -270
  240. package/src/components/image/Image.spec.js +197 -183
  241. package/src/components/image/Image.vue +4 -2
  242. package/src/components/index.js +2 -0
  243. package/src/components/loading/Loading.vue +1 -1
  244. package/src/components/loading/__snapshots__/Loading.spec.js.snap +1 -1
  245. package/src/components/message/Message.vue +7 -1
  246. package/src/components/message/__snapshots__/Message.spec.js.snap +1 -0
  247. package/src/components/modal/Modal.vue +2 -0
  248. package/src/components/navbar/Navbar.vue +5 -1
  249. package/src/components/navbar/NavbarBurger.vue +1 -0
  250. package/src/components/navbar/NavbarDropdown.vue +8 -2
  251. package/src/components/navbar/__snapshots__/NavBar.spec.js.snap +11 -11
  252. package/src/components/navbar/__snapshots__/NavBarBurger.spec.js.snap +3 -0
  253. package/src/components/navbar/__snapshots__/NavbarDropdown.spec.js.snap +1 -1
  254. package/src/components/notification/Notification.vue +6 -0
  255. package/src/components/notification/NotificationNotice.vue +16 -3
  256. package/src/components/notification/__snapshots__/Notification.spec.js.snap +1 -0
  257. package/src/components/numberinput/Numberinput.spec.js +10 -0
  258. package/src/components/numberinput/Numberinput.vue +4 -2
  259. package/src/components/progress/Progress.vue +6 -2
  260. package/src/components/snackbar/Snackbar.vue +2 -0
  261. package/src/components/tag/Tag.vue +25 -2
  262. package/src/components/tag/__snapshots__/Tag.spec.js.snap +1 -1
  263. package/src/components/taginput/Taginput.spec.js +57 -1
  264. package/src/components/taginput/Taginput.vue +373 -364
  265. package/src/components/toast/Toast.vue +1 -1
  266. package/src/index.js +2 -0
  267. package/src/scss/buefy.scss +1 -0
  268. package/src/scss/components/_loading.scss +2 -1
  269. package/src/scss/components/_message.scss +3 -0
  270. package/src/scss/components/_notification.scss +8 -0
  271. package/src/scss/components/_progress.scss +8 -0
  272. package/src/utils/MessageMixin.js +32 -1
  273. package/src/utils/NoticeMixin.js +1 -0
  274. package/src/utils/TimepickerMixin.js +718 -716
  275. package/src/utils/config.js +4 -0
  276. package/src/utils/helpers.js +1 -2
  277. package/types/components.d.ts +5 -0
  278. package/src/components/navbar/__snapshots__/NavbarBurger.spec.js.snap +0 -3
@@ -1,270 +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
- :type="newType"
36
- :class="innerFieldClasses">
37
- <slot/>
38
- </b-field>
39
- </div>
40
- <template v-else>
41
- <slot/>
42
- </template>
43
- <p
44
- v-if="hasMessage && !horizontal"
45
- class="help"
46
- :class="newType"
47
- >
48
- <slot v-if="$slots.message" name="message"/>
49
- <template v-else>
50
- <template v-for="(mess, i) in formattedMessage">
51
- {{ mess }}
52
- <br :key="i" v-if="(i + 1) < formattedMessage.length">
53
- </template>
54
- </template>
55
- </p>
56
- </div>
57
- </template>
58
-
59
- <script>
60
- import config from '../../utils/config'
61
- import FieldBody from './FieldBody'
62
-
63
- export default {
64
- name: 'BField',
65
- components: {
66
- [FieldBody.name]: FieldBody
67
- },
68
- provide() {
69
- return {
70
- 'BField': this
71
- }
72
- },
73
- inject: {
74
- parent: {
75
- from: 'BField',
76
- default: false
77
- }
78
- }, // Used internally only when using Field in Field
79
- props: {
80
- type: [String, Object],
81
- label: String,
82
- labelFor: String,
83
- message: [String, Array, Object],
84
- grouped: Boolean,
85
- groupMultiline: Boolean,
86
- position: String,
87
- expanded: Boolean,
88
- horizontal: Boolean,
89
- addons: {
90
- type: Boolean,
91
- default: true
92
- },
93
- customClass: String,
94
- labelPosition: {
95
- type: String,
96
- default: () => { return config.defaultFieldLabelPosition }
97
- }
98
- },
99
- data() {
100
- return {
101
- newType: this.type,
102
- newMessage: this.message,
103
- fieldLabelSize: null,
104
- _isField: true // Used internally by Input and Select
105
- }
106
- },
107
- computed: {
108
- rootClasses() {
109
- return [{
110
- 'is-expanded': this.expanded,
111
- 'is-horizontal': this.horizontal,
112
- 'is-floating-in-label': this.hasLabel && !this.horizontal &&
113
- this.labelPosition === 'inside',
114
- 'is-floating-label': this.hasLabel && !this.horizontal &&
115
- this.labelPosition === 'on-border'
116
- },
117
- this.numberInputClasses]
118
- },
119
- innerFieldClasses() {
120
- return [
121
- this.fieldType(),
122
- this.newPosition,
123
- {
124
- 'is-grouped-multiline': this.groupMultiline
125
- }
126
- ]
127
- },
128
- hasInnerField() {
129
- return this.grouped || this.groupMultiline || this.hasAddons()
130
- },
131
- /**
132
- * Correct Bulma class for the side of the addon or group.
133
- *
134
- * This is not kept like the others (is-small, etc.),
135
- * because since 'has-addons' is set automatically it
136
- * doesn't make sense to teach users what addons are exactly.
137
- */
138
- newPosition() {
139
- if (this.position === undefined) return
140
-
141
- const position = this.position.split('-')
142
- if (position.length < 1) return
143
-
144
- const prefix = this.grouped
145
- ? 'is-grouped-'
146
- : 'has-addons-'
147
-
148
- if (this.position) return prefix + position[1]
149
- },
150
- /**
151
- * Formatted message in case it's an array
152
- * (each element is separated by <br> tag)
153
- */
154
- formattedMessage() {
155
- if (this.parent && this.parent.hasInnerField) {
156
- return '' // Message will be displayed in parent field
157
- }
158
- if (typeof this.newMessage === 'string') {
159
- return [this.newMessage]
160
- }
161
- let messages = []
162
- if (Array.isArray(this.newMessage)) {
163
- this.newMessage.forEach((message) => {
164
- if (typeof message === 'string') {
165
- messages.push(message)
166
- } else {
167
- for (let key in message) {
168
- if (message[key]) {
169
- messages.push(key)
170
- }
171
- }
172
- }
173
- })
174
- } else {
175
- for (let key in this.newMessage) {
176
- if (this.newMessage[key]) {
177
- messages.push(key)
178
- }
179
- }
180
- }
181
- return messages.filter((m) => { if (m) return m })
182
- },
183
- hasLabel() {
184
- return this.label || this.$slots.label
185
- },
186
- hasMessage() {
187
- return ((!this.parent || !this.parent.hasInnerField) && this.newMessage) ||
188
- this.$slots.message
189
- },
190
- numberInputClasses() {
191
- if (this.$slots.default) {
192
- const numberinput = this.$slots.default.filter((node) => node.tag && node.tag.toLowerCase().indexOf('numberinput') >= 0)[0]
193
- if (numberinput) {
194
- const classes = ['has-numberinput']
195
- const controlsPosition = numberinput.componentOptions.propsData.controlsPosition
196
- const size = numberinput.componentOptions.propsData.size
197
- if (controlsPosition) {
198
- classes.push(`has-numberinput-${controlsPosition}`)
199
- }
200
- if (size) {
201
- classes.push(`has-numberinput-${size}`)
202
- }
203
- return classes
204
- }
205
- }
206
- return null
207
- }
208
- },
209
- watch: {
210
- /**
211
- * Set internal type when prop change.
212
- */
213
- type(value) {
214
- this.newType = value
215
- },
216
-
217
- /**
218
- * Set internal message when prop change.
219
- */
220
- message(value) {
221
- this.newMessage = value
222
- },
223
-
224
- /**
225
- * Set parent message if we use Field in Field.
226
- */
227
- newMessage(value) {
228
- if (this.parent && this.parent.hasInnerField) {
229
- if (!this.parent.type) {
230
- this.parent.newType = this.newType
231
- }
232
- this.parent.newMessage = value
233
- }
234
- }
235
- },
236
- methods: {
237
- /**
238
- * Field has addons if there are more than one slot
239
- * (element / component) in the Field.
240
- * Or is grouped when prop is set.
241
- * Is a method to be called when component re-render.
242
- */
243
- fieldType() {
244
- if (this.grouped) return 'is-grouped'
245
- if (this.hasAddons()) return 'has-addons'
246
- },
247
- hasAddons() {
248
- let renderedNode = 0
249
- if (this.$slots.default) {
250
- renderedNode = this.$slots.default.reduce((i, node) => node.tag ? i + 1 : i, 0)
251
- }
252
- return (
253
- renderedNode > 1 &&
254
- this.addons &&
255
- !this.horizontal
256
- )
257
- }
258
- },
259
- mounted() {
260
- if (this.horizontal) {
261
- // Bulma docs: .is-normal for any .input or .button
262
- const elements = this.$el.querySelectorAll('.input, .select, .button, .textarea, .b-slider')
263
- if (elements.length > 0) {
264
- this.fieldLabelSize = 'is-normal'
265
- }
266
- }
267
- }
268
- }
269
-
270
- </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>