@gitlab/ui 84.2.0 → 85.0.1

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 (1138) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/components/base/accordion/accordion_item.js +1 -1
  3. package/dist/components/base/badge/badge.js +1 -1
  4. package/dist/components/base/breadcrumb/breadcrumb.js +1 -1
  5. package/dist/components/base/breadcrumb/breadcrumb_item.js +1 -1
  6. package/dist/components/base/button/button.js +1 -1
  7. package/dist/components/base/button_group/button_group.js +1 -1
  8. package/dist/components/base/carousel/carousel.js +1 -1
  9. package/dist/components/base/carousel/carousel_slide.js +1 -1
  10. package/dist/components/base/collapse/collapse.js +1 -1
  11. package/dist/components/base/dropdown/dropdown.js +2 -2
  12. package/dist/components/base/dropdown/dropdown_divider.js +1 -1
  13. package/dist/components/base/dropdown/dropdown_form.js +1 -1
  14. package/dist/components/base/dropdown/dropdown_item.js +2 -1
  15. package/dist/components/base/dropdown/dropdown_section_header.js +1 -1
  16. package/dist/components/base/dropdown/dropdown_text.js +1 -1
  17. package/dist/components/base/form/form.js +1 -1
  18. package/dist/components/base/form/form_checkbox/form_checkbox.js +1 -1
  19. package/dist/components/base/form/form_checkbox/form_checkbox_group.js +2 -2
  20. package/dist/components/base/form/form_group/form_group.js +1 -1
  21. package/dist/components/base/form/form_input/form_input.js +1 -1
  22. package/dist/components/base/form/form_input_group/form_input_group.js +4 -1
  23. package/dist/components/base/form/form_radio/form_radio.js +1 -1
  24. package/dist/components/base/form/form_radio_group/form_radio_group.js +2 -2
  25. package/dist/components/base/form/form_select/form_select.js +1 -1
  26. package/dist/components/base/form/form_text/form_text.js +1 -1
  27. package/dist/components/base/form/form_textarea/form_textarea.js +2 -2
  28. package/dist/components/base/form/input_group_text/input_group_text.js +1 -1
  29. package/dist/components/base/link/link.js +1 -1
  30. package/dist/components/base/modal/modal.js +1 -1
  31. package/dist/components/base/nav/nav.js +1 -1
  32. package/dist/components/base/nav/nav_item.js +1 -1
  33. package/dist/components/base/nav/nav_item_dropdown.js +1 -1
  34. package/dist/components/base/navbar/navbar.js +1 -1
  35. package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.js +1 -1
  36. package/dist/components/base/popover/popover.js +1 -1
  37. package/dist/components/base/progress_bar/progress_bar.js +1 -1
  38. package/dist/components/base/segmented_control/segmented_control.js +1 -1
  39. package/dist/components/base/table/table.js +1 -1
  40. package/dist/components/base/table_lite/table_lite.js +1 -1
  41. package/dist/components/base/tabs/tab/tab.js +1 -1
  42. package/dist/components/base/tabs/tabs/tabs.js +1 -1
  43. package/dist/components/base/toast/toast.js +1 -1
  44. package/dist/components/base/tooltip/tooltip.js +1 -1
  45. package/dist/components/experimental/duo/chat/duo_chat.js +5 -2
  46. package/dist/config.js +1 -1
  47. package/dist/directives/collapse_toggle.js +1 -1
  48. package/dist/directives/modal.js +1 -1
  49. package/dist/directives/tooltip.js +1 -1
  50. package/dist/utils/utils.js +1 -1
  51. package/dist/vendor/bootstrap-vue/src/browser-icons.js +8 -0
  52. package/dist/vendor/bootstrap-vue/src/browser.js +8 -0
  53. package/dist/vendor/bootstrap-vue/src/bv-config.js +6 -0
  54. package/dist/vendor/bootstrap-vue/src/components/alert/alert.js +179 -0
  55. package/dist/vendor/bootstrap-vue/src/components/alert/index.js +11 -0
  56. package/dist/vendor/bootstrap-vue/src/components/aspect/aspect.js +67 -0
  57. package/dist/vendor/bootstrap-vue/src/components/aspect/index.js +11 -0
  58. package/dist/vendor/bootstrap-vue/src/components/avatar/avatar-group.js +67 -0
  59. package/dist/vendor/bootstrap-vue/src/components/avatar/avatar.js +266 -0
  60. package/dist/vendor/bootstrap-vue/src/components/avatar/index.js +14 -0
  61. package/dist/vendor/bootstrap-vue/src/components/badge/badge.js +53 -0
  62. package/dist/vendor/bootstrap-vue/src/components/badge/index.js +11 -0
  63. package/dist/vendor/bootstrap-vue/src/components/breadcrumb/breadcrumb-item.js +34 -0
  64. package/dist/vendor/bootstrap-vue/src/components/breadcrumb/breadcrumb-link.js +48 -0
  65. package/dist/vendor/bootstrap-vue/src/components/breadcrumb/breadcrumb.js +67 -0
  66. package/dist/vendor/bootstrap-vue/src/components/breadcrumb/index.js +17 -0
  67. package/dist/vendor/bootstrap-vue/src/components/button/button-close.js +66 -0
  68. package/dist/vendor/bootstrap-vue/src/components/button/button.js +180 -0
  69. package/dist/vendor/bootstrap-vue/src/components/button/index.js +16 -0
  70. package/dist/vendor/bootstrap-vue/src/components/button-group/button-group.js +44 -0
  71. package/dist/vendor/bootstrap-vue/src/components/button-group/index.js +12 -0
  72. package/dist/vendor/bootstrap-vue/src/components/button-toolbar/button-toolbar.js +112 -0
  73. package/dist/vendor/bootstrap-vue/src/components/button-toolbar/index.js +12 -0
  74. package/dist/vendor/bootstrap-vue/src/components/calendar/calendar.js +1010 -0
  75. package/dist/vendor/bootstrap-vue/src/components/calendar/index.js +11 -0
  76. package/dist/vendor/bootstrap-vue/src/components/card/card-body.js +63 -0
  77. package/dist/vendor/bootstrap-vue/src/components/card/card-footer.js +48 -0
  78. package/dist/vendor/bootstrap-vue/src/components/card/card-group.js +33 -0
  79. package/dist/vendor/bootstrap-vue/src/components/card/card-header.js +48 -0
  80. package/dist/vendor/bootstrap-vue/src/components/card/card-img-lazy.js +46 -0
  81. package/dist/vendor/bootstrap-vue/src/components/card/card-img.js +58 -0
  82. package/dist/vendor/bootstrap-vue/src/components/card/card-sub-title.js +35 -0
  83. package/dist/vendor/bootstrap-vue/src/components/card/card-text.js +31 -0
  84. package/dist/vendor/bootstrap-vue/src/components/card/card-title.js +33 -0
  85. package/dist/vendor/bootstrap-vue/src/components/card/card.js +123 -0
  86. package/dist/vendor/bootstrap-vue/src/components/card/index.js +38 -0
  87. package/dist/vendor/bootstrap-vue/src/components/carousel/carousel-slide.js +123 -0
  88. package/dist/vendor/bootstrap-vue/src/components/carousel/carousel.js +617 -0
  89. package/dist/vendor/bootstrap-vue/src/components/carousel/index.js +14 -0
  90. package/dist/vendor/bootstrap-vue/src/components/collapse/collapse.js +274 -0
  91. package/dist/vendor/bootstrap-vue/src/components/collapse/helpers/bv-collapse.js +90 -0
  92. package/dist/vendor/bootstrap-vue/src/components/collapse/index.js +15 -0
  93. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-divider.js +41 -0
  94. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-form.js +52 -0
  95. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-group.js +75 -0
  96. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-header.js +52 -0
  97. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-item-button.js +83 -0
  98. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-item.js +89 -0
  99. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-text.js +49 -0
  100. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown.js +195 -0
  101. package/dist/vendor/bootstrap-vue/src/components/dropdown/index.js +42 -0
  102. package/dist/vendor/bootstrap-vue/src/components/embed/embed.js +50 -0
  103. package/dist/vendor/bootstrap-vue/src/components/embed/index.js +11 -0
  104. package/dist/vendor/bootstrap-vue/src/components/form/form-datalist.js +52 -0
  105. package/dist/vendor/bootstrap-vue/src/components/form/form-invalid-feedback.js +53 -0
  106. package/dist/vendor/bootstrap-vue/src/components/form/form-text.js +40 -0
  107. package/dist/vendor/bootstrap-vue/src/components/form/form-valid-feedback.js +53 -0
  108. package/dist/vendor/bootstrap-vue/src/components/form/form.js +41 -0
  109. package/dist/vendor/bootstrap-vue/src/components/form/index.js +28 -0
  110. package/dist/vendor/bootstrap-vue/src/components/form-btn-label-control/bv-form-btn-label-control.js +261 -0
  111. package/dist/vendor/bootstrap-vue/src/components/form-checkbox/form-checkbox-group.js +37 -0
  112. package/dist/vendor/bootstrap-vue/src/components/form-checkbox/form-checkbox.js +134 -0
  113. package/dist/vendor/bootstrap-vue/src/components/form-checkbox/index.js +18 -0
  114. package/dist/vendor/bootstrap-vue/src/components/form-datepicker/form-datepicker.js +310 -0
  115. package/dist/vendor/bootstrap-vue/src/components/form-datepicker/index.js +12 -0
  116. package/dist/vendor/bootstrap-vue/src/components/form-file/form-file.js +561 -0
  117. package/dist/vendor/bootstrap-vue/src/components/form-file/index.js +12 -0
  118. package/dist/vendor/bootstrap-vue/src/components/form-group/form-group.js +347 -0
  119. package/dist/vendor/bootstrap-vue/src/components/form-group/index.js +12 -0
  120. package/dist/vendor/bootstrap-vue/src/components/form-input/form-input.js +157 -0
  121. package/dist/vendor/bootstrap-vue/src/components/form-input/index.js +12 -0
  122. package/dist/vendor/bootstrap-vue/src/components/form-radio/form-radio-group.js +29 -0
  123. package/dist/vendor/bootstrap-vue/src/components/form-radio/form-radio.js +30 -0
  124. package/dist/vendor/bootstrap-vue/src/components/form-radio/index.js +16 -0
  125. package/dist/vendor/bootstrap-vue/src/components/form-rating/form-rating.js +402 -0
  126. package/dist/vendor/bootstrap-vue/src/components/form-rating/index.js +12 -0
  127. package/dist/vendor/bootstrap-vue/src/components/form-select/form-select-option-group.js +54 -0
  128. package/dist/vendor/bootstrap-vue/src/components/form-select/form-select-option.js +41 -0
  129. package/dist/vendor/bootstrap-vue/src/components/form-select/form-select.js +143 -0
  130. package/dist/vendor/bootstrap-vue/src/components/form-select/helpers/mixin-options.js +56 -0
  131. package/dist/vendor/bootstrap-vue/src/components/form-select/index.js +20 -0
  132. package/dist/vendor/bootstrap-vue/src/components/form-spinbutton/form-spinbutton.js +555 -0
  133. package/dist/vendor/bootstrap-vue/src/components/form-spinbutton/index.js +12 -0
  134. package/dist/vendor/bootstrap-vue/src/components/form-tags/form-tag.js +97 -0
  135. package/dist/vendor/bootstrap-vue/src/components/form-tags/form-tags.js +806 -0
  136. package/dist/vendor/bootstrap-vue/src/components/form-tags/index.js +16 -0
  137. package/dist/vendor/bootstrap-vue/src/components/form-textarea/form-textarea.js +217 -0
  138. package/dist/vendor/bootstrap-vue/src/components/form-textarea/index.js +12 -0
  139. package/dist/vendor/bootstrap-vue/src/components/form-timepicker/form-timepicker.js +281 -0
  140. package/dist/vendor/bootstrap-vue/src/components/form-timepicker/index.js +12 -0
  141. package/dist/vendor/bootstrap-vue/src/components/image/img-lazy.js +157 -0
  142. package/dist/vendor/bootstrap-vue/src/components/image/img.js +124 -0
  143. package/dist/vendor/bootstrap-vue/src/components/image/index.js +14 -0
  144. package/dist/vendor/bootstrap-vue/src/components/index.js +109 -0
  145. package/dist/vendor/bootstrap-vue/src/components/input-group/index.js +23 -0
  146. package/dist/vendor/bootstrap-vue/src/components/input-group/input-group-addon.js +44 -0
  147. package/dist/vendor/bootstrap-vue/src/components/input-group/input-group-append.js +34 -0
  148. package/dist/vendor/bootstrap-vue/src/components/input-group/input-group-prepend.js +34 -0
  149. package/dist/vendor/bootstrap-vue/src/components/input-group/input-group-text.js +31 -0
  150. package/dist/vendor/bootstrap-vue/src/components/input-group/input-group.js +75 -0
  151. package/dist/vendor/bootstrap-vue/src/components/jumbotron/index.js +11 -0
  152. package/dist/vendor/bootstrap-vue/src/components/jumbotron/jumbotron.js +98 -0
  153. package/dist/vendor/bootstrap-vue/src/components/layout/col.js +156 -0
  154. package/dist/vendor/bootstrap-vue/src/components/layout/container.js +41 -0
  155. package/dist/vendor/bootstrap-vue/src/components/layout/form-row.js +31 -0
  156. package/dist/vendor/bootstrap-vue/src/components/layout/index.js +20 -0
  157. package/dist/vendor/bootstrap-vue/src/components/layout/row.js +113 -0
  158. package/dist/vendor/bootstrap-vue/src/components/link/index.js +11 -0
  159. package/dist/vendor/bootstrap-vue/src/components/link/link.js +239 -0
  160. package/dist/vendor/bootstrap-vue/src/components/list-group/index.js +14 -0
  161. package/dist/vendor/bootstrap-vue/src/components/list-group/list-group-item.js +78 -0
  162. package/dist/vendor/bootstrap-vue/src/components/list-group/list-group.js +42 -0
  163. package/dist/vendor/bootstrap-vue/src/components/media/index.js +17 -0
  164. package/dist/vendor/bootstrap-vue/src/components/media/media-aside.js +41 -0
  165. package/dist/vendor/bootstrap-vue/src/components/media/media-body.js +31 -0
  166. package/dist/vendor/bootstrap-vue/src/components/media/media.js +61 -0
  167. package/dist/vendor/bootstrap-vue/src/components/modal/helpers/bv-modal-event.class.js +21 -0
  168. package/dist/vendor/bootstrap-vue/src/components/modal/helpers/bv-modal.js +279 -0
  169. package/dist/vendor/bootstrap-vue/src/components/modal/helpers/modal-manager.js +211 -0
  170. package/dist/vendor/bootstrap-vue/src/components/modal/index.js +20 -0
  171. package/dist/vendor/bootstrap-vue/src/components/modal/modal.js +920 -0
  172. package/dist/vendor/bootstrap-vue/src/components/nav/index.js +30 -0
  173. package/dist/vendor/bootstrap-vue/src/components/nav/nav-form.js +45 -0
  174. package/dist/vendor/bootstrap-vue/src/components/nav/nav-item-dropdown.js +108 -0
  175. package/dist/vendor/bootstrap-vue/src/components/nav/nav-item.js +43 -0
  176. package/dist/vendor/bootstrap-vue/src/components/nav/nav-text.js +26 -0
  177. package/dist/vendor/bootstrap-vue/src/components/nav/nav.js +65 -0
  178. package/dist/vendor/bootstrap-vue/src/components/navbar/index.js +29 -0
  179. package/dist/vendor/bootstrap-vue/src/components/navbar/navbar-brand.js +40 -0
  180. package/dist/vendor/bootstrap-vue/src/components/navbar/navbar-nav.js +46 -0
  181. package/dist/vendor/bootstrap-vue/src/components/navbar/navbar-toggle.js +89 -0
  182. package/dist/vendor/bootstrap-vue/src/components/navbar/navbar.js +72 -0
  183. package/dist/vendor/bootstrap-vue/src/components/overlay/index.js +11 -0
  184. package/dist/vendor/bootstrap-vue/src/components/overlay/overlay.js +163 -0
  185. package/dist/vendor/bootstrap-vue/src/components/pagination/index.js +11 -0
  186. package/dist/vendor/bootstrap-vue/src/components/pagination/pagination.js +135 -0
  187. package/dist/vendor/bootstrap-vue/src/components/pagination-nav/index.js +11 -0
  188. package/dist/vendor/bootstrap-vue/src/components/pagination-nav/pagination-nav.js +299 -0
  189. package/dist/vendor/bootstrap-vue/src/components/popover/helpers/bv-popover-template.js +52 -0
  190. package/dist/vendor/bootstrap-vue/src/components/popover/helpers/bv-popover.js +26 -0
  191. package/dist/vendor/bootstrap-vue/src/components/popover/index.js +15 -0
  192. package/dist/vendor/bootstrap-vue/src/components/popover/popover.js +45 -0
  193. package/dist/vendor/bootstrap-vue/src/components/progress/index.js +14 -0
  194. package/dist/vendor/bootstrap-vue/src/components/progress/progress-bar.js +128 -0
  195. package/dist/vendor/bootstrap-vue/src/components/progress/progress.js +56 -0
  196. package/dist/vendor/bootstrap-vue/src/components/sidebar/index.js +15 -0
  197. package/dist/vendor/bootstrap-vue/src/components/sidebar/sidebar.js +432 -0
  198. package/dist/vendor/bootstrap-vue/src/components/skeleton/index.js +23 -0
  199. package/dist/vendor/bootstrap-vue/src/components/skeleton/skeleton-icon.js +47 -0
  200. package/dist/vendor/bootstrap-vue/src/components/skeleton/skeleton-img.js +60 -0
  201. package/dist/vendor/bootstrap-vue/src/components/skeleton/skeleton-table.js +64 -0
  202. package/dist/vendor/bootstrap-vue/src/components/skeleton/skeleton-wrapper.js +46 -0
  203. package/dist/vendor/bootstrap-vue/src/components/skeleton/skeleton.js +49 -0
  204. package/dist/vendor/bootstrap-vue/src/components/spinner/index.js +11 -0
  205. package/dist/vendor/bootstrap-vue/src/components/spinner/spinner.js +55 -0
  206. package/dist/vendor/bootstrap-vue/src/components/table/helpers/constants.js +22 -0
  207. package/dist/vendor/bootstrap-vue/src/components/table/helpers/default-sort-compare.js +64 -0
  208. package/dist/vendor/bootstrap-vue/src/components/table/helpers/filter-event.js +40 -0
  209. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-bottom-row.js +43 -0
  210. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-busy.js +83 -0
  211. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-caption.js +50 -0
  212. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-colgroup.js +32 -0
  213. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-empty.js +82 -0
  214. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-filtering.js +265 -0
  215. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-items.js +150 -0
  216. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-pagination.js +44 -0
  217. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-provider.js +187 -0
  218. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-selectable.js +229 -0
  219. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-sorting.js +290 -0
  220. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-stacked.js +39 -0
  221. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-table-renderer.js +186 -0
  222. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-tbody-row.js +338 -0
  223. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-tbody.js +237 -0
  224. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-tfoot.js +50 -0
  225. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-thead.js +214 -0
  226. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-top-row.js +42 -0
  227. package/dist/vendor/bootstrap-vue/src/components/table/helpers/normalize-fields.js +86 -0
  228. package/dist/vendor/bootstrap-vue/src/components/table/helpers/sanitize-row.js +32 -0
  229. package/dist/vendor/bootstrap-vue/src/components/table/helpers/stringify-record-values.js +11 -0
  230. package/dist/vendor/bootstrap-vue/src/components/table/helpers/text-selection-active.js +14 -0
  231. package/dist/vendor/bootstrap-vue/src/components/table/index.js +47 -0
  232. package/dist/vendor/bootstrap-vue/src/components/table/table-lite.js +52 -0
  233. package/dist/vendor/bootstrap-vue/src/components/table/table-simple.js +45 -0
  234. package/dist/vendor/bootstrap-vue/src/components/table/table.js +68 -0
  235. package/dist/vendor/bootstrap-vue/src/components/table/tbody.js +109 -0
  236. package/dist/vendor/bootstrap-vue/src/components/table/td.js +183 -0
  237. package/dist/vendor/bootstrap-vue/src/components/table/tfoot.js +93 -0
  238. package/dist/vendor/bootstrap-vue/src/components/table/th.js +27 -0
  239. package/dist/vendor/bootstrap-vue/src/components/table/thead.js +96 -0
  240. package/dist/vendor/bootstrap-vue/src/components/table/tr.js +118 -0
  241. package/dist/vendor/bootstrap-vue/src/components/tabs/index.js +14 -0
  242. package/dist/vendor/bootstrap-vue/src/components/tabs/tab.js +199 -0
  243. package/dist/vendor/bootstrap-vue/src/components/tabs/tabs.js +617 -0
  244. package/dist/vendor/bootstrap-vue/src/components/time/index.js +11 -0
  245. package/dist/vendor/bootstrap-vue/src/components/time/time.js +600 -0
  246. package/dist/vendor/bootstrap-vue/src/components/toast/helpers/bv-toast.js +209 -0
  247. package/dist/vendor/bootstrap-vue/src/components/toast/index.js +19 -0
  248. package/dist/vendor/bootstrap-vue/src/components/toast/toast.js +419 -0
  249. package/dist/vendor/bootstrap-vue/src/components/toast/toaster.js +142 -0
  250. package/dist/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-popper.js +243 -0
  251. package/dist/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip-template.js +118 -0
  252. package/dist/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip.js +929 -0
  253. package/dist/vendor/bootstrap-vue/src/components/tooltip/index.js +15 -0
  254. package/dist/vendor/bootstrap-vue/src/components/tooltip/tooltip.js +280 -0
  255. package/dist/vendor/bootstrap-vue/src/components/transition/bv-transition.js +85 -0
  256. package/dist/vendor/bootstrap-vue/src/components/transporter/transporter.js +197 -0
  257. package/dist/vendor/bootstrap-vue/src/constants/classes.js +4 -0
  258. package/dist/vendor/bootstrap-vue/src/constants/components.js +135 -0
  259. package/dist/vendor/bootstrap-vue/src/constants/config.js +5 -0
  260. package/dist/vendor/bootstrap-vue/src/constants/date.js +8 -0
  261. package/dist/vendor/bootstrap-vue/src/constants/env.js +47 -0
  262. package/dist/vendor/bootstrap-vue/src/constants/events.js +71 -0
  263. package/dist/vendor/bootstrap-vue/src/constants/key-codes.js +16 -0
  264. package/dist/vendor/bootstrap-vue/src/constants/popper.js +10 -0
  265. package/dist/vendor/bootstrap-vue/src/constants/props.js +27 -0
  266. package/dist/vendor/bootstrap-vue/src/constants/regex.js +61 -0
  267. package/dist/vendor/bootstrap-vue/src/constants/safe-types.js +15 -0
  268. package/dist/vendor/bootstrap-vue/src/constants/slots.js +66 -0
  269. package/dist/vendor/bootstrap-vue/src/directives/hover/hover.js +61 -0
  270. package/dist/vendor/bootstrap-vue/src/directives/hover/index.js +11 -0
  271. package/dist/vendor/bootstrap-vue/src/directives/index.js +23 -0
  272. package/dist/vendor/bootstrap-vue/src/directives/modal/index.js +11 -0
  273. package/dist/vendor/bootstrap-vue/src/directives/modal/modal.js +112 -0
  274. package/dist/vendor/bootstrap-vue/src/directives/popover/index.js +11 -0
  275. package/dist/vendor/bootstrap-vue/src/directives/popover/popover.js +265 -0
  276. package/dist/vendor/bootstrap-vue/src/directives/scrollspy/helpers/bv-scrollspy.class.js +404 -0
  277. package/dist/vendor/bootstrap-vue/src/directives/scrollspy/index.js +11 -0
  278. package/dist/vendor/bootstrap-vue/src/directives/scrollspy/scrollspy.js +112 -0
  279. package/dist/vendor/bootstrap-vue/src/directives/toggle/index.js +11 -0
  280. package/dist/vendor/bootstrap-vue/src/directives/toggle/toggle.js +253 -0
  281. package/dist/vendor/bootstrap-vue/src/directives/tooltip/index.js +11 -0
  282. package/dist/vendor/bootstrap-vue/src/directives/tooltip/tooltip.js +264 -0
  283. package/dist/vendor/bootstrap-vue/src/directives/visible/index.js +11 -0
  284. package/dist/vendor/bootstrap-vue/src/directives/visible/visible.js +156 -0
  285. package/dist/vendor/bootstrap-vue/src/icons/helpers/icon-base.js +139 -0
  286. package/dist/vendor/bootstrap-vue/src/icons/helpers/make-icon.js +56 -0
  287. package/dist/vendor/bootstrap-vue/src/icons/icon.js +56 -0
  288. package/dist/vendor/bootstrap-vue/src/icons/icons.js +1377 -0
  289. package/dist/vendor/bootstrap-vue/src/icons/iconstack.js +31 -0
  290. package/dist/vendor/bootstrap-vue/src/icons/index.js +4 -0
  291. package/dist/vendor/bootstrap-vue/src/icons/plugin.js +1410 -0
  292. package/dist/vendor/bootstrap-vue/src/icons-only.js +10 -0
  293. package/dist/vendor/bootstrap-vue/src/index.js +205 -0
  294. package/dist/vendor/bootstrap-vue/src/mixins/attrs.js +22 -0
  295. package/dist/vendor/bootstrap-vue/src/mixins/card.js +22 -0
  296. package/dist/vendor/bootstrap-vue/src/mixins/click-out.js +54 -0
  297. package/dist/vendor/bootstrap-vue/src/mixins/dropdown.js +457 -0
  298. package/dist/vendor/bootstrap-vue/src/mixins/focus-in.js +46 -0
  299. package/dist/vendor/bootstrap-vue/src/mixins/form-control.js +50 -0
  300. package/dist/vendor/bootstrap-vue/src/mixins/form-custom.js +23 -0
  301. package/dist/vendor/bootstrap-vue/src/mixins/form-options.js +72 -0
  302. package/dist/vendor/bootstrap-vue/src/mixins/form-radio-check-group.js +142 -0
  303. package/dist/vendor/bootstrap-vue/src/mixins/form-radio-check.js +318 -0
  304. package/dist/vendor/bootstrap-vue/src/mixins/form-selection.js +62 -0
  305. package/dist/vendor/bootstrap-vue/src/mixins/form-size.js +23 -0
  306. package/dist/vendor/bootstrap-vue/src/mixins/form-state.js +47 -0
  307. package/dist/vendor/bootstrap-vue/src/mixins/form-text.js +248 -0
  308. package/dist/vendor/bootstrap-vue/src/mixins/form-validity.js +50 -0
  309. package/dist/vendor/bootstrap-vue/src/mixins/has-listener.js +26 -0
  310. package/dist/vendor/bootstrap-vue/src/mixins/id.js +52 -0
  311. package/dist/vendor/bootstrap-vue/src/mixins/listen-on-document.js +63 -0
  312. package/dist/vendor/bootstrap-vue/src/mixins/listen-on-root.js +121 -0
  313. package/dist/vendor/bootstrap-vue/src/mixins/listen-on-window.js +63 -0
  314. package/dist/vendor/bootstrap-vue/src/mixins/listeners.js +24 -0
  315. package/dist/vendor/bootstrap-vue/src/mixins/model.js +10 -0
  316. package/dist/vendor/bootstrap-vue/src/mixins/normalize-slot.js +30 -0
  317. package/dist/vendor/bootstrap-vue/src/mixins/pagination.js +598 -0
  318. package/dist/vendor/bootstrap-vue/src/mixins/scoped-style.js +18 -0
  319. package/dist/vendor/bootstrap-vue/src/mixins/use-parent.js +14 -0
  320. package/dist/vendor/bootstrap-vue/src/utils/array.js +30 -0
  321. package/dist/vendor/bootstrap-vue/src/utils/bv-event.class.js +60 -0
  322. package/dist/vendor/bootstrap-vue/src/utils/cache.js +38 -0
  323. package/dist/vendor/bootstrap-vue/src/utils/clone-deep.js +18 -0
  324. package/dist/vendor/bootstrap-vue/src/utils/config-set.js +81 -0
  325. package/dist/vendor/bootstrap-vue/src/utils/config.js +77 -0
  326. package/dist/vendor/bootstrap-vue/src/utils/create-new-child-component.js +12 -0
  327. package/dist/vendor/bootstrap-vue/src/utils/css-escape.js +70 -0
  328. package/dist/vendor/bootstrap-vue/src/utils/date.js +135 -0
  329. package/dist/vendor/bootstrap-vue/src/utils/dom.js +298 -0
  330. package/dist/vendor/bootstrap-vue/src/utils/element-to-vue-instance-registry.js +34 -0
  331. package/dist/vendor/bootstrap-vue/src/utils/env.js +16 -0
  332. package/dist/vendor/bootstrap-vue/src/utils/events.js +78 -0
  333. package/dist/vendor/bootstrap-vue/src/utils/get-event-root.js +5 -0
  334. package/dist/vendor/bootstrap-vue/src/utils/get-instance-from-directive.js +5 -0
  335. package/dist/vendor/bootstrap-vue/src/utils/get-scope-id.js +9 -0
  336. package/dist/vendor/bootstrap-vue/src/utils/get.js +63 -0
  337. package/dist/vendor/bootstrap-vue/src/utils/html.js +16 -0
  338. package/dist/vendor/bootstrap-vue/src/utils/identity.js +3 -0
  339. package/dist/vendor/bootstrap-vue/src/utils/inspect.js +37 -0
  340. package/dist/vendor/bootstrap-vue/src/utils/locale.js +19 -0
  341. package/dist/vendor/bootstrap-vue/src/utils/loose-equal.js +59 -0
  342. package/dist/vendor/bootstrap-vue/src/utils/loose-index-of.js +13 -0
  343. package/dist/vendor/bootstrap-vue/src/utils/math.js +11 -0
  344. package/dist/vendor/bootstrap-vue/src/utils/memoize.js +14 -0
  345. package/dist/vendor/bootstrap-vue/src/utils/model.js +33 -0
  346. package/dist/vendor/bootstrap-vue/src/utils/noop.js +3 -0
  347. package/dist/vendor/bootstrap-vue/src/utils/normalize-slot.js +51 -0
  348. package/dist/vendor/bootstrap-vue/src/utils/number.js +23 -0
  349. package/dist/vendor/bootstrap-vue/src/utils/object.js +79 -0
  350. package/dist/vendor/bootstrap-vue/src/utils/observe-dom.js +76 -0
  351. package/dist/vendor/bootstrap-vue/src/utils/plugins.js +183 -0
  352. package/dist/vendor/bootstrap-vue/src/utils/props.js +103 -0
  353. package/dist/vendor/bootstrap-vue/src/utils/router.js +136 -0
  354. package/dist/vendor/bootstrap-vue/src/utils/safe-vue-instance.js +14 -0
  355. package/dist/vendor/bootstrap-vue/src/utils/stable-sort.js +28 -0
  356. package/dist/vendor/bootstrap-vue/src/utils/string.js +62 -0
  357. package/dist/vendor/bootstrap-vue/src/utils/stringify-object-values.js +31 -0
  358. package/dist/vendor/bootstrap-vue/src/utils/warn.js +60 -0
  359. package/dist/vendor/bootstrap-vue/src/vue.js +103 -0
  360. package/package.json +6 -4
  361. package/src/components/base/accordion/accordion_item.vue +1 -1
  362. package/src/components/base/badge/badge.vue +1 -1
  363. package/src/components/base/breadcrumb/breadcrumb.vue +1 -1
  364. package/src/components/base/breadcrumb/breadcrumb_item.vue +1 -1
  365. package/src/components/base/button/button.vue +1 -1
  366. package/src/components/base/button_group/button_group.vue +1 -1
  367. package/src/components/base/carousel/carousel.vue +1 -1
  368. package/src/components/base/carousel/carousel_slide.vue +1 -1
  369. package/src/components/base/collapse/collapse.vue +1 -1
  370. package/src/components/base/dropdown/dropdown.vue +2 -2
  371. package/src/components/base/dropdown/dropdown_divider.vue +1 -1
  372. package/src/components/base/dropdown/dropdown_form.vue +1 -1
  373. package/src/components/base/dropdown/dropdown_item.vue +2 -1
  374. package/src/components/base/dropdown/dropdown_section_header.vue +1 -1
  375. package/src/components/base/dropdown/dropdown_text.vue +1 -1
  376. package/src/components/base/form/form.vue +1 -1
  377. package/src/components/base/form/form_checkbox/form_checkbox.vue +1 -1
  378. package/src/components/base/form/form_checkbox/form_checkbox_group.vue +2 -2
  379. package/src/components/base/form/form_group/form_group.vue +1 -1
  380. package/src/components/base/form/form_input/form_input.vue +1 -1
  381. package/src/components/base/form/form_input_group/form_input_group.vue +4 -1
  382. package/src/components/base/form/form_radio/form_radio.vue +1 -1
  383. package/src/components/base/form/form_radio_group/form_radio_group.vue +2 -2
  384. package/src/components/base/form/form_select/form_select.vue +1 -1
  385. package/src/components/base/form/form_text/form_text.vue +1 -1
  386. package/src/components/base/form/form_textarea/form_textarea.vue +4 -4
  387. package/src/components/base/form/input_group_text/input_group_text.vue +1 -1
  388. package/src/components/base/link/link.vue +1 -1
  389. package/src/components/base/modal/modal.vue +1 -1
  390. package/src/components/base/nav/nav.vue +1 -1
  391. package/src/components/base/nav/nav_item.vue +1 -1
  392. package/src/components/base/nav/nav_item_dropdown.vue +1 -1
  393. package/src/components/base/navbar/navbar.vue +1 -1
  394. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.vue +1 -1
  395. package/src/components/base/popover/popover.vue +1 -1
  396. package/src/components/base/progress_bar/progress_bar.vue +1 -1
  397. package/src/components/base/segmented_control/segmented_control.vue +1 -1
  398. package/src/components/base/table/table.vue +1 -1
  399. package/src/components/base/table_lite/table_lite.vue +1 -1
  400. package/src/components/base/tabs/tab/tab.vue +1 -1
  401. package/src/components/base/tabs/tabs/tabs.vue +1 -1
  402. package/src/components/base/toast/toast.js +2 -1
  403. package/src/components/base/tooltip/tooltip.vue +1 -1
  404. package/src/components/experimental/duo/chat/duo_chat.vue +6 -2
  405. package/src/config.js +1 -1
  406. package/src/directives/collapse_toggle.js +1 -1
  407. package/src/directives/modal.js +1 -1
  408. package/src/directives/tooltip.js +1 -1
  409. package/src/scss/bootstrap_vue.scss +29 -29
  410. package/src/utils/utils.js +1 -1
  411. package/src/vendor/bootstrap-vue/LICENSE +21 -0
  412. package/src/vendor/bootstrap-vue/nuxt/index.js +185 -0
  413. package/src/vendor/bootstrap-vue/nuxt/plugin.template.js +35 -0
  414. package/src/vendor/bootstrap-vue/package.json +205 -0
  415. package/src/vendor/bootstrap-vue/src/_custom-controls.scss +30 -0
  416. package/src/vendor/bootstrap-vue/src/_utilities.scss +22 -0
  417. package/src/vendor/bootstrap-vue/src/_variables.scss +177 -0
  418. package/src/vendor/bootstrap-vue/src/browser-icons.js +9 -0
  419. package/src/vendor/bootstrap-vue/src/browser.js +9 -0
  420. package/src/vendor/bootstrap-vue/src/bv-config.d.ts +4 -0
  421. package/src/vendor/bootstrap-vue/src/bv-config.js +6 -0
  422. package/src/vendor/bootstrap-vue/src/components/alert/README.md +280 -0
  423. package/src/vendor/bootstrap-vue/src/components/alert/alert.js +185 -0
  424. package/src/vendor/bootstrap-vue/src/components/alert/alert.spec.js +442 -0
  425. package/src/vendor/bootstrap-vue/src/components/alert/index.d.ts +13 -0
  426. package/src/vendor/bootstrap-vue/src/components/alert/index.js +8 -0
  427. package/src/vendor/bootstrap-vue/src/components/alert/package.json +72 -0
  428. package/src/vendor/bootstrap-vue/src/components/aspect/README.md +65 -0
  429. package/src/vendor/bootstrap-vue/src/components/aspect/aspect.js +65 -0
  430. package/src/vendor/bootstrap-vue/src/components/aspect/aspect.spec.js +121 -0
  431. package/src/vendor/bootstrap-vue/src/components/aspect/index.d.ts +11 -0
  432. package/src/vendor/bootstrap-vue/src/components/aspect/index.js +8 -0
  433. package/src/vendor/bootstrap-vue/src/components/aspect/package.json +26 -0
  434. package/src/vendor/bootstrap-vue/src/components/avatar/README.md +567 -0
  435. package/src/vendor/bootstrap-vue/src/components/avatar/_avatar.scss +148 -0
  436. package/src/vendor/bootstrap-vue/src/components/avatar/avatar-group.js +75 -0
  437. package/src/vendor/bootstrap-vue/src/components/avatar/avatar-group.spec.js +74 -0
  438. package/src/vendor/bootstrap-vue/src/components/avatar/avatar.js +228 -0
  439. package/src/vendor/bootstrap-vue/src/components/avatar/avatar.spec.js +355 -0
  440. package/src/vendor/bootstrap-vue/src/components/avatar/index.d.ts +14 -0
  441. package/src/vendor/bootstrap-vue/src/components/avatar/index.js +9 -0
  442. package/src/vendor/bootstrap-vue/src/components/avatar/index.scss +1 -0
  443. package/src/vendor/bootstrap-vue/src/components/avatar/package.json +149 -0
  444. package/src/vendor/bootstrap-vue/src/components/badge/README.md +126 -0
  445. package/src/vendor/bootstrap-vue/src/components/badge/badge.js +55 -0
  446. package/src/vendor/bootstrap-vue/src/components/badge/badge.spec.js +141 -0
  447. package/src/vendor/bootstrap-vue/src/components/badge/index.d.ts +11 -0
  448. package/src/vendor/bootstrap-vue/src/components/badge/index.js +8 -0
  449. package/src/vendor/bootstrap-vue/src/components/badge/package.json +29 -0
  450. package/src/vendor/bootstrap-vue/src/components/breadcrumb/README.md +94 -0
  451. package/src/vendor/bootstrap-vue/src/components/breadcrumb/breadcrumb-item.js +27 -0
  452. package/src/vendor/bootstrap-vue/src/components/breadcrumb/breadcrumb-item.spec.js +123 -0
  453. package/src/vendor/bootstrap-vue/src/components/breadcrumb/breadcrumb-link.js +43 -0
  454. package/src/vendor/bootstrap-vue/src/components/breadcrumb/breadcrumb-link.spec.js +117 -0
  455. package/src/vendor/bootstrap-vue/src/components/breadcrumb/breadcrumb.js +52 -0
  456. package/src/vendor/bootstrap-vue/src/components/breadcrumb/breadcrumb.spec.js +183 -0
  457. package/src/vendor/bootstrap-vue/src/components/breadcrumb/index.d.ts +17 -0
  458. package/src/vendor/bootstrap-vue/src/components/breadcrumb/index.js +10 -0
  459. package/src/vendor/bootstrap-vue/src/components/breadcrumb/package.json +62 -0
  460. package/src/vendor/bootstrap-vue/src/components/button/README.md +281 -0
  461. package/src/vendor/bootstrap-vue/src/components/button/button-close.js +65 -0
  462. package/src/vendor/bootstrap-vue/src/components/button/button-close.spec.js +210 -0
  463. package/src/vendor/bootstrap-vue/src/components/button/button.js +179 -0
  464. package/src/vendor/bootstrap-vue/src/components/button/button.spec.js +385 -0
  465. package/src/vendor/bootstrap-vue/src/components/button/index.d.ts +14 -0
  466. package/src/vendor/bootstrap-vue/src/components/button/index.js +14 -0
  467. package/src/vendor/bootstrap-vue/src/components/button/package.json +105 -0
  468. package/src/vendor/bootstrap-vue/src/components/button-group/README.md +112 -0
  469. package/src/vendor/bootstrap-vue/src/components/button-group/button-group.js +42 -0
  470. package/src/vendor/bootstrap-vue/src/components/button-group/button-group.spec.js +98 -0
  471. package/src/vendor/bootstrap-vue/src/components/button-group/index.d.ts +11 -0
  472. package/src/vendor/bootstrap-vue/src/components/button-group/index.js +11 -0
  473. package/src/vendor/bootstrap-vue/src/components/button-group/package.json +29 -0
  474. package/src/vendor/bootstrap-vue/src/components/button-toolbar/README.md +109 -0
  475. package/src/vendor/bootstrap-vue/src/components/button-toolbar/button-toolbar.js +117 -0
  476. package/src/vendor/bootstrap-vue/src/components/button-toolbar/button-toolbar.spec.js +185 -0
  477. package/src/vendor/bootstrap-vue/src/components/button-toolbar/index.d.ts +11 -0
  478. package/src/vendor/bootstrap-vue/src/components/button-toolbar/index.js +11 -0
  479. package/src/vendor/bootstrap-vue/src/components/button-toolbar/package.json +32 -0
  480. package/src/vendor/bootstrap-vue/src/components/calendar/README.md +735 -0
  481. package/src/vendor/bootstrap-vue/src/components/calendar/_calendar.scss +78 -0
  482. package/src/vendor/bootstrap-vue/src/components/calendar/calendar.js +1146 -0
  483. package/src/vendor/bootstrap-vue/src/components/calendar/calendar.spec.js +466 -0
  484. package/src/vendor/bootstrap-vue/src/components/calendar/index.d.ts +28 -0
  485. package/src/vendor/bootstrap-vue/src/components/calendar/index.js +8 -0
  486. package/src/vendor/bootstrap-vue/src/components/calendar/index.scss +1 -0
  487. package/src/vendor/bootstrap-vue/src/components/calendar/package.json +317 -0
  488. package/src/vendor/bootstrap-vue/src/components/card/README.md +729 -0
  489. package/src/vendor/bootstrap-vue/src/components/card/_card-img.scss +7 -0
  490. package/src/vendor/bootstrap-vue/src/components/card/card-body.js +69 -0
  491. package/src/vendor/bootstrap-vue/src/components/card/card-body.spec.js +142 -0
  492. package/src/vendor/bootstrap-vue/src/components/card/card-footer.js +48 -0
  493. package/src/vendor/bootstrap-vue/src/components/card/card-footer.spec.js +98 -0
  494. package/src/vendor/bootstrap-vue/src/components/card/card-group.js +33 -0
  495. package/src/vendor/bootstrap-vue/src/components/card/card-group.spec.js +75 -0
  496. package/src/vendor/bootstrap-vue/src/components/card/card-header.js +48 -0
  497. package/src/vendor/bootstrap-vue/src/components/card/card-header.spec.js +98 -0
  498. package/src/vendor/bootstrap-vue/src/components/card/card-img-lazy.js +47 -0
  499. package/src/vendor/bootstrap-vue/src/components/card/card-img-lazy.spec.js +204 -0
  500. package/src/vendor/bootstrap-vue/src/components/card/card-img.js +50 -0
  501. package/src/vendor/bootstrap-vue/src/components/card/card-img.spec.js +208 -0
  502. package/src/vendor/bootstrap-vue/src/components/card/card-sub-title.js +35 -0
  503. package/src/vendor/bootstrap-vue/src/components/card/card-sub-title.spec.js +60 -0
  504. package/src/vendor/bootstrap-vue/src/components/card/card-text.js +25 -0
  505. package/src/vendor/bootstrap-vue/src/components/card/card-text.spec.js +48 -0
  506. package/src/vendor/bootstrap-vue/src/components/card/card-title.js +33 -0
  507. package/src/vendor/bootstrap-vue/src/components/card/card-title.spec.js +45 -0
  508. package/src/vendor/bootstrap-vue/src/components/card/card.js +140 -0
  509. package/src/vendor/bootstrap-vue/src/components/card/card.spec.js +296 -0
  510. package/src/vendor/bootstrap-vue/src/components/card/index.d.ts +38 -0
  511. package/src/vendor/bootstrap-vue/src/components/card/index.js +40 -0
  512. package/src/vendor/bootstrap-vue/src/components/card/index.scss +1 -0
  513. package/src/vendor/bootstrap-vue/src/components/card/package.json +262 -0
  514. package/src/vendor/bootstrap-vue/src/components/carousel/README.md +320 -0
  515. package/src/vendor/bootstrap-vue/src/components/carousel/carousel-slide.js +132 -0
  516. package/src/vendor/bootstrap-vue/src/components/carousel/carousel-slide.spec.js +276 -0
  517. package/src/vendor/bootstrap-vue/src/components/carousel/carousel.js +655 -0
  518. package/src/vendor/bootstrap-vue/src/components/carousel/carousel.spec.js +1069 -0
  519. package/src/vendor/bootstrap-vue/src/components/carousel/index.d.ts +20 -0
  520. package/src/vendor/bootstrap-vue/src/components/carousel/index.js +12 -0
  521. package/src/vendor/bootstrap-vue/src/components/carousel/package.json +185 -0
  522. package/src/vendor/bootstrap-vue/src/components/collapse/README.md +321 -0
  523. package/src/vendor/bootstrap-vue/src/components/collapse/collapse.js +272 -0
  524. package/src/vendor/bootstrap-vue/src/components/collapse/collapse.spec.js +558 -0
  525. package/src/vendor/bootstrap-vue/src/components/collapse/helpers/bv-collapse.js +88 -0
  526. package/src/vendor/bootstrap-vue/src/components/collapse/index.d.ts +13 -0
  527. package/src/vendor/bootstrap-vue/src/components/collapse/index.js +10 -0
  528. package/src/vendor/bootstrap-vue/src/components/collapse/package.json +111 -0
  529. package/src/vendor/bootstrap-vue/src/components/dropdown/README.md +730 -0
  530. package/src/vendor/bootstrap-vue/src/components/dropdown/_dropdown-form.scss +38 -0
  531. package/src/vendor/bootstrap-vue/src/components/dropdown/_dropdown-text.scss +17 -0
  532. package/src/vendor/bootstrap-vue/src/components/dropdown/_dropdown.scss +58 -0
  533. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-divider.js +36 -0
  534. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-divider.spec.js +58 -0
  535. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-form.js +47 -0
  536. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-form.spec.js +110 -0
  537. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-group.js +76 -0
  538. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-group.spec.js +94 -0
  539. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-header.js +46 -0
  540. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-header.spec.js +73 -0
  541. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-item-button.js +93 -0
  542. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-item-button.spec.js +117 -0
  543. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-item.js +87 -0
  544. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-item.spec.js +147 -0
  545. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-text.js +42 -0
  546. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-text.spec.js +59 -0
  547. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown.js +202 -0
  548. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown.spec.js +1121 -0
  549. package/src/vendor/bootstrap-vue/src/components/dropdown/index.d.ts +36 -0
  550. package/src/vendor/bootstrap-vue/src/components/dropdown/index.js +44 -0
  551. package/src/vendor/bootstrap-vue/src/components/dropdown/index.scss +3 -0
  552. package/src/vendor/bootstrap-vue/src/components/dropdown/package.json +368 -0
  553. package/src/vendor/bootstrap-vue/src/components/embed/README.md +63 -0
  554. package/src/vendor/bootstrap-vue/src/components/embed/embed.js +51 -0
  555. package/src/vendor/bootstrap-vue/src/components/embed/embed.spec.js +110 -0
  556. package/src/vendor/bootstrap-vue/src/components/embed/index.d.ts +11 -0
  557. package/src/vendor/bootstrap-vue/src/components/embed/index.js +8 -0
  558. package/src/vendor/bootstrap-vue/src/components/embed/package.json +29 -0
  559. package/src/vendor/bootstrap-vue/src/components/form/README.md +370 -0
  560. package/src/vendor/bootstrap-vue/src/components/form/form-datalist.js +42 -0
  561. package/src/vendor/bootstrap-vue/src/components/form/form-datalist.spec.js +57 -0
  562. package/src/vendor/bootstrap-vue/src/components/form/form-invalid-feedback.js +51 -0
  563. package/src/vendor/bootstrap-vue/src/components/form/form-invalid-feedback.spec.js +170 -0
  564. package/src/vendor/bootstrap-vue/src/components/form/form-text.js +40 -0
  565. package/src/vendor/bootstrap-vue/src/components/form/form-text.spec.js +93 -0
  566. package/src/vendor/bootstrap-vue/src/components/form/form-valid-feedback.js +51 -0
  567. package/src/vendor/bootstrap-vue/src/components/form/form-valid-feedback.spec.js +157 -0
  568. package/src/vendor/bootstrap-vue/src/components/form/form.js +41 -0
  569. package/src/vendor/bootstrap-vue/src/components/form/form.spec.js +97 -0
  570. package/src/vendor/bootstrap-vue/src/components/form/index.d.ts +23 -0
  571. package/src/vendor/bootstrap-vue/src/components/form/index.js +24 -0
  572. package/src/vendor/bootstrap-vue/src/components/form/package.json +124 -0
  573. package/src/vendor/bootstrap-vue/src/components/form-btn-label-control/_form-btn-label-control.scss +125 -0
  574. package/src/vendor/bootstrap-vue/src/components/form-btn-label-control/bv-form-btn-label-control.js +278 -0
  575. package/src/vendor/bootstrap-vue/src/components/form-btn-label-control/index.scss +1 -0
  576. package/src/vendor/bootstrap-vue/src/components/form-btn-label-control/package.json +5 -0
  577. package/src/vendor/bootstrap-vue/src/components/form-checkbox/README.md +862 -0
  578. package/src/vendor/bootstrap-vue/src/components/form-checkbox/_form-checkbox-group.scss +2 -0
  579. package/src/vendor/bootstrap-vue/src/components/form-checkbox/_form-checkbox.scss +125 -0
  580. package/src/vendor/bootstrap-vue/src/components/form-checkbox/form-checkbox-group.js +42 -0
  581. package/src/vendor/bootstrap-vue/src/components/form-checkbox/form-checkbox-group.spec.js +642 -0
  582. package/src/vendor/bootstrap-vue/src/components/form-checkbox/form-checkbox.js +132 -0
  583. package/src/vendor/bootstrap-vue/src/components/form-checkbox/form-checkbox.spec.js +1331 -0
  584. package/src/vendor/bootstrap-vue/src/components/form-checkbox/index.d.ts +14 -0
  585. package/src/vendor/bootstrap-vue/src/components/form-checkbox/index.js +16 -0
  586. package/src/vendor/bootstrap-vue/src/components/form-checkbox/index.scss +2 -0
  587. package/src/vendor/bootstrap-vue/src/components/form-checkbox/package.json +172 -0
  588. package/src/vendor/bootstrap-vue/src/components/form-datepicker/README.md +694 -0
  589. package/src/vendor/bootstrap-vue/src/components/form-datepicker/_form-datepicker.scss +1 -0
  590. package/src/vendor/bootstrap-vue/src/components/form-datepicker/form-datepicker.js +342 -0
  591. package/src/vendor/bootstrap-vue/src/components/form-datepicker/form-datepicker.spec.js +562 -0
  592. package/src/vendor/bootstrap-vue/src/components/form-datepicker/index.d.ts +12 -0
  593. package/src/vendor/bootstrap-vue/src/components/form-datepicker/index.js +11 -0
  594. package/src/vendor/bootstrap-vue/src/components/form-datepicker/index.scss +1 -0
  595. package/src/vendor/bootstrap-vue/src/components/form-datepicker/package.json +420 -0
  596. package/src/vendor/bootstrap-vue/src/components/form-file/README.md +357 -0
  597. package/src/vendor/bootstrap-vue/src/components/form-file/_form-file.scss +61 -0
  598. package/src/vendor/bootstrap-vue/src/components/form-file/form-file.js +575 -0
  599. package/src/vendor/bootstrap-vue/src/components/form-file/form-file.spec.js +885 -0
  600. package/src/vendor/bootstrap-vue/src/components/form-file/index.d.ts +13 -0
  601. package/src/vendor/bootstrap-vue/src/components/form-file/index.js +11 -0
  602. package/src/vendor/bootstrap-vue/src/components/form-file/index.scss +1 -0
  603. package/src/vendor/bootstrap-vue/src/components/form-file/package.json +131 -0
  604. package/src/vendor/bootstrap-vue/src/components/form-group/README.md +337 -0
  605. package/src/vendor/bootstrap-vue/src/components/form-group/form-group.js +403 -0
  606. package/src/vendor/bootstrap-vue/src/components/form-group/form-group.spec.js +477 -0
  607. package/src/vendor/bootstrap-vue/src/components/form-group/index.d.ts +11 -0
  608. package/src/vendor/bootstrap-vue/src/components/form-group/index.js +11 -0
  609. package/src/vendor/bootstrap-vue/src/components/form-group/package.json +183 -0
  610. package/src/vendor/bootstrap-vue/src/components/form-input/README.md +612 -0
  611. package/src/vendor/bootstrap-vue/src/components/form-input/_form-input.scss +217 -0
  612. package/src/vendor/bootstrap-vue/src/components/form-input/form-input.js +168 -0
  613. package/src/vendor/bootstrap-vue/src/components/form-input/form-input.spec.js +986 -0
  614. package/src/vendor/bootstrap-vue/src/components/form-input/index.d.ts +13 -0
  615. package/src/vendor/bootstrap-vue/src/components/form-input/index.js +11 -0
  616. package/src/vendor/bootstrap-vue/src/components/form-input/index.scss +1 -0
  617. package/src/vendor/bootstrap-vue/src/components/form-input/package.json +135 -0
  618. package/src/vendor/bootstrap-vue/src/components/form-radio/README.md +566 -0
  619. package/src/vendor/bootstrap-vue/src/components/form-radio/_form-radio-group.scss +3 -0
  620. package/src/vendor/bootstrap-vue/src/components/form-radio/_form-radio.scss +47 -0
  621. package/src/vendor/bootstrap-vue/src/components/form-radio/form-radio-group.js +30 -0
  622. package/src/vendor/bootstrap-vue/src/components/form-radio/form-radio-group.spec.js +469 -0
  623. package/src/vendor/bootstrap-vue/src/components/form-radio/form-radio.js +28 -0
  624. package/src/vendor/bootstrap-vue/src/components/form-radio/form-radio.spec.js +952 -0
  625. package/src/vendor/bootstrap-vue/src/components/form-radio/index.d.ts +14 -0
  626. package/src/vendor/bootstrap-vue/src/components/form-radio/index.js +14 -0
  627. package/src/vendor/bootstrap-vue/src/components/form-radio/index.scss +2 -0
  628. package/src/vendor/bootstrap-vue/src/components/form-radio/package.json +162 -0
  629. package/src/vendor/bootstrap-vue/src/components/form-rating/README.md +526 -0
  630. package/src/vendor/bootstrap-vue/src/components/form-rating/_form-rating.scss +57 -0
  631. package/src/vendor/bootstrap-vue/src/components/form-rating/form-rating.js +411 -0
  632. package/src/vendor/bootstrap-vue/src/components/form-rating/form-rating.spec.js +544 -0
  633. package/src/vendor/bootstrap-vue/src/components/form-rating/index.d.ts +14 -0
  634. package/src/vendor/bootstrap-vue/src/components/form-rating/index.js +8 -0
  635. package/src/vendor/bootstrap-vue/src/components/form-rating/index.scss +1 -0
  636. package/src/vendor/bootstrap-vue/src/components/form-rating/package.json +166 -0
  637. package/src/vendor/bootstrap-vue/src/components/form-select/README.md +504 -0
  638. package/src/vendor/bootstrap-vue/src/components/form-select/form-select-option-group.js +48 -0
  639. package/src/vendor/bootstrap-vue/src/components/form-select/form-select-option-group.spec.js +138 -0
  640. package/src/vendor/bootstrap-vue/src/components/form-select/form-select-option.js +35 -0
  641. package/src/vendor/bootstrap-vue/src/components/form-select/form-select-option.spec.js +75 -0
  642. package/src/vendor/bootstrap-vue/src/components/form-select/form-select.js +153 -0
  643. package/src/vendor/bootstrap-vue/src/components/form-select/form-select.spec.js +723 -0
  644. package/src/vendor/bootstrap-vue/src/components/form-select/helpers/mixin-options.js +56 -0
  645. package/src/vendor/bootstrap-vue/src/components/form-select/index.d.ts +17 -0
  646. package/src/vendor/bootstrap-vue/src/components/form-select/index.js +17 -0
  647. package/src/vendor/bootstrap-vue/src/components/form-select/package.json +132 -0
  648. package/src/vendor/bootstrap-vue/src/components/form-spinbutton/README.md +411 -0
  649. package/src/vendor/bootstrap-vue/src/components/form-spinbutton/_spinbutton.scss +76 -0
  650. package/src/vendor/bootstrap-vue/src/components/form-spinbutton/form-spinbutton.js +572 -0
  651. package/src/vendor/bootstrap-vue/src/components/form-spinbutton/form-spinbutton.spec.js +731 -0
  652. package/src/vendor/bootstrap-vue/src/components/form-spinbutton/index.d.ts +12 -0
  653. package/src/vendor/bootstrap-vue/src/components/form-spinbutton/index.js +11 -0
  654. package/src/vendor/bootstrap-vue/src/components/form-spinbutton/index.scss +1 -0
  655. package/src/vendor/bootstrap-vue/src/components/form-spinbutton/package.json +150 -0
  656. package/src/vendor/bootstrap-vue/src/components/form-tags/README.md +880 -0
  657. package/src/vendor/bootstrap-vue/src/components/form-tags/_form-tags.scss +70 -0
  658. package/src/vendor/bootstrap-vue/src/components/form-tags/form-tag.js +94 -0
  659. package/src/vendor/bootstrap-vue/src/components/form-tags/form-tag.spec.js +166 -0
  660. package/src/vendor/bootstrap-vue/src/components/form-tags/form-tags.js +891 -0
  661. package/src/vendor/bootstrap-vue/src/components/form-tags/form-tags.spec.js +920 -0
  662. package/src/vendor/bootstrap-vue/src/components/form-tags/index.d.ts +16 -0
  663. package/src/vendor/bootstrap-vue/src/components/form-tags/index.js +14 -0
  664. package/src/vendor/bootstrap-vue/src/components/form-tags/index.scss +1 -0
  665. package/src/vendor/bootstrap-vue/src/components/form-tags/package.json +440 -0
  666. package/src/vendor/bootstrap-vue/src/components/form-textarea/README.md +453 -0
  667. package/src/vendor/bootstrap-vue/src/components/form-textarea/form-textarea.js +226 -0
  668. package/src/vendor/bootstrap-vue/src/components/form-textarea/form-textarea.spec.js +1000 -0
  669. package/src/vendor/bootstrap-vue/src/components/form-textarea/index.d.ts +13 -0
  670. package/src/vendor/bootstrap-vue/src/components/form-textarea/index.js +11 -0
  671. package/src/vendor/bootstrap-vue/src/components/form-textarea/package.json +122 -0
  672. package/src/vendor/bootstrap-vue/src/components/form-timepicker/README.md +450 -0
  673. package/src/vendor/bootstrap-vue/src/components/form-timepicker/_form-timepicker.scss +1 -0
  674. package/src/vendor/bootstrap-vue/src/components/form-timepicker/form-timepicker.js +308 -0
  675. package/src/vendor/bootstrap-vue/src/components/form-timepicker/form-timepicker.spec.js +440 -0
  676. package/src/vendor/bootstrap-vue/src/components/form-timepicker/index.d.ts +12 -0
  677. package/src/vendor/bootstrap-vue/src/components/form-timepicker/index.js +11 -0
  678. package/src/vendor/bootstrap-vue/src/components/form-timepicker/index.scss +1 -0
  679. package/src/vendor/bootstrap-vue/src/components/form-timepicker/package.json +255 -0
  680. package/src/vendor/bootstrap-vue/src/components/image/README.md +322 -0
  681. package/src/vendor/bootstrap-vue/src/components/image/img-lazy.js +161 -0
  682. package/src/vendor/bootstrap-vue/src/components/image/img-lazy.spec.js +96 -0
  683. package/src/vendor/bootstrap-vue/src/components/image/img.js +139 -0
  684. package/src/vendor/bootstrap-vue/src/components/image/img.spec.js +255 -0
  685. package/src/vendor/bootstrap-vue/src/components/image/index.d.ts +14 -0
  686. package/src/vendor/bootstrap-vue/src/components/image/index.js +12 -0
  687. package/src/vendor/bootstrap-vue/src/components/image/package.json +152 -0
  688. package/src/vendor/bootstrap-vue/src/components/index.d.ts +56 -0
  689. package/src/vendor/bootstrap-vue/src/components/index.js +110 -0
  690. package/src/vendor/bootstrap-vue/src/components/index.scss +27 -0
  691. package/src/vendor/bootstrap-vue/src/components/input-group/README.md +334 -0
  692. package/src/vendor/bootstrap-vue/src/components/input-group/_input-group.scss +29 -0
  693. package/src/vendor/bootstrap-vue/src/components/input-group/index.d.ts +23 -0
  694. package/src/vendor/bootstrap-vue/src/components/input-group/index.js +25 -0
  695. package/src/vendor/bootstrap-vue/src/components/input-group/index.scss +1 -0
  696. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-addon.js +43 -0
  697. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-append.js +31 -0
  698. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-append.spec.js +84 -0
  699. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-prepend.js +31 -0
  700. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-prepend.spec.js +84 -0
  701. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-text.js +31 -0
  702. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-text.spec.js +45 -0
  703. package/src/vendor/bootstrap-vue/src/components/input-group/input-group.js +73 -0
  704. package/src/vendor/bootstrap-vue/src/components/input-group/input-group.spec.js +153 -0
  705. package/src/vendor/bootstrap-vue/src/components/input-group/package.json +109 -0
  706. package/src/vendor/bootstrap-vue/src/components/jumbotron/README.md +109 -0
  707. package/src/vendor/bootstrap-vue/src/components/jumbotron/index.d.ts +11 -0
  708. package/src/vendor/bootstrap-vue/src/components/jumbotron/index.js +8 -0
  709. package/src/vendor/bootstrap-vue/src/components/jumbotron/jumbotron.js +103 -0
  710. package/src/vendor/bootstrap-vue/src/components/jumbotron/jumbotron.spec.js +254 -0
  711. package/src/vendor/bootstrap-vue/src/components/jumbotron/package.json +66 -0
  712. package/src/vendor/bootstrap-vue/src/components/layout/README.md +791 -0
  713. package/src/vendor/bootstrap-vue/src/components/layout/col.js +154 -0
  714. package/src/vendor/bootstrap-vue/src/components/layout/col.spec.js +192 -0
  715. package/src/vendor/bootstrap-vue/src/components/layout/container.js +40 -0
  716. package/src/vendor/bootstrap-vue/src/components/layout/container.spec.js +75 -0
  717. package/src/vendor/bootstrap-vue/src/components/layout/form-row.js +31 -0
  718. package/src/vendor/bootstrap-vue/src/components/layout/form-row.spec.js +45 -0
  719. package/src/vendor/bootstrap-vue/src/components/layout/index.d.ts +20 -0
  720. package/src/vendor/bootstrap-vue/src/components/layout/index.js +16 -0
  721. package/src/vendor/bootstrap-vue/src/components/layout/package.json +166 -0
  722. package/src/vendor/bootstrap-vue/src/components/layout/row.js +111 -0
  723. package/src/vendor/bootstrap-vue/src/components/layout/row.spec.js +138 -0
  724. package/src/vendor/bootstrap-vue/src/components/link/README.md +76 -0
  725. package/src/vendor/bootstrap-vue/src/components/link/index.d.ts +14 -0
  726. package/src/vendor/bootstrap-vue/src/components/link/index.js +8 -0
  727. package/src/vendor/bootstrap-vue/src/components/link/link.js +212 -0
  728. package/src/vendor/bootstrap-vue/src/components/link/link.spec.js +434 -0
  729. package/src/vendor/bootstrap-vue/src/components/link/package.json +57 -0
  730. package/src/vendor/bootstrap-vue/src/components/list-group/README.md +291 -0
  731. package/src/vendor/bootstrap-vue/src/components/list-group/index.d.ts +14 -0
  732. package/src/vendor/bootstrap-vue/src/components/list-group/index.js +12 -0
  733. package/src/vendor/bootstrap-vue/src/components/list-group/list-group-item.js +76 -0
  734. package/src/vendor/bootstrap-vue/src/components/list-group/list-group-item.spec.js +286 -0
  735. package/src/vendor/bootstrap-vue/src/components/list-group/list-group.js +42 -0
  736. package/src/vendor/bootstrap-vue/src/components/list-group/list-group.spec.js +132 -0
  737. package/src/vendor/bootstrap-vue/src/components/list-group/package.json +52 -0
  738. package/src/vendor/bootstrap-vue/src/components/media/README.md +183 -0
  739. package/src/vendor/bootstrap-vue/src/components/media/_media.scss +9 -0
  740. package/src/vendor/bootstrap-vue/src/components/media/index.d.ts +17 -0
  741. package/src/vendor/bootstrap-vue/src/components/media/index.js +14 -0
  742. package/src/vendor/bootstrap-vue/src/components/media/index.scss +1 -0
  743. package/src/vendor/bootstrap-vue/src/components/media/media-aside.js +45 -0
  744. package/src/vendor/bootstrap-vue/src/components/media/media-aside.spec.js +79 -0
  745. package/src/vendor/bootstrap-vue/src/components/media/media-body.js +25 -0
  746. package/src/vendor/bootstrap-vue/src/components/media/media-body.spec.js +47 -0
  747. package/src/vendor/bootstrap-vue/src/components/media/media.js +52 -0
  748. package/src/vendor/bootstrap-vue/src/components/media/media.spec.js +149 -0
  749. package/src/vendor/bootstrap-vue/src/components/media/package.json +65 -0
  750. package/src/vendor/bootstrap-vue/src/components/modal/README.md +1193 -0
  751. package/src/vendor/bootstrap-vue/src/components/modal/_modal.scss +5 -0
  752. package/src/vendor/bootstrap-vue/src/components/modal/helpers/bv-modal-event.class.js +22 -0
  753. package/src/vendor/bootstrap-vue/src/components/modal/helpers/bv-modal-event.class.spec.js +82 -0
  754. package/src/vendor/bootstrap-vue/src/components/modal/helpers/bv-modal.js +279 -0
  755. package/src/vendor/bootstrap-vue/src/components/modal/helpers/bv-modal.spec.js +178 -0
  756. package/src/vendor/bootstrap-vue/src/components/modal/helpers/modal-manager.js +219 -0
  757. package/src/vendor/bootstrap-vue/src/components/modal/index.d.ts +95 -0
  758. package/src/vendor/bootstrap-vue/src/components/modal/index.js +13 -0
  759. package/src/vendor/bootstrap-vue/src/components/modal/index.scss +1 -0
  760. package/src/vendor/bootstrap-vue/src/components/modal/modal.js +1022 -0
  761. package/src/vendor/bootstrap-vue/src/components/modal/modal.spec.js +1418 -0
  762. package/src/vendor/bootstrap-vue/src/components/modal/package.json +587 -0
  763. package/src/vendor/bootstrap-vue/src/components/nav/README.md +480 -0
  764. package/src/vendor/bootstrap-vue/src/components/nav/_nav-item-dropdown.scss +1 -0
  765. package/src/vendor/bootstrap-vue/src/components/nav/index.d.ts +27 -0
  766. package/src/vendor/bootstrap-vue/src/components/nav/index.js +25 -0
  767. package/src/vendor/bootstrap-vue/src/components/nav/index.scss +1 -0
  768. package/src/vendor/bootstrap-vue/src/components/nav/nav-form.js +50 -0
  769. package/src/vendor/bootstrap-vue/src/components/nav/nav-form.spec.js +93 -0
  770. package/src/vendor/bootstrap-vue/src/components/nav/nav-item-dropdown.js +123 -0
  771. package/src/vendor/bootstrap-vue/src/components/nav/nav-item-dropdown.spec.js +268 -0
  772. package/src/vendor/bootstrap-vue/src/components/nav/nav-item.js +49 -0
  773. package/src/vendor/bootstrap-vue/src/components/nav/nav-item.spec.js +127 -0
  774. package/src/vendor/bootstrap-vue/src/components/nav/nav-text.js +18 -0
  775. package/src/vendor/bootstrap-vue/src/components/nav/nav-text.spec.js +30 -0
  776. package/src/vendor/bootstrap-vue/src/components/nav/nav.js +60 -0
  777. package/src/vendor/bootstrap-vue/src/components/nav/nav.spec.js +244 -0
  778. package/src/vendor/bootstrap-vue/src/components/nav/package.json +238 -0
  779. package/src/vendor/bootstrap-vue/src/components/navbar/README.md +339 -0
  780. package/src/vendor/bootstrap-vue/src/components/navbar/_navbar.scss +1 -0
  781. package/src/vendor/bootstrap-vue/src/components/navbar/index.d.ts +19 -0
  782. package/src/vendor/bootstrap-vue/src/components/navbar/index.js +25 -0
  783. package/src/vendor/bootstrap-vue/src/components/navbar/index.scss +1 -0
  784. package/src/vendor/bootstrap-vue/src/components/navbar/navbar-brand.js +42 -0
  785. package/src/vendor/bootstrap-vue/src/components/navbar/navbar-brand.spec.js +50 -0
  786. package/src/vendor/bootstrap-vue/src/components/navbar/navbar-nav.js +45 -0
  787. package/src/vendor/bootstrap-vue/src/components/navbar/navbar-nav.spec.js +105 -0
  788. package/src/vendor/bootstrap-vue/src/components/navbar/navbar-toggle.js +84 -0
  789. package/src/vendor/bootstrap-vue/src/components/navbar/navbar-toggle.spec.js +189 -0
  790. package/src/vendor/bootstrap-vue/src/components/navbar/navbar.js +78 -0
  791. package/src/vendor/bootstrap-vue/src/components/navbar/navbar.spec.js +130 -0
  792. package/src/vendor/bootstrap-vue/src/components/navbar/package.json +134 -0
  793. package/src/vendor/bootstrap-vue/src/components/overlay/README.md +815 -0
  794. package/src/vendor/bootstrap-vue/src/components/overlay/index.d.ts +11 -0
  795. package/src/vendor/bootstrap-vue/src/components/overlay/index.js +8 -0
  796. package/src/vendor/bootstrap-vue/src/components/overlay/overlay.js +162 -0
  797. package/src/vendor/bootstrap-vue/src/components/overlay/overlay.spec.js +257 -0
  798. package/src/vendor/bootstrap-vue/src/components/overlay/package.json +130 -0
  799. package/src/vendor/bootstrap-vue/src/components/pagination/README.md +430 -0
  800. package/src/vendor/bootstrap-vue/src/components/pagination/_pagination.scss +26 -0
  801. package/src/vendor/bootstrap-vue/src/components/pagination/index.d.ts +11 -0
  802. package/src/vendor/bootstrap-vue/src/components/pagination/index.js +8 -0
  803. package/src/vendor/bootstrap-vue/src/components/pagination/index.scss +1 -0
  804. package/src/vendor/bootstrap-vue/src/components/pagination/package.json +295 -0
  805. package/src/vendor/bootstrap-vue/src/components/pagination/pagination.js +138 -0
  806. package/src/vendor/bootstrap-vue/src/components/pagination/pagination.spec.js +1198 -0
  807. package/src/vendor/bootstrap-vue/src/components/pagination-nav/README.md +544 -0
  808. package/src/vendor/bootstrap-vue/src/components/pagination-nav/_pagination-nav.scss +2 -0
  809. package/src/vendor/bootstrap-vue/src/components/pagination-nav/index.d.ts +11 -0
  810. package/src/vendor/bootstrap-vue/src/components/pagination-nav/index.js +8 -0
  811. package/src/vendor/bootstrap-vue/src/components/pagination-nav/index.scss +1 -0
  812. package/src/vendor/bootstrap-vue/src/components/pagination-nav/package.json +315 -0
  813. package/src/vendor/bootstrap-vue/src/components/pagination-nav/pagination-nav.js +281 -0
  814. package/src/vendor/bootstrap-vue/src/components/pagination-nav/pagination-nav.spec.js +671 -0
  815. package/src/vendor/bootstrap-vue/src/components/popover/README.md +964 -0
  816. package/src/vendor/bootstrap-vue/src/components/popover/_popover.scss +113 -0
  817. package/src/vendor/bootstrap-vue/src/components/popover/helpers/bv-popover-template.js +50 -0
  818. package/src/vendor/bootstrap-vue/src/components/popover/helpers/bv-popover.js +28 -0
  819. package/src/vendor/bootstrap-vue/src/components/popover/index.d.ts +11 -0
  820. package/src/vendor/bootstrap-vue/src/components/popover/index.js +10 -0
  821. package/src/vendor/bootstrap-vue/src/components/popover/index.scss +1 -0
  822. package/src/vendor/bootstrap-vue/src/components/popover/package.json +264 -0
  823. package/src/vendor/bootstrap-vue/src/components/popover/popover.js +46 -0
  824. package/src/vendor/bootstrap-vue/src/components/popover/popover.spec.js +199 -0
  825. package/src/vendor/bootstrap-vue/src/components/progress/README.md +376 -0
  826. package/src/vendor/bootstrap-vue/src/components/progress/index.d.ts +14 -0
  827. package/src/vendor/bootstrap-vue/src/components/progress/index.js +12 -0
  828. package/src/vendor/bootstrap-vue/src/components/progress/package.json +109 -0
  829. package/src/vendor/bootstrap-vue/src/components/progress/progress-bar.js +133 -0
  830. package/src/vendor/bootstrap-vue/src/components/progress/progress-bar.spec.js +270 -0
  831. package/src/vendor/bootstrap-vue/src/components/progress/progress.js +57 -0
  832. package/src/vendor/bootstrap-vue/src/components/progress/progress.spec.js +71 -0
  833. package/src/vendor/bootstrap-vue/src/components/sidebar/README.md +406 -0
  834. package/src/vendor/bootstrap-vue/src/components/sidebar/_sidebar.scss +97 -0
  835. package/src/vendor/bootstrap-vue/src/components/sidebar/index.d.ts +11 -0
  836. package/src/vendor/bootstrap-vue/src/components/sidebar/index.js +10 -0
  837. package/src/vendor/bootstrap-vue/src/components/sidebar/index.scss +1 -0
  838. package/src/vendor/bootstrap-vue/src/components/sidebar/package.json +239 -0
  839. package/src/vendor/bootstrap-vue/src/components/sidebar/sidebar.js +438 -0
  840. package/src/vendor/bootstrap-vue/src/components/sidebar/sidebar.spec.js +404 -0
  841. package/src/vendor/bootstrap-vue/src/components/skeleton/README.md +275 -0
  842. package/src/vendor/bootstrap-vue/src/components/skeleton/_skeleton.scss +141 -0
  843. package/src/vendor/bootstrap-vue/src/components/skeleton/index.d.ts +23 -0
  844. package/src/vendor/bootstrap-vue/src/components/skeleton/index.js +18 -0
  845. package/src/vendor/bootstrap-vue/src/components/skeleton/index.scss +1 -0
  846. package/src/vendor/bootstrap-vue/src/components/skeleton/package.json +136 -0
  847. package/src/vendor/bootstrap-vue/src/components/skeleton/skeleton-icon.js +45 -0
  848. package/src/vendor/bootstrap-vue/src/components/skeleton/skeleton-icon.spec.js +86 -0
  849. package/src/vendor/bootstrap-vue/src/components/skeleton/skeleton-img.js +49 -0
  850. package/src/vendor/bootstrap-vue/src/components/skeleton/skeleton-img.spec.js +139 -0
  851. package/src/vendor/bootstrap-vue/src/components/skeleton/skeleton-table.js +58 -0
  852. package/src/vendor/bootstrap-vue/src/components/skeleton/skeleton-table.spec.js +119 -0
  853. package/src/vendor/bootstrap-vue/src/components/skeleton/skeleton-wrapper.js +47 -0
  854. package/src/vendor/bootstrap-vue/src/components/skeleton/skeleton-wrapper.spec.js +48 -0
  855. package/src/vendor/bootstrap-vue/src/components/skeleton/skeleton.js +46 -0
  856. package/src/vendor/bootstrap-vue/src/components/skeleton/skeleton.spec.js +126 -0
  857. package/src/vendor/bootstrap-vue/src/components/spinner/README.md +229 -0
  858. package/src/vendor/bootstrap-vue/src/components/spinner/index.d.ts +11 -0
  859. package/src/vendor/bootstrap-vue/src/components/spinner/index.js +8 -0
  860. package/src/vendor/bootstrap-vue/src/components/spinner/package.json +38 -0
  861. package/src/vendor/bootstrap-vue/src/components/spinner/spinner.js +54 -0
  862. package/src/vendor/bootstrap-vue/src/components/spinner/spinner.spec.js +305 -0
  863. package/src/vendor/bootstrap-vue/src/components/table/README.md +3170 -0
  864. package/src/vendor/bootstrap-vue/src/components/table/_table.scss +474 -0
  865. package/src/vendor/bootstrap-vue/src/components/table/helpers/constants.js +30 -0
  866. package/src/vendor/bootstrap-vue/src/components/table/helpers/default-sort-compare.js +60 -0
  867. package/src/vendor/bootstrap-vue/src/components/table/helpers/default-sort-compare.spec.js +112 -0
  868. package/src/vendor/bootstrap-vue/src/components/table/helpers/filter-event.js +38 -0
  869. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-bottom-row.js +44 -0
  870. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-busy.js +88 -0
  871. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-caption.js +49 -0
  872. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-colgroup.js +27 -0
  873. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-empty.js +105 -0
  874. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-filtering.js +271 -0
  875. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-items.js +146 -0
  876. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-pagination.js +38 -0
  877. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-provider.js +188 -0
  878. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-selectable.js +241 -0
  879. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-sorting.js +299 -0
  880. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-stacked.js +33 -0
  881. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-table-renderer.js +209 -0
  882. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-tbody-row.js +360 -0
  883. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-tbody.js +258 -0
  884. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-tfoot.js +55 -0
  885. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-thead.js +238 -0
  886. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-top-row.js +37 -0
  887. package/src/vendor/bootstrap-vue/src/components/table/helpers/normalize-fields.js +71 -0
  888. package/src/vendor/bootstrap-vue/src/components/table/helpers/normalize-fields.spec.js +93 -0
  889. package/src/vendor/bootstrap-vue/src/components/table/helpers/sanitize-row.js +39 -0
  890. package/src/vendor/bootstrap-vue/src/components/table/helpers/stringify-record-values.js +11 -0
  891. package/src/vendor/bootstrap-vue/src/components/table/helpers/text-selection-active.js +13 -0
  892. package/src/vendor/bootstrap-vue/src/components/table/index.d.ts +243 -0
  893. package/src/vendor/bootstrap-vue/src/components/table/index.js +56 -0
  894. package/src/vendor/bootstrap-vue/src/components/table/index.scss +1 -0
  895. package/src/vendor/bootstrap-vue/src/components/table/package.json +1767 -0
  896. package/src/vendor/bootstrap-vue/src/components/table/table-busy.spec.js +150 -0
  897. package/src/vendor/bootstrap-vue/src/components/table/table-caption.spec.js +176 -0
  898. package/src/vendor/bootstrap-vue/src/components/table/table-colgroup.spec.js +81 -0
  899. package/src/vendor/bootstrap-vue/src/components/table/table-filtering.spec.js +409 -0
  900. package/src/vendor/bootstrap-vue/src/components/table/table-item-formatter.spec.js +56 -0
  901. package/src/vendor/bootstrap-vue/src/components/table/table-lite.js +63 -0
  902. package/src/vendor/bootstrap-vue/src/components/table/table-lite.spec.js +682 -0
  903. package/src/vendor/bootstrap-vue/src/components/table/table-pagination.spec.js +133 -0
  904. package/src/vendor/bootstrap-vue/src/components/table/table-primarykey.spec.js +83 -0
  905. package/src/vendor/bootstrap-vue/src/components/table/table-provider.spec.js +411 -0
  906. package/src/vendor/bootstrap-vue/src/components/table/table-row-details.spec.js +459 -0
  907. package/src/vendor/bootstrap-vue/src/components/table/table-selectable.spec.js +1182 -0
  908. package/src/vendor/bootstrap-vue/src/components/table/table-simple.js +50 -0
  909. package/src/vendor/bootstrap-vue/src/components/table/table-simple.spec.js +206 -0
  910. package/src/vendor/bootstrap-vue/src/components/table/table-sorting.spec.js +858 -0
  911. package/src/vendor/bootstrap-vue/src/components/table/table-sticky-column.spec.js +377 -0
  912. package/src/vendor/bootstrap-vue/src/components/table/table-tbody-bottom-row.spec.js +94 -0
  913. package/src/vendor/bootstrap-vue/src/components/table/table-tbody-row-events.spec.js +529 -0
  914. package/src/vendor/bootstrap-vue/src/components/table/table-tbody-top-row.spec.js +88 -0
  915. package/src/vendor/bootstrap-vue/src/components/table/table-tbody-transition.spec.js +83 -0
  916. package/src/vendor/bootstrap-vue/src/components/table/table-tfoot-custom.spec.js +91 -0
  917. package/src/vendor/bootstrap-vue/src/components/table/table-tfoot-events.spec.js +137 -0
  918. package/src/vendor/bootstrap-vue/src/components/table/table-thead-events.spec.js +155 -0
  919. package/src/vendor/bootstrap-vue/src/components/table/table-thead-top.spec.js +96 -0
  920. package/src/vendor/bootstrap-vue/src/components/table/table.js +89 -0
  921. package/src/vendor/bootstrap-vue/src/components/table/table.spec.js +692 -0
  922. package/src/vendor/bootstrap-vue/src/components/table/tbody.js +103 -0
  923. package/src/vendor/bootstrap-vue/src/components/table/td.js +195 -0
  924. package/src/vendor/bootstrap-vue/src/components/table/tfoot.js +95 -0
  925. package/src/vendor/bootstrap-vue/src/components/table/th.js +25 -0
  926. package/src/vendor/bootstrap-vue/src/components/table/thead.js +98 -0
  927. package/src/vendor/bootstrap-vue/src/components/table/tr.js +122 -0
  928. package/src/vendor/bootstrap-vue/src/components/tabs/README.md +575 -0
  929. package/src/vendor/bootstrap-vue/src/components/tabs/index.d.ts +17 -0
  930. package/src/vendor/bootstrap-vue/src/components/tabs/index.js +12 -0
  931. package/src/vendor/bootstrap-vue/src/components/tabs/package.json +205 -0
  932. package/src/vendor/bootstrap-vue/src/components/tabs/tab.js +197 -0
  933. package/src/vendor/bootstrap-vue/src/components/tabs/tab.spec.js +330 -0
  934. package/src/vendor/bootstrap-vue/src/components/tabs/tabs.js +688 -0
  935. package/src/vendor/bootstrap-vue/src/components/tabs/tabs.spec.js +836 -0
  936. package/src/vendor/bootstrap-vue/src/components/time/README.md +431 -0
  937. package/src/vendor/bootstrap-vue/src/components/time/_time.scss +41 -0
  938. package/src/vendor/bootstrap-vue/src/components/time/index.d.ts +27 -0
  939. package/src/vendor/bootstrap-vue/src/components/time/index.js +8 -0
  940. package/src/vendor/bootstrap-vue/src/components/time/index.scss +1 -0
  941. package/src/vendor/bootstrap-vue/src/components/time/package.json +123 -0
  942. package/src/vendor/bootstrap-vue/src/components/time/time.js +601 -0
  943. package/src/vendor/bootstrap-vue/src/components/time/time.spec.js +330 -0
  944. package/src/vendor/bootstrap-vue/src/components/toast/README.md +658 -0
  945. package/src/vendor/bootstrap-vue/src/components/toast/_toast.scss +79 -0
  946. package/src/vendor/bootstrap-vue/src/components/toast/_toaster-transition.scss +45 -0
  947. package/src/vendor/bootstrap-vue/src/components/toast/_toaster.scss +108 -0
  948. package/src/vendor/bootstrap-vue/src/components/toast/helpers/bv-toast.js +208 -0
  949. package/src/vendor/bootstrap-vue/src/components/toast/helpers/bv-toast.spec.js +131 -0
  950. package/src/vendor/bootstrap-vue/src/components/toast/index.d.ts +70 -0
  951. package/src/vendor/bootstrap-vue/src/components/toast/index.js +12 -0
  952. package/src/vendor/bootstrap-vue/src/components/toast/index.scss +3 -0
  953. package/src/vendor/bootstrap-vue/src/components/toast/package.json +188 -0
  954. package/src/vendor/bootstrap-vue/src/components/toast/toast.js +454 -0
  955. package/src/vendor/bootstrap-vue/src/components/toast/toast.spec.js +346 -0
  956. package/src/vendor/bootstrap-vue/src/components/toast/toaster.js +139 -0
  957. package/src/vendor/bootstrap-vue/src/components/toast/toaster.spec.js +77 -0
  958. package/src/vendor/bootstrap-vue/src/components/tooltip/README.md +559 -0
  959. package/src/vendor/bootstrap-vue/src/components/tooltip/_tooltip.scss +86 -0
  960. package/src/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-popper.js +248 -0
  961. package/src/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip-template.js +130 -0
  962. package/src/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip.js +981 -0
  963. package/src/vendor/bootstrap-vue/src/components/tooltip/index.d.ts +11 -0
  964. package/src/vendor/bootstrap-vue/src/components/tooltip/index.js +10 -0
  965. package/src/vendor/bootstrap-vue/src/components/tooltip/index.scss +1 -0
  966. package/src/vendor/bootstrap-vue/src/components/tooltip/package.json +261 -0
  967. package/src/vendor/bootstrap-vue/src/components/tooltip/tooltip.js +316 -0
  968. package/src/vendor/bootstrap-vue/src/components/tooltip/tooltip.spec.js +1529 -0
  969. package/src/vendor/bootstrap-vue/src/components/transition/bv-transition.js +83 -0
  970. package/src/vendor/bootstrap-vue/src/components/transition/package.json +5 -0
  971. package/src/vendor/bootstrap-vue/src/components/transporter/package.json +5 -0
  972. package/src/vendor/bootstrap-vue/src/components/transporter/transporter.js +202 -0
  973. package/src/vendor/bootstrap-vue/src/components/transporter/transporter.spec.js +85 -0
  974. package/src/vendor/bootstrap-vue/src/constants/classes.js +2 -0
  975. package/src/vendor/bootstrap-vue/src/constants/components.js +133 -0
  976. package/src/vendor/bootstrap-vue/src/constants/config.js +4 -0
  977. package/src/vendor/bootstrap-vue/src/constants/date.js +7 -0
  978. package/src/vendor/bootstrap-vue/src/constants/env.js +58 -0
  979. package/src/vendor/bootstrap-vue/src/constants/events.js +68 -0
  980. package/src/vendor/bootstrap-vue/src/constants/key-codes.js +14 -0
  981. package/src/vendor/bootstrap-vue/src/constants/popper.js +8 -0
  982. package/src/vendor/bootstrap-vue/src/constants/props.js +29 -0
  983. package/src/vendor/bootstrap-vue/src/constants/regex.js +60 -0
  984. package/src/vendor/bootstrap-vue/src/constants/safe-types.js +17 -0
  985. package/src/vendor/bootstrap-vue/src/constants/slots.js +64 -0
  986. package/src/vendor/bootstrap-vue/src/directives/hover/README.md +87 -0
  987. package/src/vendor/bootstrap-vue/src/directives/hover/hover.js +54 -0
  988. package/src/vendor/bootstrap-vue/src/directives/hover/hover.spec.js +49 -0
  989. package/src/vendor/bootstrap-vue/src/directives/hover/index.d.ts +11 -0
  990. package/src/vendor/bootstrap-vue/src/directives/hover/index.js +8 -0
  991. package/src/vendor/bootstrap-vue/src/directives/hover/package.json +13 -0
  992. package/src/vendor/bootstrap-vue/src/directives/index.d.ts +13 -0
  993. package/src/vendor/bootstrap-vue/src/directives/index.js +22 -0
  994. package/src/vendor/bootstrap-vue/src/directives/modal/index.d.ts +11 -0
  995. package/src/vendor/bootstrap-vue/src/directives/modal/index.js +8 -0
  996. package/src/vendor/bootstrap-vue/src/directives/modal/modal.js +115 -0
  997. package/src/vendor/bootstrap-vue/src/directives/modal/modal.spec.js +191 -0
  998. package/src/vendor/bootstrap-vue/src/directives/popover/README.md +648 -0
  999. package/src/vendor/bootstrap-vue/src/directives/popover/index.d.ts +11 -0
  1000. package/src/vendor/bootstrap-vue/src/directives/popover/index.js +8 -0
  1001. package/src/vendor/bootstrap-vue/src/directives/popover/package.json +111 -0
  1002. package/src/vendor/bootstrap-vue/src/directives/popover/popover.js +275 -0
  1003. package/src/vendor/bootstrap-vue/src/directives/popover/popover.spec.js +129 -0
  1004. package/src/vendor/bootstrap-vue/src/directives/scrollspy/README.md +411 -0
  1005. package/src/vendor/bootstrap-vue/src/directives/scrollspy/helpers/bv-scrollspy.class.js +480 -0
  1006. package/src/vendor/bootstrap-vue/src/directives/scrollspy/index.d.ts +11 -0
  1007. package/src/vendor/bootstrap-vue/src/directives/scrollspy/index.js +8 -0
  1008. package/src/vendor/bootstrap-vue/src/directives/scrollspy/package.json +38 -0
  1009. package/src/vendor/bootstrap-vue/src/directives/scrollspy/scrollspy.js +117 -0
  1010. package/src/vendor/bootstrap-vue/src/directives/toggle/README.md +164 -0
  1011. package/src/vendor/bootstrap-vue/src/directives/toggle/index.d.ts +11 -0
  1012. package/src/vendor/bootstrap-vue/src/directives/toggle/index.js +8 -0
  1013. package/src/vendor/bootstrap-vue/src/directives/toggle/package.json +26 -0
  1014. package/src/vendor/bootstrap-vue/src/directives/toggle/toggle.js +274 -0
  1015. package/src/vendor/bootstrap-vue/src/directives/toggle/toggle.spec.js +452 -0
  1016. package/src/vendor/bootstrap-vue/src/directives/tooltip/README.md +522 -0
  1017. package/src/vendor/bootstrap-vue/src/directives/tooltip/index.d.ts +11 -0
  1018. package/src/vendor/bootstrap-vue/src/directives/tooltip/index.js +8 -0
  1019. package/src/vendor/bootstrap-vue/src/directives/tooltip/package.json +131 -0
  1020. package/src/vendor/bootstrap-vue/src/directives/tooltip/tooltip.js +270 -0
  1021. package/src/vendor/bootstrap-vue/src/directives/tooltip/tooltip.spec.js +223 -0
  1022. package/src/vendor/bootstrap-vue/src/directives/visible/README.md +244 -0
  1023. package/src/vendor/bootstrap-vue/src/directives/visible/index.d.ts +11 -0
  1024. package/src/vendor/bootstrap-vue/src/directives/visible/index.js +8 -0
  1025. package/src/vendor/bootstrap-vue/src/directives/visible/package.json +24 -0
  1026. package/src/vendor/bootstrap-vue/src/directives/visible/visible.js +184 -0
  1027. package/src/vendor/bootstrap-vue/src/icons/README.md +874 -0
  1028. package/src/vendor/bootstrap-vue/src/icons/_icons.scss +156 -0
  1029. package/src/vendor/bootstrap-vue/src/icons/helpers/icon-base.js +134 -0
  1030. package/src/vendor/bootstrap-vue/src/icons/helpers/make-icon.js +48 -0
  1031. package/src/vendor/bootstrap-vue/src/icons/icon.js +54 -0
  1032. package/src/vendor/bootstrap-vue/src/icons/icons.d.ts +2757 -0
  1033. package/src/vendor/bootstrap-vue/src/icons/icons.js +8244 -0
  1034. package/src/vendor/bootstrap-vue/src/icons/icons.spec.js +522 -0
  1035. package/src/vendor/bootstrap-vue/src/icons/iconstack.js +31 -0
  1036. package/src/vendor/bootstrap-vue/src/icons/iconstack.spec.js +161 -0
  1037. package/src/vendor/bootstrap-vue/src/icons/index.d.ts +18 -0
  1038. package/src/vendor/bootstrap-vue/src/icons/index.js +16 -0
  1039. package/src/vendor/bootstrap-vue/src/icons/index.scss +1 -0
  1040. package/src/vendor/bootstrap-vue/src/icons/package.json +72782 -0
  1041. package/src/vendor/bootstrap-vue/src/icons/plugin.js +4159 -0
  1042. package/src/vendor/bootstrap-vue/src/icons-only.js +33 -0
  1043. package/src/vendor/bootstrap-vue/src/icons.scss +8 -0
  1044. package/src/vendor/bootstrap-vue/src/index.d.ts +67 -0
  1045. package/src/vendor/bootstrap-vue/src/index.js +366 -0
  1046. package/src/vendor/bootstrap-vue/src/index.scss +17 -0
  1047. package/src/vendor/bootstrap-vue/src/mixins/attrs.js +19 -0
  1048. package/src/vendor/bootstrap-vue/src/mixins/attrs.spec.js +194 -0
  1049. package/src/vendor/bootstrap-vue/src/mixins/card.js +23 -0
  1050. package/src/vendor/bootstrap-vue/src/mixins/click-out.js +72 -0
  1051. package/src/vendor/bootstrap-vue/src/mixins/click-out.spec.js +52 -0
  1052. package/src/vendor/bootstrap-vue/src/mixins/dropdown.js +460 -0
  1053. package/src/vendor/bootstrap-vue/src/mixins/focus-in.js +44 -0
  1054. package/src/vendor/bootstrap-vue/src/mixins/focus-in.spec.js +53 -0
  1055. package/src/vendor/bootstrap-vue/src/mixins/form-control.js +51 -0
  1056. package/src/vendor/bootstrap-vue/src/mixins/form-custom.js +24 -0
  1057. package/src/vendor/bootstrap-vue/src/mixins/form-options.js +73 -0
  1058. package/src/vendor/bootstrap-vue/src/mixins/form-radio-check-group.js +162 -0
  1059. package/src/vendor/bootstrap-vue/src/mixins/form-radio-check.js +332 -0
  1060. package/src/vendor/bootstrap-vue/src/mixins/form-selection.js +60 -0
  1061. package/src/vendor/bootstrap-vue/src/mixins/form-size.js +24 -0
  1062. package/src/vendor/bootstrap-vue/src/mixins/form-state.js +47 -0
  1063. package/src/vendor/bootstrap-vue/src/mixins/form-text.js +250 -0
  1064. package/src/vendor/bootstrap-vue/src/mixins/form-validity.js +48 -0
  1065. package/src/vendor/bootstrap-vue/src/mixins/has-listener.js +26 -0
  1066. package/src/vendor/bootstrap-vue/src/mixins/id.js +51 -0
  1067. package/src/vendor/bootstrap-vue/src/mixins/listen-on-document.js +64 -0
  1068. package/src/vendor/bootstrap-vue/src/mixins/listen-on-document.spec.js +117 -0
  1069. package/src/vendor/bootstrap-vue/src/mixins/listen-on-root.js +121 -0
  1070. package/src/vendor/bootstrap-vue/src/mixins/listen-on-root.spec.js +77 -0
  1071. package/src/vendor/bootstrap-vue/src/mixins/listen-on-window.js +64 -0
  1072. package/src/vendor/bootstrap-vue/src/mixins/listen-on-window.spec.js +115 -0
  1073. package/src/vendor/bootstrap-vue/src/mixins/listeners.js +24 -0
  1074. package/src/vendor/bootstrap-vue/src/mixins/listeners.spec.js +245 -0
  1075. package/src/vendor/bootstrap-vue/src/mixins/model.js +5 -0
  1076. package/src/vendor/bootstrap-vue/src/mixins/normalize-slot.js +30 -0
  1077. package/src/vendor/bootstrap-vue/src/mixins/pagination.js +670 -0
  1078. package/src/vendor/bootstrap-vue/src/mixins/scoped-style.js +14 -0
  1079. package/src/vendor/bootstrap-vue/src/mixins/use-parent.js +12 -0
  1080. package/src/vendor/bootstrap-vue/src/utils/array.js +22 -0
  1081. package/src/vendor/bootstrap-vue/src/utils/bv-event.class.js +60 -0
  1082. package/src/vendor/bootstrap-vue/src/utils/bv-event.class.spec.js +66 -0
  1083. package/src/vendor/bootstrap-vue/src/utils/cache.js +37 -0
  1084. package/src/vendor/bootstrap-vue/src/utils/clone-deep.js +15 -0
  1085. package/src/vendor/bootstrap-vue/src/utils/clone-deep.spec.js +70 -0
  1086. package/src/vendor/bootstrap-vue/src/utils/config-set.js +80 -0
  1087. package/src/vendor/bootstrap-vue/src/utils/config.js +72 -0
  1088. package/src/vendor/bootstrap-vue/src/utils/config.spec.js +169 -0
  1089. package/src/vendor/bootstrap-vue/src/utils/create-new-child-component.js +10 -0
  1090. package/src/vendor/bootstrap-vue/src/utils/css-escape.js +73 -0
  1091. package/src/vendor/bootstrap-vue/src/utils/css-escape.spec.js +82 -0
  1092. package/src/vendor/bootstrap-vue/src/utils/date.js +130 -0
  1093. package/src/vendor/bootstrap-vue/src/utils/date.spec.js +159 -0
  1094. package/src/vendor/bootstrap-vue/src/utils/dom.js +308 -0
  1095. package/src/vendor/bootstrap-vue/src/utils/dom.spec.js +291 -0
  1096. package/src/vendor/bootstrap-vue/src/utils/element-to-vue-instance-registry.js +40 -0
  1097. package/src/vendor/bootstrap-vue/src/utils/env.js +15 -0
  1098. package/src/vendor/bootstrap-vue/src/utils/events.js +71 -0
  1099. package/src/vendor/bootstrap-vue/src/utils/events.spec.js +41 -0
  1100. package/src/vendor/bootstrap-vue/src/utils/get-event-root.js +3 -0
  1101. package/src/vendor/bootstrap-vue/src/utils/get-instance-from-directive.js +4 -0
  1102. package/src/vendor/bootstrap-vue/src/utils/get-scope-id.js +6 -0
  1103. package/src/vendor/bootstrap-vue/src/utils/get.js +64 -0
  1104. package/src/vendor/bootstrap-vue/src/utils/get.spec.js +109 -0
  1105. package/src/vendor/bootstrap-vue/src/utils/html.js +8 -0
  1106. package/src/vendor/bootstrap-vue/src/utils/identity.js +1 -0
  1107. package/src/vendor/bootstrap-vue/src/utils/inspect.js +55 -0
  1108. package/src/vendor/bootstrap-vue/src/utils/inspect.spec.js +251 -0
  1109. package/src/vendor/bootstrap-vue/src/utils/locale.js +34 -0
  1110. package/src/vendor/bootstrap-vue/src/utils/loose-equal.js +57 -0
  1111. package/src/vendor/bootstrap-vue/src/utils/loose-equal.spec.js +203 -0
  1112. package/src/vendor/bootstrap-vue/src/utils/loose-index-of.js +11 -0
  1113. package/src/vendor/bootstrap-vue/src/utils/math.js +15 -0
  1114. package/src/vendor/bootstrap-vue/src/utils/memoize.js +10 -0
  1115. package/src/vendor/bootstrap-vue/src/utils/model.js +29 -0
  1116. package/src/vendor/bootstrap-vue/src/utils/noop.js +1 -0
  1117. package/src/vendor/bootstrap-vue/src/utils/normalize-slot.js +44 -0
  1118. package/src/vendor/bootstrap-vue/src/utils/normalize-slot.spec.js +63 -0
  1119. package/src/vendor/bootstrap-vue/src/utils/number.js +19 -0
  1120. package/src/vendor/bootstrap-vue/src/utils/number.spec.js +72 -0
  1121. package/src/vendor/bootstrap-vue/src/utils/object.js +68 -0
  1122. package/src/vendor/bootstrap-vue/src/utils/object.spec.js +61 -0
  1123. package/src/vendor/bootstrap-vue/src/utils/observe-dom.js +77 -0
  1124. package/src/vendor/bootstrap-vue/src/utils/plugins.js +169 -0
  1125. package/src/vendor/bootstrap-vue/src/utils/props.js +98 -0
  1126. package/src/vendor/bootstrap-vue/src/utils/props.spec.js +112 -0
  1127. package/src/vendor/bootstrap-vue/src/utils/router.js +145 -0
  1128. package/src/vendor/bootstrap-vue/src/utils/router.spec.js +248 -0
  1129. package/src/vendor/bootstrap-vue/src/utils/safe-vue-instance.js +13 -0
  1130. package/src/vendor/bootstrap-vue/src/utils/stable-sort.js +31 -0
  1131. package/src/vendor/bootstrap-vue/src/utils/string.js +75 -0
  1132. package/src/vendor/bootstrap-vue/src/utils/string.spec.js +94 -0
  1133. package/src/vendor/bootstrap-vue/src/utils/stringify-object-values.js +31 -0
  1134. package/src/vendor/bootstrap-vue/src/utils/stringify-object-values.spec.js +47 -0
  1135. package/src/vendor/bootstrap-vue/src/utils/warn.js +57 -0
  1136. package/src/vendor/bootstrap-vue/src/utils/warn.spec.js +54 -0
  1137. package/src/vendor/bootstrap-vue/src/vue-injections.d.ts +13 -0
  1138. package/src/vendor/bootstrap-vue/src/vue.js +126 -0
@@ -0,0 +1,3170 @@
1
+ # Table
2
+
3
+ > For displaying tabular data, `<b-table>` supports pagination, filtering, sorting, custom
4
+ > rendering, various style options, events, and asynchronous data. For simple display of tabular
5
+ > data without all the fancy features, BootstrapVue provides two lightweight alternative components
6
+ > [`<b-table-lite>`](#light-weight-tables) and [`<b-table-simple>`](#simple-tables).
7
+
8
+ **Example: Basic usage**
9
+
10
+ ```html
11
+ <template>
12
+ <div>
13
+ <b-table striped hover :items="items"></b-table>
14
+ </div>
15
+ </template>
16
+
17
+ <script>
18
+ export default {
19
+ data() {
20
+ return {
21
+ items: [
22
+ { age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
23
+ { age: 21, first_name: 'Larsen', last_name: 'Shaw' },
24
+ { age: 89, first_name: 'Geneva', last_name: 'Wilson' },
25
+ { age: 38, first_name: 'Jami', last_name: 'Carney' }
26
+ ]
27
+ }
28
+ }
29
+ }
30
+ </script>
31
+
32
+ <!-- b-table.vue -->
33
+ ```
34
+
35
+ ## Items (record data)
36
+
37
+ `items` is the table data in array format, where each record (row) data are keyed objects. Example
38
+ format:
39
+
40
+ <!-- eslint-disable no-unused-vars -->
41
+
42
+ ```js
43
+ const items = [
44
+ { age: 32, first_name: 'Cyndi' },
45
+ { age: 27, first_name: 'Havij' },
46
+ { age: 42, first_name: 'Robert' }
47
+ ]
48
+ ```
49
+
50
+ `<b-table>` automatically samples the first row to extract field names (the keys in the record
51
+ data). Field names are automatically "humanized" by converting `kebab-case`, `snake_case`, and
52
+ `camelCase` to individual words and capitalizes each word. Example conversions:
53
+
54
+ - `first_name` becomes `First Name`
55
+ - `last-name` becomes `Last Name`
56
+ - `age` becomes `Age`
57
+ - `YEAR` remains `YEAR`
58
+ - `isActive` becomes `Is Active`
59
+
60
+ These titles will be displayed in the table header, in the order they appear in the **first** record
61
+ of data. See the [Fields](#fields-column-definitions) section below for customizing how field
62
+ headings appear.
63
+
64
+ **Note:** Field order is not guaranteed. Fields will typically appear in the order they were defined
65
+ in the first row, but this may not always be the case depending on the version of browser in use.
66
+ See section [Fields (column definitions)](#fields-column-definitions) below to see how to guarantee
67
+ the order of fields, and to override the headings generated.
68
+
69
+ Record data may also have additional special reserved name keys for colorizing rows and individual
70
+ cells (variants), and for triggering additional row detail. The supported optional item record
71
+ modifier properties (make sure your field keys do not conflict with these names):
72
+
73
+ | Property | Type | Description |
74
+ | --------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
75
+ | `_cellVariants` | Object | Bootstrap contextual state applied to individual cells. Keyed by field (See the [Color Variants](/docs/reference/color-variants) for supported values). These variants map to classes `table-${variant}` or `bg-${variant}` (when the `dark` prop is set). |
76
+ | `_rowVariant` | String | Bootstrap contextual state applied to the entire row (See the [Color Variants](/docs/reference/color-variants) for supported values). These variants map to classes `table-${variant}` or `bg-${variant}` (when the `dark` prop is set) |
77
+ | `_showDetails` | Boolean | Used to trigger the display of the `row-details` scoped slot. See section [Row details support](#row-details-support) below for additional information |
78
+
79
+ **Example: Using variants for table cells**
80
+
81
+ ```html
82
+ <template>
83
+ <div>
84
+ <b-table hover :items="items"></b-table>
85
+ </div>
86
+ </template>
87
+
88
+ <script>
89
+ export default {
90
+ data() {
91
+ return {
92
+ items: [
93
+ { age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
94
+ { age: 21, first_name: 'Larsen', last_name: 'Shaw' },
95
+ {
96
+ age: 89,
97
+ first_name: 'Geneva',
98
+ last_name: 'Wilson',
99
+ _rowVariant: 'danger'
100
+ },
101
+ {
102
+ age: 40,
103
+ first_name: 'Thor',
104
+ last_name: 'MacDonald',
105
+ _cellVariants: { age: 'info', first_name: 'warning' }
106
+ },
107
+ { age: 29, first_name: 'Dick', last_name: 'Dunlap' }
108
+ ]
109
+ }
110
+ }
111
+ }
112
+ </script>
113
+
114
+ <!-- b-table-variants.vue -->
115
+ ```
116
+
117
+ `items` can also be a reference to a _provider_ function, which returns an `Array` of items data.
118
+ Provider functions can also be asynchronous:
119
+
120
+ - By returning `null` (or `undefined`) and calling a callback, when the data is ready, with the data
121
+ array as the only argument to the callback,
122
+ - By returning a `Promise` that resolves to an array.
123
+
124
+ See the ["Using Items Provider functions"](#using-items-provider-functions) section below for more
125
+ details.
126
+
127
+ ### Table item notes and warnings
128
+
129
+ - Avoid manipulating record data in place, as changes to the underlying items data will cause either
130
+ the row or entire table to be re-rendered. See [Primary Key](#primary-key), below, for ways to
131
+ minimize Vue's re-rendering of rows.
132
+ - `items` array records should be a simple object and **must** avoid placing data that may have
133
+ circular references in the values within a row. `<b-table>` serializes the row data into strings
134
+ for sorting and filtering, and circular references will cause stack overflows to occur and your
135
+ app to crash!
136
+
137
+ ## Fields (column definitions)
138
+
139
+ The `fields` prop is used to customize the table columns headings, and in which order the columns of
140
+ data are displayed. The field object keys (i.e. `age` or `first_name` as shown below) are used to
141
+ extract the value from each item (record) row, and to provide additional features such as enabling
142
+ [sorting](#sorting) on the column, etc.
143
+
144
+ Fields can be provided as a _simple array_ or an _array of objects_. **Internally the fields data
145
+ will be normalized into the _array of objects_ format**. Events or slots that include the column
146
+ `field` data will be in the normalized field object format (array of objects for `fields`, or an
147
+ object for an individual `field`).
148
+
149
+ ### Fields as a simple array
150
+
151
+ Fields can be a simple array, for defining the order of the columns, and which columns to display:
152
+
153
+ **Example: Using `array` fields definition**
154
+
155
+ ```html
156
+ <template>
157
+ <div>
158
+ <b-table striped hover :items="items" :fields="fields"></b-table>
159
+ </div>
160
+ </template>
161
+
162
+ <script>
163
+ export default {
164
+ data() {
165
+ return {
166
+ // Note `isActive` is left out and will not appear in the rendered table
167
+ fields: ['first_name', 'last_name', 'age'],
168
+ items: [
169
+ { isActive: true, age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
170
+ { isActive: false, age: 21, first_name: 'Larsen', last_name: 'Shaw' },
171
+ { isActive: false, age: 89, first_name: 'Geneva', last_name: 'Wilson' },
172
+ { isActive: true, age: 38, first_name: 'Jami', last_name: 'Carney' }
173
+ ]
174
+ }
175
+ }
176
+ }
177
+ </script>
178
+
179
+ <!-- b-table-fields-array.vue -->
180
+ ```
181
+
182
+ ### Fields as an array of objects
183
+
184
+ Fields can be a an array of objects, providing additional control over the fields (such as sorting,
185
+ formatting, etc.). Only columns (keys) that appear in the fields array will be shown:
186
+
187
+ **Example: Using array of objects fields definition**
188
+
189
+ ```html
190
+ <template>
191
+ <div>
192
+ <b-table striped hover :items="items" :fields="fields"></b-table>
193
+ </div>
194
+ </template>
195
+
196
+ <script>
197
+ export default {
198
+ data() {
199
+ return {
200
+ // Note 'isActive' is left out and will not appear in the rendered table
201
+ fields: [
202
+ {
203
+ key: 'last_name',
204
+ sortable: true
205
+ },
206
+ {
207
+ key: 'first_name',
208
+ sortable: false
209
+ },
210
+ {
211
+ key: 'age',
212
+ label: 'Person age',
213
+ sortable: true,
214
+ // Variant applies to the whole column, including the header and footer
215
+ variant: 'danger'
216
+ }
217
+ ],
218
+ items: [
219
+ { isActive: true, age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
220
+ { isActive: false, age: 21, first_name: 'Larsen', last_name: 'Shaw' },
221
+ { isActive: false, age: 89, first_name: 'Geneva', last_name: 'Wilson' },
222
+ { isActive: true, age: 38, first_name: 'Jami', last_name: 'Carney' }
223
+ ]
224
+ }
225
+ }
226
+ }
227
+ </script>
228
+
229
+ <!-- b-table-fields-array-of-objects.vue -->
230
+ ```
231
+
232
+ ### Field definition reference
233
+
234
+ The following field properties are recognized:
235
+
236
+ | Property | Type | Description |
237
+ | ------------------- | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
238
+ | `key` | String | The key for selecting data from the record in the items array. Required when setting the `fields` via an array of objects. The `key` is also used for generating the [custom data rendering](#custom-data-rendering) and [custom header and footer](#header-and-footer-custom-rendering-via-scoped-slots) slot names. |
239
+ | `label` | String | Appears in the columns table header (and footer if `foot-clone` is set). Defaults to the field's key (in humanized format) if not provided. It's possible to use empty labels by assigning an empty string `""` but be sure you also set `headerTitle` to provide non-sighted users a hint about the column contents. |
240
+ | `headerTitle` | String | Text to place on the fields header `<th>` attribute `title`. Defaults to no `title` attribute. |
241
+ | `headerAbbr` | String | Text to place on the fields header `<th>` attribute `abbr`. Set this to the unabbreviated version of the label (or title) if label (or title) is an abbreviation. Defaults to no `abbr` attribute. |
242
+ | `class` | String or Array | Class name (or array of class names) to add to `<th>` **and** `<td>` in the column. |
243
+ | `formatter` | String or Function | A formatter callback function or name of a method in your component, can be used instead of (or in conjunction with) scoped field slots. The formatter will be called with the syntax `formatter(value, key, item)`. Refer to [Custom Data Rendering](#custom-data-rendering) for more details. |
244
+ | `sortable` | Boolean | Enable sorting on this column. Refer to the [Sorting](#sorting) Section for more details. |
245
+ | `sortKey` | String | <span class="badge badge-secondary">v2.17.0+</span> Set the value of `sortBy` for the column in the emitted context when `no-local-sorting` is `true`. |
246
+ | `sortDirection` | String | Set the initial sort direction on this column when it becomes sorted. Refer to the [Change initial sort direction](#change-initial-sort-direction) Section for more details. |
247
+ | `sortByFormatted` | Boolean or Function | Sort the column by the result of the field's `formatter` callback function when set to `true`. Default is `false`. Boolean has no effect if the field does not have a `formatter`. Optionally accepts a formatter function _reference_ to format the value for sorting purposes only. Refer to the [Sorting](#sorting) Section for more details. |
248
+ | `filterByFormatted` | Boolean or Function | Filter the column by the result of the field's `formatter` callback function when set to `true`. Default is `false`. Boolean has no effect if the field does not have a `formatter`. Optionally accepts a formatter function _reference_ to format the value for filtering purposes only. Refer to the [Filtering](#filtering) section for more details. |
249
+ | `tdClass` | String or Array or Function | Class name (or array of class names) to add to `<tbody>` data `<td>` cells in the column. If custom classes per cell are required, a callback function can be specified instead. The function will be called as `tdClass(value, key, item)` and it must return an `Array` or `String`. |
250
+ | `thClass` | String or Array | Class name (or array of class names) to add to this field's `<thead>`/`<tfoot>` heading `<th>` cell. |
251
+ | `thStyle` | Object | JavaScript object representing CSS styles you would like to apply to the table `<thead>`/`<tfoot>` field `<th>`. |
252
+ | `variant` | String | Apply contextual class to all the `<th>` **and** `<td>` in the column - `active`, `success`, `info`, `warning`, `danger`. These variants map to classes `thead-${variant}` (in the header), `table-${variant}` (in the body), or `bg-${variant}` (when the prop `dark` is set). |
253
+ | `tdAttr` | Object or Function | JavaScript object representing additional attributes to apply to the `<tbody>` field `<td>` cell. If custom attributes per cell are required, a callback function can be specified instead. The function will be called as `tdAttr(value, key, item)` and it must return an `Object`. |
254
+ | `thAttr` | Object or Function | JavaScript object representing additional attributes to apply to the field's `<thead>`/`<tfoot>` heading `<th>` cell. If the field's `isRowHeader` is set to `true`, the attributes will also apply to the `<tbody>` field `<th>` cell. If custom attributes per cell are required, a callback function can be specified instead. The function will be called as `thAttr(value, key, item, type)` and it must return an `Object`. |
255
+ | `isRowHeader` | Boolean | When set to `true`, the field's item data cell will be rendered with `<th>` rather than the default of `<td>`. |
256
+ | `stickyColumn` | Boolean | When set to `true`, and the table in [responsive](#responsive-tables) mode or has [sticky headers](#sticky-headers), will cause the column to become fixed to the left when the table's horizontal scrollbar is scrolled. See [Sticky columns](#sticky-columns) for more details |
257
+
258
+ **Notes:**
259
+
260
+ - Field properties, if not present, default to `null` (falsey) unless otherwise stated above.
261
+ - `class`, `thClass`, `tdClass` etc. will not work with classes that are defined in scoped CSS,
262
+ unless you are using VueLoader's
263
+ [Deep selector](https://vue-loader.vuejs.org/guide/scoped-css.html#child-component-root-elements).
264
+ - For information on the syntax supported by `thStyle`, see
265
+ [Class and Style Bindings](https://vuejs.org/v2/guide/class-and-style.html#Binding-Inline-Styles)
266
+ in the Vue.js guide.
267
+ - Any additional properties added to the field definition objects will be left intact - so you can
268
+ access them via the named scoped slots for custom data, header, and footer rendering.
269
+
270
+ For information and usage about scoped slots and formatters, refer to the
271
+ [Custom Data Rendering](#custom-data-rendering) section below.
272
+
273
+ Feel free to mix and match simple array and object array together:
274
+
275
+ <!-- eslint-disable no-unused-vars -->
276
+
277
+ ```js
278
+ const fields = [
279
+ { key: 'first_name', label: 'First' },
280
+ { key: 'last_name', label: 'Last' },
281
+ 'age',
282
+ 'sex'
283
+ ]
284
+ ```
285
+
286
+ ## Primary key
287
+
288
+ `<b-table>` provides an additional prop `primary-key`, which you can use to identify the _name_ of
289
+ the field key that _uniquely_ identifies the row.
290
+
291
+ The value specified by the primary column key **must be** either a `string` or `number`, and **must
292
+ be unique** across all rows in the table.
293
+
294
+ The primary key column does not need to appear in the displayed fields.
295
+
296
+ ### Table row ID generation
297
+
298
+ When provided, the `primary-key` will generate a unique ID for each item row `<tr>` element. The ID
299
+ will be in the format of `{table-id}__row_{primary-key-value}`, where `{table-id}` is the unique ID
300
+ of the `<b-table>` and `{primary-key-value}` is the value of the item's field value for the field
301
+ specified by `primary-key`.
302
+
303
+ ### Table render and transition optimization
304
+
305
+ The `primary-key` is also used by `<b-table>` to help Vue optimize the rendering of table rows.
306
+ Internally, the value of the field key specified by the `primary-key` prop is used as the Vue `:key`
307
+ value for each rendered item row `<tr>` element.
308
+
309
+ If you are seeing rendering issue (i.e. tooltips hiding or unexpected subcomponent re-usage when
310
+ item data changes or data is sorted/filtered/edited) or table row transitions are not working,
311
+ setting the `primary-key` prop (if you have a unique identifier per row) can alleviate these issues.
312
+
313
+ Specifying the `primary-key` column is handy if you are using 3rd party table transitions or drag
314
+ and drop plugins, as they rely on having a consistent and unique per row `:key` value.
315
+
316
+ If `primary-key` is not provided, `<b-table>` will auto-generate keys based on the displayed row's
317
+ index number (i.e. position in the _displayed_ table rows). This may cause GUI issues such as sub
318
+ components/elements that are rendering with previous results (i.e. being re-used by Vue's render
319
+ patch optimization routines). Specifying a `primary-key` column can alleviate this issue (or you can
320
+ place a unique `:key` on your element/components in your custom formatted field slots).
321
+
322
+ Refer to the [Table body transition support](#table-body-transition-support) section for additional
323
+ details.
324
+
325
+ ## Table style options
326
+
327
+ ### Table styling
328
+
329
+ `<b-table>` provides several props to alter the style of the table:
330
+
331
+ | prop | Type | Description |
332
+ | -------------------- | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
333
+ | `striped` | Boolean | Add zebra-striping to the table rows within the `<tbody>` |
334
+ | `bordered` | Boolean | For borders on all sides of the table and cells. |
335
+ | `borderless` | Boolean | removes inner borders from table. |
336
+ | `outlined` | Boolean | For a thin border on all sides of the table. Has no effect if `bordered` is set. |
337
+ | `small` | Boolean | To make tables more compact by cutting cell padding in half. |
338
+ | `hover` | Boolean | To enable a hover highlighting state on table rows within a `<tbody>` |
339
+ | `dark` | Boolean | Invert the colors — with light text on dark backgrounds (equivalent to Bootstrap v4 class `.table-dark`) |
340
+ | `fixed` | Boolean | Generate a table with equal fixed-width columns (`table-layout: fixed;`) |
341
+ | `responsive` | Boolean or String | Generate a responsive table to make it scroll horizontally. Set to `true` for an always responsive table, or set it to one of the breakpoints `'sm'`, `'md'`, `'lg'`, or `'xl'` to make the table responsive (horizontally scroll) only on screens smaller than the breakpoint. See [Responsive tables](#responsive-tables) below for details. |
342
+ | `sticky-header` | Boolean or String | Generates a vertically scrollable table with sticky headers. Set to `true` to enable sticky headers (default table max-height of `300px`), or set it to a string containing a height (with CSS units) to specify a maximum height other than `300px`. See the [Sticky header](#sticky-headers) section below for details. |
343
+ | `stacked` | Boolean or String | Generate a responsive stacked table. Set to `true` for an always stacked table, or set it to one of the breakpoints `'sm'`, `'md'`, `'lg'`, or `'xl'` to make the table visually stacked only on screens smaller than the breakpoint. See [Stacked tables](#stacked-tables) below for details. |
344
+ | `caption-top` | Boolean | If the table has a caption, and this prop is set to `true`, the caption will be visually placed above the table. If `false` (the default), the caption will be visually placed below the table. |
345
+ | `table-variant` | String | Give the table an overall theme color variant. |
346
+ | `head-variant` | String | Use `'light'` or `'dark'` to make table header appear light or dark gray, respectively |
347
+ | `foot-variant` | String | Use `'light'` or `'dark'` to make table footer appear light or dark gray, respectively. If not set, `head-variant` will be used. Has no effect if `foot-clone` is not set |
348
+ | `foot-clone` | Boolean | Turns on the table footer, and defaults with the same contents a the table header |
349
+ | `no-footer-sorting` | Boolean | When `foot-clone` is true and the table is sortable, disables the sorting icons and click behaviour on the footer heading cells. Refer to the [Sorting](#sorting) section below for more details. |
350
+ | `no-border-collapse` | Boolean | Disables the default of collapsing of the table borders. Mainly for use with [sticky headers](#sticky-headers) and/or [sticky columns](#sticky-columns). Will cause the appearance of double borders in some situations. |
351
+
352
+ **Note:** The table style options `fixed`, `stacked`, `caption-top`, `no-border-collapse`, sticky
353
+ headers, sticky columns and the table sorting feature, all require BootstrapVue's custom CSS.
354
+
355
+ **Example: Basic table styles**
356
+
357
+ ```html
358
+ <template>
359
+ <div>
360
+ <b-form-group label="Table Options" label-cols-lg="2" v-slot="{ ariaDescribedby }">
361
+ <b-form-checkbox v-model="striped" :aria-describedby="ariaDescribedby" inline>Striped</b-form-checkbox>
362
+ <b-form-checkbox v-model="bordered" :aria-describedby="ariaDescribedby" inline>Bordered</b-form-checkbox>
363
+ <b-form-checkbox v-model="borderless" :aria-describedby="ariaDescribedby" inline>Borderless</b-form-checkbox>
364
+ <b-form-checkbox v-model="outlined" :aria-describedby="ariaDescribedby" inline>Outlined</b-form-checkbox>
365
+ <b-form-checkbox v-model="small" :aria-describedby="ariaDescribedby" inline>Small</b-form-checkbox>
366
+ <b-form-checkbox v-model="hover" :aria-describedby="ariaDescribedby" inline>Hover</b-form-checkbox>
367
+ <b-form-checkbox v-model="dark" :aria-describedby="ariaDescribedby" inline>Dark</b-form-checkbox>
368
+ <b-form-checkbox v-model="fixed" :aria-describedby="ariaDescribedby" inline>Fixed</b-form-checkbox>
369
+ <b-form-checkbox v-model="footClone" :aria-describedby="ariaDescribedby" inline>Foot Clone</b-form-checkbox>
370
+ <b-form-checkbox v-model="noCollapse" :aria-describedby="ariaDescribedby" inline>No border collapse</b-form-checkbox>
371
+ </b-form-group>
372
+
373
+ <b-form-group label="Head Variant" label-cols-lg="2" v-slot="{ ariaDescribedby }">
374
+ <b-form-radio-group
375
+ v-model="headVariant"
376
+ :aria-describedby="ariaDescribedby"
377
+ class="mt-lg-2"
378
+ >
379
+ <b-form-radio :value="null" inline>None</b-form-radio>
380
+ <b-form-radio value="light" inline>Light</b-form-radio>
381
+ <b-form-radio value="dark" inline>Dark</b-form-radio>
382
+ </b-form-radio-group>
383
+ </b-form-group>
384
+
385
+ <b-form-group label="Table Variant" label-for="table-style-variant" label-cols-lg="2">
386
+ <b-form-select
387
+ id="table-style-variant"
388
+ v-model="tableVariant"
389
+ :options="tableVariants"
390
+ >
391
+ <template #first>
392
+ <option value="">-- None --</option>
393
+ </template>
394
+ </b-form-select>
395
+ </b-form-group>
396
+
397
+ <b-table
398
+ :striped="striped"
399
+ :bordered="bordered"
400
+ :borderless="borderless"
401
+ :outlined="outlined"
402
+ :small="small"
403
+ :hover="hover"
404
+ :dark="dark"
405
+ :fixed="fixed"
406
+ :foot-clone="footClone"
407
+ :no-border-collapse="noCollapse"
408
+ :items="items"
409
+ :fields="fields"
410
+ :head-variant="headVariant"
411
+ :table-variant="tableVariant"
412
+ ></b-table>
413
+ </div>
414
+ </template>
415
+
416
+ <script>
417
+ export default {
418
+ data() {
419
+ return {
420
+ fields: ['first_name', 'last_name', 'age'],
421
+ items: [
422
+ { age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
423
+ { age: 21, first_name: 'Larsen', last_name: 'Shaw' },
424
+ { age: 89, first_name: 'Geneva', last_name: 'Wilson' }
425
+ ],
426
+ tableVariants: [
427
+ 'primary',
428
+ 'secondary',
429
+ 'info',
430
+ 'danger',
431
+ 'warning',
432
+ 'success',
433
+ 'light',
434
+ 'dark'
435
+ ],
436
+ striped: false,
437
+ bordered: false,
438
+ borderless: false,
439
+ outlined: false,
440
+ small: false,
441
+ hover: false,
442
+ dark: false,
443
+ fixed: false,
444
+ footClone: false,
445
+ headVariant: null,
446
+ tableVariant: '',
447
+ noCollapse: false
448
+ }
449
+ }
450
+ }
451
+ </script>
452
+
453
+ <!-- b-table-bordered.vue -->
454
+ ```
455
+
456
+ ### Row styling and attributes
457
+
458
+ You can also style every row using the `tbody-tr-class` prop, and optionally supply additional
459
+ attributes via the `tbody-tr-attr` prop:
460
+
461
+ | Property | Type | Description |
462
+ | ---------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
463
+ | `tbody-tr-class` | String, Array or Function | Classes to be applied to every row on the table. If a function is given, it will be called as `tbodyTrClass( item, type )` and it may return an `Array`, `Object` or `String`. |
464
+ | `tbody-tr-attr` | Object or Function | Attributes to be applied to every row on the table. If a function is given, it will be called as `tbodyTrAttr( item, type )` and it must return an `Object`. |
465
+
466
+ When passing a function reference to `tbody-tr-class` or `tbody-tr-attr`, the function's arguments
467
+ will be as follows:
468
+
469
+ - `item` - The item record data associated with the row. For rows that are not associated with an
470
+ item record, this value will be `null` or `undefined`
471
+ - `type` - The type of row being rendered. `'row'` for an item row, `'row-details'` for an item
472
+ details row, `'row-top'` for the fixed row top slot, `'row-bottom'` for the fixed row bottom slot,
473
+ or `'table-busy'` for the table busy slot.
474
+
475
+ **Example: Basic row styles**
476
+
477
+ ```html
478
+ <template>
479
+ <div>
480
+ <b-table :items="items" :fields="fields" :tbody-tr-class="rowClass"></b-table>
481
+ </div>
482
+ </template>
483
+
484
+ <script>
485
+ export default {
486
+ data() {
487
+ return {
488
+ fields: ['first_name', 'last_name', 'age'],
489
+ items: [
490
+ { age: 40, first_name: 'Dickerson', last_name: 'Macdonald', status: 'awesome' },
491
+ { age: 21, first_name: 'Larsen', last_name: 'Shaw' },
492
+ { age: 89, first_name: 'Geneva', last_name: 'Wilson' }
493
+ ]
494
+ }
495
+ },
496
+ methods: {
497
+ rowClass(item, type) {
498
+ if (!item || type !== 'row') return
499
+ if (item.status === 'awesome') return 'table-success'
500
+ }
501
+ }
502
+ }
503
+ </script>
504
+
505
+ <!-- b-table-styled-row.vue -->
506
+ ```
507
+
508
+ ### Responsive tables
509
+
510
+ Responsive tables allow tables to be scrolled horizontally with ease. Make any table responsive
511
+ across all viewports by setting the prop `responsive` to `true`. Or, pick a maximum breakpoint with
512
+ which to have a responsive table up to by setting the prop `responsive` to one of the breakpoint
513
+ values: `sm`, `md`, `lg`, or `xl`.
514
+
515
+ **Example: Always responsive table**
516
+
517
+ ```html
518
+ <template>
519
+ <div>
520
+ <b-table responsive :items="items"></b-table>
521
+ </div>
522
+ </template>
523
+
524
+ <script>
525
+ export default {
526
+ data() {
527
+ return {
528
+ items: [
529
+ {
530
+ heading1: 'table cell',
531
+ heading2: 'table cell',
532
+ heading3: 'table cell',
533
+ heading4: 'table cell',
534
+ heading5: 'table cell',
535
+ heading6: 'table cell',
536
+ heading7: 'table cell',
537
+ heading8: 'table cell',
538
+ heading9: 'table cell',
539
+ heading10: 'table cell',
540
+ heading11: 'table cell',
541
+ heading12: 'table cell'
542
+ },
543
+ {
544
+ heading1: 'table cell',
545
+ heading2: 'table cell',
546
+ heading3: 'table cell',
547
+ heading4: 'table cell',
548
+ heading5: 'table cell',
549
+ heading6: 'table cell',
550
+ heading7: 'table cell',
551
+ heading8: 'table cell',
552
+ heading9: 'table cell',
553
+ heading10: 'table cell',
554
+ heading11: 'table cell',
555
+ heading12: 'table cell'
556
+ },
557
+ {
558
+ heading1: 'table cell',
559
+ heading2: 'table cell',
560
+ heading3: 'table cell',
561
+ heading4: 'table cell',
562
+ heading5: 'table cell',
563
+ heading6: 'table cell',
564
+ heading7: 'table cell',
565
+ heading8: 'table cell',
566
+ heading9: 'table cell',
567
+ heading10: 'table cell',
568
+ heading11: 'table cell',
569
+ heading12: 'table cell'
570
+ }
571
+ ]
572
+ }
573
+ }
574
+ }
575
+ </script>
576
+
577
+ <!-- b-table-responsive.vue -->
578
+ ```
579
+
580
+ **Responsive table notes:**
581
+
582
+ - _Possible vertical clipping/truncation_. Responsive tables make use of `overflow-y: hidden`, which
583
+ clips off any content that goes beyond the bottom or top edges of the table. In particular, this
584
+ may clip off dropdown menus and other third-party widgets.
585
+ - Using props `responsive` and `fixed` together will **not** work as expected. Fixed table layout
586
+ uses the first row (table header in this case) to compute the width required by each column (and
587
+ the overall table width) to fit within the width of the parent container &mdash; without taking
588
+ cells in the `<tbody>` into consideration &mdash; resulting in table that may not be responsive.
589
+ To get around this limitation, you would need to specify widths for the columns (or certain
590
+ columns) via one of the following methods:
591
+ - Use `<col>` elements within the [`table-colgroup` slot](#table-colgroup) that have widths set
592
+ (e.g. `<col style="width: 20rem">`), or
593
+ - Wrap header cells in `<div>` elements, via the use of
594
+ [custom header rendering](#header-and-footer-custom-rendering-via-scoped-slots), which have a
595
+ minimum width set on them, or
596
+ - Use the `thStyle` property of the [field definition object](#field-definition-reference) to set
597
+ a width for the column(s), or
598
+ - Use custom CSS to define classes to apply to the columns to set widths, via the `thClass` or
599
+ `class` properties of the [field definition object](#field-definition-reference).
600
+
601
+ ### Stacked tables
602
+
603
+ An alternative to responsive tables, BootstrapVue includes the stacked table option (using custom
604
+ SCSS/CSS), which allow tables to be rendered in a visually stacked format. Make any table stacked
605
+ across _all viewports_ by setting the prop `stacked` to `true`. Or, alternatively, set a breakpoint
606
+ at which the table will return to normal table format by setting the prop `stacked` to one of the
607
+ breakpoint values `'sm'`, `'md'`, `'lg'`, or `'xl'`.
608
+
609
+ Column header labels will be rendered to the left of each field value using a CSS `::before` pseudo
610
+ element, with a width of 40%.
611
+
612
+ The `stacked` prop takes precedence over the [`sticky-header`](#sticky-headers) prop and the
613
+ [`stickyColumn`](#sticky-columns) field definition property.
614
+
615
+ **Example: Always stacked table**
616
+
617
+ ```html
618
+ <template>
619
+ <div>
620
+ <b-table stacked :items="items"></b-table>
621
+ </div>
622
+ </template>
623
+
624
+ <script>
625
+ export default {
626
+ data() {
627
+ return {
628
+ items: [
629
+ { age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
630
+ { age: 21, first_name: 'Larsen', last_name: 'Shaw' },
631
+ { age: 89, first_name: 'Geneva', last_name: 'Wilson' }
632
+ ]
633
+ }
634
+ }
635
+ }
636
+ </script>
637
+
638
+ <!-- b-table-stacked.vue -->
639
+ ```
640
+
641
+ **Note: When the table is visually stacked:**
642
+
643
+ - The table header (and table footer) will be hidden.
644
+ - Custom rendered header slots will not be shown, rather, the fields' `label` will be used.
645
+ - The table **cannot** be sorted by clicking the rendered field labels. You will need to provide an
646
+ external control to select the field to sort by and the sort direction. See the
647
+ [Sorting](#sorting) section below for sorting control information, as well as the
648
+ [complete example](#complete-example) at the bottom of this page for an example of controlling
649
+ sorting via the use of form controls.
650
+ - The slots `top-row` and `bottom-row` will be hidden when visually stacked.
651
+ - The table caption, if provided, will always appear at the top of the table when visually stacked.
652
+ - In an always stacked table, the table header and footer, and the fixed top and bottom row slots
653
+ will not be rendered.
654
+
655
+ BootstrapVue's custom CSS is required in order to support stacked tables.
656
+
657
+ ### Table caption
658
+
659
+ Add an optional caption to your table via the prop `caption` or the named slot `table-caption` (the
660
+ slot takes precedence over the prop). The default Bootstrap v4 styling places the caption at the
661
+ bottom of the table:
662
+
663
+ ```html
664
+ <template>
665
+ <div>
666
+ <b-table :items="items" :fields="fields">
667
+ <template #table-caption>This is a table caption.</template>
668
+ </b-table>
669
+ </div>
670
+ </template>
671
+
672
+ <script>
673
+ export default {
674
+ data() {
675
+ return {
676
+ fields: ['first_name', 'last_name', 'age'],
677
+ items: [
678
+ { age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
679
+ { age: 21, first_name: 'Larsen', last_name: 'Shaw' },
680
+ { age: 89, first_name: 'Geneva', last_name: 'Wilson' }
681
+ ]
682
+ }
683
+ }
684
+ }
685
+ </script>
686
+
687
+ <!-- b-table-caption.vue -->
688
+ ```
689
+
690
+ You can have the caption placed at the top of the table by setting the `caption-top` prop to `true`:
691
+
692
+ ```html
693
+ <template>
694
+ <div>
695
+ <b-table :items="items" :fields="fields" caption-top>
696
+ <template #table-caption>This is a table caption at the top.</template>
697
+ </b-table>
698
+ </div>
699
+ </template>
700
+
701
+ <script>
702
+ export default {
703
+ data() {
704
+ return {
705
+ fields: ['first_name', 'last_name', 'age'],
706
+ items: [
707
+ { age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
708
+ { age: 21, first_name: 'Larsen', last_name: 'Shaw' },
709
+ { age: 89, first_name: 'Geneva', last_name: 'Wilson' }
710
+ ]
711
+ }
712
+ }
713
+ }
714
+ </script>
715
+
716
+ <!-- b-table-caption-top.vue -->
717
+ ```
718
+
719
+ You can also use [custom CSS](https://developer.mozilla.org/en-US/docs/Web/CSS/caption-side) to
720
+ control the caption positioning.
721
+
722
+ ### Table colgroup
723
+
724
+ Use the named slot `table-colgroup` to specify `<colgroup>` and `<col>` elements for optional
725
+ grouping and styling of table columns. Note the styles available via `<col>` elements are limited.
726
+ Refer to [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup) for details and
727
+ usage of `<colgroup>`
728
+
729
+ Slot `table-colgroup` can be optionally scoped, receiving an object with the following properties:
730
+
731
+ | Property | Type | Description |
732
+ | --------- | ------ | --------------------------------------------------------------------------------------------------------------- |
733
+ | `columns` | Number | The number of columns in the rendered table |
734
+ | `fields` | Array | Array of field definition objects (normalized to the [array of objects](#fields-as-an-array-of-objects) format) |
735
+
736
+ When provided, the content of the `table-colgroup` slot will be placed _inside_ of a `<colgroup>`
737
+ element. there is no need to provide your own outer `<colgroup>` element. When a series of table
738
+ columns should be grouped for assistive technology reasons (for conveying logical column
739
+ associations, use a `<col span="#">` element (with `#` replaced with the number of grouped columns)
740
+ to group the series of columns.
741
+
742
+ **Tip:** In some situations when trying to set column widths via `style` or `class` on the `<col>`
743
+ element, you may find that placing the table in `fixed` header width (table fixed layout mode) mode,
744
+ combined with `responsive` (horizontal scrolling) mode will help, although you will need to have
745
+ explicit widths, or minimum widths, via a style or a class for each column's respective `<col>`
746
+ element. For example:
747
+
748
+ ```html
749
+ <b-table fixed responsive :items="items" :fields="fields" ... >
750
+ <template #table-colgroup="scope">
751
+ <col
752
+ v-for="field in scope.fields"
753
+ :key="field.key"
754
+ :style="{ width: field.key === 'foo' ? '120px' : '180px' }"
755
+ >
756
+ </template>
757
+ <!-- additional table slots here if needed -->
758
+ </b-table>
759
+ ```
760
+
761
+ ### Table busy state
762
+
763
+ `<b-table>` provides a `busy` prop that will flag the table as busy, which you can set to `true`
764
+ just before you update your items, and then set it to `false` once you have your items. When in the
765
+ busy state, the table will have the attribute `aria-busy="true"`.
766
+
767
+ During the busy state, the table will be rendered in a "muted" look (`opacity: 0.6`), using the
768
+ following custom CSS:
769
+
770
+ ```css
771
+ /* Busy table styling */
772
+ table.b-table[aria-busy='true'] {
773
+ opacity: 0.6;
774
+ }
775
+ ```
776
+
777
+ You can override this styling using your own CSS.
778
+
779
+ You may optionally provide a `table-busy` slot to show a custom loading message or spinner whenever
780
+ the table's busy state is `true`. The slot will be placed in a `<tr>` element with class
781
+ `b-table-busy-slot`, which has one single `<td>` with a `colspan` set to the number of fields.
782
+
783
+ **Example of `table-busy` slot usage:**
784
+
785
+ ```html
786
+ <template>
787
+ <div>
788
+ <b-button @click="toggleBusy">Toggle Busy State</b-button>
789
+
790
+ <b-table :items="items" :busy="isBusy" class="mt-3" outlined>
791
+ <template #table-busy>
792
+ <div class="text-center text-danger my-2">
793
+ <b-spinner class="align-middle"></b-spinner>
794
+ <strong>Loading...</strong>
795
+ </div>
796
+ </template>
797
+ </b-table>
798
+ </div>
799
+ </template>
800
+
801
+ <script>
802
+ export default {
803
+ data() {
804
+ return {
805
+ isBusy: false,
806
+ items: [
807
+ { first_name: 'Dickerson', last_name: 'MacDonald', age: 40 },
808
+ { first_name: 'Larsen', last_name: 'Shaw', age: 21 },
809
+ { first_name: 'Geneva', last_name: 'Wilson', age: 89 },
810
+ { first_name: 'Jami', last_name: 'Carney', age: 38 }
811
+ ]
812
+ }
813
+ },
814
+ methods: {
815
+ toggleBusy() {
816
+ this.isBusy = !this.isBusy
817
+ }
818
+ }
819
+ }
820
+ </script>
821
+
822
+ <!-- b-table-busy-slot.vue -->
823
+ ```
824
+
825
+ Also see the [Using Items Provider Functions](#using-items-provider-functions) below for additional
826
+ information on the `busy` state.
827
+
828
+ **Notes:**
829
+
830
+ - All click related and hover events, and sort-changed events will **not** be emitted when the table
831
+ is in the `busy` state.
832
+ - Busy styling and slot are not available in the `<b-table-lite>` component.
833
+
834
+ ## Custom data rendering
835
+
836
+ Custom rendering for each data field in a row is possible using either
837
+ [scoped slots](https://vuejs.org/v2/guide/components.html#Scoped-Slots) or a formatter callback
838
+ function, or a combination of both.
839
+
840
+ ### Scoped field slots
841
+
842
+ Scoped field slots give you greater control over how the record data appears. You can use scoped
843
+ slots to provided custom rendering for a particular field. If you want to add an extra field which
844
+ does not exist in the records, just add it to the [`fields`](#fields-column-definitions) array, and
845
+ then reference the field(s) in the scoped slot(s). Scoped field slots use the following naming
846
+ syntax: `'cell(' + field key + ')'`.
847
+
848
+ You can use the default _fall-back_ scoped slot `'cell()'` to format any cells that do not have an
849
+ explicit scoped slot provided.
850
+
851
+ **Example: Custom data rendering with scoped slots**
852
+
853
+ ```html
854
+ <template>
855
+ <div>
856
+ <b-table small :fields="fields" :items="items" responsive="sm">
857
+ <!-- A virtual column -->
858
+ <template #cell(index)="data">
859
+ {{ data.index + 1 }}
860
+ </template>
861
+
862
+ <!-- A custom formatted column -->
863
+ <template #cell(name)="data">
864
+ <b class="text-info">{{ data.value.last.toUpperCase() }}</b>, <b>{{ data.value.first }}</b>
865
+ </template>
866
+
867
+ <!-- A virtual composite column -->
868
+ <template #cell(nameage)="data">
869
+ {{ data.item.name.first }} is {{ data.item.age }} years old
870
+ </template>
871
+
872
+ <!-- Optional default data cell scoped slot -->
873
+ <template #cell()="data">
874
+ <i>{{ data.value }}</i>
875
+ </template>
876
+ </b-table>
877
+ </div>
878
+ </template>
879
+
880
+ <script>
881
+ export default {
882
+ data() {
883
+ return {
884
+ fields: [
885
+ // A virtual column that doesn't exist in items
886
+ 'index',
887
+ // A column that needs custom formatting
888
+ { key: 'name', label: 'Full Name' },
889
+ // A regular column
890
+ 'age',
891
+ // A regular column
892
+ 'sex',
893
+ // A virtual column made up from two fields
894
+ { key: 'nameage', label: 'First name and age' }
895
+ ],
896
+ items: [
897
+ { name: { first: 'John', last: 'Doe' }, sex: 'Male', age: 42 },
898
+ { name: { first: 'Jane', last: 'Doe' }, sex: 'Female', age: 36 },
899
+ { name: { first: 'Rubin', last: 'Kincade' }, sex: 'Male', age: 73 },
900
+ { name: { first: 'Shirley', last: 'Partridge' }, sex: 'Female', age: 62 }
901
+ ]
902
+ }
903
+ }
904
+ }
905
+ </script>
906
+
907
+ <!-- b-table-data-slots.vue -->
908
+ ```
909
+
910
+ The slot's scope variable (`data` in the above sample) will have the following properties:
911
+
912
+ | Property | Type | Description |
913
+ | ---------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
914
+ | `index` | Number | The row number (indexed from zero) relative to the _displayed_ rows |
915
+ | `item` | Object | The entire raw record data (i.e. `items[index]`) for this row (before any formatter is applied) |
916
+ | `value` | Any | The value for this key in the record (`null` or `undefined` if a virtual column), or the output of the field's [`formatter` function](#formatter-callback) |
917
+ | `unformatted` | Any | The raw value for this key in the item record (`null` or `undefined` if a virtual column), before being passed to the field's [`formatter` function](#formatter-callback) |
918
+ | `field` | Object | The field's normalized field definition object |
919
+ | `detailsShowing` | Boolean | Will be `true` if the row's `row-details` scoped slot is visible. See section [Row details support](#row-details-support) below for additional information |
920
+ | `toggleDetails` | Function | Can be called to toggle the visibility of the rows `row-details` scoped slot. See section [Row details support](#row-details-support) below for additional information |
921
+ | `rowSelected` | Boolean | Will be `true` if the row has been selected. See section [Row select support](#row-select-support) for additional information |
922
+ | `selectRow` | Function | When called, selects the current row. See section [Row select support](#row-select-support) for additional information |
923
+ | `unselectRow` | Function | When called, unselects the current row. See section [Row select support](#row-select-support) for additional information |
924
+
925
+ **Notes:**
926
+
927
+ - `index` will not always be the actual row's index number, as it is computed after filtering,
928
+ sorting and pagination have been applied to the original table data. The `index` value will refer
929
+ to the **displayed row number**. This number will align with the indexes from the optional
930
+ [`v-model` bound](#v-model-binding) variable.
931
+ - When using the new Vue 2.6 `v-slot` syntax, note that slot names **cannot** contain spaces, and
932
+ when using in-browser DOM templates the slot names will _always_ be lower cased. To get around
933
+ this, you can pass the slot name using Vue's
934
+ [dynamic slot names](https://vuejs.org/v2/guide/components-slots.html#Dynamic-Slot-Names)
935
+
936
+ #### Displaying raw HTML
937
+
938
+ By default `b-table` escapes HTML tags in items data and results of formatter functions, if you need
939
+ to display raw HTML code in `b-table`, you should use `v-html` directive on an element in a in
940
+ scoped field slot.
941
+
942
+ ```html
943
+ <template>
944
+ <div>
945
+ <b-table :items="items">
946
+ <template #cell(html)="data">
947
+ <span v-html="data.value"></span>
948
+ </template>
949
+ </b-table>
950
+ </div>
951
+ </template>
952
+
953
+ <script>
954
+ export default {
955
+ data() {
956
+ return {
957
+ items: [
958
+ {
959
+ text: 'This is <i>escaped</i> content',
960
+ html: 'This is <i>raw <strong>HTML</strong></i> <span style="color:red">content</span>'
961
+ }
962
+ ]
963
+ }
964
+ }
965
+ }
966
+ </script>
967
+
968
+ <!-- b-table-html-data-slots.vue -->
969
+ ```
970
+
971
+ <p class="alert alert-danger">
972
+ <strong>Warning:</strong> Be cautious of using the <code>v-html</code> method to display user
973
+ supplied content, as it may make your application vulnerable to
974
+ <a class="alert-link" href="https://en.wikipedia.org/wiki/Cross-site_scripting">
975
+ <abbr title="Cross Site Scripting Attacks">XSS attacks</abbr></a>, if you do not first
976
+ <a class="alert-link" href="https://en.wikipedia.org/wiki/HTML_sanitization">sanitize</a> the
977
+ user supplied string.
978
+ </p>
979
+
980
+ ### Formatter callback
981
+
982
+ Optionally, you can customize field output by using a formatter callback function. To enable this,
983
+ the field's `formatter` property is used. The value of this property may be String or function
984
+ reference. In case of a String value, the function must be defined at the parent component's
985
+ methods. When providing `formatter` as a `Function`, it must be declared at global scope (window or
986
+ as global mixin at Vue, or as an anonymous function), unless it has been bound to a `this` context.
987
+
988
+ The callback function accepts three arguments - `value`, `key`, and `item`, and should return the
989
+ formatted value as a string (HTML strings are not supported)
990
+
991
+ **Example: Custom data rendering with formatter callback function**
992
+
993
+ ```html
994
+ <template>
995
+ <div>
996
+ <b-table :fields="fields" :items="items">
997
+ <template #cell(name)="data">
998
+ <!-- `data.value` is the value after formatted by the Formatter -->
999
+ <a :href="`#${data.value.replace(/[^a-z]+/i,'-').toLowerCase()}`">{{ data.value }}</a>
1000
+ </template>
1001
+ </b-table>
1002
+ </div>
1003
+ </template>
1004
+
1005
+ <script>
1006
+ export default {
1007
+ data() {
1008
+ return {
1009
+ fields: [
1010
+ {
1011
+ // A column that needs custom formatting,
1012
+ // calling formatter 'fullName' in this app
1013
+ key: 'name',
1014
+ label: 'Full Name',
1015
+ formatter: 'fullName'
1016
+ },
1017
+ // A regular column
1018
+ 'age',
1019
+ {
1020
+ // A regular column with custom formatter
1021
+ key: 'sex',
1022
+ formatter: value => {
1023
+ return value.charAt(0).toUpperCase()
1024
+ }
1025
+ },
1026
+ {
1027
+ // A virtual column with custom formatter
1028
+ key: 'birthYear',
1029
+ label: 'Calculated Birth Year',
1030
+ formatter: (value, key, item) => {
1031
+ return new Date().getFullYear() - item.age
1032
+ }
1033
+ }
1034
+ ],
1035
+ items: [
1036
+ { name: { first: 'John', last: 'Doe' }, sex: 'Male', age: 42 },
1037
+ { name: { first: 'Jane', last: 'Doe' }, sex: 'Female', age: 36 },
1038
+ { name: { first: 'Rubin', last: 'Kincade' }, sex: 'male', age: 73 },
1039
+ { name: { first: 'Shirley', last: 'Partridge' }, sex: 'female', age: 62 }
1040
+ ]
1041
+ }
1042
+ },
1043
+ methods: {
1044
+ fullName(value) {
1045
+ return `${value.first} ${value.last}`
1046
+ }
1047
+ }
1048
+ }
1049
+ </script>
1050
+
1051
+ <!-- b-table-data-formatter.vue -->
1052
+ ```
1053
+
1054
+ ## Header and Footer custom rendering via scoped slots
1055
+
1056
+ It is also possible to provide custom rendering for the tables `thead` and `tfoot` elements. Note by
1057
+ default the table footer is not rendered unless `foot-clone` is set to `true`.
1058
+
1059
+ Scoped slots for the header and footer cells uses a special naming convention of
1060
+ `'head(<fieldkey>)'` and `'foot(<fieldkey>)'` respectively. if a `'foot(...)'` slot for a field is
1061
+ not provided, but a `'head(...)'` slot is provided, then the footer will use the `'head(...)'` slot
1062
+ content.
1063
+
1064
+ You can use a default _fall-back_ scoped slot `'head()'` or `'foot()'` to format any header or
1065
+ footer cells that do not have an explicit scoped slot provided.
1066
+
1067
+ ```html
1068
+ <template>
1069
+ <div>
1070
+ <b-table :fields="fields" :items="items" foot-clone>
1071
+ <!-- A custom formatted data column cell -->
1072
+ <template #cell(name)="data">
1073
+ {{ data.value.first }} {{ data.value.last }}
1074
+ </template>
1075
+
1076
+ <!-- A custom formatted header cell for field 'name' -->
1077
+ <template #head(name)="data">
1078
+ <span class="text-info">{{ data.label.toUpperCase() }}</span>
1079
+ </template>
1080
+
1081
+ <!-- A custom formatted footer cell for field 'name' -->
1082
+ <template #foot(name)="data">
1083
+ <span class="text-danger">{{ data.label }}</span>
1084
+ </template>
1085
+
1086
+ <!-- Default fall-back custom formatted footer cell -->
1087
+ <template #foot()="data">
1088
+ <i>{{ data.label }}</i>
1089
+ </template>
1090
+ </b-table>
1091
+ </div>
1092
+ </template>
1093
+
1094
+ <script>
1095
+ export default {
1096
+ data() {
1097
+ return {
1098
+ fields: [
1099
+ // A column that needs custom formatting
1100
+ { key: 'name', label: 'Full Name' },
1101
+ // A regular column
1102
+ 'age',
1103
+ // A regular column
1104
+ 'sex'
1105
+ ],
1106
+ items: [
1107
+ { name: { first: 'John', last: 'Doe' }, sex: 'Male', age: 42 },
1108
+ { name: { first: 'Jane', last: 'Doe' }, sex: 'Female', age: 36 },
1109
+ { name: { first: 'Rubin', last: 'Kincade' }, sex: 'Male', age: 73 },
1110
+ { name: { first: 'Shirley', last: 'Partridge' }, sex: 'Female', age: 62 }
1111
+ ]
1112
+ }
1113
+ }
1114
+ }
1115
+ </script>
1116
+
1117
+ <!-- b-table-head-foot-slots.vue -->
1118
+ ```
1119
+
1120
+ The slots can be optionally scoped (`data` in the above example), and will have the following
1121
+ properties:
1122
+
1123
+ | Property | Type | Description |
1124
+ | --------------- | ------ | ----------------------------------------------------------------------------------------- |
1125
+ | `column` | String | The fields's `key` value |
1126
+ | `field` | Object | the field's object (from the `fields` prop) |
1127
+ | `label` | String | The fields label value (also available as `data.field.label`) |
1128
+ | `selectAllRows` | Method | Select all rows (applicable if the table is in [`selectable`](#row-select-support) mode |
1129
+ | `clearSelected` | Method | Unselect all rows (applicable if the table is in [`selectable`](#row-select-support) mode |
1130
+
1131
+ When placing inputs, buttons, selects or links within a `head(...)` or `foot(...)` slot, note that
1132
+ `head-clicked` event will not be emitted when the input, select, textarea is clicked (unless they
1133
+ are disabled). `head-clicked` will never be emitted when clicking on links or buttons inside the
1134
+ scoped slots (even when disabled)
1135
+
1136
+ **Notes:**
1137
+
1138
+ - When using the new Vue 2.6 `v-slot` syntax, note that slot names **cannot** contain spaces, and
1139
+ when using in-browser DOM templates the slot names will _always_ be lower cased. To get around
1140
+ this, you can pass the slot name using Vue's
1141
+ [dynamic slot names](https://vuejs.org/v2/guide/components-slots.html#Dynamic-Slot-Names)
1142
+
1143
+ ### Adding additional rows to the header
1144
+
1145
+ If you wish to add additional rows to the header you may do so via the `thead-top` slot. This slot
1146
+ is inserted before the header cells row, and is not automatically encapsulated by `<tr>..</tr>`
1147
+ tags. It is recommended to use the BootstrapVue [table helper components](#table-helper-components),
1148
+ rather than native browser table child elements.
1149
+
1150
+ ```html
1151
+ <template>
1152
+ <div>
1153
+ <b-table
1154
+ :items="items"
1155
+ :fields="fields"
1156
+ responsive="sm"
1157
+ >
1158
+ <template #thead-top="data">
1159
+ <b-tr>
1160
+ <b-th colspan="2"><span class="sr-only">Name and ID</span></b-th>
1161
+ <b-th variant="secondary">Type 1</b-th>
1162
+ <b-th variant="primary" colspan="3">Type 2</b-th>
1163
+ <b-th variant="danger">Type 3</b-th>
1164
+ </b-tr>
1165
+ </template>
1166
+ </b-table>
1167
+ </div>
1168
+ </template>
1169
+
1170
+ <script>
1171
+ export default {
1172
+ data() {
1173
+ return {
1174
+ items: [
1175
+ { name: 'Stephen Hawking', id: 1, type1: false, type2a: true, type2b: false, type2c: false, type3: false },
1176
+ { name: 'Johnny Appleseed', id: 2, type1: false, type2a: true, type2b: true, type2c: false, type3: false },
1177
+ { name: 'George Washington', id: 3, type1: false, type2a: false, type2b: false, type2c: false, type3: true },
1178
+ { name: 'Albert Einstein', id: 4, type1: true, type2a: false, type2b: false, type2c: true, type3: false },
1179
+ { name: 'Isaac Newton', id: 5, type1: true, type2a: true, type2b: false, type2c: true, type3: false },
1180
+ ],
1181
+ fields: [
1182
+ 'name',
1183
+ { key: 'id', label: 'ID' },
1184
+ { key: 'type1', label: 'Type 1' },
1185
+ { key: 'type2a', label: 'Type 2A' },
1186
+ { key: 'type2b', label: 'Type 2B' },
1187
+ { key: 'type2c', label: 'Type 2C' },
1188
+ { key: 'type3', label: 'Type 3' }
1189
+ ]
1190
+ }
1191
+ }
1192
+ }
1193
+ </script>
1194
+
1195
+ <!-- b-table-thead-top-slot.vue -->
1196
+ ```
1197
+
1198
+ Slot `thead-top` can be optionally scoped, receiving an object with the following properties:
1199
+
1200
+ | Property | Type | Description |
1201
+ | --------------- | ------ | ----------------------------------------------------------------------------------------- |
1202
+ | `columns` | Number | The number of columns in the rendered table |
1203
+ | `fields` | Array | Array of field definition objects (normalized to the array of objects format) |
1204
+ | `selectAllRows` | Method | Select all rows (applicable if the table is in [`selectable`](#row-select-support) mode |
1205
+ | `clearSelected` | Method | Unselect all rows (applicable if the table is in [`selectable`](#row-select-support) mode |
1206
+
1207
+ ### Creating a custom footer
1208
+
1209
+ If you need greater layout control of the content of the `<tfoot>`, you can use the optionally
1210
+ scoped slot `custom-foot` to provide your own rows and cells. Use BootstrapVue's
1211
+ [table helper sub-components](#table-helper-components) `<b-tr>`, `<b-th>`, and `<b-td>` to generate
1212
+ your custom footer layout.
1213
+
1214
+ Slot `custom-foot` can be optionally scoped, receiving an object with the following properties:
1215
+
1216
+ | Property | Type | Description |
1217
+ | --------- | ------ | ------------------------------------------------------------------------------------------ |
1218
+ | `columns` | Number | The number of columns in the rendered table |
1219
+ | `fields` | Array | Array of field definition objects (normalized to the array of objects format) |
1220
+ | `items` | Array | Array of the currently _displayed_ items records - after filtering, sorting and pagination |
1221
+
1222
+ **Notes:**
1223
+
1224
+ - The `custom-foot` slot will **not** be rendered if the `foot-clone` prop has been set.
1225
+ - `head-clicked` events are not be emitted when clicking on `custom-foot` cells.
1226
+ - Sorting and sorting icons are not available for cells in the `custom-foot` slot.
1227
+ - The custom footer will not be shown when the table is in visually stacked mode.
1228
+
1229
+ ## Custom empty and emptyfiltered rendering via slots
1230
+
1231
+ Aside from using `empty-text`, `empty-filtered-text`, `empty-html`, and `empty-filtered-html`, it is
1232
+ also possible to provide custom rendering for tables that have no data to display using named slots.
1233
+
1234
+ In order for these slots to be shown, the `show-empty` attribute must be set and `items` must be
1235
+ either falsy or an array of length 0.
1236
+
1237
+ ```html
1238
+ <div>
1239
+ <b-table :fields="fields" :items="items" show-empty>
1240
+ <template #empty="scope">
1241
+ <h4>{{ scope.emptyText }}</h4>
1242
+ </template>
1243
+ <template #emptyfiltered="scope">
1244
+ <h4>{{ scope.emptyFilteredText }}</h4>
1245
+ </template>
1246
+ </b-table>
1247
+ </div>
1248
+ ```
1249
+
1250
+ The slot can optionally be scoped. The slot's scope (`scope` in the above example) will have the
1251
+ following properties:
1252
+
1253
+ | Property | Type | Description |
1254
+ | ------------------- | ------ | -------------------------------------------------- |
1255
+ | `emptyHtml` | String | The `empty-html` prop |
1256
+ | `emptyText` | String | The `empty-text` prop |
1257
+ | `emptyFilteredHtml` | String | The `empty-filtered-html` prop |
1258
+ | `emptyFilteredText` | String | The `empty-filtered-text` prop |
1259
+ | `fields` | Array | The `fields` prop |
1260
+ | `items` | Array | The `items` prop. Exposed here to check null vs [] |
1261
+
1262
+ ## Advanced features
1263
+
1264
+ ### Sticky headers
1265
+
1266
+ Use the `sticky-header` prop to enable a vertically scrolling table with headers that remain fixed
1267
+ (sticky) as the table body scrolls. Setting the prop to `true` (or no explicit value) will generate
1268
+ a table that has a maximum height of `300px`. To specify a maximum height other than `300px`, set
1269
+ the `sticky-header` prop to a valid CSS height (including units), i.e. `sticky-header="200px"`.
1270
+ Tables with `sticky-header` enabled will also automatically become always responsive horizontally,
1271
+ regardless of the [`responsive`](#responsive-tables) prop setting, if the table is wider than the
1272
+ available horizontal space.
1273
+
1274
+ ```html
1275
+ <template>
1276
+ <div>
1277
+ <b-table sticky-header :items="items" head-variant="light"></b-table>
1278
+ </div>
1279
+ </template>
1280
+
1281
+ <script>
1282
+ export default {
1283
+ data() {
1284
+ return {
1285
+ items: [
1286
+ { heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
1287
+ { heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
1288
+ { heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
1289
+ { heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
1290
+ { heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
1291
+ { heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
1292
+ { heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
1293
+ { heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
1294
+ { heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
1295
+ { heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
1296
+ { heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' },
1297
+ { heading1: 'table cell', heading2: 'table cell', heading3: 'table cell' }
1298
+ ]
1299
+ }
1300
+ }
1301
+ }
1302
+ </script>
1303
+
1304
+ <!-- b-table-sticky-header.vue -->
1305
+ ```
1306
+
1307
+ **Sticky header notes:**
1308
+
1309
+ - The `sticky-header` prop has no effect if the table has the [`stacked`](#stacked-tables) prop set.
1310
+ - Sticky header tables are wrapped inside a vertically scrollable `<div>` with a maximum height set.
1311
+ - BootstrapVue's custom CSS is required in order to support `sticky-header`.
1312
+ - Bootstrap v4 uses the CSS style `border-collapse: collapsed` on table elements. This prevents the
1313
+ borders on the sticky header from "sticking" to the header, and hence the borders will scroll when
1314
+ the body scrolls. To get around this issue, set the prop `no-border-collapse` on the table (note
1315
+ that this may cause double width borders when using features such as `bordered`, etc.).
1316
+ - The sticky header feature uses CSS style `position: sticky` to position the headings. Internet
1317
+ Explorer does not support `position: sticky`, hence for IE 11 the table headings will scroll with
1318
+ the table body.
1319
+
1320
+ ### Sticky columns
1321
+
1322
+ Columns can be made sticky, where they stick to the left of the table when the table has a
1323
+ horizontal scrollbar. To make a column a sticky column, set the `stickyColumn` prop in the
1324
+ [field's header definition](#field-definition-reference). Sticky columns will only work when the
1325
+ table has either the `sticky-header` prop set and/or the [`responsive`](#responsive-tables) prop is
1326
+ set.
1327
+
1328
+ **Example: Sticky columns and headers**
1329
+
1330
+ ```html
1331
+ <template>
1332
+ <div>
1333
+ <div class="mb-2">
1334
+ <b-form-checkbox v-model="stickyHeader" inline>Sticky header</b-form-checkbox>
1335
+ <b-form-checkbox v-model="noCollapse" inline>No border collapse</b-form-checkbox>
1336
+ </div>
1337
+ <b-table
1338
+ :sticky-header="stickyHeader"
1339
+ :no-border-collapse="noCollapse"
1340
+ responsive
1341
+ :items="items"
1342
+ :fields="fields"
1343
+ >
1344
+ <!-- We are using utility class `text-nowrap` to help illustrate horizontal scrolling -->
1345
+ <template #head(id)="scope">
1346
+ <div class="text-nowrap">Row ID</div>
1347
+ </template>
1348
+ <template #head()="scope">
1349
+ <div class="text-nowrap">
1350
+ Heading {{ scope.label }}
1351
+ </div>
1352
+ </template>
1353
+ </b-table>
1354
+ </div>
1355
+ </template>
1356
+
1357
+ <script>
1358
+ export default {
1359
+ data() {
1360
+ return {
1361
+ stickyHeader: true,
1362
+ noCollapse: false,
1363
+ fields: [
1364
+ { key: 'id', stickyColumn: true, isRowHeader: true, variant: 'primary' },
1365
+ 'a',
1366
+ 'b',
1367
+ { key: 'c', stickyColumn: true, variant: 'info' },
1368
+ 'd',
1369
+ 'e',
1370
+ 'f',
1371
+ 'g',
1372
+ 'h',
1373
+ 'i',
1374
+ 'j',
1375
+ 'k',
1376
+ 'l'
1377
+ ],
1378
+ items: [
1379
+ { id: 1, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
1380
+ { id: 2, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
1381
+ { id: 3, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
1382
+ { id: 4, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
1383
+ { id: 5, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
1384
+ { id: 6, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
1385
+ { id: 7, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
1386
+ { id: 8, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
1387
+ { id: 9, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 },
1388
+ { id: 10, a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, i: 8, j: 9, k: 10, l: 11 }
1389
+ ]
1390
+ }
1391
+ }
1392
+ }
1393
+ </script>
1394
+
1395
+ <!-- table-sticky-columns.vue -->
1396
+ ```
1397
+
1398
+ **Sticky column notes:**
1399
+
1400
+ - Sticky columns has no effect if the table has the [`stacked`](#stacked-tables) prop set.
1401
+ - Sticky columns tables require either the `sticky-header` and/or `responsive` modes, and are
1402
+ wrapped inside a horizontally scrollable `<div>`.
1403
+ - When you have multiple columns that are set as `stickyColumn`, the columns will stack over each
1404
+ other visually, and the left-most sticky columns may "peek" out from under the next sticky column.
1405
+ To get around this behaviour, make sure your latter sticky columns are the same width or wider
1406
+ than previous sticky columns.
1407
+ - Bootstrap v4 uses the CSS style `border-collapse: collapsed` on table elements. This prevents any
1408
+ borders on the sticky columns from "sticking" to the column, and hence those borders will scroll
1409
+ when the body scrolls. To get around this issue, set the prop `no-border-collapse` on the table
1410
+ (note that this may cause double width borders when using features such as `bordered`, etc.).
1411
+ - BootstrapVue's custom CSS is required in order to support sticky columns.
1412
+ - The sticky column feature uses CSS style `position: sticky` to position the column cells. Internet
1413
+ Explorer does not support `position: sticky`, hence for IE 11 the sticky column will scroll with
1414
+ the table body.
1415
+
1416
+ ### Row details support
1417
+
1418
+ If you would optionally like to display additional record information (such as columns not specified
1419
+ in the fields definition array), you can use the scoped slot `row-details`, in combination with the
1420
+ special item record Boolean property `_showDetails`.
1421
+
1422
+ If the record has its `_showDetails` property set to `true`, **and** a `row-details` scoped slot
1423
+ exists, a new row will be shown just below the item, with the rendered contents of the `row-details`
1424
+ scoped slot.
1425
+
1426
+ In the scoped field slot, you can toggle the visibility of the row's `row-details` scoped slot by
1427
+ calling the `toggleDetails` function passed to the field's scoped slot variable. You can use the
1428
+ scoped fields slot variable `detailsShowing` to determine the visibility of the `row-details` slot.
1429
+
1430
+ **Note:** If manipulating the `_showDetails` property directly on the item data (i.e. not via the
1431
+ `toggleDetails` function reference), the `_showDetails` properly **must** exist in the items data
1432
+ for proper reactive detection of changes to its value. Read more about
1433
+ [Vue's reactivity limitations](https://vuejs.org/v2/guide/reactivity.html#Change-Detection-Caveats).
1434
+
1435
+ **Available `row-details` scoped variable properties:**
1436
+
1437
+ | Property | Type | Description |
1438
+ | --------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------- |
1439
+ | `item` | Object | The entire row record data object |
1440
+ | `index` | Number | The current visible row number |
1441
+ | `fields` | Array | The normalized fields definition array (in the _array of objects_ format) |
1442
+ | `toggleDetails` | Function | Function to toggle visibility of the row's details slot |
1443
+ | `rowSelected` | Boolean | Will be `true` if the row has been selected. See section [Row select support](#row-select-support) for additional information |
1444
+ | `selectRow` | Function | When called, selects the current row. See section [Row select support](#row-select-support) for additional information |
1445
+ | `unselectRow` | Function | When called, unselects the current row. See section [Row select support](#row-select-support) for additional information |
1446
+
1447
+ Note: the row select related scope properties are only available in `<b-table>`.
1448
+
1449
+ In the following example, we show two methods of toggling the visibility of the details: one via a
1450
+ button, and one via a checkbox. We also have the third row details defaulting to have details
1451
+ initially showing.
1452
+
1453
+ ```html
1454
+ <template>
1455
+ <div>
1456
+ <b-table :items="items" :fields="fields" striped responsive="sm">
1457
+ <template #cell(show_details)="row">
1458
+ <b-button size="sm" @click="row.toggleDetails" class="mr-2">
1459
+ {{ row.detailsShowing ? 'Hide' : 'Show'}} Details
1460
+ </b-button>
1461
+
1462
+ <!-- As `row.showDetails` is one-way, we call the toggleDetails function on @change -->
1463
+ <b-form-checkbox v-model="row.detailsShowing" @change="row.toggleDetails">
1464
+ Details via check
1465
+ </b-form-checkbox>
1466
+ </template>
1467
+
1468
+ <template #row-details="row">
1469
+ <b-card>
1470
+ <b-row class="mb-2">
1471
+ <b-col sm="3" class="text-sm-right"><b>Age:</b></b-col>
1472
+ <b-col>{{ row.item.age }}</b-col>
1473
+ </b-row>
1474
+
1475
+ <b-row class="mb-2">
1476
+ <b-col sm="3" class="text-sm-right"><b>Is Active:</b></b-col>
1477
+ <b-col>{{ row.item.isActive }}</b-col>
1478
+ </b-row>
1479
+
1480
+ <b-button size="sm" @click="row.toggleDetails">Hide Details</b-button>
1481
+ </b-card>
1482
+ </template>
1483
+ </b-table>
1484
+ </div>
1485
+ </template>
1486
+
1487
+ <script>
1488
+ export default {
1489
+ data() {
1490
+ return {
1491
+ fields: ['first_name', 'last_name', 'show_details'],
1492
+ items: [
1493
+ { isActive: true, age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
1494
+ { isActive: false, age: 21, first_name: 'Larsen', last_name: 'Shaw' },
1495
+ {
1496
+ isActive: false,
1497
+ age: 89,
1498
+ first_name: 'Geneva',
1499
+ last_name: 'Wilson',
1500
+ _showDetails: true
1501
+ },
1502
+ { isActive: true, age: 38, first_name: 'Jami', last_name: 'Carney' }
1503
+ ]
1504
+ }
1505
+ }
1506
+ }
1507
+ </script>
1508
+
1509
+ <!-- b-table-details.vue -->
1510
+ ```
1511
+
1512
+ ### Row select support
1513
+
1514
+ You can make rows selectable, by using the `<b-table>` prop `selectable`.
1515
+
1516
+ Users can easily change the selecting mode by setting the `select-mode` prop.
1517
+
1518
+ - `'multi'`: Each click will select/deselect the row (default mode)
1519
+ - `'single'`: Only a single row can be selected at one time
1520
+ - `'range'`: Any row clicked is selected, any other deselected. <kbd>Shift</kbd> + click selects a
1521
+ range of rows, and <kbd>Ctrl</kbd> (or <kbd>Cmd</kbd>) + click will toggle the selected row.
1522
+
1523
+ When a table is `selectable` and the user clicks on a row, `<b-table>` will emit the `row-selected`
1524
+ event, passing a single argument which is the complete list of selected items. **Treat this argument
1525
+ as read-only.**
1526
+
1527
+ Rows can also be programmatically selected and unselected via the following exposed methods on the
1528
+ `<b-table>` instance (i.e. via a reference to the table instance via `this.$refs`):
1529
+
1530
+ | Method | Description |
1531
+ | ---------------------- | ---------------------------------------------------------------------------------------------------- |
1532
+ | `selectRow(index)` | Selects a row with the given `index` number. |
1533
+ | `unselectRow(index)` | Unselects a row with the given `index` number. |
1534
+ | `selectAllRows()` | Selects all rows in the table, except in `single` mode in which case only the first row is selected. |
1535
+ | `clearSelected()` | Unselects all rows. |
1536
+ | `isRowSelected(index)` | Returns `true` if the row with the given `index` is selected, otherwise it returns `false`. |
1537
+
1538
+ **Programmatic row selection notes:**
1539
+
1540
+ - `index` is the zero-based index of the table's **visible rows**, after filtering, sorting, and
1541
+ pagination have been applied.
1542
+ - In `single` mode, `selectRow(index)` will unselect any previous selected row.
1543
+ - Attempting to `selectRow(index)` or `unselectRow(index)` on a non-existent row will be ignored.
1544
+ - The table must be `selectable` for any of these methods to have effect.
1545
+ - You can disable selection of rows via click events by setting the `no-select-on-click` prop. Rows
1546
+ will then only be selectable programmatically.
1547
+
1548
+ **Row select notes:**
1549
+
1550
+ - [Sorting](#sorting), [filtering](#filtering), or [paginating](#pagination) the table will **clear
1551
+ the active selection**. The `row-selected` event will be emitted with an empty array (`[]`) if
1552
+ needed.
1553
+ - When the table is in `selectable` mode, all data item `<tr>` elements will be in the document tab
1554
+ sequence (`tabindex="0"`) for [accessibility](#accessibility) reasons, and will have the attribute
1555
+ `aria-selected` set to either `'true'` or `'false'` depending on the selected state of the row.
1556
+ - When a table is `selectable`, the table will have the attribute `aria-multiselect` set to either
1557
+ `'false'` for `single` mode, and `'true'` for either `multi` or `range` modes.
1558
+
1559
+ When a `<b-table>` is selectable, it will have class `b-table-selectable` and one of the following
1560
+ three classes (depending on which mode is in use) on the `<table>` element:
1561
+
1562
+ - `b-table-select-single`
1563
+ - `b-table-select-multi`
1564
+ - `b-table-select-range`
1565
+
1566
+ When at least one row is selected, the class `b-table-selecting` will be active on the `<table>`
1567
+ element. Rows that are selected rows will have a class of `b-table-row-selected` applied to the
1568
+ `<tr>` element.
1569
+
1570
+ Use the prop `selected-variant` to apply a Bootstrap theme color to the selected row(s). Note, due
1571
+ to the order that the table variants are defined in Bootstrap's CSS, any row-variant _might_ take
1572
+ precedence over the `selected-variant`. You can set `selected-variant` to an empty string if you
1573
+ will be using other means to convey that a row is selected (such as a scoped field slot in the below
1574
+ example).
1575
+
1576
+ The `selected-variant` can be any of the
1577
+ [standard (or custom) Bootstrap base color variants](/docs/reference/color-variants), or the special
1578
+ [table `active` variant](/docs/reference/color-variants#table-variants) (the default) which takes
1579
+ precedence over any specific row or cell variants.
1580
+
1581
+ For accessibility reasons (specifically for color blind users, or users with color contrast issues),
1582
+ it is highly recommended to always provide some other visual means of conveying that a row is
1583
+ selected, such as a virtual column as shown in the example below.
1584
+
1585
+ ```html
1586
+ <template>
1587
+ <div>
1588
+ <b-form-group
1589
+ label="Selection mode:"
1590
+ label-for="table-select-mode-select"
1591
+ label-cols-md="4"
1592
+ >
1593
+ <b-form-select
1594
+ id="table-select-mode-select"
1595
+ v-model="selectMode"
1596
+ :options="modes"
1597
+ class="mb-3"
1598
+ ></b-form-select>
1599
+ </b-form-group>
1600
+
1601
+ <b-table
1602
+ :items="items"
1603
+ :fields="fields"
1604
+ :select-mode="selectMode"
1605
+ responsive="sm"
1606
+ ref="selectableTable"
1607
+ selectable
1608
+ @row-selected="onRowSelected"
1609
+ >
1610
+ <!-- Example scoped slot for select state illustrative purposes -->
1611
+ <template #cell(selected)="{ rowSelected }">
1612
+ <template v-if="rowSelected">
1613
+ <span aria-hidden="true">&check;</span>
1614
+ <span class="sr-only">Selected</span>
1615
+ </template>
1616
+ <template v-else>
1617
+ <span aria-hidden="true">&nbsp;</span>
1618
+ <span class="sr-only">Not selected</span>
1619
+ </template>
1620
+ </template>
1621
+ </b-table>
1622
+ <p>
1623
+ <b-button size="sm" @click="selectAllRows">Select all</b-button>
1624
+ <b-button size="sm" @click="clearSelected">Clear selected</b-button>
1625
+ <b-button size="sm" @click="selectThirdRow">Select 3rd row</b-button>
1626
+ <b-button size="sm" @click="unselectThirdRow">Unselect 3rd row</b-button>
1627
+ </p>
1628
+ <p>
1629
+ Selected Rows:<br>
1630
+ {{ selected }}
1631
+ </p>
1632
+ </div>
1633
+ </template>
1634
+
1635
+ <script>
1636
+ export default {
1637
+ data() {
1638
+ return {
1639
+ modes: ['multi', 'single', 'range'],
1640
+ fields: ['selected', 'isActive', 'age', 'first_name', 'last_name'],
1641
+ items: [
1642
+ { isActive: true, age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
1643
+ { isActive: false, age: 21, first_name: 'Larsen', last_name: 'Shaw' },
1644
+ { isActive: false, age: 89, first_name: 'Geneva', last_name: 'Wilson' },
1645
+ { isActive: true, age: 38, first_name: 'Jami', last_name: 'Carney' }
1646
+ ],
1647
+ selectMode: 'multi',
1648
+ selected: []
1649
+ }
1650
+ },
1651
+ methods: {
1652
+ onRowSelected(items) {
1653
+ this.selected = items
1654
+ },
1655
+ selectAllRows() {
1656
+ this.$refs.selectableTable.selectAllRows()
1657
+ },
1658
+ clearSelected() {
1659
+ this.$refs.selectableTable.clearSelected()
1660
+ },
1661
+ selectThirdRow() {
1662
+ // Rows are indexed from 0, so the third row is index 2
1663
+ this.$refs.selectableTable.selectRow(2)
1664
+ },
1665
+ unselectThirdRow() {
1666
+ // Rows are indexed from 0, so the third row is index 2
1667
+ this.$refs.selectableTable.unselectRow(2)
1668
+ }
1669
+ }
1670
+ }
1671
+ </script>
1672
+
1673
+ <!-- b-table-selectable.vue -->
1674
+ ```
1675
+
1676
+ ### Table body transition support
1677
+
1678
+ Vue transitions and animations are optionally supported on the `<tbody>` element via the use of
1679
+ Vue's `<transition-group>` component internally. Three props are available for transitions support
1680
+ (all three default to undefined):
1681
+
1682
+ | Prop | Type | Description |
1683
+ | --------------------------- | ------ | ----------------------------------------------------------------- |
1684
+ | `tbody-transition-props` | Object | Object of transition-group properties |
1685
+ | `tbody-transition-handlers` | Object | Object of transition-group event handlers |
1686
+ | `primary-key` | String | String specifying the field to use as a unique row key (required) |
1687
+
1688
+ To enable transitions you need to specify `tbody-transition-props` and/or
1689
+ `tbody-transition-handlers`, and must specify which field key to use as a unique key via the
1690
+ `primary-key` prop. Your data **must have** a column (specified by setting the `primary-key` prop to
1691
+ the _name_ of the field) that has a **unique value per row** in order for transitions to work
1692
+ properly. The `primary-key` field's _value_ can either be a unique string or number. The field
1693
+ specified does not need to appear in the rendered table output, but it **must** exist in each row of
1694
+ your items data.
1695
+
1696
+ You must also provide CSS to handle your transitions (if using CSS transitions) in your project.
1697
+
1698
+ For more information of Vue's list rendering transitions, see the
1699
+ [Vue JS official docs](https://vuejs.org/v2/guide/transitions.html#List-Move-Transitions).
1700
+
1701
+ In the example below, we have used the following custom CSS:
1702
+
1703
+ ```css
1704
+ table#table-transition-example .flip-list-move {
1705
+ transition: transform 1s;
1706
+ }
1707
+ ```
1708
+
1709
+ ```html
1710
+ <template>
1711
+ <div>
1712
+ <b-table
1713
+ id="table-transition-example"
1714
+ :items="items"
1715
+ :fields="fields"
1716
+ striped
1717
+ small
1718
+ primary-key="a"
1719
+ :tbody-transition-props="transProps"
1720
+ ></b-table>
1721
+ </div>
1722
+ </template>
1723
+
1724
+ <script>
1725
+ export default {
1726
+ data() {
1727
+ return {
1728
+ transProps: {
1729
+ // Transition name
1730
+ name: 'flip-list'
1731
+ },
1732
+ items: [
1733
+ { a: 2, b: 'Two', c: 'Moose' },
1734
+ { a: 1, b: 'Three', c: 'Dog' },
1735
+ { a: 3, b: 'Four', c: 'Cat' },
1736
+ { a: 4, b: 'One', c: 'Mouse' }
1737
+ ],
1738
+ fields: [
1739
+ { key: 'a', sortable: true },
1740
+ { key: 'b', sortable: true },
1741
+ { key: 'c', sortable: true }
1742
+ ]
1743
+ }
1744
+ }
1745
+ }
1746
+ </script>
1747
+
1748
+ <!-- b-table-transitions.vue -->
1749
+ ```
1750
+
1751
+ ### `v-model` binding
1752
+
1753
+ If you bind a variable to the `v-model` prop, the contents of this variable will be the currently
1754
+ displayed item records (zero based index, up to `page-size` - 1). This variable (the `value` prop)
1755
+ should usually be treated as _readonly_.
1756
+
1757
+ The records within the `v-model` are a filtered/paginated _shallow copy_ of `items`, and hence any
1758
+ changes to a record's properties in the `v-model` will be reflected in the original `items` array
1759
+ (except when `items` is set to a provider function). Deleting a record from the `v-model` array will
1760
+ **not** remove the record from the original items array nor will it remove it from the displayed
1761
+ rows.
1762
+
1763
+ **Note:** Do not bind any value directly to the `value` prop. Use the `v-model` binding.
1764
+
1765
+ ## Sorting
1766
+
1767
+ As mentioned in the [Fields](#fields-column-definitions) section above, you can make columns
1768
+ sortable in `<b-table>`. Clicking on a sortable column header will sort the column in ascending
1769
+ direction (smallest first), while clicking on it again will switch the direction of sorting to
1770
+ descending (largest first). Clicking on a non-sortable column will clear the sorting (the prop
1771
+ `no-sort-reset` can be used to disable this feature).
1772
+
1773
+ You can control which column is pre-sorted and the order of sorting (ascending or descending). To
1774
+ pre-specify the column to be sorted, set the `sort-by` prop to the field's key. Set the sort
1775
+ direction by setting `sort-desc` to either `true` (for descending) or `false` (for ascending, the
1776
+ default).
1777
+
1778
+ - **Ascending**: Items are sorted lowest to highest (i.e. `A` to `Z`) and will be displayed with the
1779
+ lowest value in the first row with progressively higher values in the following rows.
1780
+ - **Descending**: Items are sorted highest to lowest (i.e. `Z` to `A`) and will be displayed with
1781
+ the highest value in the first row with progressively lower values in the following rows.
1782
+
1783
+ The props `sort-by` and `sort-desc` can be turned into _two-way_ (syncable) props by adding the
1784
+ `.sync` modifier. Your bound variables will then be updated accordingly based on the current sort
1785
+ criteria. See the [Vue docs](https://vuejs.org/v2/guide/components.html#sync-Modifier) for details
1786
+ on the `.sync` prop modifier.
1787
+
1788
+ Setting `sort-by` to a column that is not defined in the fields as `sortable` will result in the
1789
+ table not being sorted.
1790
+
1791
+ When the prop `foot-clone` is set, the footer headings will also allow sorting by clicking, even if
1792
+ you have custom formatted footer field headers. To disable the sort icons and sorting via heading
1793
+ clicks in the footer, set the `no-footer-sorting` prop to true.
1794
+
1795
+ ```html
1796
+ <template>
1797
+ <div>
1798
+ <b-table
1799
+ :items="items"
1800
+ :fields="fields"
1801
+ :sort-by.sync="sortBy"
1802
+ :sort-desc.sync="sortDesc"
1803
+ responsive="sm"
1804
+ ></b-table>
1805
+
1806
+ <div>
1807
+ Sorting By: <b>{{ sortBy }}</b>, Sort Direction:
1808
+ <b>{{ sortDesc ? 'Descending' : 'Ascending' }}</b>
1809
+ </div>
1810
+ </div>
1811
+ </template>
1812
+
1813
+ <script>
1814
+ export default {
1815
+ data() {
1816
+ return {
1817
+ sortBy: 'age',
1818
+ sortDesc: false,
1819
+ fields: [
1820
+ { key: 'last_name', sortable: true },
1821
+ { key: 'first_name', sortable: true },
1822
+ { key: 'age', sortable: true },
1823
+ { key: 'isActive', sortable: false }
1824
+ ],
1825
+ items: [
1826
+ { isActive: true, age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
1827
+ { isActive: false, age: 21, first_name: 'Larsen', last_name: 'Shaw' },
1828
+ { isActive: false, age: 89, first_name: 'Geneva', last_name: 'Wilson' },
1829
+ { isActive: true, age: 38, first_name: 'Jami', last_name: 'Carney' }
1830
+ ]
1831
+ }
1832
+ }
1833
+ }
1834
+ </script>
1835
+
1836
+ <!-- b-table-sorting.vue -->
1837
+ ```
1838
+
1839
+ ### Sort icon alignment
1840
+
1841
+ By default the sorting icons appear right aligned in the header cell. You can change the icons to be
1842
+ left aligned by setting the prop `sort-icon-left` on `<b-table>`.
1843
+
1844
+ ```html
1845
+ <template>
1846
+ <div>
1847
+ <b-table
1848
+ :items="items"
1849
+ :fields="fields"
1850
+ :sort-by.sync="sortBy"
1851
+ :sort-desc.sync="sortDesc"
1852
+ sort-icon-left
1853
+ responsive="sm"
1854
+ ></b-table>
1855
+
1856
+ <div>
1857
+ Sorting By: <b>{{ sortBy }}</b>, Sort Direction:
1858
+ <b>{{ sortDesc ? 'Descending' : 'Ascending' }}</b>
1859
+ </div>
1860
+ </div>
1861
+ </template>
1862
+
1863
+ <script>
1864
+ export default {
1865
+ data() {
1866
+ return {
1867
+ sortBy: 'age',
1868
+ sortDesc: false,
1869
+ fields: [
1870
+ { key: 'last_name', sortable: true },
1871
+ { key: 'first_name', sortable: true },
1872
+ { key: 'age', sortable: true },
1873
+ { key: 'isActive', sortable: false }
1874
+ ],
1875
+ items: [
1876
+ { isActive: true, age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
1877
+ { isActive: false, age: 21, first_name: 'Larsen', last_name: 'Shaw' },
1878
+ { isActive: false, age: 89, first_name: 'Geneva', last_name: 'Wilson' },
1879
+ { isActive: true, age: 38, first_name: 'Jami', last_name: 'Carney' }
1880
+ ]
1881
+ }
1882
+ }
1883
+ }
1884
+ </script>
1885
+
1886
+ <!-- b-table-sorting-left.vue -->
1887
+ ```
1888
+
1889
+ ### Customizing the sort icons
1890
+
1891
+ The sorting icons are generated via the use of SVG background images. The icons can be altered by
1892
+ updating BootstrapVue's SASS/SCSS variables and recompiling the SCSS source code. Refer to the
1893
+ [theming](/docs/reference/theming) section for details on customizing Bootstrap and BootstrapVue's
1894
+ generated CSS.
1895
+
1896
+ ### Sort-compare routine
1897
+
1898
+ The internal built-in default `sort-compare` function sorts the specified field `key` based on the
1899
+ data in the underlying record object (or by formatted value if a field has a formatter function, and
1900
+ the field has its `sortByFormatted` property is set to `true`). The field value is first stringified
1901
+ if it is an object and then sorted.
1902
+
1903
+ **Notes:**
1904
+
1905
+ - The built-in `sort-compare` routine **cannot** sort based on the custom rendering of the field
1906
+ data: scoped slots are used only for _presentation only_, and do not affect the underlying data.
1907
+ - Fields that have a [`formatter` function](#formatter-callback) (virtual field or regular field)
1908
+ can be sorted by the value returned via the formatter function if the
1909
+ [field](#field-definition-reference) property `sortByFormatted` is set to `true`. Optionally you
1910
+ can pass a formatter function reference to `sortByFormatted` to format the value before sorting.
1911
+ The default is `false` which will sort by the original field value. This is only applicable for
1912
+ the built-in sort-compare routine.
1913
+ - By default, the internal sorting routine will sort `null`, `undefined`, or empty string values
1914
+ first (less than any other values). To sort so that `null`, `undefined` or empty string values
1915
+ appear last (greater than any other value), set the `sort-null-last` prop to `true`.
1916
+
1917
+ For customizing the sort-compare handling, refer to the
1918
+ [Custom sort-compare routine](#custom-sort-compare-routine) section below.
1919
+
1920
+ ### Internal sorting and locale handling
1921
+
1922
+ The internal sort-compare routine uses
1923
+ [`String.prototype.localeCompare()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare)
1924
+ for comparing the stringified column value (if values being compared are not both `Number` or both
1925
+ `Date` types). The browser native `localeCompare()` method accepts a `locale` string (or array of
1926
+ locale strings) and an `options` object for controlling how strings are sorted. The default options
1927
+ are `{ numeric: true }`, and the locale is `undefined` (which uses the browser default locale).
1928
+
1929
+ You can change the locale (or locales) via the `sort-compare-locale` prop to set the locale(s) for
1930
+ sorting, as well as pass sort options via the `sort-compare-options` prop.
1931
+
1932
+ The `sort-compare-locale` prop defaults to `undefined`, which uses the browser (or Node.js runtime)
1933
+ default locale. The prop `sort-compare-locale` can either accept a
1934
+ [BCP 47 language tag](https://tools.ietf.org/html/rfc5646) string or an _array_ of such tags. For
1935
+ more details on locales, please see
1936
+ [Locale identification and negotiation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation)
1937
+ on MDN.
1938
+
1939
+ The `sort-compare-options` prop accepts an object containing any of the following properties:
1940
+
1941
+ - `localeMatcher`: The locale matching algorithm to use. Possible values are `'lookup'` and
1942
+ `'best fit'`. The default is `'best fit'`. For information about this option, see the
1943
+ [MDN Intl page](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_negotiation)
1944
+ for details.
1945
+ - `sensitivity`: Which differences in the strings should lead to _non-zero_ compare result values.
1946
+ Possible values are:
1947
+ - `'base'`: Only strings that differ in base letters compare as unequal. Examples: `a ≠ b`,
1948
+ `a = á`, `a = A`.
1949
+ - `'accent'`: Only strings that differ in base letters or accents and other diacritic marks
1950
+ compare as unequal. Examples: `a ≠ b`, `a ≠ á`, `a = A`.
1951
+ - `'case'`: Only strings that differ in base letters or case compare as unequal. Examples:
1952
+ `a ≠ b`, `a = á`, `a ≠ A`.
1953
+ - `'variant'`: **(default)** Strings that differ in base letters, accents and other diacritic
1954
+ marks, or case compare as unequal. Other differences _may also_ be taken into consideration.
1955
+ Examples: `a ≠ b`, `a ≠ á`, `a ≠ A`.
1956
+ - `ignorePunctuation`: Whether punctuation should be ignored. Possible values are `true` and
1957
+ `false`. The default is `false`.
1958
+ - `numeric`: Whether numeric collation should be used, such that `'1' < '2' < '10'`. Possible values
1959
+ are `true` and `false`. The default is `false`. Note that implementations (browsers, runtimes) are
1960
+ not required to support this property, and therefore it might be ignored.
1961
+ - `caseFirst`: Whether upper case or lower case should sort first. Possible values are `'upper'`,
1962
+ `'lower'`, or `'false'` (use the locale's default). The default is `'false'`. Implementations are
1963
+ not required to support this property.
1964
+ - `'usage'`: **Always** set to `'sort'` by `<b-table>`
1965
+
1966
+ **Example 1:** If you want to sort German words, set `sort-compare-locale="de"` (in German, `ä`
1967
+ sorts _before_ `z`) or Swedish set `sort-compare-locale="sv"` (in Swedish, `ä` sorts _after_ `z`)
1968
+
1969
+ **Example 2:** To compare numbers that are strings numerically, and to ignore case and accents:
1970
+
1971
+ ```html
1972
+ <b-table :sort-compare-options="{ numeric: true, sensitivity: 'base' }" ...>
1973
+ ```
1974
+
1975
+ **Notes:**
1976
+
1977
+ - Refer to
1978
+ [MDN `String.prototype.localeCompare()` documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare)
1979
+ for details on the options object property values.
1980
+ - Refer to
1981
+ [MDN locales documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#locales_argument)
1982
+ for details on locale values.
1983
+ - Not all browsers (or Node.js) support the `locale` and `options` with
1984
+ `String.prototype.localeCompare()`. Refer to [Can I use](https://caniuse.com/localecompare) for
1985
+ browser support. For Node.js, you may need to add in
1986
+ [Intl support](https://nodejs.org/api/intl.html) for handling locales, other than the default, to
1987
+ prevent [SSR hydration mismatch errors](https://ssr.vuejs.org/guide/hydration.html).
1988
+
1989
+ ### Custom sort-compare routine
1990
+
1991
+ You can provide your own custom sort compare routine by passing a function reference to the prop
1992
+ `sort-compare`. The `sort-compare` routine is passed seven (7) arguments, of which the last 4 are
1993
+ optional:
1994
+
1995
+ - the first two arguments (`a` and `b`) are the _record objects_ for the rows being compared
1996
+ - the third argument is the field `key` being sorted on (`sortBy`)
1997
+ - the fourth argument (`sortDesc`) is the order `<b-table>` will be displaying the records (`true`
1998
+ for descending, `false` for ascending)
1999
+ - the fifth argument is a reference to the field's [formatter function](#formatter-callback) or the
2000
+ field's `filterByFormatted` value if it is a function reference. If not formatter is found this
2001
+ value will be `undefined`. You will need to call this method to get the formatted field value:
2002
+ `valA = formatter(a[key], key, a)` and `valB = formatter(b[key], key, b)`, if you need to sort by
2003
+ the formatted value. This will be `undefined` if the field's `sortByFormatted` property is not
2004
+ `true` or is not a formatter function _reference_, or the fields formatter function cannot be
2005
+ found.
2006
+ - the sixth argument is the value of the `sort-compare-options` prop (default is
2007
+ `{ numeric: true }`)
2008
+ - the seventh argument is the value of the `sort-compare-locale` prop (default is `undefined`)
2009
+
2010
+ The sixth and seventh arguments can be used if you are using the
2011
+ [`String.prototype.localeCompare()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare)
2012
+ method to compare strings.
2013
+
2014
+ In most typical situations, you only need to use the first three arguments. The fourth argument -
2015
+ sorting direction - should not normally be used, as `b-table` will handle the direction, and this
2016
+ value is typically only needed when special handling of how `null` and/or `undefined` values are
2017
+ sorted (i.e. sorting `null`/`undefined` first or last).
2018
+
2019
+ The routine should return either `-1` (or a negative value) for `a[key] < b[key]` , `0` for
2020
+ `a[key] === b[key]`, or `1` (or a positive value) for `a[key] > b[key]`.
2021
+
2022
+ Your custom sort-compare routine can also return `null` or `false`, to fall back to the _built-in
2023
+ sort-compare routine_ for the particular `key`. You can use this feature (i.e. by returning `null`)
2024
+ to have your custom sort-compare routine handle _only_ certain fields (keys) such as the special
2025
+ case of virtual (scoped slot) columns, and have the internal (built in) sort-compare handle all
2026
+ _other_ fields.
2027
+
2028
+ The default sort-compare routine works similar to the following. Note the fourth argument (sorting
2029
+ direction) is **not** used in the sort comparison:
2030
+
2031
+ <!-- eslint-disable no-unused-vars, no-undef -->
2032
+
2033
+ ```js
2034
+ function sortCompare(aRow, bRow, key, sortDesc, formatter, compareOptions, compareLocale) {
2035
+ const a = aRow[key] // or use Lodash `_.get()`
2036
+ const b = bRow[key]
2037
+ if (
2038
+ (typeof a === 'number' && typeof b === 'number') ||
2039
+ (a instanceof Date && b instanceof Date)
2040
+ ) {
2041
+ // If both compared fields are native numbers or both are native dates
2042
+ return a < b ? -1 : a > b ? 1 : 0
2043
+ } else {
2044
+ // Otherwise stringify the field data and use String.prototype.localeCompare
2045
+ return toString(a).localeCompare(toString(b), compareLocale, compareOptions)
2046
+ }
2047
+ }
2048
+
2049
+ // Helper function to stringify the values of an Object
2050
+ function toString(value) {
2051
+ if (value === null || typeof value === 'undefined') {
2052
+ return ''
2053
+ } else if (value instanceof Object) {
2054
+ return Object.keys(value)
2055
+ .sort()
2056
+ .map(key => toString(value[key]))
2057
+ .join(' ')
2058
+ } else {
2059
+ return String(value)
2060
+ }
2061
+ }
2062
+ ```
2063
+
2064
+ ### Disable local sorting
2065
+
2066
+ If you want to handle sorting entirely in your app, you can disable the local sorting in `<b-table>`
2067
+ by setting the prop `no-local-sorting` to `true`, while still maintaining the sortable header
2068
+ functionality (via `sort-changed` or `context-changed` events as well as syncable props).
2069
+
2070
+ You can use the syncable props `sort-by.sync` and `sort-desc.sync` to detect changes in sorting
2071
+ column and direction.
2072
+
2073
+ Also, When a sortable column header (or footer) is clicked, the event `sort-changed` will be emitted
2074
+ with a single argument containing the context object of `<b-table>`. See the
2075
+ [Detection of sorting change](#detection-of-sorting-change) section below for details about the
2076
+ sort-changed event and the context object.
2077
+
2078
+ When `no-local-sorting` is `true`, the `sort-compare` prop has no effect.
2079
+
2080
+ ### Change initial sort direction
2081
+
2082
+ Control the order in which ascending and descending sorting is applied when a sortable column header
2083
+ is clicked, by using the `sort-direction` prop. The default value `'asc'` applies ascending sort
2084
+ first (when a column is not currently sorted). To reverse the behavior and sort in descending
2085
+ direction first, set it to `'desc'`.
2086
+
2087
+ If you don't want the current sorting direction to change when clicking another sortable column
2088
+ header, set `sort-direction` to `'last'`. This will maintain the sorting direction of the previously
2089
+ sorted column.
2090
+
2091
+ For individual column initial sort direction (which applies when the column transitions from
2092
+ unsorted to sorted), specify the property `sortDirection` in `fields`. See the
2093
+ [Complete Example](#complete-example) below for an example of using this feature.
2094
+
2095
+ ## Filtering
2096
+
2097
+ Filtering, when used, is applied by default to the **original items** array data. `b-table` provides
2098
+ several options for how data is filtered.
2099
+
2100
+ It is currently not possible to filter based on result of formatting via
2101
+ [scoped field slots](#scoped-field-slots).
2102
+
2103
+ ### Built in filtering
2104
+
2105
+ The item's row data values are stringified (see the sorting section above for how stringification is
2106
+ done) and the filter searches that stringified data (excluding any of the special properties that
2107
+ begin with an underscore `'_'`). The stringification also, by default, includes any data not shown
2108
+ in the presented columns.
2109
+
2110
+ With the default built-in filter function, the `filter` prop value can either be a string or a
2111
+ `RegExp` object (regular expressions should _not_ have the `/g` global flag set).
2112
+
2113
+ If the stringified row contains the provided string value or matches the RegExp expression then it
2114
+ is included in the displayed results.
2115
+
2116
+ Set the `filter` prop to `null` or an empty string to clear the current filter.
2117
+
2118
+ ### Built in filtering options
2119
+
2120
+ There are several options for controlling what data the filter is applied against.
2121
+
2122
+ - The `filter-ignored-fields` prop accepts an array of _top-level_ (immediate properties of the row
2123
+ data) field keys that should be ignored when filtering.
2124
+ - The `filter-included-fields` prop accepts an array of _top-level_ (immediate properties of the row
2125
+ data) field keys that should used when filtering. All other field keys not included in this array
2126
+ will be ignored. This feature can be handy when you want to filter on specific columns. If the
2127
+ specified array is empty, then _all_ fields are included, except those specified via the prop
2128
+ `filter-ignored-fields`. If a field key is specified in both `filter-ignored-fields` and
2129
+ `filter-included-fields`, then `filter-included-fields` takes precedence.
2130
+ - Normally, `<b-table>` filters based on the stringified record data. If the field has a `formatter`
2131
+ function specified, you can optionally filter based on the result of the formatter by setting the
2132
+ [field definition property](#field-definition-reference) `filterByFormatted` to `true`. If the
2133
+ field does not have a formatter function, this option is ignored. You can optionally pass a
2134
+ formatter function _reference_, to be used for filtering only, to the field definition property
2135
+ `filterByFormatted`.
2136
+
2137
+ The props `filter-ignored-fields` and `filter-included-fields`, and the field definition property
2138
+ `filterByFormatted` have no effect when using a [custom filter function](#custom-filter-function),
2139
+ or [items provider](#using-items-provider-functions) based filtering.
2140
+
2141
+ ### Custom filter function
2142
+
2143
+ You can also use a custom filter function, by setting the prop `filter-function` to a reference of
2144
+ custom filter test function. The filter function will be passed two arguments:
2145
+
2146
+ - the original item row record data object. **Treat this argument as read-only.**
2147
+ - the content of the `filter` prop (could be a string, RegExp, array, or object)
2148
+
2149
+ The function should return `true` if the record matches your criteria or `false` if the record is to
2150
+ be filtered out.
2151
+
2152
+ For proper reactive updates to the displayed data, when not filtering you should set the `filter`
2153
+ prop to `null` or an empty string (and not an empty object or array). The filter function will not
2154
+ be called when the `filter` prop is a falsey value.
2155
+
2156
+ The display of the `empty-filter-text` relies on the truthiness of the `filter` prop.
2157
+
2158
+ ### Filter events
2159
+
2160
+ When local filtering is applied, and the resultant number of items change, `<b-table>` will emit the
2161
+ `filtered` event with a two arguments:
2162
+
2163
+ - an array reference which is the complete list of items passing the filter routine. **Treat this
2164
+ argument as read-only.**
2165
+ - the number of records that passed the filter test (the length of the first argument)
2166
+
2167
+ Setting the prop `filter` to null or an empty string will clear local items filtering.
2168
+
2169
+ ### Debouncing filter criteria changes
2170
+
2171
+ <span class="badge badge-warning small">deprecated in v2.1.0</span> Use the `debounce` feature of
2172
+ [`<b-form-input>`](/docs/components/form-input#debounce-support) instead.
2173
+
2174
+ If you have a text input tied to the `filter` prop of `<b-table>`, the filtering process will occur
2175
+ for each character typed by the user. With large items datasets, this process can take a while and
2176
+ may cause the text input to appear sluggish.
2177
+
2178
+ To help alleviate this type of situation, `<b-table>` accepts a debounce timeout value (in
2179
+ milliseconds) via the `filter-debounce` prop. The default is `0` (milliseconds). When a value
2180
+ greater than `0` is provided, the filter will wait for that time before updating the table results.
2181
+ If the value of the `filter` prop changes before this timeout expires, the filtering will be once
2182
+ again delayed until the debounce timeout expires.
2183
+
2184
+ When used, the suggested value of `filter-debounce` should be in the range of `100` to `200`
2185
+ milliseconds, but other values may be more suitable for your use case.
2186
+
2187
+ The use of this prop can be beneficial when using provider filtering with
2188
+ [items provider functions](#using-items-provider-functions), to help reduce the number of calls to
2189
+ your back end API.
2190
+
2191
+ ### Filtering notes
2192
+
2193
+ See the [Complete Example](#complete-example) below for an example of using the `filter` feature.
2194
+
2195
+ ## Pagination
2196
+
2197
+ `<b-table>` supports built in pagination of item data. You can control how many rows are displayed
2198
+ at a time by setting the `per-page` prop to the maximum number of rows you would like displayed, and
2199
+ use the `current-page` prop to specify which page to display (starting from page `1`). If you set
2200
+ `current-page` to a value larger than the computed number of pages, then no rows will be shown.
2201
+
2202
+ You can use the [`<b-pagination>`](/docs/components/pagination) component in conjunction with
2203
+ `<b-table>` for providing control over pagination.
2204
+
2205
+ Setting `per-page` to `0` (default) will disable the local items pagination feature.
2206
+
2207
+ ## Using items provider functions
2208
+
2209
+ As mentioned under the [Items](#items-record-data) prop section, it is possible to use a function to
2210
+ provide the row data (items), by specifying a function reference via the `items` prop.
2211
+
2212
+ The provider function is called with the following signature:
2213
+
2214
+ <!-- eslint-disable no-undef -->
2215
+
2216
+ ```js
2217
+ provider(ctx, [callback])
2218
+ ```
2219
+
2220
+ The `ctx` is the context object associated with the table state, and contains the following
2221
+ properties:
2222
+
2223
+ | Property | Type | Description |
2224
+ | ------------- | -------------------------- | --------------------------------------------------------------------------------- |
2225
+ | `currentPage` | Number | The current page number (starting from 1, the value of the `current-page` prop) |
2226
+ | `perPage` | Number | The maximum number of rows per page to display (the value of the `per-page` prop) |
2227
+ | `filter` | String or RegExp or Object | The value of the `filter` prop |
2228
+ | `sortBy` | String | The current column key being sorted, or an empty string if not sorting |
2229
+ | `sortDesc` | Boolean | The current sort direction (`true` for descending, `false` for ascending) |
2230
+ | `apiUrl` | String | The value provided to the `api-url` prop. `null` if none provided. |
2231
+
2232
+ The second argument `callback` is an optional parameter for when using the callback asynchronous
2233
+ method.
2234
+
2235
+ **Example: returning an array of data (synchronous):**
2236
+
2237
+ <!-- eslint-disable no-unused-vars, prefer-const -->
2238
+
2239
+ ```js
2240
+ function myProvider() {
2241
+ let items = []
2242
+
2243
+ // Perform any items processing needed
2244
+
2245
+ // Must return an array
2246
+ return items || []
2247
+ }
2248
+ ```
2249
+
2250
+ **Example: Using callback to return data (asynchronous):**
2251
+
2252
+ <!-- eslint-disable no-unused-vars, node/no-callback-literal -->
2253
+
2254
+ ```js
2255
+ function myProvider(ctx, callback) {
2256
+ const params = '?page=' + ctx.currentPage + '&size=' + ctx.perPage
2257
+
2258
+ this.fetchData('/some/url' + params)
2259
+ .then(data => {
2260
+ // Pluck the array of items off our axios response
2261
+ const items = data.items
2262
+ // Provide the array of items to the callback
2263
+ callback(items)
2264
+ })
2265
+ .catch(() => {
2266
+ callback([])
2267
+ })
2268
+
2269
+ // Must return null or undefined to signal b-table that callback is being used
2270
+ return null
2271
+ }
2272
+ ```
2273
+
2274
+ **Example: Using a Promise to return data (asynchronous):**
2275
+
2276
+ <!-- eslint-disable no-unused-vars, no-undef -->
2277
+
2278
+ ```js
2279
+ function myProvider(ctx) {
2280
+ const promise = axios.get('/some/url?page=' + ctx.currentPage + '&size=' + ctx.perPage)
2281
+
2282
+ // Must return a promise that resolves to an array of items
2283
+ return promise.then(data => {
2284
+ // Pluck the array of items off our axios response
2285
+ const items = data.items
2286
+ // Must return an array of items or an empty array if an error occurred
2287
+ return items || []
2288
+ })
2289
+ }
2290
+ ```
2291
+
2292
+ **Example: Using an async function (semi-synchronous):**
2293
+
2294
+ Using an async method to return an items array is possible:
2295
+
2296
+ <!-- eslint-disable no-unused-vars, no-undef -->
2297
+
2298
+ ```js
2299
+ async function myProvider(ctx) {
2300
+ try {
2301
+ const response = await axios.get(`/some/url?page=${ctx.currentPage}&size=${ctx.perPage}`)
2302
+ return response.items
2303
+ } catch (error) {
2304
+ return []
2305
+ }
2306
+ }
2307
+ ```
2308
+
2309
+ Note that not all browsers support `async/await` natively. For browsers that do not support `async`
2310
+ methods, you will need to transpile your code.
2311
+
2312
+ ### Automated table busy state
2313
+
2314
+ `<b-table>` automatically tracks/controls its `busy` state when items provider functions are used,
2315
+ however it also provides a `busy` prop that can be used either to override the inner `busy` state,
2316
+ or to monitor `<b-pagination>`'s current busy state in your application using the 2-way `.sync`
2317
+ modifier.
2318
+
2319
+ **Note:** in order to allow `<b-table>` fully track its `busy` state, the custom items provider
2320
+ function should handle errors from data sources and return an empty array to `<b-table>`.
2321
+
2322
+ **Example: usage of busy state**
2323
+
2324
+ ```html
2325
+ <template>
2326
+ <div>
2327
+ <b-table
2328
+ id="my-table"
2329
+ :busy.sync="isBusy"
2330
+ :items="myProvider"
2331
+ :fields="fields"
2332
+ ...
2333
+ ></b-table>
2334
+ </div>
2335
+ </template>
2336
+
2337
+ <script>
2338
+ export default {
2339
+ data () {
2340
+ return {
2341
+ isBusy: false
2342
+ }
2343
+ }
2344
+ methods: {
2345
+ myProvider () {
2346
+ // Here we don't set isBusy prop, so busy state will be
2347
+ // handled by table itself
2348
+ // this.isBusy = true
2349
+ let promise = axios.get('/some/url')
2350
+
2351
+ return promise.then((data) => {
2352
+ const items = data.items
2353
+ // Here we could override the busy state, setting isBusy to false
2354
+ // this.isBusy = false
2355
+ return(items)
2356
+ }).catch(error => {
2357
+ // Here we could override the busy state, setting isBusy to false
2358
+ // this.isBusy = false
2359
+ // Returning an empty array, allows table to correctly handle
2360
+ // internal busy state in case of error
2361
+ return []
2362
+ })
2363
+ }
2364
+ }
2365
+ }
2366
+ </script>
2367
+ ```
2368
+
2369
+ If using an `async/await` provider:
2370
+
2371
+ <!-- eslint-disable no-unused-vars, no-undef -->
2372
+
2373
+ ```js
2374
+ async function myProvider(ctx) {
2375
+ this.isBusy = true
2376
+ try {
2377
+ const response = await axios.get(`/some/url?page=${ctx.currentPage}&size=${ctx.perPage}`)
2378
+ this.isBusy = false
2379
+ return response.items
2380
+ } catch (error) {
2381
+ this.isBusy = false
2382
+ return []
2383
+ }
2384
+ }
2385
+ ```
2386
+
2387
+ **Notes:**
2388
+
2389
+ - If you manually place the table in the `busy` state, the items provider will **not** be
2390
+ called/refreshed until the `busy` state has been set to `false`.
2391
+ - All click related and hover events, and sort-changed events will **not** be emitted when in the
2392
+ `busy` state (either set automatically during provider update, or when manually set).
2393
+
2394
+ ### Provider paging, filtering, and sorting
2395
+
2396
+ By default, the items provider function is responsible for **all paging, filtering, and sorting** of
2397
+ the data, before passing it to `b-table` for display.
2398
+
2399
+ You can disable provider paging, filtering, and sorting (individually) by setting the following
2400
+ `b-table` prop(s) to `true`:
2401
+
2402
+ | Prop | Type | Default | Description |
2403
+ | ----------------------- | ------- | ------- | -------------------------------------------------------------- |
2404
+ | `no-provider-paging` | Boolean | `false` | When `true` enables the use of `b-table` local data pagination |
2405
+ | `no-provider-sorting` | Boolean | `false` | When `true` enables the use of `b-table` local sorting |
2406
+ | `no-provider-filtering` | Boolean | `false` | When `true` enables the use of `b-table` local filtering |
2407
+
2408
+ When `no-provider-paging` is `false` (default), you should only return at maximum, `perPage` number
2409
+ of records.
2410
+
2411
+ **Notes:**
2412
+
2413
+ - `<b-table>` needs reference to your pagination and filtering values in order to trigger the
2414
+ calling of the provider function. So be sure to bind to the `per-page`, `current-page` and
2415
+ `filter` props on `b-table` to trigger the provider update function call (unless you have the
2416
+ respective `no-provider-*` prop set to `true`).
2417
+ - The `no-local-sorting` prop has no effect when `items` is a provider function.
2418
+ - When using provider filtering, you may find that setting the
2419
+ [`debounce` prop on `<b-form-input>`](/docs/components/form-input#debounce-support) to a value
2420
+ greater than `100` ms will help minimize the number of calls to your back end API as the user
2421
+ types in the criteria.
2422
+
2423
+ ### Force refreshing of table data
2424
+
2425
+ You may also trigger the refresh of the provider function by emitting the event `refresh::table` on
2426
+ `$root` with the single argument being the `id` of your `b-table`. You must have a unique ID on your
2427
+ table for this to work.
2428
+
2429
+ ```js
2430
+ this.$root.$emit('bv::refresh::table', 'my-table')
2431
+ ```
2432
+
2433
+ Or by calling the `refresh()` method on the table reference
2434
+
2435
+ ```html
2436
+ <div>
2437
+ <b-table ref="table" ... ></b-table>
2438
+ </div>
2439
+ ```
2440
+
2441
+ ```js
2442
+ this.$refs.table.refresh()
2443
+ ```
2444
+
2445
+ **Note:** If the table is in the `busy` state (i.e. a provider update is currently running), the
2446
+ refresh will wait until the current update is completed. If there is currently a refresh pending and
2447
+ a new refresh is requested, then only one refresh will occur.
2448
+
2449
+ ### Detection of sorting change
2450
+
2451
+ By listening on `<b-table>` `sort-changed` event, you can detect when the sorting key and direction
2452
+ have changed.
2453
+
2454
+ ```html
2455
+ <div>
2456
+ <b-table @sort-changed="sortingChanged" ... ></b-table>
2457
+ </div>
2458
+ ```
2459
+
2460
+ The `sort-changed` event provides a single argument of the table's current state context object.
2461
+ This context object has the same format as used by items provider functions.
2462
+
2463
+ <!-- eslint-disable no-unused-vars -->
2464
+
2465
+ ```js
2466
+ export default {
2467
+ methods: {
2468
+ sortingChanged(ctx) {
2469
+ // ctx.sortBy ==> Field key for sorting by (or null for no sorting)
2470
+ // ctx.sortDesc ==> true if sorting descending, false otherwise
2471
+ }
2472
+ }
2473
+ }
2474
+ ```
2475
+
2476
+ You can also obtain the current sortBy and sortDesc values by using the `:sort-by.sync` and
2477
+ `:sort-desc.sync` two-way props respectively (see section [Sorting](#sorting) above for details).
2478
+
2479
+ ```html
2480
+ <div>
2481
+ <b-table :sort-by.sync="mySortBy" :sort-desc.sync="mySortDesc" ... ></b-table>
2482
+ </div>
2483
+ ```
2484
+
2485
+ ### Server side rendering
2486
+
2487
+ Special care must be taken when using server side rendering (SSR) and an `items` provider function.
2488
+ Make sure you handle any special situations that may be needed server side when fetching your data!
2489
+
2490
+ When `<b-table>` is mounted in the document, it will automatically trigger a provider update call.
2491
+
2492
+ ## Light-weight tables
2493
+
2494
+ `<b-table-lite>` provides a great alternative to `<b-table>` if you just need simple display of
2495
+ tabular data. The `<b-table-lite>` component provides all of the styling and formatting features of
2496
+ `<b-table>` (including row details and stacked support), while **excluding** the following features:
2497
+
2498
+ - Filtering
2499
+ - Sorting
2500
+ - Pagination
2501
+ - Items provider support
2502
+ - Selectable rows
2503
+ - Busy table state and styling
2504
+ - Fixed top and bottom rows
2505
+ - Empty row support
2506
+
2507
+ ### Table lite as a plugin
2508
+
2509
+ The `TablePlugin` includes `<b-table-lite>`. For convenience, BootstrapVue also provides a
2510
+ `TableLitePlugin` which installs only `<b-table-lite>`. `TableLitePlugin` is available as a top
2511
+ level named export.
2512
+
2513
+ ## Simple tables
2514
+
2515
+ The `<b-table-simple>` component gives the user complete control over the rendering of the table
2516
+ content, while providing basic Bootstrap v4 table styling. `<b-table-simple>` is a wrapper component
2517
+ around the `<table>` element. Inside the component, via the `default` slot, you can use any or all
2518
+ of the BootstrapVue [table helper components](#table-helper-components): `<b-thead>`, `<b-tfoot>`,
2519
+ `<b-tbody>`, `<b-tr>`, `<b-th>`, `<b-td>`, and the HTML5 elements `<caption>`, `<colgroup>` and
2520
+ `<col>`. Contrary to the component's name, one can create simple or complex table layouts with
2521
+ `<b-table-simple>`.
2522
+
2523
+ `<b-table-simple>` provides basic styling options via props: `striped`, `bordered`, `borderless`,
2524
+ `outlined`, `small`, `hover`, `dark`, `fixed`, `responsive` and `sticky-header`. Note that `stacked`
2525
+ mode is available but requires some additional markup to generate the cell headings, as described in
2526
+ the [Simple tables and stacked mode](#simple-tables-and-stacked-mode) section below. Sticky columns
2527
+ are also supported, but also require a bit of additional markup to specify which columns are to be
2528
+ sticky. See below for more information on using [sticky columns](#simple-tables-and-sticky-columns).
2529
+
2530
+ Since `b-table-simple` is just a wrapper component, of which you will need to render content inside,
2531
+ it does not provide any of the advanced features of `<b-table>` (i.e. row events, head events,
2532
+ sorting, pagination, filtering, foot-clone, items, fields, etc.).
2533
+
2534
+ ```html
2535
+ <div>
2536
+ <b-table-simple hover small caption-top responsive>
2537
+ <caption>Items sold in August, grouped by Country and City:</caption>
2538
+ <colgroup><col><col></colgroup>
2539
+ <colgroup><col><col><col></colgroup>
2540
+ <colgroup><col><col></colgroup>
2541
+ <b-thead head-variant="dark">
2542
+ <b-tr>
2543
+ <b-th colspan="2">Region</b-th>
2544
+ <b-th colspan="3">Clothes</b-th>
2545
+ <b-th colspan="2">Accessories</b-th>
2546
+ </b-tr>
2547
+ <b-tr>
2548
+ <b-th>Country</b-th>
2549
+ <b-th>City</b-th>
2550
+ <b-th>Trousers</b-th>
2551
+ <b-th>Skirts</b-th>
2552
+ <b-th>Dresses</b-th>
2553
+ <b-th>Bracelets</b-th>
2554
+ <b-th>Rings</b-th>
2555
+ </b-tr>
2556
+ </b-thead>
2557
+ <b-tbody>
2558
+ <b-tr>
2559
+ <b-th rowspan="3">Belgium</b-th>
2560
+ <b-th class="text-right">Antwerp</b-th>
2561
+ <b-td>56</b-td>
2562
+ <b-td>22</b-td>
2563
+ <b-td>43</b-td>
2564
+ <b-td variant="success">72</b-td>
2565
+ <b-td>23</b-td>
2566
+ </b-tr>
2567
+ <b-tr>
2568
+ <b-th class="text-right">Gent</b-th>
2569
+ <b-td>46</b-td>
2570
+ <b-td variant="warning">18</b-td>
2571
+ <b-td>50</b-td>
2572
+ <b-td>61</b-td>
2573
+ <b-td variant="danger">15</b-td>
2574
+ </b-tr>
2575
+ <b-tr>
2576
+ <b-th class="text-right">Brussels</b-th>
2577
+ <b-td>51</b-td>
2578
+ <b-td>27</b-td>
2579
+ <b-td>38</b-td>
2580
+ <b-td>69</b-td>
2581
+ <b-td>28</b-td>
2582
+ </b-tr>
2583
+ <b-tr>
2584
+ <b-th rowspan="2">The Netherlands</b-th>
2585
+ <b-th class="text-right">Amsterdam</b-th>
2586
+ <b-td variant="success">89</b-td>
2587
+ <b-td>34</b-td>
2588
+ <b-td>69</b-td>
2589
+ <b-td>85</b-td>
2590
+ <b-td>38</b-td>
2591
+ </b-tr>
2592
+ <b-tr>
2593
+ <b-th class="text-right">Utrecht</b-th>
2594
+ <b-td>80</b-td>
2595
+ <b-td variant="danger">12</b-td>
2596
+ <b-td>43</b-td>
2597
+ <b-td>36</b-td>
2598
+ <b-td variant="warning">19</b-td>
2599
+ </b-tr>
2600
+ </b-tbody>
2601
+ <b-tfoot>
2602
+ <b-tr>
2603
+ <b-td colspan="7" variant="secondary" class="text-right">
2604
+ Total Rows: <b>5</b>
2605
+ </b-td>
2606
+ </b-tr>
2607
+ </b-tfoot>
2608
+ </b-table-simple>
2609
+ </div>
2610
+
2611
+ <!-- b-table-simple.vue -->
2612
+ ```
2613
+
2614
+ When in `responsive` or `sticky-header` mode, the `<table>` element is wrapped inside a `<div>`
2615
+ element. If you need to apply additional classes to the `<table>` element, use the `table-class`
2616
+ prop.
2617
+
2618
+ Any additional attributes given to `<b-table-simple>` will always be applied to the `<table>`
2619
+ element.
2620
+
2621
+ ### Simple tables and stacked mode
2622
+
2623
+ A bit of additional markup is required on your `<b-table-simple>` body cells when the table is in
2624
+ stacked mode. Specifically, BootstrapVue uses a special data attribute to create the cell's heading,
2625
+ of which you can supply to `<b-td>` or `<b-th>` via the `stacked-heading` prop. Only plain strings
2626
+ are supported (not HTML markup), as we use the pseudo element `::before` and css `content` property.
2627
+
2628
+ Here is the same table as above, set to be always stacked, which has the extra markup to handle
2629
+ stacked mode (specifically for generating the cell headings):
2630
+
2631
+ ```html
2632
+ <div>
2633
+ <b-table-simple hover small caption-top stacked>
2634
+ <caption>Items sold in August, grouped by Country and City:</caption>
2635
+ <colgroup><col><col></colgroup>
2636
+ <colgroup><col><col><col></colgroup>
2637
+ <colgroup><col><col></colgroup>
2638
+ <b-thead head-variant="dark">
2639
+ <b-tr>
2640
+ <b-th colspan="2">Region</b-th>
2641
+ <b-th colspan="3">Clothes</b-th>
2642
+ <b-th colspan="2">Accessories</b-th>
2643
+ </b-tr>
2644
+ <b-tr>
2645
+ <b-th>Country</b-th>
2646
+ <b-th>City</b-th>
2647
+ <b-th>Trousers</b-th>
2648
+ <b-th>Skirts</b-th>
2649
+ <b-th>Dresses</b-th>
2650
+ <b-th>Bracelets</b-th>
2651
+ <b-th>Rings</b-th>
2652
+ </b-tr>
2653
+ </b-thead>
2654
+ <b-tbody>
2655
+ <b-tr>
2656
+ <b-th rowspan="3" class="text-center">Belgium (3 Cities)</b-th>
2657
+ <b-th stacked-heading="City" class="text-left">Antwerp</b-th>
2658
+ <b-td stacked-heading="Clothes: Trousers">56</b-td>
2659
+ <b-td stacked-heading="Clothes: Skirts">22</b-td>
2660
+ <b-td stacked-heading="Clothes: Dresses">43</b-td>
2661
+ <b-td stacked-heading="Accessories: Bracelets" variant="success">72</b-td>
2662
+ <b-td stacked-heading="Accessories: Rings">23</b-td>
2663
+ </b-tr>
2664
+ <b-tr>
2665
+ <b-th stacked-heading="City">Gent</b-th>
2666
+ <b-td stacked-heading="Clothes: Trousers">46</b-td>
2667
+ <b-td stacked-heading="Clothes: Skirts" variant="warning">18</b-td>
2668
+ <b-td stacked-heading="Clothes: Dresses">50</b-td>
2669
+ <b-td stacked-heading="Accessories: Bracelets">61</b-td>
2670
+ <b-td stacked-heading="Accessories: Rings" variant="danger">15</b-td>
2671
+ </b-tr>
2672
+ <b-tr>
2673
+ <b-th stacked-heading="City">Brussels</b-th>
2674
+ <b-td stacked-heading="Clothes: Trousers">51</b-td>
2675
+ <b-td stacked-heading="Clothes: Skirts">27</b-td>
2676
+ <b-td stacked-heading="Clothes: Dresses">38</b-td>
2677
+ <b-td stacked-heading="Accessories: Bracelets">69</b-td>
2678
+ <b-td stacked-heading="Accessories: Rings">28</b-td>
2679
+ </b-tr>
2680
+ <b-tr>
2681
+ <b-th rowspan="2" class="text-center">The Netherlands (2 Cities)</b-th>
2682
+ <b-th stacked-heading="City">Amsterdam</b-th>
2683
+ <b-td stacked-heading="Clothes: Trousers" variant="success">89</b-td>
2684
+ <b-td stacked-heading="Clothes: Skirts">34</b-td>
2685
+ <b-td stacked-heading="Clothes: Dresses">69</b-td>
2686
+ <b-td stacked-heading="Accessories: Bracelets">85</b-td>
2687
+ <b-td stacked-heading="Accessories: Rings">38</b-td>
2688
+ </b-tr>
2689
+ <b-tr>
2690
+ <b-th stacked-heading="City">Utrecht</b-th>
2691
+ <b-td stacked-heading="Clothes: Trousers">80</b-td>
2692
+ <b-td stacked-heading="Clothes: Skirts" variant="danger">12</b-td>
2693
+ <b-td stacked-heading="Clothes: Dresses">43</b-td>
2694
+ <b-td stacked-heading="Accessories: Bracelets">36</b-td>
2695
+ <b-td stacked-heading="Accessories: Rings" variant="warning">19</b-td>
2696
+ </b-tr>
2697
+ </b-tbody>
2698
+ <b-tfoot>
2699
+ <b-tr>
2700
+ <b-td colspan="7" variant="secondary" class="text-right">
2701
+ Total Rows: <b>5</b>
2702
+ </b-td>
2703
+ </b-tr>
2704
+ </b-tfoot>
2705
+ </b-table-simple>
2706
+ </div>
2707
+
2708
+ <!-- b-table-simple-stacked.vue -->
2709
+ ```
2710
+
2711
+ Like `<b-table>` and `<b-table-lite>`, table headers (`<thead>`) and footers (`<tfoot>`) are
2712
+ visually hidden when the table is visually stacked. If you need a header or footer, you can do so by
2713
+ creating an extra `<b-tr>` inside of the `<b-tbody>` component (or in a second `<b-tbody>`
2714
+ component), and set a role of `columnheader` on the child `<b-th>` cells, and use Bootstrap v4
2715
+ [responsive display utility classes](/docs/reference/utility-classes) to hide the extra row (or
2716
+ `<b-tbody>`) above a certain breakpoint when the table is no longer visually stacked (the breakpoint
2717
+ should match the stacked table breakpoint you have set), i.e. `<b-tr class="d-md-none">` would hide
2718
+ the row on medium and wider screens, while `<b-tbody class="d-md-none">` would hide the row group on
2719
+ medium and wider screens.
2720
+
2721
+ **Note:** stacked mode with `<b-table-simple>` requires that you use the BootstrapVue
2722
+ [table helper components](#table-helper-components). Use of the regular `<tbody>`, `<tr>`, `<td>`
2723
+ and `<th>` element tags will not work as expected, nor will they automatically apply any of the
2724
+ required accessibility attributes.
2725
+
2726
+ ### Simple tables and sticky columns
2727
+
2728
+ Sticky columns are supported with `<b-table-simple>`, but you will need to set the `sticky-column`
2729
+ prop on each table cell (in the `thead`, `tbody`, and `tfoot` row groups) in the column that is to
2730
+ be sticky. For example:
2731
+
2732
+ ```html
2733
+ <b-table-simple responsive>
2734
+ <b-thead>
2735
+ <b-tr>
2736
+ <b-th sticky-column>Sticky Column Header</b-th>
2737
+ <b-th>Heading 1</b-th>
2738
+ <b-th>Heading 2</b-th>
2739
+ <b-th>Heading 3</b-th>
2740
+ <b-th>Heading 4</b-th>
2741
+ </b-tr>
2742
+ </b-thead>
2743
+ <b-tbody>
2744
+ <b-tr>
2745
+ <b-th sticky-column>Sticky Column Row Header</b-th>
2746
+ <b-td>Cell</b-td>
2747
+ <b-td>Cell</b-td>
2748
+ <b-td>Cell</b-td>
2749
+ <b-td>Cell</b-td>
2750
+ </b-tr>
2751
+ <b-tr>
2752
+ <b-th sticky-column>Sticky Column Row Header</b-th>
2753
+ <b-td>Cell</b-td>
2754
+ <b-td>Cell</b-td>
2755
+ <b-td>Cell</b-td>
2756
+ <b-td>Cell</b-td>
2757
+ </b-tr>
2758
+ </b-tbody>
2759
+ <b-tfoot>
2760
+ <b-tr>
2761
+ <b-th sticky-column>Sticky Column Footer</b-th>
2762
+ <b-th>Heading 1</b-th>
2763
+ <b-th>Heading 2</b-th>
2764
+ <b-th>Heading 3</b-th>
2765
+ <b-th>Heading 4</b-th>
2766
+ </b-tr>
2767
+ </b-tfoot>
2768
+ </b-table-simple>
2769
+ ```
2770
+
2771
+ As with `<b-table>` and `<b-table-lite>`, sticky columns are not supported when the `stacked` prop
2772
+ is set on `<b-table-simple>`.
2773
+
2774
+ ### Table simple as a plugin
2775
+
2776
+ The `TablePlugin` includes `<b-table-simple>` and all of the helper components. For convenience,
2777
+ BootstrapVue also provides a `TableSimplePlugin` which installs `<b-table-simple>` and all of the
2778
+ helper components. `TableSimplePlugin` is available as a top level named export.
2779
+
2780
+ ## Table helper components
2781
+
2782
+ BootstrapVue provides additional helper child components when using `<b-table-simple>`, or the named
2783
+ slots `top-row`, `bottom-row`, `thead-top`, and `custom-foot` (all of which accept table child
2784
+ elements). The helper components are as follows:
2785
+
2786
+ - `b-tbody` (`<b-table-simple>` only)
2787
+ - `b-thead` (`<b-table-simple>` only)
2788
+ - `b-tfoot` (`<b-table-simple>` only)
2789
+ - `b-tr`
2790
+ - `b-td`
2791
+ - `b-th`
2792
+
2793
+ These components are optimized to handle converting variants to the appropriate classes (such as
2794
+ handling table `dark` mode), and automatically applying certain accessibility attributes (i.e.
2795
+ `role`s and `scope`s). They also can generate the stacked table, and sticky header and column,
2796
+ markup. Components `<b-table>` and `<b-table-lite>` use these helper components internally.
2797
+
2798
+ In the [Simple tables](#simple-tables) example, we are using the helper components `<b-thead>`,
2799
+ `<b-tbody>`, `<b-tr>`, `<b-th>`, `<b-td>` and `<b-tfoot>`. While you can use regular table child
2800
+ elements (i.e. `<tbody>`, `<tr>`, `<td>`, etc.) within `<b-table-simple>`, and the named slots
2801
+ `top-row`, `bottom-row`, and `thead-top`, it is recommended to use these BootstrapVue table `<b-t*>`
2802
+ helper components. Note that there are no helper components for `<caption>`, `<colgroup>` or
2803
+ `<col>`, so you may use these three HTML5 elements directly in `<b-table-simple>`.
2804
+
2805
+ - Table helper components `<b-tr>`, `<b-td>` and `<b-th>` all accept a `variant` prop, which will
2806
+ apply one of the Bootstrap theme colors (custom theme colors are supported via
2807
+ [theming](/docs/reference/theming).) and will automatically adjust to use the correct variant
2808
+ class based on the table's `dark` mode.
2809
+ - The helper components `<b-thead>`, `<b-tfoot>` accept a `head-variant` and `foot-variant` prop
2810
+ respectively. Supported values are `'dark'`, `'light'` or `null` (`null` uses the default table
2811
+ background). These variants also control the text color (light text for `'dark'` variant, and dark
2812
+ text for the `'light'` variant).
2813
+ - Accessibility attributes `role` and `scope` are automatically set on `<b-th>` and `<b-td>`
2814
+ components based on their location (thead, tbody, or tfoot) and their `rowspan` or `colspan`
2815
+ props. You can override the automatic `scope` and `role` values by setting the appropriate
2816
+ attribute on the helper component.
2817
+ - For `<b-tbody>`, `<b-thead>`, and `<b-tfoot>` helper components, the appropriate default `role` of
2818
+ `'rowgroup'` will be applied, unless you override the role by supplying a `role` attribute.
2819
+ - For the `<b-tr>` helper component, the appropriate default `role` of `'row'` will be applied,
2820
+ unless you override the role by supplying a `role` attribute. `<b-tr>` does not add a `scope`.
2821
+ - The `<b-tbody>` element supports rendering a Vue `<transition-group>` when either, or both, of the
2822
+ `tbody-transition-props` and `tbody-transition-handlers` props are used. See the
2823
+ [Table body transition support](#table-body-transition-support) section for more details.
2824
+
2825
+ ## Accessibility
2826
+
2827
+ The `<b-table>` and `<b-table-lite>` components, when using specific features, will attempt to
2828
+ provide the best accessibility markup possible.
2829
+
2830
+ When using `<b-table-simple>` with the helper table components, elements will have the appropriate
2831
+ roles applied by default, of which you can optionally override. When using click handlers on the
2832
+ `<b-table-simple>` helper components, you will need to apply appropriate `aria-*` attributes, and
2833
+ set `tabindex="0"` to make the click actions accessible to screen reader and keyboard-only users.
2834
+ You should also listen for `@keydown.enter.prevent` to handle users pressing <kbd>Enter</kbd> to
2835
+ trigger your click on cells or rows (required for accessibility for keyboard-only users).
2836
+
2837
+ ### Heading accessibility
2838
+
2839
+ When a column (field) is sortable (`<b-table>` only) or there is a `head-clicked` listener
2840
+ registered (`<b-table>` and `<b-table-lite>`), the header (and footer) `<th>` cells will be placed
2841
+ into the document tab sequence (via `tabindex="0"`) for accessibility by keyboard-only and screen
2842
+ reader users, so that the user may trigger a click (by pressing <kbd>Enter</kbd> on the header
2843
+ cells.
2844
+
2845
+ ### Data row accessibility
2846
+
2847
+ When the table is in `selectable` mode (`<b-table>` only, and prop `no-select-on-click` is not set),
2848
+ or if there is a `row-clicked` event listener registered (`<b-table>` and `<b-table-lite>`), all
2849
+ data item rows (`<tr>` elements) will be placed into the document tab sequence (via `tabindex="0"`)
2850
+ to allow keyboard-only and screen reader users the ability to click the rows by pressing
2851
+ <kbd>Enter</kbd> or <kbd>Space</kbd>.
2852
+
2853
+ When the table items rows are placed in the document tab sequence (`<b-table>` and
2854
+ `<b-table-lite>`), they will also support basic keyboard navigation when focused:
2855
+
2856
+ - <kbd>Down</kbd> will move to the next row
2857
+ - <kbd>Up</kbd> will move to the previous row
2858
+ - <kbd>End</kbd> or <kbd>Down</kbd>+<kbd>Shift</kbd> will move to the last row
2859
+ - <kbd>Home</kbd> or <kbd>Up</kbd>+<kbd>Shift</kbd> will move to the first row
2860
+ - <kbd>Enter</kbd> or <kbd>Space</kbd> to click the row.
2861
+
2862
+ ### Row event accessibility
2863
+
2864
+ Note the following row based events/actions (available with `<b-table>` and `<b-table-lite>`) are
2865
+ not considered accessible, and should only be used if the functionality is non critical or can be
2866
+ provided via other means:
2867
+
2868
+ - `row-dblclicked`
2869
+ - `row-contextmenu`
2870
+ - `row-hovered`
2871
+ - `row-unhovered`
2872
+ - `row-middle-clicked`
2873
+
2874
+ Note that the `row-middle-clicked` event is not supported in all browsers (i.e. IE, Safari and most
2875
+ mobile browsers). When listening for `row-middle-clicked` events originating on elements that do not
2876
+ support input or navigation, you will often want to explicitly prevent other default actions mapped
2877
+ to the down action of the middle mouse button. On Windows this is usually autoscroll, and on macOS
2878
+ and Linux this is usually clipboard paste. This can be done by preventing the default behaviour of
2879
+ the `mousedown` or `pointerdown` event.
2880
+
2881
+ Additionally, you may need to avoid opening a default system or browser context menu after a right
2882
+ click. Due to timing differences between operating systems, this too is not a preventable default
2883
+ behaviour of `row-middle-clicked`. Instead, this can be done by preventing the default behaviour of
2884
+ the `row-contextmenu` event.
2885
+
2886
+ It is recommended you test your app in as many browser and device variants as possible to ensure
2887
+ your app handles the various inconsistencies with events.
2888
+
2889
+ ## Complete example
2890
+
2891
+ ```html
2892
+ <template>
2893
+ <b-container fluid>
2894
+ <!-- User Interface controls -->
2895
+ <b-row>
2896
+ <b-col lg="6" class="my-1">
2897
+ <b-form-group
2898
+ label="Sort"
2899
+ label-for="sort-by-select"
2900
+ label-cols-sm="3"
2901
+ label-align-sm="right"
2902
+ label-size="sm"
2903
+ class="mb-0"
2904
+ v-slot="{ ariaDescribedby }"
2905
+ >
2906
+ <b-input-group size="sm">
2907
+ <b-form-select
2908
+ id="sort-by-select"
2909
+ v-model="sortBy"
2910
+ :options="sortOptions"
2911
+ :aria-describedby="ariaDescribedby"
2912
+ class="w-75"
2913
+ >
2914
+ <template #first>
2915
+ <option value="">-- none --</option>
2916
+ </template>
2917
+ </b-form-select>
2918
+
2919
+ <b-form-select
2920
+ v-model="sortDesc"
2921
+ :disabled="!sortBy"
2922
+ :aria-describedby="ariaDescribedby"
2923
+ size="sm"
2924
+ class="w-25"
2925
+ >
2926
+ <option :value="false">Asc</option>
2927
+ <option :value="true">Desc</option>
2928
+ </b-form-select>
2929
+ </b-input-group>
2930
+ </b-form-group>
2931
+ </b-col>
2932
+
2933
+ <b-col lg="6" class="my-1">
2934
+ <b-form-group
2935
+ label="Initial sort"
2936
+ label-for="initial-sort-select"
2937
+ label-cols-sm="3"
2938
+ label-align-sm="right"
2939
+ label-size="sm"
2940
+ class="mb-0"
2941
+ >
2942
+ <b-form-select
2943
+ id="initial-sort-select"
2944
+ v-model="sortDirection"
2945
+ :options="['asc', 'desc', 'last']"
2946
+ size="sm"
2947
+ ></b-form-select>
2948
+ </b-form-group>
2949
+ </b-col>
2950
+
2951
+ <b-col lg="6" class="my-1">
2952
+ <b-form-group
2953
+ label="Filter"
2954
+ label-for="filter-input"
2955
+ label-cols-sm="3"
2956
+ label-align-sm="right"
2957
+ label-size="sm"
2958
+ class="mb-0"
2959
+ >
2960
+ <b-input-group size="sm">
2961
+ <b-form-input
2962
+ id="filter-input"
2963
+ v-model="filter"
2964
+ type="search"
2965
+ placeholder="Type to Search"
2966
+ ></b-form-input>
2967
+
2968
+ <b-input-group-append>
2969
+ <b-button :disabled="!filter" @click="filter = ''">Clear</b-button>
2970
+ </b-input-group-append>
2971
+ </b-input-group>
2972
+ </b-form-group>
2973
+ </b-col>
2974
+
2975
+ <b-col lg="6" class="my-1">
2976
+ <b-form-group
2977
+ v-model="sortDirection"
2978
+ label="Filter On"
2979
+ description="Leave all unchecked to filter on all data"
2980
+ label-cols-sm="3"
2981
+ label-align-sm="right"
2982
+ label-size="sm"
2983
+ class="mb-0"
2984
+ v-slot="{ ariaDescribedby }"
2985
+ >
2986
+ <b-form-checkbox-group
2987
+ v-model="filterOn"
2988
+ :aria-describedby="ariaDescribedby"
2989
+ class="mt-1"
2990
+ >
2991
+ <b-form-checkbox value="name">Name</b-form-checkbox>
2992
+ <b-form-checkbox value="age">Age</b-form-checkbox>
2993
+ <b-form-checkbox value="isActive">Active</b-form-checkbox>
2994
+ </b-form-checkbox-group>
2995
+ </b-form-group>
2996
+ </b-col>
2997
+
2998
+ <b-col sm="5" md="6" class="my-1">
2999
+ <b-form-group
3000
+ label="Per page"
3001
+ label-for="per-page-select"
3002
+ label-cols-sm="6"
3003
+ label-cols-md="4"
3004
+ label-cols-lg="3"
3005
+ label-align-sm="right"
3006
+ label-size="sm"
3007
+ class="mb-0"
3008
+ >
3009
+ <b-form-select
3010
+ id="per-page-select"
3011
+ v-model="perPage"
3012
+ :options="pageOptions"
3013
+ size="sm"
3014
+ ></b-form-select>
3015
+ </b-form-group>
3016
+ </b-col>
3017
+
3018
+ <b-col sm="7" md="6" class="my-1">
3019
+ <b-pagination
3020
+ v-model="currentPage"
3021
+ :total-rows="totalRows"
3022
+ :per-page="perPage"
3023
+ align="fill"
3024
+ size="sm"
3025
+ class="my-0"
3026
+ ></b-pagination>
3027
+ </b-col>
3028
+ </b-row>
3029
+
3030
+ <!-- Main table element -->
3031
+ <b-table
3032
+ :items="items"
3033
+ :fields="fields"
3034
+ :current-page="currentPage"
3035
+ :per-page="perPage"
3036
+ :filter="filter"
3037
+ :filter-included-fields="filterOn"
3038
+ :sort-by.sync="sortBy"
3039
+ :sort-desc.sync="sortDesc"
3040
+ :sort-direction="sortDirection"
3041
+ stacked="md"
3042
+ show-empty
3043
+ small
3044
+ @filtered="onFiltered"
3045
+ >
3046
+ <template #cell(name)="row">
3047
+ {{ row.value.first }} {{ row.value.last }}
3048
+ </template>
3049
+
3050
+ <template #cell(actions)="row">
3051
+ <b-button size="sm" @click="info(row.item, row.index, $event.target)" class="mr-1">
3052
+ Info modal
3053
+ </b-button>
3054
+ <b-button size="sm" @click="row.toggleDetails">
3055
+ {{ row.detailsShowing ? 'Hide' : 'Show' }} Details
3056
+ </b-button>
3057
+ </template>
3058
+
3059
+ <template #row-details="row">
3060
+ <b-card>
3061
+ <ul>
3062
+ <li v-for="(value, key) in row.item" :key="key">{{ key }}: {{ value }}</li>
3063
+ </ul>
3064
+ </b-card>
3065
+ </template>
3066
+ </b-table>
3067
+
3068
+ <!-- Info modal -->
3069
+ <b-modal :id="infoModal.id" :title="infoModal.title" ok-only @hide="resetInfoModal">
3070
+ <pre>{{ infoModal.content }}</pre>
3071
+ </b-modal>
3072
+ </b-container>
3073
+ </template>
3074
+
3075
+ <script>
3076
+ export default {
3077
+ data() {
3078
+ return {
3079
+ items: [
3080
+ { isActive: true, age: 40, name: { first: 'Dickerson', last: 'Macdonald' } },
3081
+ { isActive: false, age: 21, name: { first: 'Larsen', last: 'Shaw' } },
3082
+ {
3083
+ isActive: false,
3084
+ age: 9,
3085
+ name: { first: 'Mini', last: 'Navarro' },
3086
+ _rowVariant: 'success'
3087
+ },
3088
+ { isActive: false, age: 89, name: { first: 'Geneva', last: 'Wilson' } },
3089
+ { isActive: true, age: 38, name: { first: 'Jami', last: 'Carney' } },
3090
+ { isActive: false, age: 27, name: { first: 'Essie', last: 'Dunlap' } },
3091
+ { isActive: true, age: 40, name: { first: 'Thor', last: 'Macdonald' } },
3092
+ {
3093
+ isActive: true,
3094
+ age: 87,
3095
+ name: { first: 'Larsen', last: 'Shaw' },
3096
+ _cellVariants: { age: 'danger', isActive: 'warning' }
3097
+ },
3098
+ { isActive: false, age: 26, name: { first: 'Mitzi', last: 'Navarro' } },
3099
+ { isActive: false, age: 22, name: { first: 'Genevieve', last: 'Wilson' } },
3100
+ { isActive: true, age: 38, name: { first: 'John', last: 'Carney' } },
3101
+ { isActive: false, age: 29, name: { first: 'Dick', last: 'Dunlap' } }
3102
+ ],
3103
+ fields: [
3104
+ { key: 'name', label: 'Person full name', sortable: true, sortDirection: 'desc' },
3105
+ { key: 'age', label: 'Person age', sortable: true, class: 'text-center' },
3106
+ {
3107
+ key: 'isActive',
3108
+ label: 'Is Active',
3109
+ formatter: (value, key, item) => {
3110
+ return value ? 'Yes' : 'No'
3111
+ },
3112
+ sortable: true,
3113
+ sortByFormatted: true,
3114
+ filterByFormatted: true
3115
+ },
3116
+ { key: 'actions', label: 'Actions' }
3117
+ ],
3118
+ totalRows: 1,
3119
+ currentPage: 1,
3120
+ perPage: 5,
3121
+ pageOptions: [5, 10, 15, { value: 100, text: "Show a lot" }],
3122
+ sortBy: '',
3123
+ sortDesc: false,
3124
+ sortDirection: 'asc',
3125
+ filter: null,
3126
+ filterOn: [],
3127
+ infoModal: {
3128
+ id: 'info-modal',
3129
+ title: '',
3130
+ content: ''
3131
+ }
3132
+ }
3133
+ },
3134
+ computed: {
3135
+ sortOptions() {
3136
+ // Create an options list from our fields
3137
+ return this.fields
3138
+ .filter(f => f.sortable)
3139
+ .map(f => {
3140
+ return { text: f.label, value: f.key }
3141
+ })
3142
+ }
3143
+ },
3144
+ mounted() {
3145
+ // Set the initial number of items
3146
+ this.totalRows = this.items.length
3147
+ },
3148
+ methods: {
3149
+ info(item, index, button) {
3150
+ this.infoModal.title = `Row index: ${index}`
3151
+ this.infoModal.content = JSON.stringify(item, null, 2)
3152
+ this.$root.$emit('bv::show::modal', this.infoModal.id, button)
3153
+ },
3154
+ resetInfoModal() {
3155
+ this.infoModal.title = ''
3156
+ this.infoModal.content = ''
3157
+ },
3158
+ onFiltered(filteredItems) {
3159
+ // Trigger pagination to update the number of buttons/pages due to filtering
3160
+ this.totalRows = filteredItems.length
3161
+ this.currentPage = 1
3162
+ }
3163
+ }
3164
+ }
3165
+ </script>
3166
+
3167
+ <!-- b-table-complete.vue -->
3168
+ ```
3169
+
3170
+ <!-- Component reference added automatically from component package.json -->