@gitlab/ui 132.0.1 → 132.0.3
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.
- package/dist/charts.js +13 -0
- package/dist/components/base/accordion/accordion.js +69 -0
- package/dist/components/base/accordion/accordion_item.js +160 -0
- package/dist/components/base/accordion/constants.js +3 -0
- package/dist/components/base/alert/alert.js +263 -0
- package/dist/components/base/animated_icon/animated_chevron_down_up_icon.js +45 -0
- package/dist/components/base/animated_icon/animated_chevron_lg_down_up_icon.js +45 -0
- package/dist/components/base/animated_icon/animated_chevron_lg_right_down_icon.js +45 -0
- package/dist/components/base/animated_icon/animated_chevron_right_down_icon.js +45 -0
- package/dist/components/base/animated_icon/animated_duo_chat_icon.js +45 -0
- package/dist/components/base/animated_icon/animated_loader_icon.js +45 -0
- package/dist/components/base/animated_icon/animated_notifications_icon.js +45 -0
- package/dist/components/base/animated_icon/animated_sidebar_icon.js +45 -0
- package/dist/components/base/animated_icon/animated_smile_icon.js +45 -0
- package/dist/components/base/animated_icon/animated_sort_icon.js +45 -0
- package/dist/components/base/animated_icon/animated_star_icon.js +45 -0
- package/dist/components/base/animated_icon/animated_todo_icon.js +45 -0
- package/dist/components/base/animated_icon/animated_upload_icon.js +45 -0
- package/dist/components/base/animated_icon/base_animated_icon.js +77 -0
- package/dist/components/base/attribute_list/attribute_list.js +100 -0
- package/dist/components/base/avatar/avatar.js +175 -0
- package/dist/components/base/avatar/utils.js +17 -0
- package/dist/components/base/avatar_labeled/avatar_labeled.js +198 -0
- package/dist/components/base/avatar_link/avatar_link.js +47 -0
- package/dist/components/base/avatars_inline/avatars_inline.js +139 -0
- package/dist/components/base/badge/badge.js +197 -0
- package/dist/components/base/banner/banner.js +149 -0
- package/dist/components/base/breadcrumb/breadcrumb.js +282 -0
- package/dist/components/base/breadcrumb/breadcrumb_item.js +96 -0
- package/dist/components/base/broadcast_message/broadcast_message.js +113 -0
- package/dist/components/base/broadcast_message/constants.js +5 -0
- package/dist/components/base/button/button.js +419 -0
- package/dist/components/base/button_group/button_group.js +53 -0
- package/dist/components/base/card/card.js +69 -0
- package/dist/components/base/collapse/collapse.js +163 -0
- package/dist/components/base/color_mode_toggle/color_mode_toggle.js +92 -0
- package/dist/components/base/datepicker/datepicker.js +475 -0
- package/dist/components/base/daterange_picker/daterange_picker.js +394 -0
- package/dist/components/base/drawer/drawer.js +156 -0
- package/dist/components/base/dropdown/dropdown.js +330 -0
- package/dist/components/base/dropdown/dropdown_divider.js +48 -0
- package/dist/components/base/dropdown/dropdown_form.js +48 -0
- package/dist/components/base/dropdown/dropdown_item.js +175 -0
- package/dist/components/base/dropdown/dropdown_section_header.js +48 -0
- package/dist/components/base/dropdown/dropdown_text.js +48 -0
- package/dist/components/base/filtered_search/common_story_options.js +14 -0
- package/dist/components/base/filtered_search/filtered_search.js +428 -0
- package/dist/components/base/filtered_search/filtered_search_suggestion.js +95 -0
- package/dist/components/base/filtered_search/filtered_search_suggestion_list.js +139 -0
- package/dist/components/base/filtered_search/filtered_search_term.js +217 -0
- package/dist/components/base/filtered_search/filtered_search_token.js +383 -0
- package/dist/components/base/filtered_search/filtered_search_token_segment.js +444 -0
- package/dist/components/base/filtered_search/filtered_search_utils.js +241 -0
- package/dist/components/base/form/form.js +43 -0
- package/dist/components/base/form/form_character_count/form_character_count.js +107 -0
- package/dist/components/base/form/form_checkbox/form_checkbox.js +342 -0
- package/dist/components/base/form/form_checkbox/form_checkbox_group.js +188 -0
- package/dist/components/base/form/form_combobox/constants.js +55 -0
- package/dist/components/base/form/form_combobox/form_combobox.js +239 -0
- package/dist/components/base/form/form_date/form_date.js +143 -0
- package/dist/components/base/form/form_fields/form_field_validator.js +93 -0
- package/dist/components/base/form/form_fields/form_fields.js +289 -0
- package/dist/components/base/form/form_fields/form_fields_loop.js +75 -0
- package/dist/components/base/form/form_fields/mappers.js +13 -0
- package/dist/components/base/form/form_fields/validators.js +48 -0
- package/dist/components/base/form/form_group/form_group.js +119 -0
- package/dist/components/base/form/form_input/form_input.js +695 -0
- package/dist/components/base/form/form_input_group/form_input_group.js +120 -0
- package/dist/components/base/form/form_input_group/form_input_group_mixin.js +41 -0
- package/dist/components/base/form/form_radio/form_radio.js +259 -0
- package/dist/components/base/form/form_radio_group/form_radio_group.js +189 -0
- package/dist/components/base/form/form_select/constants.js +12 -0
- package/dist/components/base/form/form_select/form_select.js +96 -0
- package/dist/components/base/form/form_textarea/form_textarea.js +166 -0
- package/dist/components/base/form/input_group_text/input_group_text.js +43 -0
- package/dist/components/base/icon/icon.js +113 -0
- package/dist/components/base/illustration/illustration.js +80 -0
- package/dist/components/base/infinite_scroll/infinite_scroll.js +196 -0
- package/dist/components/base/keyset_pagination/keyset_pagination.js +152 -0
- package/dist/components/base/label/label.js +174 -0
- package/dist/components/base/link/link.js +330 -0
- package/dist/components/base/loading_icon/loading_icon.js +120 -0
- package/dist/components/base/markdown/markdown.js +50 -0
- package/dist/components/base/modal/modal.js +259 -0
- package/dist/components/base/new_dropdowns/base_dropdown/base_dropdown.js +716 -0
- package/dist/components/base/new_dropdowns/base_dropdown/constants.js +5 -0
- package/dist/components/base/new_dropdowns/base_dropdown/dropdown_container.js +32 -0
- package/dist/components/base/new_dropdowns/constants.js +24 -0
- package/dist/components/base/new_dropdowns/disclosure/constants.js +8 -0
- package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown.js +400 -0
- package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown_group.js +112 -0
- package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.js +196 -0
- package/dist/components/base/new_dropdowns/disclosure/mock_data.js +168 -0
- package/dist/components/base/new_dropdowns/disclosure/utils.js +84 -0
- package/dist/components/base/new_dropdowns/listbox/listbox.js +997 -0
- package/dist/components/base/new_dropdowns/listbox/listbox_group.js +58 -0
- package/dist/components/base/new_dropdowns/listbox/listbox_item.js +112 -0
- package/dist/components/base/new_dropdowns/listbox/listbox_search_input.js +94 -0
- package/dist/components/base/new_dropdowns/listbox/mock_data.js +131 -0
- package/dist/components/base/new_dropdowns/listbox/utils.js +33 -0
- package/dist/components/base/pagination/pagination.js +397 -0
- package/dist/components/base/path/data.js +34 -0
- package/dist/components/base/path/path.js +177 -0
- package/dist/components/base/popover/popover.js +142 -0
- package/dist/components/base/progress_bar/progress_bar.js +117 -0
- package/dist/components/base/search_box_by_click/search_box_by_click.js +245 -0
- package/dist/components/base/search_box_by_type/search_box_by_type.js +187 -0
- package/dist/components/base/segmented_control/segmented_control.js +73 -0
- package/dist/components/base/skeleton_loader/skeleton_loader.js +232 -0
- package/dist/components/base/sorting/sorting.js +180 -0
- package/dist/components/base/table/constants.js +5 -0
- package/dist/components/base/table/table.js +187 -0
- package/dist/components/base/table_lite/table_lite.js +80 -0
- package/dist/components/base/tabs/constants.js +3 -0
- package/dist/components/base/tabs/tab/tab.js +113 -0
- package/dist/components/base/tabs/tabs/scrollable_tabs.js +162 -0
- package/dist/components/base/tabs/tabs/tabs.js +223 -0
- package/dist/components/base/toast/index.js +66 -0
- package/dist/components/base/toast/toast.js +125 -0
- package/dist/components/base/toast/toaster.js +87 -0
- package/dist/components/base/toggle/toggle.js +178 -0
- package/dist/components/base/token/token.js +97 -0
- package/dist/components/base/token_selector/helpers.js +5 -0
- package/dist/components/base/token_selector/token_container.js +160 -0
- package/dist/components/base/token_selector/token_selector.js +454 -0
- package/dist/components/base/token_selector/token_selector_dropdown.js +223 -0
- package/dist/components/base/tooltip/tooltip.js +54 -0
- package/dist/components/charts/area/area.js +329 -0
- package/dist/components/charts/bar/bar.js +207 -0
- package/dist/components/charts/chart/chart.js +215 -0
- package/dist/components/charts/column/column.js +221 -0
- package/dist/components/charts/discrete_scatter/discrete_scatter.js +199 -0
- package/dist/components/charts/gauge/gauge.js +205 -0
- package/dist/components/charts/heatmap/heatmap.js +299 -0
- package/dist/components/charts/heatmap/index.js +2 -0
- package/dist/components/charts/legend/legend.js +245 -0
- package/dist/components/charts/line/line.js +340 -0
- package/dist/components/charts/series_label/series_label.js +101 -0
- package/dist/components/charts/shared/tooltip/tooltip.js +369 -0
- package/dist/components/charts/shared/tooltip/tooltip_default_format/tooltip_default_format.js +53 -0
- package/dist/components/charts/single_stat/single_stat.js +164 -0
- package/dist/components/charts/sparkline/sparkline.js +299 -0
- package/dist/components/charts/stacked_column/stacked_column.js +380 -0
- package/dist/components/dashboards/dashboard_layout/dashboard_layout.js +125 -0
- package/dist/components/dashboards/dashboard_layout/grid_layout/grid_layout.js +326 -0
- package/dist/components/dashboards/dashboard_layout/validators.js +14 -0
- package/dist/components/dashboards/dashboard_panel/dashboard_panel.js +236 -0
- package/dist/components/dashboards/mock_data.js +49 -0
- package/dist/components/experimental/experiment_badge/constants.js +4 -0
- package/dist/components/experimental/experiment_badge/experiment_badge.js +102 -0
- package/dist/components/extended/multi_step_form_template/multi_step_form_template.js +87 -0
- package/dist/components/index.js +107 -0
- package/dist/components/mixins/button_mixin.js +11 -0
- package/dist/components/mixins/safe_link_mixin.js +30 -0
- package/dist/components/mixins/tooltip_mixin.js +21 -0
- package/dist/components/regions/dashboard_skeleton/dashboard_skeleton.js +53 -0
- package/dist/components/regions/empty_state/empty_state.js +181 -0
- package/dist/components/shared_components/clear_icon_button/clear_icon_button.js +64 -0
- package/dist/components/shared_components/clipboard_button/clipboard_button.js +100 -0
- package/dist/components/shared_components/close_button/close_button.js +55 -0
- package/dist/components/utilities/animated_number/animated_number.js +131 -0
- package/dist/components/utilities/friendly_wrap/friendly_wrap.js +75 -0
- package/dist/components/utilities/intersection_observer/intersection_observer.js +88 -0
- package/dist/components/utilities/intersperse/intersperse.js +104 -0
- package/dist/components/utilities/sprintf/sprintf.js +171 -0
- package/dist/components/utilities/truncate/constants.js +8 -0
- package/dist/components/utilities/truncate/truncate.js +154 -0
- package/dist/components/utilities/truncate_text/constants.js +7 -0
- package/dist/components/utilities/truncate_text/truncate_text.js +146 -0
- package/dist/config.js +53 -0
- package/dist/directives/hover_load/hover_load.js +45 -0
- package/dist/directives/index.js +8 -0
- package/dist/directives/modal.js +1 -0
- package/dist/directives/outside/outside.js +149 -0
- package/dist/directives/resize_observer/resize_observer.js +58 -0
- package/dist/directives/safe_html/constants.js +6 -0
- package/dist/directives/safe_html/safe_html.js +39 -0
- package/dist/directives/safe_link/mock_data.js +10 -0
- package/dist/directives/safe_link/safe_link.js +67 -0
- package/dist/directives/tooltip/container.js +7 -0
- package/dist/directives/tooltip/tooltip.js +18 -0
- package/dist/index.css +7 -0
- package/dist/index.css.map +1 -0
- package/dist/index.js +2 -0
- package/dist/tailwind.css +2 -0
- package/dist/tailwind.css.map +1 -0
- package/dist/tokens/build/js/tokens.dark.js +1410 -0
- package/dist/tokens/build/js/tokens.js +1410 -0
- package/dist/tokens/common_story_options.js +29 -0
- package/dist/tokens/tokens_story.js +76 -0
- package/dist/utils/breakpoints.js +20 -0
- package/dist/utils/charts/config.js +616 -0
- package/dist/utils/charts/constants.js +69 -0
- package/dist/utils/charts/mock_data.js +191 -0
- package/dist/utils/charts/story_config.js +24 -0
- package/dist/utils/charts/theme.js +200 -0
- package/dist/utils/charts/utils.js +54 -0
- package/dist/utils/constants.js +331 -0
- package/dist/utils/data_utils.js +19 -0
- package/dist/utils/datetime_utility.js +61 -0
- package/dist/utils/equality_utils.js +84 -0
- package/dist/utils/form_options_utils.js +46 -0
- package/dist/utils/i18n.js +65 -0
- package/dist/utils/is_slot_empty.js +34 -0
- package/dist/utils/number_utils.js +132 -0
- package/dist/utils/play_utils.js +11 -0
- package/dist/utils/set_utils.js +25 -0
- package/dist/utils/stories_constants.js +29 -0
- package/dist/utils/stories_utils.js +62 -0
- package/dist/utils/story_decorators/container.js +19 -0
- package/dist/utils/string_utils.js +69 -0
- package/dist/utils/svgs/svg_paths.js +7 -0
- package/dist/utils/test_utils.js +33 -0
- package/dist/utils/url_utils.js +56 -0
- package/dist/utils/use_fake_date.js +29 -0
- package/dist/utils/use_mock_intersection_observer.js +105 -0
- package/dist/utils/utils.js +205 -0
- package/dist/utils/vue_utils.js +57 -0
- package/dist/utils.js +5 -0
- package/dist/vendor/bootstrap-vue/src/bv-config.js +8 -0
- package/dist/vendor/bootstrap-vue/src/components/button/button-close.js +81 -0
- package/dist/vendor/bootstrap-vue/src/components/button/button.js +204 -0
- package/dist/vendor/bootstrap-vue/src/components/button/index.js +2 -0
- package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-divider.js +44 -0
- package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-form.js +59 -0
- package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-group.js +98 -0
- package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-header.js +63 -0
- package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-item-button.js +108 -0
- package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-item.js +97 -0
- package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-text.js +60 -0
- package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown.js +270 -0
- package/dist/vendor/bootstrap-vue/src/components/dropdown/index.js +8 -0
- package/dist/vendor/bootstrap-vue/src/components/form/form-invalid-feedback.js +80 -0
- package/dist/vendor/bootstrap-vue/src/components/form/form-text.js +55 -0
- package/dist/vendor/bootstrap-vue/src/components/form/form-valid-feedback.js +80 -0
- package/dist/vendor/bootstrap-vue/src/components/form/form.js +56 -0
- package/dist/vendor/bootstrap-vue/src/components/form/index.js +4 -0
- package/dist/vendor/bootstrap-vue/src/components/form-group/form-group.js +347 -0
- package/dist/vendor/bootstrap-vue/src/components/form-group/index.js +1 -0
- package/dist/vendor/bootstrap-vue/src/components/form-select/form-select-option-group.js +56 -0
- package/dist/vendor/bootstrap-vue/src/components/form-select/form-select-option.js +47 -0
- package/dist/vendor/bootstrap-vue/src/components/form-select/form-select.js +154 -0
- package/dist/vendor/bootstrap-vue/src/components/form-select/helpers/mixin-options.js +63 -0
- package/dist/vendor/bootstrap-vue/src/components/form-select/index.js +3 -0
- package/dist/vendor/bootstrap-vue/src/components/form-textarea/form-textarea.js +236 -0
- package/dist/vendor/bootstrap-vue/src/components/form-textarea/index.js +1 -0
- package/dist/vendor/bootstrap-vue/src/components/layout/col.js +155 -0
- package/dist/vendor/bootstrap-vue/src/components/layout/form-row.js +34 -0
- package/dist/vendor/bootstrap-vue/src/components/layout/index.js +2 -0
- package/dist/vendor/bootstrap-vue/src/components/link/index.js +1 -0
- package/dist/vendor/bootstrap-vue/src/components/link/link.js +283 -0
- package/dist/vendor/bootstrap-vue/src/components/modal/helpers/bv-modal-event.class.js +21 -0
- package/dist/vendor/bootstrap-vue/src/components/modal/helpers/modal-manager.js +212 -0
- package/dist/vendor/bootstrap-vue/src/components/modal/index.js +1 -0
- package/dist/vendor/bootstrap-vue/src/components/modal/modal.js +1059 -0
- package/dist/vendor/bootstrap-vue/src/components/popover/helpers/bv-popover-template.js +55 -0
- package/dist/vendor/bootstrap-vue/src/components/popover/helpers/bv-popover.js +31 -0
- package/dist/vendor/bootstrap-vue/src/components/popover/index.js +1 -0
- package/dist/vendor/bootstrap-vue/src/components/popover/popover.js +64 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/constants.js +22 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/default-sort-compare.js +64 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/filter-event.js +40 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-bottom-row.js +43 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-busy.js +86 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-caption.js +57 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-colgroup.js +32 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-empty.js +101 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-filtering.js +292 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-items.js +169 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-pagination.js +51 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-provider.js +210 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-selectable.js +227 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-sorting.js +328 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-stacked.js +42 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-table-renderer.js +241 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-tbody-row.js +349 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-tbody.js +247 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-tfoot.js +69 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-thead.js +233 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-top-row.js +42 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/normalize-fields.js +86 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/sanitize-row.js +31 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/stringify-record-values.js +11 -0
- package/dist/vendor/bootstrap-vue/src/components/table/helpers/text-selection-active.js +14 -0
- package/dist/vendor/bootstrap-vue/src/components/table/index.js +9 -0
- package/dist/vendor/bootstrap-vue/src/components/table/table-lite.js +51 -0
- package/dist/vendor/bootstrap-vue/src/components/table/table-simple.js +44 -0
- package/dist/vendor/bootstrap-vue/src/components/table/table.js +67 -0
- package/dist/vendor/bootstrap-vue/src/components/table/tbody.js +116 -0
- package/dist/vendor/bootstrap-vue/src/components/table/td.js +204 -0
- package/dist/vendor/bootstrap-vue/src/components/table/tfoot.js +96 -0
- package/dist/vendor/bootstrap-vue/src/components/table/th.js +26 -0
- package/dist/vendor/bootstrap-vue/src/components/table/thead.js +99 -0
- package/dist/vendor/bootstrap-vue/src/components/table/tr.js +121 -0
- package/dist/vendor/bootstrap-vue/src/components/tabs/index.js +2 -0
- package/dist/vendor/bootstrap-vue/src/components/tabs/tab.js +238 -0
- package/dist/vendor/bootstrap-vue/src/components/tabs/tabs.js +690 -0
- package/dist/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-popper.js +278 -0
- package/dist/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip-template.js +125 -0
- package/dist/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip.js +932 -0
- package/dist/vendor/bootstrap-vue/src/components/tooltip/index.js +1 -0
- package/dist/vendor/bootstrap-vue/src/components/tooltip/tooltip.js +337 -0
- package/dist/vendor/bootstrap-vue/src/components/transition/bv-transition.js +118 -0
- package/dist/vendor/bootstrap-vue/src/components/transporter/transporter.js +220 -0
- package/dist/vendor/bootstrap-vue/src/constants/components.js +55 -0
- package/dist/vendor/bootstrap-vue/src/constants/config.js +11 -0
- package/dist/vendor/bootstrap-vue/src/constants/env.js +36 -0
- package/dist/vendor/bootstrap-vue/src/constants/events.js +56 -0
- package/dist/vendor/bootstrap-vue/src/constants/key-codes.js +11 -0
- package/dist/vendor/bootstrap-vue/src/constants/popper.js +10 -0
- package/dist/vendor/bootstrap-vue/src/constants/props.js +24 -0
- package/dist/vendor/bootstrap-vue/src/constants/regex.js +35 -0
- package/dist/vendor/bootstrap-vue/src/constants/safe-types.js +15 -0
- package/dist/vendor/bootstrap-vue/src/constants/slots.js +36 -0
- package/dist/vendor/bootstrap-vue/src/directives/modal/index.js +1 -0
- package/dist/vendor/bootstrap-vue/src/directives/modal/modal.js +112 -0
- package/dist/vendor/bootstrap-vue/src/directives/tooltip/index.js +1 -0
- package/dist/vendor/bootstrap-vue/src/directives/tooltip/tooltip.js +267 -0
- package/dist/vendor/bootstrap-vue/src/directives/visible/index.js +1 -0
- package/dist/vendor/bootstrap-vue/src/directives/visible/visible.js +187 -0
- package/dist/vendor/bootstrap-vue/src/mixins/attrs.js +5 -0
- package/dist/vendor/bootstrap-vue/src/mixins/click-out.js +54 -0
- package/dist/vendor/bootstrap-vue/src/mixins/dropdown.js +470 -0
- package/dist/vendor/bootstrap-vue/src/mixins/focus-in.js +46 -0
- package/dist/vendor/bootstrap-vue/src/mixins/form-control.js +73 -0
- package/dist/vendor/bootstrap-vue/src/mixins/form-custom.js +26 -0
- package/dist/vendor/bootstrap-vue/src/mixins/form-options.js +91 -0
- package/dist/vendor/bootstrap-vue/src/mixins/form-selection.js +62 -0
- package/dist/vendor/bootstrap-vue/src/mixins/form-size.js +26 -0
- package/dist/vendor/bootstrap-vue/src/mixins/form-state.js +50 -0
- package/dist/vendor/bootstrap-vue/src/mixins/form-text.js +293 -0
- package/dist/vendor/bootstrap-vue/src/mixins/form-validity.js +50 -0
- package/dist/vendor/bootstrap-vue/src/mixins/has-listener.js +29 -0
- package/dist/vendor/bootstrap-vue/src/mixins/id.js +57 -0
- package/dist/vendor/bootstrap-vue/src/mixins/listen-on-document.js +62 -0
- package/dist/vendor/bootstrap-vue/src/mixins/listen-on-root.js +120 -0
- package/dist/vendor/bootstrap-vue/src/mixins/listen-on-window.js +62 -0
- package/dist/vendor/bootstrap-vue/src/mixins/listeners.js +25 -0
- package/dist/vendor/bootstrap-vue/src/mixins/model.js +10 -0
- package/dist/vendor/bootstrap-vue/src/mixins/normalize-slot.js +30 -0
- package/dist/vendor/bootstrap-vue/src/mixins/scoped-style.js +18 -0
- package/dist/vendor/bootstrap-vue/src/mixins/use-parent.js +14 -0
- package/dist/vendor/bootstrap-vue/src/utils/array.js +27 -0
- package/dist/vendor/bootstrap-vue/src/utils/bv-event.class.js +60 -0
- package/dist/vendor/bootstrap-vue/src/utils/cache.js +60 -0
- package/dist/vendor/bootstrap-vue/src/utils/clone-deep.js +18 -0
- package/dist/vendor/bootstrap-vue/src/utils/config-set.js +86 -0
- package/dist/vendor/bootstrap-vue/src/utils/config.js +71 -0
- package/dist/vendor/bootstrap-vue/src/utils/create-new-child-component.js +133 -0
- package/dist/vendor/bootstrap-vue/src/utils/css-escape.js +70 -0
- package/dist/vendor/bootstrap-vue/src/utils/dom.js +298 -0
- package/dist/vendor/bootstrap-vue/src/utils/element-to-vue-instance-registry.js +28 -0
- package/dist/vendor/bootstrap-vue/src/utils/env.js +16 -0
- package/dist/vendor/bootstrap-vue/src/utils/events.js +78 -0
- package/dist/vendor/bootstrap-vue/src/utils/get-event-root.js +5 -0
- package/dist/vendor/bootstrap-vue/src/utils/get-instance-from-directive.js +3 -0
- package/dist/vendor/bootstrap-vue/src/utils/get-scope-id.js +9 -0
- package/dist/vendor/bootstrap-vue/src/utils/get.js +63 -0
- package/dist/vendor/bootstrap-vue/src/utils/html.js +16 -0
- package/dist/vendor/bootstrap-vue/src/utils/identity.js +3 -0
- package/dist/vendor/bootstrap-vue/src/utils/inspect.js +35 -0
- package/dist/vendor/bootstrap-vue/src/utils/locale.js +18 -0
- package/dist/vendor/bootstrap-vue/src/utils/loose-equal.js +59 -0
- package/dist/vendor/bootstrap-vue/src/utils/loose-index-of.js +13 -0
- package/dist/vendor/bootstrap-vue/src/utils/math.js +9 -0
- package/dist/vendor/bootstrap-vue/src/utils/memoize.js +14 -0
- package/dist/vendor/bootstrap-vue/src/utils/model.js +33 -0
- package/dist/vendor/bootstrap-vue/src/utils/noop.js +3 -0
- package/dist/vendor/bootstrap-vue/src/utils/normalize-slot.js +51 -0
- package/dist/vendor/bootstrap-vue/src/utils/number.js +23 -0
- package/dist/vendor/bootstrap-vue/src/utils/object.js +72 -0
- package/dist/vendor/bootstrap-vue/src/utils/observe-dom.js +76 -0
- package/dist/vendor/bootstrap-vue/src/utils/on-instance-destroy.js +22 -0
- package/dist/vendor/bootstrap-vue/src/utils/plugins.js +124 -0
- package/dist/vendor/bootstrap-vue/src/utils/props.js +67 -0
- package/dist/vendor/bootstrap-vue/src/utils/router.js +150 -0
- package/dist/vendor/bootstrap-vue/src/utils/safe-vue-instance.js +14 -0
- package/dist/vendor/bootstrap-vue/src/utils/stable-sort.js +28 -0
- package/dist/vendor/bootstrap-vue/src/utils/string.js +47 -0
- package/dist/vendor/bootstrap-vue/src/utils/stringify-object-values.js +31 -0
- package/dist/vendor/bootstrap-vue/src/utils/warn.js +45 -0
- package/dist/vendor/bootstrap-vue/src/vue.js +55 -0
- package/package.json +4 -3
- package/src/components/base/link/link.vue +2 -2
- package/src/utils/url_utils.js +66 -0
- package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-divider.js +5 -2
- package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-form.js +16 -4
- package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-group.js +31 -8
- package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-header.js +15 -4
- package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-item-button.js +32 -8
- package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown.js +2 -2
- package/src/vendor/bootstrap-vue/src/components/form/form-invalid-feedback.js +35 -8
- package/src/vendor/bootstrap-vue/src/components/form/form-valid-feedback.js +35 -8
- package/src/vendor/bootstrap-vue/src/components/form-group/form-group.js +2 -2
- package/src/vendor/bootstrap-vue/src/components/form-select/form-select-option-group.js +4 -2
- package/src/vendor/bootstrap-vue/src/components/form-select/form-select-option.js +9 -3
- package/src/vendor/bootstrap-vue/src/components/form-select/form-select.js +16 -9
- package/src/vendor/bootstrap-vue/src/components/form-select/helpers/mixin-options.js +10 -3
- package/src/vendor/bootstrap-vue/src/components/form-textarea/form-textarea.js +26 -7
- package/src/vendor/bootstrap-vue/src/components/layout/col.js +2 -2
- package/src/vendor/bootstrap-vue/src/components/modal/modal.js +2 -2
- package/src/vendor/bootstrap-vue/src/components/popover/popover.js +23 -7
- package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-busy.js +5 -2
- package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-caption.js +10 -3
- package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-empty.js +25 -6
- package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-items.js +20 -5
- package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-pagination.js +11 -4
- package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-provider.js +27 -7
- package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-selectable.js +21 -7
- package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-sorting.js +72 -18
- package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-stacked.js +6 -3
- package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-table-renderer.js +72 -17
- package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-tbody-row.js +18 -6
- package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-tbody.js +7 -3
- package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-tfoot.js +27 -7
- package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-thead.js +21 -6
- package/src/vendor/bootstrap-vue/src/components/tabs/tabs.js +2 -2
- package/src/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-popper.js +36 -13
- package/src/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip-template.js +10 -3
- package/src/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip.js +8 -9
- package/src/vendor/bootstrap-vue/src/components/transition/bv-transition.js +20 -5
- package/src/vendor/bootstrap-vue/src/components/transporter/transporter.js +22 -6
- package/src/vendor/bootstrap-vue/src/mixins/listen-on-document.js +1 -2
- package/src/vendor/bootstrap-vue/src/mixins/listen-on-root.js +1 -2
- package/src/vendor/bootstrap-vue/src/mixins/listen-on-window.js +1 -2
- package/src/vendor/bootstrap-vue/src/utils/array.js +0 -1
- package/src/vendor/bootstrap-vue/src/utils/locale.js +1 -2
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import { extend, REF_FOR_KEY } from '../../../vue';
|
|
2
|
+
import { EVENT_NAME_ROW_HOVERED, EVENT_NAME_ROW_UNHOVERED, EVENT_NAME_ROW_CLICKED } from '../../../constants/events';
|
|
3
|
+
import { PROP_TYPE_ARRAY, PROP_TYPE_OBJECT, PROP_TYPE_STRING, PROP_TYPE_FUNCTION } from '../../../constants/props';
|
|
4
|
+
import { SLOT_NAME_ROW_DETAILS } from '../../../constants/slots';
|
|
5
|
+
import { useParentMixin } from '../../../mixins/use-parent';
|
|
6
|
+
import { get } from '../../../utils/get';
|
|
7
|
+
import { isFunction, isString, isUndefinedOrNull } from '../../../utils/inspect';
|
|
8
|
+
import { safeVueInstance } from '../../../utils/safe-vue-instance';
|
|
9
|
+
import { toString } from '../../../utils/string';
|
|
10
|
+
import { BTr } from '../tr';
|
|
11
|
+
import { BTd } from '../td';
|
|
12
|
+
import { BTh } from '../th';
|
|
13
|
+
import { FIELD_KEY_SHOW_DETAILS, FIELD_KEY_CELL_VARIANT, FIELD_KEY_ROW_VARIANT } from './constants';
|
|
14
|
+
|
|
15
|
+
// --- Props ---
|
|
16
|
+
|
|
17
|
+
const props = {
|
|
18
|
+
detailsTdClass: {
|
|
19
|
+
type: [PROP_TYPE_ARRAY, PROP_TYPE_OBJECT, PROP_TYPE_STRING],
|
|
20
|
+
required: false,
|
|
21
|
+
default: undefined
|
|
22
|
+
},
|
|
23
|
+
tbodyTrAttr: {
|
|
24
|
+
type: [PROP_TYPE_OBJECT, PROP_TYPE_FUNCTION],
|
|
25
|
+
required: false,
|
|
26
|
+
default: undefined
|
|
27
|
+
},
|
|
28
|
+
tbodyTrClass: {
|
|
29
|
+
type: [PROP_TYPE_ARRAY, PROP_TYPE_OBJECT, PROP_TYPE_STRING, PROP_TYPE_FUNCTION],
|
|
30
|
+
required: false,
|
|
31
|
+
default: undefined
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
// --- Mixin ---
|
|
36
|
+
|
|
37
|
+
// @vue/component
|
|
38
|
+
const tbodyRowMixin = extend({
|
|
39
|
+
mixins: [useParentMixin],
|
|
40
|
+
props,
|
|
41
|
+
methods: {
|
|
42
|
+
// Methods for computing classes, attributes and styles for table cells
|
|
43
|
+
getTdValues(item, key, tdValue, defaultValue) {
|
|
44
|
+
const {
|
|
45
|
+
bvParent
|
|
46
|
+
} = this;
|
|
47
|
+
if (tdValue) {
|
|
48
|
+
const value = get(item, key, '');
|
|
49
|
+
if (isFunction(tdValue)) {
|
|
50
|
+
return tdValue(value, key, item);
|
|
51
|
+
} else if (isString(tdValue) && isFunction(bvParent[tdValue])) {
|
|
52
|
+
return bvParent[tdValue](value, key, item);
|
|
53
|
+
}
|
|
54
|
+
return tdValue;
|
|
55
|
+
}
|
|
56
|
+
return defaultValue;
|
|
57
|
+
},
|
|
58
|
+
getThValues(item, key, thValue, type, defaultValue) {
|
|
59
|
+
const {
|
|
60
|
+
bvParent
|
|
61
|
+
} = this;
|
|
62
|
+
if (thValue) {
|
|
63
|
+
const value = get(item, key, '');
|
|
64
|
+
if (isFunction(thValue)) {
|
|
65
|
+
return thValue(value, key, item, type);
|
|
66
|
+
} else if (isString(thValue) && isFunction(bvParent[thValue])) {
|
|
67
|
+
return bvParent[thValue](value, key, item, type);
|
|
68
|
+
}
|
|
69
|
+
return thValue;
|
|
70
|
+
}
|
|
71
|
+
return defaultValue;
|
|
72
|
+
},
|
|
73
|
+
// Method to get the value for a field
|
|
74
|
+
getFormattedValue(item, field) {
|
|
75
|
+
const {
|
|
76
|
+
key
|
|
77
|
+
} = field;
|
|
78
|
+
const formatter = this.getFieldFormatter(key);
|
|
79
|
+
let value = get(item, key, null);
|
|
80
|
+
if (isFunction(formatter)) {
|
|
81
|
+
value = formatter(value, key, item);
|
|
82
|
+
}
|
|
83
|
+
return isUndefinedOrNull(value) ? '' : value;
|
|
84
|
+
},
|
|
85
|
+
// Factory function methods
|
|
86
|
+
toggleDetailsFactory(hasDetailsSlot, item) {
|
|
87
|
+
// Returns a function to toggle a row's details slot
|
|
88
|
+
return () => {
|
|
89
|
+
if (hasDetailsSlot) {
|
|
90
|
+
this.$set(item, FIELD_KEY_SHOW_DETAILS, !item[FIELD_KEY_SHOW_DETAILS]);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
// Row event handlers
|
|
95
|
+
rowHovered(event) {
|
|
96
|
+
// `mouseenter` handler (non-bubbling)
|
|
97
|
+
// `this.tbodyRowEventStopped` from tbody mixin
|
|
98
|
+
if (!this.tbodyRowEventStopped(event)) {
|
|
99
|
+
// `this.emitTbodyRowEvent` from tbody mixin
|
|
100
|
+
this.emitTbodyRowEvent(EVENT_NAME_ROW_HOVERED, event);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
rowUnhovered(event) {
|
|
104
|
+
// `mouseleave` handler (non-bubbling)
|
|
105
|
+
// `this.tbodyRowEventStopped` from tbody mixin
|
|
106
|
+
if (!this.tbodyRowEventStopped(event)) {
|
|
107
|
+
// `this.emitTbodyRowEvent` from tbody mixin
|
|
108
|
+
this.emitTbodyRowEvent(EVENT_NAME_ROW_UNHOVERED, event);
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
// Renders a TD or TH for a row's field
|
|
112
|
+
renderTbodyRowCell(field, colIndex, item, rowIndex) {
|
|
113
|
+
const {
|
|
114
|
+
isStacked
|
|
115
|
+
} = this;
|
|
116
|
+
const {
|
|
117
|
+
key,
|
|
118
|
+
label,
|
|
119
|
+
isRowHeader
|
|
120
|
+
} = field;
|
|
121
|
+
const h = this.$createElement;
|
|
122
|
+
const hasDetailsSlot = this.hasNormalizedSlot(SLOT_NAME_ROW_DETAILS);
|
|
123
|
+
const formatted = this.getFormattedValue(item, field);
|
|
124
|
+
const stickyColumn = !isStacked && (this.isResponsive || this.stickyHeader) && field.stickyColumn;
|
|
125
|
+
// We only uses the helper components for sticky columns to
|
|
126
|
+
// improve performance of BTable/BTableLite by reducing the
|
|
127
|
+
// total number of vue instances created during render
|
|
128
|
+
const cellTag = stickyColumn ? isRowHeader ? BTh : BTd : isRowHeader ? 'th' : 'td';
|
|
129
|
+
const cellVariant = item[FIELD_KEY_CELL_VARIANT] && item[FIELD_KEY_CELL_VARIANT][key] ? item[FIELD_KEY_CELL_VARIANT][key] : field.variant || null;
|
|
130
|
+
const data = {
|
|
131
|
+
// For the Vue key, we concatenate the column index and
|
|
132
|
+
// field key (as field keys could be duplicated)
|
|
133
|
+
// TODO: Although we do prevent duplicate field keys...
|
|
134
|
+
// So we could change this to: `row-${rowIndex}-cell-${key}`
|
|
135
|
+
class: [field.class ? field.class : '', this.getTdValues(item, key, field.tdClass, '')],
|
|
136
|
+
props: {},
|
|
137
|
+
attrs: {
|
|
138
|
+
'aria-colindex': String(colIndex + 1),
|
|
139
|
+
...(isRowHeader ? this.getThValues(item, key, field.thAttr, 'row', {}) : this.getTdValues(item, key, field.tdAttr, {}))
|
|
140
|
+
},
|
|
141
|
+
key: `row-${rowIndex}-cell-${colIndex}-${key}`
|
|
142
|
+
};
|
|
143
|
+
if (stickyColumn) {
|
|
144
|
+
// We are using the helper BTd or BTh
|
|
145
|
+
data.props = {
|
|
146
|
+
stackedHeading: isStacked ? label : null,
|
|
147
|
+
stickyColumn: true,
|
|
148
|
+
variant: cellVariant
|
|
149
|
+
};
|
|
150
|
+
} else {
|
|
151
|
+
// Using native TD or TH element, so we need to
|
|
152
|
+
// add in the attributes and variant class
|
|
153
|
+
data.attrs['data-label'] = isStacked && !isUndefinedOrNull(label) ? toString(label) : null;
|
|
154
|
+
data.attrs.role = isRowHeader ? 'rowheader' : 'cell';
|
|
155
|
+
data.attrs.scope = isRowHeader ? 'row' : null;
|
|
156
|
+
// Add in the variant class
|
|
157
|
+
if (cellVariant) {
|
|
158
|
+
data.class.push(`${this.dark ? 'bg' : 'table'}-${cellVariant}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const slotScope = {
|
|
162
|
+
item,
|
|
163
|
+
index: rowIndex,
|
|
164
|
+
field,
|
|
165
|
+
unformatted: get(item, key, ''),
|
|
166
|
+
value: formatted,
|
|
167
|
+
toggleDetails: this.toggleDetailsFactory(hasDetailsSlot, item),
|
|
168
|
+
detailsShowing: Boolean(item[FIELD_KEY_SHOW_DETAILS])
|
|
169
|
+
};
|
|
170
|
+
// If table supports selectable mode, then add in the following scope
|
|
171
|
+
// this.supportsSelectableRows will be undefined if mixin isn't loaded
|
|
172
|
+
if (safeVueInstance(this).supportsSelectableRows) {
|
|
173
|
+
slotScope.rowSelected = this.isRowSelected(rowIndex);
|
|
174
|
+
slotScope.selectRow = () => this.selectRow(rowIndex);
|
|
175
|
+
slotScope.unselectRow = () => this.unselectRow(rowIndex);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// The new `v-slot` syntax doesn't like a slot name starting with
|
|
179
|
+
// a square bracket and if using in-document HTML templates, the
|
|
180
|
+
// v-slot attributes are lower-cased by the browser.
|
|
181
|
+
// Switched to round bracket syntax to prevent confusion with
|
|
182
|
+
// dynamic slot name syntax.
|
|
183
|
+
// We look for slots in this order: `cell(${key})`, `cell(${key.toLowerCase()})`, 'cell()'
|
|
184
|
+
// Slot names are now cached by mixin tbody in `this.$_bodyFieldSlotNameCache`
|
|
185
|
+
// Will be `null` if no slot (or fallback slot) exists
|
|
186
|
+
const slotName = this.$_bodyFieldSlotNameCache[key];
|
|
187
|
+
let $childNodes = slotName ? this.normalizeSlot(slotName, slotScope) : toString(formatted);
|
|
188
|
+
if (this.isStacked) {
|
|
189
|
+
// We wrap in a DIV to ensure rendered as a single cell when visually stacked!
|
|
190
|
+
$childNodes = [h('div', [$childNodes])];
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Render either a td or th cell
|
|
194
|
+
return h(cellTag, data, [$childNodes]);
|
|
195
|
+
},
|
|
196
|
+
// Renders an item's row (or rows if details supported)
|
|
197
|
+
renderTbodyRow(item, rowIndex) {
|
|
198
|
+
const {
|
|
199
|
+
computedFields: fields,
|
|
200
|
+
striped,
|
|
201
|
+
primaryKey,
|
|
202
|
+
currentPage,
|
|
203
|
+
perPage,
|
|
204
|
+
tbodyTrClass,
|
|
205
|
+
tbodyTrAttr,
|
|
206
|
+
hasSelectableRowClick
|
|
207
|
+
} = safeVueInstance(this);
|
|
208
|
+
const h = this.$createElement;
|
|
209
|
+
const hasDetailsSlot = this.hasNormalizedSlot(SLOT_NAME_ROW_DETAILS);
|
|
210
|
+
const rowShowDetails = item[FIELD_KEY_SHOW_DETAILS] && hasDetailsSlot;
|
|
211
|
+
const hasRowClickHandler = this.$listeners[EVENT_NAME_ROW_CLICKED] || hasSelectableRowClick;
|
|
212
|
+
|
|
213
|
+
// We can return more than one TR if rowDetails enabled
|
|
214
|
+
const $rows = [];
|
|
215
|
+
|
|
216
|
+
// Details ID needed for `aria-details` when details showing
|
|
217
|
+
// We set it to `null` when not showing so that attribute
|
|
218
|
+
// does not appear on the element
|
|
219
|
+
const detailsId = rowShowDetails ? this.safeId(`_details_${rowIndex}_`) : null;
|
|
220
|
+
|
|
221
|
+
// For each item data field in row
|
|
222
|
+
const $tds = fields.map((field, colIndex) => {
|
|
223
|
+
return this.renderTbodyRowCell(field, colIndex, item, rowIndex);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
// Calculate the row number in the dataset (indexed from 1)
|
|
227
|
+
let ariaRowIndex = null;
|
|
228
|
+
if (currentPage && perPage && perPage > 0) {
|
|
229
|
+
ariaRowIndex = String((currentPage - 1) * perPage + rowIndex + 1);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Create a unique :key to help ensure that sub components are re-rendered rather than
|
|
233
|
+
// re-used, which can cause issues. If a primary key is not provided we use the rendered
|
|
234
|
+
// rows index within the tbody.
|
|
235
|
+
// See: https://github.com/bootstrap-vue/bootstrap-vue/issues/2410
|
|
236
|
+
const primaryKeyValue = toString(get(item, primaryKey)) || null;
|
|
237
|
+
const rowKey = primaryKeyValue || toString(rowIndex);
|
|
238
|
+
|
|
239
|
+
// If primary key is provided, use it to generate a unique ID on each tbody > tr
|
|
240
|
+
// In the format of '{tableId}__row_{primaryKeyValue}'
|
|
241
|
+
const rowId = primaryKeyValue ? this.safeId(`_row_${primaryKeyValue}`) : null;
|
|
242
|
+
|
|
243
|
+
// Selectable classes and attributes
|
|
244
|
+
const selectableClasses = safeVueInstance(this).selectableRowClasses ? this.selectableRowClasses(rowIndex) : {};
|
|
245
|
+
const selectableAttrs = safeVueInstance(this).selectableRowAttrs ? this.selectableRowAttrs(rowIndex) : {};
|
|
246
|
+
|
|
247
|
+
// Additional classes and attributes
|
|
248
|
+
const userTrClasses = isFunction(tbodyTrClass) ? tbodyTrClass(item, 'row') : tbodyTrClass;
|
|
249
|
+
const userTrAttrs = isFunction(tbodyTrAttr) ? /* istanbul ignore next */tbodyTrAttr(item, 'row') : tbodyTrAttr;
|
|
250
|
+
|
|
251
|
+
// Add the item row
|
|
252
|
+
$rows.push(h(BTr, {
|
|
253
|
+
class: [userTrClasses, selectableClasses, rowShowDetails ? 'b-table-has-details' : ''],
|
|
254
|
+
props: {
|
|
255
|
+
variant: item[FIELD_KEY_ROW_VARIANT] || null
|
|
256
|
+
},
|
|
257
|
+
attrs: {
|
|
258
|
+
id: rowId,
|
|
259
|
+
...userTrAttrs,
|
|
260
|
+
// Users cannot override the following attributes
|
|
261
|
+
tabindex: hasRowClickHandler ? '0' : null,
|
|
262
|
+
'data-pk': primaryKeyValue || null,
|
|
263
|
+
'aria-details': detailsId,
|
|
264
|
+
'aria-owns': detailsId,
|
|
265
|
+
'aria-rowindex': ariaRowIndex,
|
|
266
|
+
...selectableAttrs
|
|
267
|
+
},
|
|
268
|
+
on: {
|
|
269
|
+
// Note: These events are not A11Y friendly!
|
|
270
|
+
mouseenter: this.rowHovered,
|
|
271
|
+
mouseleave: this.rowUnhovered
|
|
272
|
+
},
|
|
273
|
+
key: `__b-table-row-${rowKey}__`,
|
|
274
|
+
ref: 'item-rows',
|
|
275
|
+
[REF_FOR_KEY]: true
|
|
276
|
+
}, $tds));
|
|
277
|
+
|
|
278
|
+
// Row Details slot
|
|
279
|
+
if (rowShowDetails) {
|
|
280
|
+
const detailsScope = {
|
|
281
|
+
item,
|
|
282
|
+
index: rowIndex,
|
|
283
|
+
fields,
|
|
284
|
+
toggleDetails: this.toggleDetailsFactory(hasDetailsSlot, item)
|
|
285
|
+
};
|
|
286
|
+
// If table supports selectable mode, then add in the following scope
|
|
287
|
+
// this.supportsSelectableRows will be undefined if mixin isn't loaded
|
|
288
|
+
if (safeVueInstance(this).supportsSelectableRows) {
|
|
289
|
+
detailsScope.rowSelected = this.isRowSelected(rowIndex);
|
|
290
|
+
detailsScope.selectRow = () => this.selectRow(rowIndex);
|
|
291
|
+
detailsScope.unselectRow = () => this.unselectRow(rowIndex);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// Render the details slot in a TD
|
|
295
|
+
const $details = h(BTd, {
|
|
296
|
+
props: {
|
|
297
|
+
colspan: fields.length
|
|
298
|
+
},
|
|
299
|
+
class: this.detailsTdClass
|
|
300
|
+
}, [this.normalizeSlot(SLOT_NAME_ROW_DETAILS, detailsScope)]);
|
|
301
|
+
|
|
302
|
+
// Add a hidden row to keep table row striping consistent when details showing
|
|
303
|
+
// Only added if the table is striped
|
|
304
|
+
if (striped) {
|
|
305
|
+
$rows.push(
|
|
306
|
+
// We don't use `BTr` here as we don't need the extra functionality
|
|
307
|
+
h('tr', {
|
|
308
|
+
staticClass: 'd-none',
|
|
309
|
+
attrs: {
|
|
310
|
+
'aria-hidden': 'true',
|
|
311
|
+
role: 'presentation'
|
|
312
|
+
},
|
|
313
|
+
key: `__b-table-details-stripe__${rowKey}`
|
|
314
|
+
}));
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Add the actual details row
|
|
318
|
+
const userDetailsTrClasses = isFunction(this.tbodyTrClass) ? /* istanbul ignore next */this.tbodyTrClass(item, SLOT_NAME_ROW_DETAILS) : this.tbodyTrClass;
|
|
319
|
+
const userDetailsTrAttrs = isFunction(this.tbodyTrAttr) ? /* istanbul ignore next */this.tbodyTrAttr(item, SLOT_NAME_ROW_DETAILS) : this.tbodyTrAttr;
|
|
320
|
+
$rows.push(h(BTr, {
|
|
321
|
+
staticClass: 'b-table-details',
|
|
322
|
+
class: [userDetailsTrClasses],
|
|
323
|
+
props: {
|
|
324
|
+
variant: item[FIELD_KEY_ROW_VARIANT] || null
|
|
325
|
+
},
|
|
326
|
+
attrs: {
|
|
327
|
+
...userDetailsTrAttrs,
|
|
328
|
+
// Users cannot override the following attributes
|
|
329
|
+
id: detailsId,
|
|
330
|
+
tabindex: '-1'
|
|
331
|
+
},
|
|
332
|
+
key: `__b-table-details__${rowKey}`
|
|
333
|
+
}, [$details]));
|
|
334
|
+
} else if (hasDetailsSlot) {
|
|
335
|
+
// Only add the placeholder if a the table has a row-details slot defined (but not shown)
|
|
336
|
+
$rows.push(h());
|
|
337
|
+
if (striped) {
|
|
338
|
+
// Add extra placeholder if table is striped
|
|
339
|
+
$rows.push(h());
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Return the row(s)
|
|
344
|
+
return $rows;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
export { props, tbodyRowMixin };
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { extend } from '../../../vue';
|
|
2
|
+
import { EVENT_NAME_ROW_CLICKED, EVENT_NAME_ROW_MIDDLE_CLICKED, EVENT_NAME_ROW_CONTEXTMENU, EVENT_NAME_ROW_DBLCLICKED } from '../../../constants/events';
|
|
3
|
+
import { CODE_ENTER, CODE_SPACE, CODE_UP, CODE_DOWN, CODE_HOME, CODE_END } from '../../../constants/key-codes';
|
|
4
|
+
import { PROP_TYPE_ARRAY, PROP_TYPE_OBJECT, PROP_TYPE_STRING } from '../../../constants/props';
|
|
5
|
+
import { from } from '../../../utils/array';
|
|
6
|
+
import { isElement, closest, isActiveElement, attemptFocus } from '../../../utils/dom';
|
|
7
|
+
import { safeVueInstance } from '../../../utils/safe-vue-instance';
|
|
8
|
+
import { stopEvent } from '../../../utils/events';
|
|
9
|
+
import { sortKeys } from '../../../utils/object';
|
|
10
|
+
import { pluckProps } from '../../../utils/props';
|
|
11
|
+
import { props as props$1, BTbody } from '../tbody';
|
|
12
|
+
import { filterEvent } from './filter-event';
|
|
13
|
+
import { textSelectionActive } from './text-selection-active';
|
|
14
|
+
import { props as props$2, tbodyRowMixin } from './mixin-tbody-row';
|
|
15
|
+
|
|
16
|
+
// --- Helper methods ---
|
|
17
|
+
|
|
18
|
+
const getCellSlotName = value => `cell(${value || ''})`;
|
|
19
|
+
|
|
20
|
+
// --- Props ---
|
|
21
|
+
|
|
22
|
+
const props = sortKeys({
|
|
23
|
+
...props$1,
|
|
24
|
+
...props$2,
|
|
25
|
+
tbodyClass: {
|
|
26
|
+
type: [PROP_TYPE_ARRAY, PROP_TYPE_OBJECT, PROP_TYPE_STRING],
|
|
27
|
+
required: false,
|
|
28
|
+
default: undefined
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// --- Mixin ---
|
|
33
|
+
|
|
34
|
+
// @vue/component
|
|
35
|
+
const tbodyMixin = extend({
|
|
36
|
+
mixins: [tbodyRowMixin],
|
|
37
|
+
props,
|
|
38
|
+
beforeDestroy() {
|
|
39
|
+
this.$_bodyFieldSlotNameCache = null;
|
|
40
|
+
},
|
|
41
|
+
methods: {
|
|
42
|
+
// Returns all the item TR elements (excludes detail and spacer rows)
|
|
43
|
+
// `this.$refs['item-rows']` is an array of item TR components/elements
|
|
44
|
+
// Rows should all be `<b-tr>` components, but we map to TR elements
|
|
45
|
+
// Also note that `this.$refs['item-rows']` may not always be in document order
|
|
46
|
+
getTbodyTrs() {
|
|
47
|
+
const {
|
|
48
|
+
$refs
|
|
49
|
+
} = this;
|
|
50
|
+
const tbody = $refs.tbody ? $refs.tbody.$el || $refs.tbody : null;
|
|
51
|
+
const trs = ($refs['item-rows'] || []).map(tr => tr.$el || tr);
|
|
52
|
+
return tbody && tbody.children && tbody.children.length > 0 && trs && trs.length > 0 ? from(tbody.children).filter(tr => trs.includes(tr)) : /* istanbul ignore next */[];
|
|
53
|
+
},
|
|
54
|
+
// Returns index of a particular TBODY item TR
|
|
55
|
+
// We set `true` on closest to include self in result
|
|
56
|
+
getTbodyTrIndex(el) {
|
|
57
|
+
/* istanbul ignore next: should not normally happen */
|
|
58
|
+
if (!isElement(el)) {
|
|
59
|
+
return -1;
|
|
60
|
+
}
|
|
61
|
+
const tr = el.tagName === 'TR' ? el : closest('tr', el, true);
|
|
62
|
+
return tr ? this.getTbodyTrs().indexOf(tr) : -1;
|
|
63
|
+
},
|
|
64
|
+
// Emits a row event, with the item object, row index and original event
|
|
65
|
+
emitTbodyRowEvent(type, event) {
|
|
66
|
+
if (type && event && event.target) {
|
|
67
|
+
const rowIndex = this.getTbodyTrIndex(event.target);
|
|
68
|
+
if (rowIndex > -1) {
|
|
69
|
+
// The array of TRs correlate to the `computedItems` array
|
|
70
|
+
const item = this.computedItems[rowIndex];
|
|
71
|
+
if (this.hasListener(type)) {
|
|
72
|
+
this.$emit(type, item, rowIndex, event);
|
|
73
|
+
}
|
|
74
|
+
// Call selectionHandler directly if selectable (defined in mixin-selectable.js)
|
|
75
|
+
if (type === EVENT_NAME_ROW_CLICKED && this.hasSelectableRowClick) {
|
|
76
|
+
this.selectionHandler(item, rowIndex, event);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
tbodyRowEventStopped(event) {
|
|
82
|
+
return this.stopIfBusy && this.stopIfBusy(event);
|
|
83
|
+
},
|
|
84
|
+
// Delegated row event handlers
|
|
85
|
+
onTbodyRowKeydown(event) {
|
|
86
|
+
// Keyboard navigation and row click emulation
|
|
87
|
+
const {
|
|
88
|
+
target,
|
|
89
|
+
keyCode
|
|
90
|
+
} = event;
|
|
91
|
+
if (this.tbodyRowEventStopped(event) || target.tagName !== 'TR' || !isActiveElement(target) || target.tabIndex !== 0) {
|
|
92
|
+
// Early exit if not an item row TR
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if ([CODE_ENTER, CODE_SPACE].includes(keyCode)) {
|
|
96
|
+
// Emulated click for keyboard users, transfer to click handler
|
|
97
|
+
stopEvent(event);
|
|
98
|
+
this.onTBodyRowClicked(event);
|
|
99
|
+
} else if ([CODE_UP, CODE_DOWN, CODE_HOME, CODE_END].includes(keyCode)) {
|
|
100
|
+
// Keyboard navigation
|
|
101
|
+
const rowIndex = this.getTbodyTrIndex(target);
|
|
102
|
+
if (rowIndex > -1) {
|
|
103
|
+
stopEvent(event);
|
|
104
|
+
const trs = this.getTbodyTrs();
|
|
105
|
+
const shift = event.shiftKey;
|
|
106
|
+
if (keyCode === CODE_HOME || shift && keyCode === CODE_UP) {
|
|
107
|
+
// Focus first row
|
|
108
|
+
attemptFocus(trs[0]);
|
|
109
|
+
} else if (keyCode === CODE_END || shift && keyCode === CODE_DOWN) {
|
|
110
|
+
// Focus last row
|
|
111
|
+
attemptFocus(trs[trs.length - 1]);
|
|
112
|
+
} else if (keyCode === CODE_UP && rowIndex > 0) {
|
|
113
|
+
// Focus previous row
|
|
114
|
+
attemptFocus(trs[rowIndex - 1]);
|
|
115
|
+
} else if (keyCode === CODE_DOWN && rowIndex < trs.length - 1) {
|
|
116
|
+
// Focus next row
|
|
117
|
+
attemptFocus(trs[rowIndex + 1]);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
onTBodyRowClicked(event) {
|
|
123
|
+
const {
|
|
124
|
+
$refs
|
|
125
|
+
} = this;
|
|
126
|
+
const tbody = $refs.tbody ? $refs.tbody.$el || $refs.tbody : null;
|
|
127
|
+
// Don't emit event when the table is busy, the user clicked
|
|
128
|
+
// on a non-disabled control or is selecting text
|
|
129
|
+
if (this.tbodyRowEventStopped(event) || filterEvent(event) || textSelectionActive(tbody || this.$el)) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
this.emitTbodyRowEvent(EVENT_NAME_ROW_CLICKED, event);
|
|
133
|
+
},
|
|
134
|
+
onTbodyRowMiddleMouseRowClicked(event) {
|
|
135
|
+
if (!this.tbodyRowEventStopped(event) && event.which === 2) {
|
|
136
|
+
this.emitTbodyRowEvent(EVENT_NAME_ROW_MIDDLE_CLICKED, event);
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
onTbodyRowContextmenu(event) {
|
|
140
|
+
if (!this.tbodyRowEventStopped(event)) {
|
|
141
|
+
this.emitTbodyRowEvent(EVENT_NAME_ROW_CONTEXTMENU, event);
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
onTbodyRowDblClicked(event) {
|
|
145
|
+
if (!this.tbodyRowEventStopped(event) && !filterEvent(event)) {
|
|
146
|
+
this.emitTbodyRowEvent(EVENT_NAME_ROW_DBLCLICKED, event);
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
// Render the tbody element and children
|
|
150
|
+
// Note:
|
|
151
|
+
// Row hover handlers are handled by the tbody-row mixin
|
|
152
|
+
// As mouseenter/mouseleave events do not bubble
|
|
153
|
+
renderTbody() {
|
|
154
|
+
const {
|
|
155
|
+
computedItems: items,
|
|
156
|
+
renderBusy,
|
|
157
|
+
renderTopRow,
|
|
158
|
+
renderEmpty,
|
|
159
|
+
renderBottomRow,
|
|
160
|
+
hasSelectableRowClick
|
|
161
|
+
} = safeVueInstance(this);
|
|
162
|
+
const h = this.$createElement;
|
|
163
|
+
const hasRowClickHandler = this.hasListener(EVENT_NAME_ROW_CLICKED) || hasSelectableRowClick;
|
|
164
|
+
|
|
165
|
+
// Prepare the tbody rows
|
|
166
|
+
const $rows = [];
|
|
167
|
+
|
|
168
|
+
// Add the item data rows or the busy slot
|
|
169
|
+
const $busy = renderBusy ? renderBusy() : null;
|
|
170
|
+
if ($busy) {
|
|
171
|
+
// If table is busy and a busy slot, then return only the busy "row" indicator
|
|
172
|
+
$rows.push($busy);
|
|
173
|
+
} else {
|
|
174
|
+
// Table isn't busy, or we don't have a busy slot
|
|
175
|
+
|
|
176
|
+
// Create a slot cache for improved performance when looking up cell slot names
|
|
177
|
+
// Values will be keyed by the field's `key` and will store the slot's name
|
|
178
|
+
// Slots could be dynamic (i.e. `v-if`), so we must compute on each render
|
|
179
|
+
// Used by tbody-row mixin render helper
|
|
180
|
+
const cache = {};
|
|
181
|
+
let defaultSlotName = getCellSlotName();
|
|
182
|
+
defaultSlotName = this.hasNormalizedSlot(defaultSlotName) ? defaultSlotName : null;
|
|
183
|
+
this.computedFields.forEach(field => {
|
|
184
|
+
const {
|
|
185
|
+
key
|
|
186
|
+
} = field;
|
|
187
|
+
const slotName = getCellSlotName(key);
|
|
188
|
+
const lowercaseSlotName = getCellSlotName(key.toLowerCase());
|
|
189
|
+
cache[key] = this.hasNormalizedSlot(slotName) ? slotName : this.hasNormalizedSlot(lowercaseSlotName) ? /* istanbul ignore next */lowercaseSlotName : defaultSlotName;
|
|
190
|
+
});
|
|
191
|
+
// Created as a non-reactive property so to not trigger component updates
|
|
192
|
+
// Must be a fresh object each render
|
|
193
|
+
this.$_bodyFieldSlotNameCache = cache;
|
|
194
|
+
|
|
195
|
+
// Add static top row slot (hidden in visibly stacked mode
|
|
196
|
+
// as we can't control `data-label` attr)
|
|
197
|
+
$rows.push(renderTopRow ? renderTopRow() : h());
|
|
198
|
+
|
|
199
|
+
// Render the rows
|
|
200
|
+
items.forEach((item, rowIndex) => {
|
|
201
|
+
// Render the individual item row (rows if details slot)
|
|
202
|
+
$rows.push(this.renderTbodyRow(item, rowIndex));
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
// Empty items / empty filtered row slot (only shows if `items.length < 1`)
|
|
206
|
+
$rows.push(renderEmpty ? renderEmpty() : h());
|
|
207
|
+
|
|
208
|
+
// Static bottom row slot (hidden in visibly stacked mode
|
|
209
|
+
// as we can't control `data-label` attr)
|
|
210
|
+
$rows.push(renderBottomRow ? renderBottomRow() : h());
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Note: these events will only emit if a listener is registered
|
|
214
|
+
const handlers = {
|
|
215
|
+
auxclick: this.onTbodyRowMiddleMouseRowClicked,
|
|
216
|
+
// TODO:
|
|
217
|
+
// Perhaps we do want to automatically prevent the
|
|
218
|
+
// default context menu from showing if there is a
|
|
219
|
+
// `row-contextmenu` listener registered
|
|
220
|
+
contextmenu: this.onTbodyRowContextmenu,
|
|
221
|
+
// The following event(s) is not considered A11Y friendly
|
|
222
|
+
dblclick: this.onTbodyRowDblClicked
|
|
223
|
+
// Hover events (`mouseenter`/`mouseleave`) are handled by `tbody-row` mixin
|
|
224
|
+
};
|
|
225
|
+
// Add in click/keydown listeners if needed
|
|
226
|
+
if (hasRowClickHandler) {
|
|
227
|
+
handlers.click = this.onTBodyRowClicked;
|
|
228
|
+
handlers.keydown = this.onTbodyRowKeydown;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Assemble rows into the tbody
|
|
232
|
+
const $tbody = h(BTbody, {
|
|
233
|
+
class: this.tbodyClass || null,
|
|
234
|
+
props: pluckProps(props$1, this.$props),
|
|
235
|
+
// BTbody transfers all native event listeners to the root element
|
|
236
|
+
// TODO: Only set the handlers if the table is not busy
|
|
237
|
+
on: handlers,
|
|
238
|
+
ref: 'tbody'
|
|
239
|
+
}, $rows);
|
|
240
|
+
|
|
241
|
+
// Return the assembled tbody
|
|
242
|
+
return $tbody;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
export { props, tbodyMixin };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { extend } from '../../../vue';
|
|
2
|
+
import { PROP_TYPE_BOOLEAN, PROP_TYPE_STRING, PROP_TYPE_ARRAY, PROP_TYPE_OBJECT } from '../../../constants/props';
|
|
3
|
+
import { SLOT_NAME_CUSTOM_FOOT } from '../../../constants/slots';
|
|
4
|
+
import { BTfoot } from '../tfoot';
|
|
5
|
+
|
|
6
|
+
// --- Props ---
|
|
7
|
+
|
|
8
|
+
const props = {
|
|
9
|
+
footClone: {
|
|
10
|
+
type: PROP_TYPE_BOOLEAN,
|
|
11
|
+
required: false,
|
|
12
|
+
default: false
|
|
13
|
+
},
|
|
14
|
+
// Any Bootstrap theme variant (or custom)
|
|
15
|
+
// Falls back to `headRowVariant`
|
|
16
|
+
footRowVariant: {
|
|
17
|
+
type: PROP_TYPE_STRING,
|
|
18
|
+
required: false,
|
|
19
|
+
default: undefined
|
|
20
|
+
},
|
|
21
|
+
// 'dark', 'light', or `null` (or custom)
|
|
22
|
+
footVariant: {
|
|
23
|
+
type: PROP_TYPE_STRING,
|
|
24
|
+
required: false,
|
|
25
|
+
default: undefined
|
|
26
|
+
},
|
|
27
|
+
tfootClass: {
|
|
28
|
+
type: [PROP_TYPE_ARRAY, PROP_TYPE_OBJECT, PROP_TYPE_STRING],
|
|
29
|
+
required: false,
|
|
30
|
+
default: undefined
|
|
31
|
+
},
|
|
32
|
+
tfootTrClass: {
|
|
33
|
+
type: [PROP_TYPE_ARRAY, PROP_TYPE_OBJECT, PROP_TYPE_STRING],
|
|
34
|
+
required: false,
|
|
35
|
+
default: undefined
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// --- Mixin ---
|
|
40
|
+
|
|
41
|
+
// @vue/component
|
|
42
|
+
const tfootMixin = extend({
|
|
43
|
+
props,
|
|
44
|
+
methods: {
|
|
45
|
+
renderTFootCustom() {
|
|
46
|
+
const h = this.$createElement;
|
|
47
|
+
if (this.hasNormalizedSlot(SLOT_NAME_CUSTOM_FOOT)) {
|
|
48
|
+
return h(BTfoot, {
|
|
49
|
+
class: this.tfootClass || null,
|
|
50
|
+
props: {
|
|
51
|
+
footVariant: this.footVariant || this.headVariant || null
|
|
52
|
+
},
|
|
53
|
+
key: 'bv-tfoot-custom'
|
|
54
|
+
}, this.normalizeSlot(SLOT_NAME_CUSTOM_FOOT, {
|
|
55
|
+
items: this.computedItems.slice(),
|
|
56
|
+
fields: this.computedFields.slice(),
|
|
57
|
+
columns: this.computedFields.length
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
return h();
|
|
61
|
+
},
|
|
62
|
+
renderTfoot() {
|
|
63
|
+
// Passing true to renderThead will make it render a tfoot
|
|
64
|
+
return this.footClone ? this.renderThead(true) : this.renderTFootCustom();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
export { props, tfootMixin };
|