@gitlab/ui 132.0.1 → 132.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/dist/charts.js +13 -0
  2. package/dist/components/base/accordion/accordion.js +69 -0
  3. package/dist/components/base/accordion/accordion_item.js +160 -0
  4. package/dist/components/base/accordion/constants.js +3 -0
  5. package/dist/components/base/alert/alert.js +263 -0
  6. package/dist/components/base/animated_icon/animated_chevron_down_up_icon.js +45 -0
  7. package/dist/components/base/animated_icon/animated_chevron_lg_down_up_icon.js +45 -0
  8. package/dist/components/base/animated_icon/animated_chevron_lg_right_down_icon.js +45 -0
  9. package/dist/components/base/animated_icon/animated_chevron_right_down_icon.js +45 -0
  10. package/dist/components/base/animated_icon/animated_duo_chat_icon.js +45 -0
  11. package/dist/components/base/animated_icon/animated_loader_icon.js +45 -0
  12. package/dist/components/base/animated_icon/animated_notifications_icon.js +45 -0
  13. package/dist/components/base/animated_icon/animated_sidebar_icon.js +45 -0
  14. package/dist/components/base/animated_icon/animated_smile_icon.js +45 -0
  15. package/dist/components/base/animated_icon/animated_sort_icon.js +45 -0
  16. package/dist/components/base/animated_icon/animated_star_icon.js +45 -0
  17. package/dist/components/base/animated_icon/animated_todo_icon.js +45 -0
  18. package/dist/components/base/animated_icon/animated_upload_icon.js +45 -0
  19. package/dist/components/base/animated_icon/base_animated_icon.js +77 -0
  20. package/dist/components/base/attribute_list/attribute_list.js +100 -0
  21. package/dist/components/base/avatar/avatar.js +175 -0
  22. package/dist/components/base/avatar/utils.js +17 -0
  23. package/dist/components/base/avatar_labeled/avatar_labeled.js +198 -0
  24. package/dist/components/base/avatar_link/avatar_link.js +47 -0
  25. package/dist/components/base/avatars_inline/avatars_inline.js +139 -0
  26. package/dist/components/base/badge/badge.js +197 -0
  27. package/dist/components/base/banner/banner.js +149 -0
  28. package/dist/components/base/breadcrumb/breadcrumb.js +282 -0
  29. package/dist/components/base/breadcrumb/breadcrumb_item.js +96 -0
  30. package/dist/components/base/broadcast_message/broadcast_message.js +113 -0
  31. package/dist/components/base/broadcast_message/constants.js +5 -0
  32. package/dist/components/base/button/button.js +419 -0
  33. package/dist/components/base/button_group/button_group.js +53 -0
  34. package/dist/components/base/card/card.js +69 -0
  35. package/dist/components/base/collapse/collapse.js +163 -0
  36. package/dist/components/base/color_mode_toggle/color_mode_toggle.js +92 -0
  37. package/dist/components/base/datepicker/datepicker.js +475 -0
  38. package/dist/components/base/daterange_picker/daterange_picker.js +394 -0
  39. package/dist/components/base/drawer/drawer.js +156 -0
  40. package/dist/components/base/dropdown/dropdown.js +330 -0
  41. package/dist/components/base/dropdown/dropdown_divider.js +48 -0
  42. package/dist/components/base/dropdown/dropdown_form.js +48 -0
  43. package/dist/components/base/dropdown/dropdown_item.js +175 -0
  44. package/dist/components/base/dropdown/dropdown_section_header.js +48 -0
  45. package/dist/components/base/dropdown/dropdown_text.js +48 -0
  46. package/dist/components/base/filtered_search/common_story_options.js +14 -0
  47. package/dist/components/base/filtered_search/filtered_search.js +428 -0
  48. package/dist/components/base/filtered_search/filtered_search_suggestion.js +95 -0
  49. package/dist/components/base/filtered_search/filtered_search_suggestion_list.js +139 -0
  50. package/dist/components/base/filtered_search/filtered_search_term.js +217 -0
  51. package/dist/components/base/filtered_search/filtered_search_token.js +383 -0
  52. package/dist/components/base/filtered_search/filtered_search_token_segment.js +444 -0
  53. package/dist/components/base/filtered_search/filtered_search_utils.js +241 -0
  54. package/dist/components/base/form/form.js +43 -0
  55. package/dist/components/base/form/form_character_count/form_character_count.js +107 -0
  56. package/dist/components/base/form/form_checkbox/form_checkbox.js +342 -0
  57. package/dist/components/base/form/form_checkbox/form_checkbox_group.js +188 -0
  58. package/dist/components/base/form/form_combobox/constants.js +55 -0
  59. package/dist/components/base/form/form_combobox/form_combobox.js +239 -0
  60. package/dist/components/base/form/form_date/form_date.js +143 -0
  61. package/dist/components/base/form/form_fields/form_field_validator.js +93 -0
  62. package/dist/components/base/form/form_fields/form_fields.js +289 -0
  63. package/dist/components/base/form/form_fields/form_fields_loop.js +75 -0
  64. package/dist/components/base/form/form_fields/mappers.js +13 -0
  65. package/dist/components/base/form/form_fields/validators.js +48 -0
  66. package/dist/components/base/form/form_group/form_group.js +119 -0
  67. package/dist/components/base/form/form_input/form_input.js +695 -0
  68. package/dist/components/base/form/form_input_group/form_input_group.js +120 -0
  69. package/dist/components/base/form/form_input_group/form_input_group_mixin.js +41 -0
  70. package/dist/components/base/form/form_radio/form_radio.js +259 -0
  71. package/dist/components/base/form/form_radio_group/form_radio_group.js +189 -0
  72. package/dist/components/base/form/form_select/constants.js +12 -0
  73. package/dist/components/base/form/form_select/form_select.js +96 -0
  74. package/dist/components/base/form/form_textarea/form_textarea.js +166 -0
  75. package/dist/components/base/form/input_group_text/input_group_text.js +43 -0
  76. package/dist/components/base/icon/icon.js +113 -0
  77. package/dist/components/base/illustration/illustration.js +80 -0
  78. package/dist/components/base/infinite_scroll/infinite_scroll.js +196 -0
  79. package/dist/components/base/keyset_pagination/keyset_pagination.js +152 -0
  80. package/dist/components/base/label/label.js +174 -0
  81. package/dist/components/base/link/link.js +330 -0
  82. package/dist/components/base/loading_icon/loading_icon.js +120 -0
  83. package/dist/components/base/markdown/markdown.js +50 -0
  84. package/dist/components/base/modal/modal.js +259 -0
  85. package/dist/components/base/new_dropdowns/base_dropdown/base_dropdown.js +716 -0
  86. package/dist/components/base/new_dropdowns/base_dropdown/constants.js +5 -0
  87. package/dist/components/base/new_dropdowns/base_dropdown/dropdown_container.js +32 -0
  88. package/dist/components/base/new_dropdowns/constants.js +24 -0
  89. package/dist/components/base/new_dropdowns/disclosure/constants.js +8 -0
  90. package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown.js +400 -0
  91. package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown_group.js +112 -0
  92. package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.js +196 -0
  93. package/dist/components/base/new_dropdowns/disclosure/mock_data.js +168 -0
  94. package/dist/components/base/new_dropdowns/disclosure/utils.js +84 -0
  95. package/dist/components/base/new_dropdowns/listbox/listbox.js +997 -0
  96. package/dist/components/base/new_dropdowns/listbox/listbox_group.js +58 -0
  97. package/dist/components/base/new_dropdowns/listbox/listbox_item.js +112 -0
  98. package/dist/components/base/new_dropdowns/listbox/listbox_search_input.js +94 -0
  99. package/dist/components/base/new_dropdowns/listbox/mock_data.js +131 -0
  100. package/dist/components/base/new_dropdowns/listbox/utils.js +33 -0
  101. package/dist/components/base/pagination/pagination.js +397 -0
  102. package/dist/components/base/path/data.js +34 -0
  103. package/dist/components/base/path/path.js +177 -0
  104. package/dist/components/base/popover/popover.js +142 -0
  105. package/dist/components/base/progress_bar/progress_bar.js +117 -0
  106. package/dist/components/base/search_box_by_click/search_box_by_click.js +245 -0
  107. package/dist/components/base/search_box_by_type/search_box_by_type.js +187 -0
  108. package/dist/components/base/segmented_control/segmented_control.js +73 -0
  109. package/dist/components/base/skeleton_loader/skeleton_loader.js +232 -0
  110. package/dist/components/base/sorting/sorting.js +180 -0
  111. package/dist/components/base/table/constants.js +5 -0
  112. package/dist/components/base/table/table.js +187 -0
  113. package/dist/components/base/table_lite/table_lite.js +80 -0
  114. package/dist/components/base/tabs/constants.js +3 -0
  115. package/dist/components/base/tabs/tab/tab.js +113 -0
  116. package/dist/components/base/tabs/tabs/scrollable_tabs.js +162 -0
  117. package/dist/components/base/tabs/tabs/tabs.js +223 -0
  118. package/dist/components/base/toast/index.js +66 -0
  119. package/dist/components/base/toast/toast.js +125 -0
  120. package/dist/components/base/toast/toaster.js +87 -0
  121. package/dist/components/base/toggle/toggle.js +178 -0
  122. package/dist/components/base/token/token.js +97 -0
  123. package/dist/components/base/token_selector/helpers.js +5 -0
  124. package/dist/components/base/token_selector/token_container.js +160 -0
  125. package/dist/components/base/token_selector/token_selector.js +454 -0
  126. package/dist/components/base/token_selector/token_selector_dropdown.js +223 -0
  127. package/dist/components/base/tooltip/tooltip.js +54 -0
  128. package/dist/components/charts/area/area.js +329 -0
  129. package/dist/components/charts/bar/bar.js +207 -0
  130. package/dist/components/charts/chart/chart.js +215 -0
  131. package/dist/components/charts/column/column.js +221 -0
  132. package/dist/components/charts/discrete_scatter/discrete_scatter.js +199 -0
  133. package/dist/components/charts/gauge/gauge.js +205 -0
  134. package/dist/components/charts/heatmap/heatmap.js +299 -0
  135. package/dist/components/charts/heatmap/index.js +2 -0
  136. package/dist/components/charts/legend/legend.js +245 -0
  137. package/dist/components/charts/line/line.js +340 -0
  138. package/dist/components/charts/series_label/series_label.js +101 -0
  139. package/dist/components/charts/shared/tooltip/tooltip.js +369 -0
  140. package/dist/components/charts/shared/tooltip/tooltip_default_format/tooltip_default_format.js +53 -0
  141. package/dist/components/charts/single_stat/single_stat.js +164 -0
  142. package/dist/components/charts/sparkline/sparkline.js +299 -0
  143. package/dist/components/charts/stacked_column/stacked_column.js +380 -0
  144. package/dist/components/dashboards/dashboard_layout/dashboard_layout.js +125 -0
  145. package/dist/components/dashboards/dashboard_layout/grid_layout/grid_layout.js +326 -0
  146. package/dist/components/dashboards/dashboard_layout/validators.js +14 -0
  147. package/dist/components/dashboards/dashboard_panel/dashboard_panel.js +236 -0
  148. package/dist/components/dashboards/mock_data.js +49 -0
  149. package/dist/components/experimental/experiment_badge/constants.js +4 -0
  150. package/dist/components/experimental/experiment_badge/experiment_badge.js +102 -0
  151. package/dist/components/extended/multi_step_form_template/multi_step_form_template.js +87 -0
  152. package/dist/components/index.js +107 -0
  153. package/dist/components/mixins/button_mixin.js +11 -0
  154. package/dist/components/mixins/safe_link_mixin.js +30 -0
  155. package/dist/components/mixins/tooltip_mixin.js +21 -0
  156. package/dist/components/regions/dashboard_skeleton/dashboard_skeleton.js +53 -0
  157. package/dist/components/regions/empty_state/empty_state.js +181 -0
  158. package/dist/components/shared_components/clear_icon_button/clear_icon_button.js +64 -0
  159. package/dist/components/shared_components/clipboard_button/clipboard_button.js +100 -0
  160. package/dist/components/shared_components/close_button/close_button.js +55 -0
  161. package/dist/components/utilities/animated_number/animated_number.js +131 -0
  162. package/dist/components/utilities/friendly_wrap/friendly_wrap.js +75 -0
  163. package/dist/components/utilities/intersection_observer/intersection_observer.js +88 -0
  164. package/dist/components/utilities/intersperse/intersperse.js +104 -0
  165. package/dist/components/utilities/sprintf/sprintf.js +171 -0
  166. package/dist/components/utilities/truncate/constants.js +8 -0
  167. package/dist/components/utilities/truncate/truncate.js +154 -0
  168. package/dist/components/utilities/truncate_text/constants.js +7 -0
  169. package/dist/components/utilities/truncate_text/truncate_text.js +146 -0
  170. package/dist/config.js +53 -0
  171. package/dist/directives/hover_load/hover_load.js +45 -0
  172. package/dist/directives/index.js +8 -0
  173. package/dist/directives/modal.js +1 -0
  174. package/dist/directives/outside/outside.js +149 -0
  175. package/dist/directives/resize_observer/resize_observer.js +58 -0
  176. package/dist/directives/safe_html/constants.js +6 -0
  177. package/dist/directives/safe_html/safe_html.js +39 -0
  178. package/dist/directives/safe_link/mock_data.js +10 -0
  179. package/dist/directives/safe_link/safe_link.js +67 -0
  180. package/dist/directives/tooltip/container.js +7 -0
  181. package/dist/directives/tooltip/tooltip.js +18 -0
  182. package/dist/index.css +7 -0
  183. package/dist/index.css.map +1 -0
  184. package/dist/index.js +2 -0
  185. package/dist/tailwind.css +2 -0
  186. package/dist/tailwind.css.map +1 -0
  187. package/dist/tokens/build/js/tokens.dark.js +1410 -0
  188. package/dist/tokens/build/js/tokens.js +1410 -0
  189. package/dist/tokens/common_story_options.js +29 -0
  190. package/dist/tokens/tokens_story.js +76 -0
  191. package/dist/utils/breakpoints.js +20 -0
  192. package/dist/utils/charts/config.js +616 -0
  193. package/dist/utils/charts/constants.js +69 -0
  194. package/dist/utils/charts/mock_data.js +191 -0
  195. package/dist/utils/charts/story_config.js +24 -0
  196. package/dist/utils/charts/theme.js +200 -0
  197. package/dist/utils/charts/utils.js +54 -0
  198. package/dist/utils/constants.js +331 -0
  199. package/dist/utils/data_utils.js +19 -0
  200. package/dist/utils/datetime_utility.js +61 -0
  201. package/dist/utils/equality_utils.js +84 -0
  202. package/dist/utils/form_options_utils.js +46 -0
  203. package/dist/utils/i18n.js +65 -0
  204. package/dist/utils/is_slot_empty.js +34 -0
  205. package/dist/utils/number_utils.js +132 -0
  206. package/dist/utils/play_utils.js +11 -0
  207. package/dist/utils/set_utils.js +25 -0
  208. package/dist/utils/stories_constants.js +29 -0
  209. package/dist/utils/stories_utils.js +62 -0
  210. package/dist/utils/story_decorators/container.js +19 -0
  211. package/dist/utils/string_utils.js +69 -0
  212. package/dist/utils/svgs/svg_paths.js +7 -0
  213. package/dist/utils/test_utils.js +33 -0
  214. package/dist/utils/use_fake_date.js +29 -0
  215. package/dist/utils/use_mock_intersection_observer.js +105 -0
  216. package/dist/utils/utils.js +205 -0
  217. package/dist/utils/vue_utils.js +57 -0
  218. package/dist/utils.js +5 -0
  219. package/dist/vendor/bootstrap-vue/src/bv-config.js +8 -0
  220. package/dist/vendor/bootstrap-vue/src/components/button/button-close.js +81 -0
  221. package/dist/vendor/bootstrap-vue/src/components/button/button.js +204 -0
  222. package/dist/vendor/bootstrap-vue/src/components/button/index.js +2 -0
  223. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-divider.js +41 -0
  224. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-form.js +52 -0
  225. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-group.js +75 -0
  226. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-header.js +52 -0
  227. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-item-button.js +85 -0
  228. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-item.js +97 -0
  229. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-text.js +60 -0
  230. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown.js +270 -0
  231. package/dist/vendor/bootstrap-vue/src/components/dropdown/index.js +8 -0
  232. package/dist/vendor/bootstrap-vue/src/components/form/form-invalid-feedback.js +53 -0
  233. package/dist/vendor/bootstrap-vue/src/components/form/form-text.js +55 -0
  234. package/dist/vendor/bootstrap-vue/src/components/form/form-valid-feedback.js +53 -0
  235. package/dist/vendor/bootstrap-vue/src/components/form/form.js +56 -0
  236. package/dist/vendor/bootstrap-vue/src/components/form/index.js +4 -0
  237. package/dist/vendor/bootstrap-vue/src/components/form-group/form-group.js +347 -0
  238. package/dist/vendor/bootstrap-vue/src/components/form-group/index.js +1 -0
  239. package/dist/vendor/bootstrap-vue/src/components/form-select/form-select-option-group.js +54 -0
  240. package/dist/vendor/bootstrap-vue/src/components/form-select/form-select-option.js +41 -0
  241. package/dist/vendor/bootstrap-vue/src/components/form-select/form-select.js +143 -0
  242. package/dist/vendor/bootstrap-vue/src/components/form-select/helpers/mixin-options.js +56 -0
  243. package/dist/vendor/bootstrap-vue/src/components/form-select/index.js +3 -0
  244. package/dist/vendor/bootstrap-vue/src/components/form-textarea/form-textarea.js +217 -0
  245. package/dist/vendor/bootstrap-vue/src/components/form-textarea/index.js +1 -0
  246. package/dist/vendor/bootstrap-vue/src/components/layout/col.js +155 -0
  247. package/dist/vendor/bootstrap-vue/src/components/layout/form-row.js +34 -0
  248. package/dist/vendor/bootstrap-vue/src/components/layout/index.js +2 -0
  249. package/dist/vendor/bootstrap-vue/src/components/link/index.js +1 -0
  250. package/dist/vendor/bootstrap-vue/src/components/link/link.js +283 -0
  251. package/dist/vendor/bootstrap-vue/src/components/modal/helpers/bv-modal-event.class.js +21 -0
  252. package/dist/vendor/bootstrap-vue/src/components/modal/helpers/modal-manager.js +212 -0
  253. package/dist/vendor/bootstrap-vue/src/components/modal/index.js +1 -0
  254. package/dist/vendor/bootstrap-vue/src/components/modal/modal.js +1059 -0
  255. package/dist/vendor/bootstrap-vue/src/components/popover/helpers/bv-popover-template.js +55 -0
  256. package/dist/vendor/bootstrap-vue/src/components/popover/helpers/bv-popover.js +31 -0
  257. package/dist/vendor/bootstrap-vue/src/components/popover/index.js +1 -0
  258. package/dist/vendor/bootstrap-vue/src/components/popover/popover.js +49 -0
  259. package/dist/vendor/bootstrap-vue/src/components/table/helpers/constants.js +22 -0
  260. package/dist/vendor/bootstrap-vue/src/components/table/helpers/default-sort-compare.js +64 -0
  261. package/dist/vendor/bootstrap-vue/src/components/table/helpers/filter-event.js +40 -0
  262. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-bottom-row.js +43 -0
  263. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-busy.js +83 -0
  264. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-caption.js +50 -0
  265. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-colgroup.js +32 -0
  266. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-empty.js +82 -0
  267. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-filtering.js +292 -0
  268. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-items.js +154 -0
  269. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-pagination.js +44 -0
  270. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-provider.js +191 -0
  271. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-selectable.js +213 -0
  272. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-sorting.js +274 -0
  273. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-stacked.js +39 -0
  274. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-table-renderer.js +186 -0
  275. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-tbody-row.js +338 -0
  276. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-tbody.js +243 -0
  277. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-tfoot.js +50 -0
  278. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-thead.js +218 -0
  279. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-top-row.js +42 -0
  280. package/dist/vendor/bootstrap-vue/src/components/table/helpers/normalize-fields.js +86 -0
  281. package/dist/vendor/bootstrap-vue/src/components/table/helpers/sanitize-row.js +31 -0
  282. package/dist/vendor/bootstrap-vue/src/components/table/helpers/stringify-record-values.js +11 -0
  283. package/dist/vendor/bootstrap-vue/src/components/table/helpers/text-selection-active.js +14 -0
  284. package/dist/vendor/bootstrap-vue/src/components/table/index.js +9 -0
  285. package/dist/vendor/bootstrap-vue/src/components/table/table-lite.js +51 -0
  286. package/dist/vendor/bootstrap-vue/src/components/table/table-simple.js +44 -0
  287. package/dist/vendor/bootstrap-vue/src/components/table/table.js +67 -0
  288. package/dist/vendor/bootstrap-vue/src/components/table/tbody.js +116 -0
  289. package/dist/vendor/bootstrap-vue/src/components/table/td.js +204 -0
  290. package/dist/vendor/bootstrap-vue/src/components/table/tfoot.js +96 -0
  291. package/dist/vendor/bootstrap-vue/src/components/table/th.js +26 -0
  292. package/dist/vendor/bootstrap-vue/src/components/table/thead.js +99 -0
  293. package/dist/vendor/bootstrap-vue/src/components/table/tr.js +121 -0
  294. package/dist/vendor/bootstrap-vue/src/components/tabs/index.js +2 -0
  295. package/dist/vendor/bootstrap-vue/src/components/tabs/tab.js +238 -0
  296. package/dist/vendor/bootstrap-vue/src/components/tabs/tabs.js +690 -0
  297. package/dist/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-popper.js +251 -0
  298. package/dist/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip-template.js +118 -0
  299. package/dist/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip.js +932 -0
  300. package/dist/vendor/bootstrap-vue/src/components/tooltip/index.js +1 -0
  301. package/dist/vendor/bootstrap-vue/src/components/tooltip/tooltip.js +337 -0
  302. package/dist/vendor/bootstrap-vue/src/components/transition/bv-transition.js +103 -0
  303. package/dist/vendor/bootstrap-vue/src/components/transporter/transporter.js +205 -0
  304. package/dist/vendor/bootstrap-vue/src/constants/components.js +55 -0
  305. package/dist/vendor/bootstrap-vue/src/constants/config.js +11 -0
  306. package/dist/vendor/bootstrap-vue/src/constants/env.js +36 -0
  307. package/dist/vendor/bootstrap-vue/src/constants/events.js +56 -0
  308. package/dist/vendor/bootstrap-vue/src/constants/key-codes.js +11 -0
  309. package/dist/vendor/bootstrap-vue/src/constants/popper.js +10 -0
  310. package/dist/vendor/bootstrap-vue/src/constants/props.js +24 -0
  311. package/dist/vendor/bootstrap-vue/src/constants/regex.js +35 -0
  312. package/dist/vendor/bootstrap-vue/src/constants/safe-types.js +15 -0
  313. package/dist/vendor/bootstrap-vue/src/constants/slots.js +36 -0
  314. package/dist/vendor/bootstrap-vue/src/directives/modal/index.js +1 -0
  315. package/dist/vendor/bootstrap-vue/src/directives/modal/modal.js +112 -0
  316. package/dist/vendor/bootstrap-vue/src/directives/tooltip/index.js +1 -0
  317. package/dist/vendor/bootstrap-vue/src/directives/tooltip/tooltip.js +267 -0
  318. package/dist/vendor/bootstrap-vue/src/directives/visible/index.js +1 -0
  319. package/dist/vendor/bootstrap-vue/src/directives/visible/visible.js +187 -0
  320. package/dist/vendor/bootstrap-vue/src/mixins/attrs.js +5 -0
  321. package/dist/vendor/bootstrap-vue/src/mixins/click-out.js +54 -0
  322. package/dist/vendor/bootstrap-vue/src/mixins/dropdown.js +470 -0
  323. package/dist/vendor/bootstrap-vue/src/mixins/focus-in.js +46 -0
  324. package/dist/vendor/bootstrap-vue/src/mixins/form-control.js +73 -0
  325. package/dist/vendor/bootstrap-vue/src/mixins/form-custom.js +26 -0
  326. package/dist/vendor/bootstrap-vue/src/mixins/form-options.js +91 -0
  327. package/dist/vendor/bootstrap-vue/src/mixins/form-selection.js +62 -0
  328. package/dist/vendor/bootstrap-vue/src/mixins/form-size.js +26 -0
  329. package/dist/vendor/bootstrap-vue/src/mixins/form-state.js +50 -0
  330. package/dist/vendor/bootstrap-vue/src/mixins/form-text.js +293 -0
  331. package/dist/vendor/bootstrap-vue/src/mixins/form-validity.js +50 -0
  332. package/dist/vendor/bootstrap-vue/src/mixins/has-listener.js +29 -0
  333. package/dist/vendor/bootstrap-vue/src/mixins/id.js +57 -0
  334. package/dist/vendor/bootstrap-vue/src/mixins/listen-on-document.js +62 -0
  335. package/dist/vendor/bootstrap-vue/src/mixins/listen-on-root.js +120 -0
  336. package/dist/vendor/bootstrap-vue/src/mixins/listen-on-window.js +62 -0
  337. package/dist/vendor/bootstrap-vue/src/mixins/listeners.js +25 -0
  338. package/dist/vendor/bootstrap-vue/src/mixins/model.js +10 -0
  339. package/dist/vendor/bootstrap-vue/src/mixins/normalize-slot.js +30 -0
  340. package/dist/vendor/bootstrap-vue/src/mixins/scoped-style.js +18 -0
  341. package/dist/vendor/bootstrap-vue/src/mixins/use-parent.js +14 -0
  342. package/dist/vendor/bootstrap-vue/src/utils/array.js +27 -0
  343. package/dist/vendor/bootstrap-vue/src/utils/bv-event.class.js +60 -0
  344. package/dist/vendor/bootstrap-vue/src/utils/cache.js +60 -0
  345. package/dist/vendor/bootstrap-vue/src/utils/clone-deep.js +18 -0
  346. package/dist/vendor/bootstrap-vue/src/utils/config-set.js +86 -0
  347. package/dist/vendor/bootstrap-vue/src/utils/config.js +71 -0
  348. package/dist/vendor/bootstrap-vue/src/utils/create-new-child-component.js +133 -0
  349. package/dist/vendor/bootstrap-vue/src/utils/css-escape.js +70 -0
  350. package/dist/vendor/bootstrap-vue/src/utils/dom.js +298 -0
  351. package/dist/vendor/bootstrap-vue/src/utils/element-to-vue-instance-registry.js +28 -0
  352. package/dist/vendor/bootstrap-vue/src/utils/env.js +16 -0
  353. package/dist/vendor/bootstrap-vue/src/utils/events.js +78 -0
  354. package/dist/vendor/bootstrap-vue/src/utils/get-event-root.js +5 -0
  355. package/dist/vendor/bootstrap-vue/src/utils/get-instance-from-directive.js +3 -0
  356. package/dist/vendor/bootstrap-vue/src/utils/get-scope-id.js +9 -0
  357. package/dist/vendor/bootstrap-vue/src/utils/get.js +63 -0
  358. package/dist/vendor/bootstrap-vue/src/utils/html.js +16 -0
  359. package/dist/vendor/bootstrap-vue/src/utils/identity.js +3 -0
  360. package/dist/vendor/bootstrap-vue/src/utils/inspect.js +35 -0
  361. package/dist/vendor/bootstrap-vue/src/utils/locale.js +18 -0
  362. package/dist/vendor/bootstrap-vue/src/utils/loose-equal.js +59 -0
  363. package/dist/vendor/bootstrap-vue/src/utils/loose-index-of.js +13 -0
  364. package/dist/vendor/bootstrap-vue/src/utils/math.js +9 -0
  365. package/dist/vendor/bootstrap-vue/src/utils/memoize.js +14 -0
  366. package/dist/vendor/bootstrap-vue/src/utils/model.js +33 -0
  367. package/dist/vendor/bootstrap-vue/src/utils/noop.js +3 -0
  368. package/dist/vendor/bootstrap-vue/src/utils/normalize-slot.js +51 -0
  369. package/dist/vendor/bootstrap-vue/src/utils/number.js +23 -0
  370. package/dist/vendor/bootstrap-vue/src/utils/object.js +72 -0
  371. package/dist/vendor/bootstrap-vue/src/utils/observe-dom.js +76 -0
  372. package/dist/vendor/bootstrap-vue/src/utils/on-instance-destroy.js +22 -0
  373. package/dist/vendor/bootstrap-vue/src/utils/plugins.js +124 -0
  374. package/dist/vendor/bootstrap-vue/src/utils/props.js +67 -0
  375. package/dist/vendor/bootstrap-vue/src/utils/router.js +150 -0
  376. package/dist/vendor/bootstrap-vue/src/utils/safe-vue-instance.js +14 -0
  377. package/dist/vendor/bootstrap-vue/src/utils/stable-sort.js +28 -0
  378. package/dist/vendor/bootstrap-vue/src/utils/string.js +47 -0
  379. package/dist/vendor/bootstrap-vue/src/utils/stringify-object-values.js +31 -0
  380. package/dist/vendor/bootstrap-vue/src/utils/warn.js +45 -0
  381. package/dist/vendor/bootstrap-vue/src/vue.js +55 -0
  382. package/package.json +4 -3
  383. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown.js +2 -2
  384. package/src/vendor/bootstrap-vue/src/components/form-group/form-group.js +2 -2
  385. package/src/vendor/bootstrap-vue/src/components/layout/col.js +2 -2
  386. package/src/vendor/bootstrap-vue/src/components/modal/modal.js +2 -2
  387. package/src/vendor/bootstrap-vue/src/components/tabs/tabs.js +2 -2
  388. package/src/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip.js +8 -9
  389. package/src/vendor/bootstrap-vue/src/mixins/listen-on-document.js +1 -2
  390. package/src/vendor/bootstrap-vue/src/mixins/listen-on-root.js +1 -2
  391. package/src/vendor/bootstrap-vue/src/mixins/listen-on-window.js +1 -2
  392. package/src/vendor/bootstrap-vue/src/utils/array.js +0 -1
  393. package/src/vendor/bootstrap-vue/src/utils/locale.js +1 -2
@@ -0,0 +1,292 @@
1
+ import { extend } from '../../../vue';
2
+ import { NAME_TABLE } from '../../../constants/components';
3
+ import { EVENT_NAME_FILTERED } from '../../../constants/events';
4
+ import { PROP_TYPE_ARRAY, PROP_TYPE_OBJECT, PROP_TYPE_STRING, PROP_TYPE_REG_EXP, PROP_TYPE_NUMBER, PROP_TYPE_FUNCTION } from '../../../constants/props';
5
+ import { RX_SPACES, RX_DIGITS } from '../../../constants/regex';
6
+ import { concat } from '../../../utils/array';
7
+ import { cloneDeep } from '../../../utils/clone-deep';
8
+ import { identity } from '../../../utils/identity';
9
+ import { isFunction, isString, isRegExp } from '../../../utils/inspect';
10
+ import { looseEqual } from '../../../utils/loose-equal';
11
+ import { toInteger } from '../../../utils/number';
12
+ import { escapeRegExp } from '../../../utils/string';
13
+ import { warn } from '../../../utils/warn';
14
+ import { stringifyRecordValues } from './stringify-record-values';
15
+
16
+ // --- Constants ---
17
+
18
+ const DEBOUNCE_DEPRECATED_MSG = 'Prop "filter-debounce" is deprecated. Use the debounce feature of "<b-form-input>" instead.';
19
+
20
+ // --- Props ---
21
+
22
+ const props = {
23
+ filter: {
24
+ type: [PROP_TYPE_ARRAY, PROP_TYPE_OBJECT, PROP_TYPE_STRING, PROP_TYPE_REG_EXP],
25
+ required: false,
26
+ default: undefined
27
+ },
28
+ filterDebounce: {
29
+ type: [PROP_TYPE_NUMBER, PROP_TYPE_STRING],
30
+ required: false,
31
+ default: 0,
32
+ validator: value => RX_DIGITS.test(String(value))
33
+ },
34
+ filterFunction: {
35
+ type: PROP_TYPE_FUNCTION,
36
+ required: false,
37
+ default: undefined
38
+ },
39
+ filterIgnoredFields: {
40
+ type: PROP_TYPE_ARRAY,
41
+ required: false,
42
+ default: () => []
43
+ },
44
+ filterIncludedFields: {
45
+ type: PROP_TYPE_ARRAY,
46
+ required: false,
47
+ default: () => []
48
+ }
49
+ };
50
+
51
+ // --- Mixin ---
52
+
53
+ // @vue/component
54
+ const filteringMixin = extend({
55
+ props,
56
+ data() {
57
+ return {
58
+ // Flag for displaying which empty slot to show and some event triggering
59
+ isFiltered: false,
60
+ // Where we store the copy of the filter criteria after debouncing
61
+ // We pre-set it with the sanitized filter value
62
+ localFilter: this.filterSanitize(this.filter)
63
+ };
64
+ },
65
+ computed: {
66
+ computedFilterIgnored() {
67
+ return concat(this.filterIgnoredFields || []).filter(identity);
68
+ },
69
+ computedFilterIncluded() {
70
+ return concat(this.filterIncludedFields || []).filter(identity);
71
+ },
72
+ computedFilterDebounce() {
73
+ const ms = toInteger(this.filterDebounce, 0);
74
+ /* istanbul ignore next */
75
+ if (ms > 0) {
76
+ warn(DEBOUNCE_DEPRECATED_MSG, NAME_TABLE);
77
+ }
78
+ return ms;
79
+ },
80
+ localFiltering() {
81
+ return this.hasProvider ? !!this.noProviderFiltering : true;
82
+ },
83
+ // For watching changes to `filteredItems` vs `localItems`
84
+ filteredCheck() {
85
+ const {
86
+ filteredItems,
87
+ localItems,
88
+ localFilter
89
+ } = this;
90
+ return {
91
+ filteredItems,
92
+ localItems,
93
+ localFilter
94
+ };
95
+ },
96
+ // Sanitized/normalize filter-function prop
97
+ localFilterFn() {
98
+ // Return `null` to signal to use internal filter function
99
+ const {
100
+ filterFunction
101
+ } = this;
102
+ // `filterFunction` is an optional Function prop with no default
103
+ return isFunction(filterFunction) ? filterFunction : null;
104
+ },
105
+ // Returns the records in `localItems` that match the filter criteria
106
+ // Returns the original `localItems` array if not sorting
107
+ filteredItems() {
108
+ // Note the criteria is debounced and sanitized
109
+ const {
110
+ localItems: items,
111
+ localFilter: criteria
112
+ } = this;
113
+
114
+ // Resolve the filtering function, when requested
115
+ // We prefer the provided filtering function and fallback to the internal one
116
+ // When no filtering criteria is specified the filtering factories will return `null`
117
+ const filterFn = this.localFiltering ? this.filterFnFactory(this.localFilterFn, criteria) || this.defaultFilterFnFactory(criteria) : null;
118
+
119
+ // We only do local filtering when requested and there are records to filter
120
+ return filterFn && items.length > 0 ? items.filter(filterFn) : items;
121
+ }
122
+ },
123
+ watch: {
124
+ // Watch for debounce being set to 0
125
+ computedFilterDebounce(newValue) {
126
+ if (!newValue && this.$_filterTimer) {
127
+ this.clearFilterTimer();
128
+ this.localFilter = this.filterSanitize(this.filter);
129
+ }
130
+ },
131
+ // Watch for changes to the filter criteria, and debounce if necessary
132
+ filter: {
133
+ // We need a deep watcher in case the user passes
134
+ // an object when using `filter-function`
135
+ deep: true,
136
+ handler(newCriteria) {
137
+ const timeout = this.computedFilterDebounce;
138
+ this.clearFilterTimer();
139
+ if (timeout && timeout > 0) {
140
+ // If we have a debounce time, delay the update of `localFilter`
141
+ this.$_filterTimer = setTimeout(() => {
142
+ this.localFilter = this.filterSanitize(newCriteria);
143
+ }, timeout);
144
+ } else {
145
+ // Otherwise, immediately update `localFilter` with `newFilter` value
146
+ this.localFilter = this.filterSanitize(newCriteria);
147
+ }
148
+ }
149
+ },
150
+ // Watch for changes to the filter criteria and filtered items vs `localItems`
151
+ // Set visual state and emit events as required
152
+ filteredCheck(_ref) {
153
+ let {
154
+ filteredItems,
155
+ localFilter
156
+ } = _ref;
157
+ // Determine if the dataset is filtered or not
158
+ let isFiltered = false;
159
+ if (!localFilter) {
160
+ // If filter criteria is falsey
161
+ isFiltered = false;
162
+ } else if (looseEqual(localFilter, []) || looseEqual(localFilter, {})) {
163
+ // If filter criteria is an empty array or object
164
+ isFiltered = false;
165
+ } else if (localFilter) {
166
+ // If filter criteria is truthy
167
+ isFiltered = true;
168
+ }
169
+ if (isFiltered) {
170
+ this.$emit(EVENT_NAME_FILTERED, filteredItems, filteredItems.length);
171
+ // Clear selection on filter change if selectable (defined in mixin-selectable.js)
172
+ if (this.hasSelectableRowClick) {
173
+ this.clearSelected();
174
+ }
175
+ }
176
+ this.isFiltered = isFiltered;
177
+ },
178
+ isFiltered(newValue, oldValue) {
179
+ if (newValue === false && oldValue === true) {
180
+ // We need to emit a filtered event if `isFiltered` transitions from `true` to
181
+ // `false` so that users can update their pagination controls
182
+ const {
183
+ localItems
184
+ } = this;
185
+ this.$emit(EVENT_NAME_FILTERED, localItems, localItems.length);
186
+ // Clear selection on filter change if selectable (defined in mixin-selectable.js)
187
+ if (this.hasSelectableRowClick) {
188
+ this.clearSelected();
189
+ }
190
+ }
191
+ }
192
+ },
193
+ created() {
194
+ // Create private non-reactive props
195
+ this.$_filterTimer = null;
196
+ // If filter is "pre-set", set the criteria
197
+ // This will trigger any watchers/dependents
198
+ // this.localFilter = this.filterSanitize(this.filter)
199
+ // Set the initial filtered state in a `$nextTick()` so that
200
+ // we trigger a filtered event if needed
201
+ this.$nextTick(() => {
202
+ this.isFiltered = Boolean(this.localFilter);
203
+ });
204
+ },
205
+ beforeDestroy() {
206
+ this.clearFilterTimer();
207
+ },
208
+ methods: {
209
+ clearFilterTimer() {
210
+ clearTimeout(this.$_filterTimer);
211
+ this.$_filterTimer = null;
212
+ },
213
+ filterSanitize(criteria) {
214
+ // Sanitizes filter criteria based on internal or external filtering
215
+ if (this.localFiltering && !this.localFilterFn && !(isString(criteria) || isRegExp(criteria))) {
216
+ // If using internal filter function, which only accepts string or RegExp,
217
+ // return '' to signify no filter
218
+ return '';
219
+ }
220
+
221
+ // Could be a string, object or array, as needed by external filter function
222
+ // We use `cloneDeep` to ensure we have a new copy of an object or array
223
+ // without Vue's reactive observers
224
+ return cloneDeep(criteria);
225
+ },
226
+ // Filter Function factories
227
+ filterFnFactory(filterFn, criteria) {
228
+ // Wrapper factory for external filter functions
229
+ // Wrap the provided filter-function and return a new function
230
+ // Returns `null` if no filter-function defined or if criteria is falsey
231
+ // Rather than directly grabbing `this.computedLocalFilterFn` or `this.filterFunction`
232
+ // we have it passed, so that the caller computed prop will be reactive to changes
233
+ // in the original filter-function (as this routine is a method)
234
+ if (!filterFn || !isFunction(filterFn) || !criteria || looseEqual(criteria, []) || looseEqual(criteria, {})) {
235
+ return null;
236
+ }
237
+
238
+ // Build the wrapped filter test function, passing the criteria to the provided function
239
+ const fn = item => {
240
+ // Generated function returns true if the criteria matches part
241
+ // of the serialized data, otherwise false
242
+ return filterFn(item, criteria);
243
+ };
244
+
245
+ // Return the wrapped function
246
+ return fn;
247
+ },
248
+ defaultFilterFnFactory(criteria) {
249
+ // Generates the default filter function, using the given filter criteria
250
+ // Returns `null` if no criteria or criteria format not supported
251
+ if (!criteria || !(isString(criteria) || isRegExp(criteria))) {
252
+ // Built in filter can only support strings or RegExp criteria (at the moment)
253
+ return null;
254
+ }
255
+
256
+ // Build the RegExp needed for filtering
257
+ let regExp = criteria;
258
+ if (isString(regExp)) {
259
+ // Escape special RegExp characters in the string and convert contiguous
260
+ // whitespace to \s+ matches
261
+ const pattern = escapeRegExp(criteria).replace(RX_SPACES, '\\s+');
262
+ // Build the RegExp (no need for global flag, as we only need
263
+ // to find the value once in the string)
264
+ regExp = new RegExp(`.*${pattern}.*`, 'i');
265
+ }
266
+
267
+ // Generate the wrapped filter test function to use
268
+ const fn = item => {
269
+ // This searches all row values (and sub property values) in the entire (excluding
270
+ // special `_` prefixed keys), because we convert the record to a space-separated
271
+ // string containing all the value properties (recursively), even ones that are
272
+ // not visible (not specified in this.fields)
273
+ // Users can ignore filtering on specific fields, or on only certain fields,
274
+ // and can optionall specify searching results of fields with formatter
275
+ //
276
+ // TODO: Enable searching on scoped slots (optional, as it will be SLOW)
277
+ //
278
+ // Generated function returns true if the criteria matches part of
279
+ // the serialized data, otherwise false
280
+ //
281
+ // We set `lastIndex = 0` on the `RegExp` in case someone specifies the `/g` global flag
282
+ regExp.lastIndex = 0;
283
+ return regExp.test(stringifyRecordValues(item, this.computedFilterIgnored, this.computedFilterIncluded, this.computedFieldsObj));
284
+ };
285
+
286
+ // Return the generated function
287
+ return fn;
288
+ }
289
+ }
290
+ });
291
+
292
+ export { filteringMixin, props };
@@ -0,0 +1,154 @@
1
+ import { extend } from '../../../vue';
2
+ import { EVENT_NAME_CONTEXT_CHANGED } from '../../../constants/events';
3
+ import { PROP_TYPE_ARRAY, PROP_TYPE_STRING } from '../../../constants/props';
4
+ import { useParentMixin } from '../../../mixins/use-parent';
5
+ import { isArray, isString, isFunction } from '../../../utils/inspect';
6
+ import { looseEqual } from '../../../utils/loose-equal';
7
+ import { mathMax } from '../../../utils/math';
8
+ import { makeModelMixin } from '../../../utils/model';
9
+ import { toInteger } from '../../../utils/number';
10
+ import { sortKeys, clone } from '../../../utils/object';
11
+ import { makeProp } from '../../../utils/props';
12
+ import { safeVueInstance } from '../../../utils/safe-vue-instance';
13
+ import { normalizeFields } from './normalize-fields';
14
+
15
+ // --- Constants ---
16
+
17
+ const {
18
+ mixin: modelMixin,
19
+ props: modelProps,
20
+ prop: MODEL_PROP_NAME,
21
+ event: MODEL_EVENT_NAME
22
+ } = makeModelMixin('value', {
23
+ type: PROP_TYPE_ARRAY,
24
+ defaultValue: []
25
+ });
26
+
27
+ // --- Props ---
28
+
29
+ const props = sortKeys({
30
+ ...modelProps,
31
+ fields: makeProp(PROP_TYPE_ARRAY, null),
32
+ // Provider mixin adds in `Function` type
33
+ items: makeProp(PROP_TYPE_ARRAY, []),
34
+ // Primary key for record
35
+ // If provided the value in each row must be unique!
36
+ primaryKey: makeProp(PROP_TYPE_STRING),
37
+ // `v-model` for retrieving the current displayed rows
38
+ [MODEL_PROP_NAME]: makeProp(PROP_TYPE_ARRAY, [])
39
+ });
40
+
41
+ // --- Mixin ---
42
+
43
+ // @vue/component
44
+ const itemsMixin = extend({
45
+ mixins: [modelMixin, useParentMixin],
46
+ props,
47
+ data() {
48
+ const {
49
+ items
50
+ } = this;
51
+ return {
52
+ // Our local copy of the items
53
+ // Must be an array
54
+ localItems: isArray(items) ? items.slice() : []
55
+ };
56
+ },
57
+ computed: {
58
+ computedFields() {
59
+ // We normalize fields into an array of objects
60
+ // `[ { key:..., label:..., ...}, {...}, ..., {..}]`
61
+ return normalizeFields(this.fields, this.localItems);
62
+ },
63
+ computedFieldsObj() {
64
+ // Fields as a simple lookup hash object
65
+ // Mainly for formatter lookup and use in `scopedSlots` for convenience
66
+ // If the field has a formatter, it normalizes formatter to a
67
+ // function ref or `undefined` if no formatter
68
+ const {
69
+ bvParent
70
+ } = this;
71
+ return this.computedFields.reduce((obj, f) => {
72
+ // We use object spread here so we don't mutate the original field object
73
+ obj[f.key] = clone(f);
74
+ if (f.formatter) {
75
+ // Normalize formatter to a function ref or `undefined`
76
+ let formatter = f.formatter;
77
+ if (isString(formatter) && isFunction(bvParent[formatter])) {
78
+ formatter = bvParent[formatter];
79
+ } else if (!isFunction(formatter)) {
80
+ /* istanbul ignore next */
81
+ formatter = undefined;
82
+ }
83
+ // Return formatter function or `undefined` if none
84
+ obj[f.key].formatter = formatter;
85
+ }
86
+ return obj;
87
+ }, {});
88
+ },
89
+ computedItems() {
90
+ const {
91
+ paginatedItems,
92
+ sortedItems,
93
+ filteredItems,
94
+ localItems
95
+ } = safeVueInstance(this);
96
+ // Fallback if various mixins not provided
97
+ return (paginatedItems || sortedItems || filteredItems || localItems || /* istanbul ignore next */
98
+ []).slice();
99
+ },
100
+ context() {
101
+ const {
102
+ perPage,
103
+ currentPage
104
+ } = safeVueInstance(this);
105
+ // Current state of sorting, filtering and pagination props/values
106
+ return {
107
+ filter: this.localFilter,
108
+ sortBy: this.localSortBy,
109
+ sortDesc: this.localSortDesc,
110
+ perPage: mathMax(toInteger(perPage, 0), 0),
111
+ currentPage: mathMax(toInteger(currentPage, 0), 1),
112
+ apiUrl: this.apiUrl
113
+ };
114
+ }
115
+ },
116
+ watch: {
117
+ items(newValue) {
118
+ // Set `localItems`/`filteredItems` to a copy of the provided array
119
+ this.localItems = isArray(newValue) ? newValue.slice() : [];
120
+ },
121
+ // Watch for changes on `computedItems` and update the `v-model`
122
+ computedItems(newValue, oldValue) {
123
+ if (!looseEqual(newValue, oldValue)) {
124
+ this.$emit(MODEL_EVENT_NAME, newValue);
125
+ }
126
+ },
127
+ // Watch for context changes
128
+ context(newValue, oldValue) {
129
+ // Emit context information for external paging/filtering/sorting handling
130
+ if (!looseEqual(newValue, oldValue)) {
131
+ this.$emit(EVENT_NAME_CONTEXT_CHANGED, newValue);
132
+ // Clear selection on context change if selectable (defined in mixin-selectable.js)
133
+ if (this.hasSelectableRowClick) {
134
+ this.clearSelected();
135
+ }
136
+ }
137
+ }
138
+ },
139
+ mounted() {
140
+ // Initially update the `v-model` of displayed items
141
+ this.$emit(MODEL_EVENT_NAME, this.computedItems);
142
+ },
143
+ methods: {
144
+ // Method to get the formatter method for a given field key
145
+ getFieldFormatter(key) {
146
+ const field = this.computedFieldsObj[key];
147
+ // `this.computedFieldsObj` has pre-normalized the formatter to a
148
+ // function ref if present, otherwise `undefined`
149
+ return field ? field.formatter : undefined;
150
+ }
151
+ }
152
+ });
153
+
154
+ export { MODEL_EVENT_NAME, MODEL_PROP_NAME, itemsMixin, props };
@@ -0,0 +1,44 @@
1
+ import { extend } from '../../../vue';
2
+ import { PROP_TYPE_NUMBER_STRING } from '../../../constants/props';
3
+ import { mathMax } from '../../../utils/math';
4
+ import { toInteger } from '../../../utils/number';
5
+ import { makeProp } from '../../../utils/props';
6
+ import { safeVueInstance } from '../../../utils/safe-vue-instance';
7
+
8
+ // --- Props ---
9
+
10
+ const props = {
11
+ currentPage: makeProp(PROP_TYPE_NUMBER_STRING, 1),
12
+ perPage: makeProp(PROP_TYPE_NUMBER_STRING, 0)
13
+ };
14
+
15
+ // --- Mixin ---
16
+
17
+ // @vue/component
18
+ const paginationMixin = extend({
19
+ props,
20
+ computed: {
21
+ localPaging() {
22
+ return this.hasProvider ? !!this.noProviderPaging : true;
23
+ },
24
+ paginatedItems() {
25
+ const {
26
+ sortedItems,
27
+ filteredItems,
28
+ localItems
29
+ } = safeVueInstance(this);
30
+ let items = sortedItems || filteredItems || localItems || [];
31
+ const currentPage = mathMax(toInteger(this.currentPage, 1), 1);
32
+ const perPage = mathMax(toInteger(this.perPage, 0), 0);
33
+ // Apply local pagination
34
+ if (this.localPaging && perPage) {
35
+ // Grab the current page of data (which may be past filtered items limit)
36
+ items = items.slice((currentPage - 1) * perPage, currentPage * perPage);
37
+ }
38
+ // Return the items to display in the table
39
+ return items;
40
+ }
41
+ }
42
+ });
43
+
44
+ export { paginationMixin, props };
@@ -0,0 +1,191 @@
1
+ import { extend } from '../../../vue';
2
+ import { NAME_TABLE } from '../../../constants/components';
3
+ import { EVENT_NAME_REFRESHED, EVENT_NAME_REFRESH } from '../../../constants/events';
4
+ import { PROP_TYPE_STRING, PROP_TYPE_ARRAY_FUNCTION, PROP_TYPE_BOOLEAN } from '../../../constants/props';
5
+ import { getRootEventName, getRootActionEventName } from '../../../utils/events';
6
+ import { isFunction, isArray, isPromise } from '../../../utils/inspect';
7
+ import { looseEqual } from '../../../utils/loose-equal';
8
+ import { clone } from '../../../utils/object';
9
+ import { makeProp } from '../../../utils/props';
10
+ import { safeVueInstance } from '../../../utils/safe-vue-instance';
11
+ import { warn } from '../../../utils/warn';
12
+ import { listenOnRootMixin } from '../../../mixins/listen-on-root';
13
+
14
+ // --- Constants ---
15
+
16
+ const ROOT_EVENT_NAME_REFRESHED = getRootEventName(NAME_TABLE, EVENT_NAME_REFRESHED);
17
+ const ROOT_ACTION_EVENT_NAME_REFRESH = getRootActionEventName(NAME_TABLE, EVENT_NAME_REFRESH);
18
+
19
+ // --- Props ---
20
+
21
+ const props = {
22
+ // Passed to the context object
23
+ // Not used by `<b-table>` directly
24
+ apiUrl: makeProp(PROP_TYPE_STRING),
25
+ // Adds in 'Function' support
26
+ items: makeProp(PROP_TYPE_ARRAY_FUNCTION, []),
27
+ noProviderFiltering: makeProp(PROP_TYPE_BOOLEAN, false),
28
+ noProviderPaging: makeProp(PROP_TYPE_BOOLEAN, false),
29
+ noProviderSorting: makeProp(PROP_TYPE_BOOLEAN, false)
30
+ };
31
+
32
+ // --- Mixin ---
33
+
34
+ // @vue/component
35
+ const providerMixin = extend({
36
+ mixins: [listenOnRootMixin],
37
+ props,
38
+ computed: {
39
+ hasProvider() {
40
+ return isFunction(this.items);
41
+ },
42
+ providerTriggerContext() {
43
+ // Used to trigger the provider function via a watcher. Only the fields that
44
+ // are needed for triggering a provider update are included. Note that the
45
+ // regular this.context is sent to the provider during fetches though, as they
46
+ // may need all the prop info.
47
+ const ctx = {
48
+ apiUrl: this.apiUrl,
49
+ filter: null,
50
+ sortBy: null,
51
+ sortDesc: null,
52
+ perPage: null,
53
+ currentPage: null
54
+ };
55
+ if (!this.noProviderFiltering) {
56
+ // Either a string, or could be an object or array.
57
+ ctx.filter = this.localFilter;
58
+ }
59
+ if (!this.noProviderSorting) {
60
+ ctx.sortBy = this.localSortBy;
61
+ ctx.sortDesc = this.localSortDesc;
62
+ }
63
+ if (!this.noProviderPaging) {
64
+ ctx.perPage = this.perPage;
65
+ ctx.currentPage = this.currentPage;
66
+ }
67
+ return clone(ctx);
68
+ }
69
+ },
70
+ watch: {
71
+ // Provider update triggering
72
+ items(newValue) {
73
+ // If a new provider has been specified, trigger an update
74
+ if (this.hasProvider || isFunction(newValue)) {
75
+ this.$nextTick(this._providerUpdate);
76
+ }
77
+ },
78
+ providerTriggerContext(newValue, oldValue) {
79
+ // Trigger the provider to update as the relevant context values have changed.
80
+ if (!looseEqual(newValue, oldValue)) {
81
+ this.$nextTick(this._providerUpdate);
82
+ }
83
+ }
84
+ },
85
+ mounted() {
86
+ // Call the items provider if necessary
87
+ if (this.hasProvider && (!this.localItems || this.localItems.length === 0)) {
88
+ // Fetch on mount if localItems is empty
89
+ this._providerUpdate();
90
+ }
91
+ // Listen for global messages to tell us to force refresh the table
92
+ this.listenOnRoot(ROOT_ACTION_EVENT_NAME_REFRESH, id => {
93
+ if (id === this.id || id === this) {
94
+ this.refresh();
95
+ }
96
+ });
97
+ },
98
+ methods: {
99
+ refresh() {
100
+ const {
101
+ items,
102
+ computedBusy
103
+ } = safeVueInstance(this);
104
+
105
+ // Public Method: Force a refresh of the provider function
106
+ this.$_pendingRefresh = false;
107
+ if (computedBusy) {
108
+ // Can't force an update when forced busy by user (busy prop === true)
109
+ if (this.localBusy && this.hasProvider) {
110
+ // But if provider running (localBusy), re-schedule refresh once `refreshed` emitted
111
+ this.$_pendingRefresh = true;
112
+ }
113
+ } else {
114
+ this.clearSelected();
115
+ if (this.hasProvider) {
116
+ this.$nextTick(this._providerUpdate);
117
+ } else {
118
+ /* istanbul ignore next */
119
+ this.localItems = isArray(items) ? items.slice() : [];
120
+ }
121
+ }
122
+ },
123
+ // Provider related methods
124
+ _providerSetLocal(items) {
125
+ this.localItems = isArray(items) ? items.slice() : [];
126
+ this.localBusy = false;
127
+ this.$emit(EVENT_NAME_REFRESHED);
128
+ // New root emit
129
+ if (this.id) {
130
+ this.emitOnRoot(ROOT_EVENT_NAME_REFRESHED, this.id);
131
+ }
132
+ // Handle pending refresh request
133
+ if (this.$_pendingRefresh) {
134
+ this.$_pendingRefresh = false;
135
+ this.refresh();
136
+ }
137
+ },
138
+ _providerUpdate() {
139
+ // Refresh the provider function items.
140
+ if (!this.hasProvider) {
141
+ // Do nothing if no provider
142
+ return;
143
+ }
144
+ // If table is busy, wait until refreshed before calling again
145
+ if (safeVueInstance(this).computedBusy) {
146
+ // Schedule a new refresh once `refreshed` is emitted
147
+ this.$nextTick(this.refresh);
148
+ return;
149
+ }
150
+
151
+ // Set internal busy state
152
+ this.localBusy = true;
153
+
154
+ // Call provider function with context and optional callback after DOM is fully updated
155
+ this.$nextTick(() => {
156
+ try {
157
+ // Call provider function passing it the context and optional callback
158
+ const data = this.items(this.context, this._providerSetLocal);
159
+ if (isPromise(data)) {
160
+ // Provider returned Promise
161
+ data.then(items => {
162
+ // Provider resolved with items
163
+ this._providerSetLocal(items);
164
+ });
165
+ } else if (isArray(data)) {
166
+ // Provider returned Array data
167
+ this._providerSetLocal(data);
168
+ } else {
169
+ /* istanbul ignore if */
170
+ if (this.items.length !== 2) {
171
+ // Check number of arguments provider function requested
172
+ // Provider not using callback (didn't request second argument), so we clear
173
+ // busy state as most likely there was an error in the provider function
174
+ /* istanbul ignore next */
175
+ warn("Provider function didn't request callback and did not return a promise or data.", NAME_TABLE);
176
+ this.localBusy = false;
177
+ }
178
+ }
179
+ } catch (e) /* istanbul ignore next */{
180
+ // Provider function borked on us, so we spew out a warning
181
+ // and clear the busy state
182
+ warn(`Provider function error [${e.name}] ${e.message}.`, NAME_TABLE);
183
+ this.localBusy = false;
184
+ this.$_pendingRefresh = false;
185
+ }
186
+ });
187
+ }
188
+ }
189
+ });
190
+
191
+ export { props, providerMixin };