From 0e318f4755e65eb569dcc579938d0d72c02abd62 Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Mon, 22 Jul 2019 13:18:02 -0300 Subject: [PATCH 001/100] feat(b-container): add support for bootstrap v4.4.x new responsive containers --- src/components/layout/container.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/layout/container.js b/src/components/layout/container.js index 6b518ef097b..48171a009e9 100644 --- a/src/components/layout/container.js +++ b/src/components/layout/container.js @@ -9,6 +9,11 @@ export const props = { fluid: { type: Boolean, default: false + }, + breakpoint: { + // New in Bootstrap v4.4.x + type: String, + default: null } } @@ -22,8 +27,9 @@ export const BContainer = /*#__PURE__*/ Vue.extend({ props.tag, mergeData(data, { class: { - container: !props.fluid, - 'container-fluid': props.fluid + container: !props.fluid && !props.breakpoint, + 'container-fluid': props.fluid && !props.breakpoint, + [`container-${props.breakpoint}`]: !!props.breakpoint } }), children From 9b58d94ef36a658bf618e0f83c7c36c081a4cab3 Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Mon, 22 Jul 2019 13:42:50 -0300 Subject: [PATCH 002/100] Update README.md --- src/components/layout/README.md | 40 +++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/src/components/layout/README.md b/src/components/layout/README.md index f9a35a97ade..20b7d92ea60 100644 --- a/src/components/layout/README.md +++ b/src/components/layout/README.md @@ -6,7 +6,7 @@ BootstrapVue provides several convenient _functional_ components tailored for layout, which can simplify your complex page markup compared to traditional Bootstrap v4 markup. Feel free to switch -back and forth between traditional Bootstrap v4 markup (i.e. `
`s and classes) and BootstrapVue +back and forth between traditional Bootstrap v4 markup (i.e. `
`s and classes) and BootstrapVue's functional layout components. ## How it works @@ -70,11 +70,18 @@ like the Containers (``) are the most basic layout element in Bootstrap and is **required when using the grid system**. Choose from a responsive, fixed-width container (meaning its max-width changes at each breakpoint) by default, or fluid-width (meaning it's 100% wide all the time) by -setting 'fluid' prop. +setting 'fluid' prop, or responsive containers where the container is fluid up until a specific +breakpoint. While containers can be nested, most layouts do not require a nested container. -**Fixed width container, based on viewport breakpoints:** +The default breakpoint widths can be configured using Bootstrap V4.x SCSS variables. See the +[Theming](/docs/reference/theming) reference page for additional details. + +### Default container + +The default `` is a responsive, fixed-width container, meaning its `max-width` changes +at each breakpoint. ```html @@ -82,7 +89,10 @@ While containers can be nested, most layouts do not require a nested container. ``` -**Fluid container which is always 100% width, regardless of viewport breakpoint:** +### Fluid width container + +Using the `fluid` prop on `` will render a container that is always 100% width, +regardless of viewport breakpoint. ```html @@ -90,6 +100,28 @@ While containers can be nested, most layouts do not require a nested container. ``` +### Responsive containers + +Responsive containers are new in Bootstrap v4.4. They allow you to specify a contaier that is 100% +wide until particular breakpoint is reached at which point a `max-width` is applied. For example, +setting prop `breakpoint` to `'md'` will render a container that is 100% wide to start until the +`'md'` breakpoint is reached, where it will remain through the higher breakpoints. + +```html + + 100% wide until small breakpoint + + + 100% wide until medium breakpoint + + + 100% wide until large breakpoint + + + 100% wide until extra large breakpoint + +``` + ## Rows `` and `` `` components must be placed inside a `` component, or an element (such as a From c1531c842b51bc578fe5e4fecea591e5b05d8827 Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Mon, 22 Jul 2019 13:45:41 -0300 Subject: [PATCH 003/100] Update container.spec.js --- src/components/layout/container.spec.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/components/layout/container.spec.js b/src/components/layout/container.spec.js index 1da041483b4..9e5df98b45e 100644 --- a/src/components/layout/container.spec.js +++ b/src/components/layout/container.spec.js @@ -37,6 +37,19 @@ describe('layout > container', () => { expect(wrapper.text()).toEqual('') }) + it('should have container-md class when prop breakkpoint="md"', async () => { + const wrapper = mount(BContainer, { + propsData: { + breakpoint: 'md' + } + }) + + expect(wrapper.is('div')).toBe(true) + expect(wrapper.classes()).toContain('container-md') + expect(wrapper.classes().length).toBe(1) + expect(wrapper.text()).toEqual('') + }) + it('has content from default slot', async () => { const wrapper = mount(BContainer, { slots: { From bf66240a973c5c9d9022076092da039d6ce80780 Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Mon, 22 Jul 2019 13:51:48 -0300 Subject: [PATCH 004/100] Update README.md --- src/components/layout/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/layout/README.md b/src/components/layout/README.md index 20b7d92ea60..4c085223cf6 100644 --- a/src/components/layout/README.md +++ b/src/components/layout/README.md @@ -102,6 +102,8 @@ regardless of viewport breakpoint. ### Responsive containers +Requires Bootstrap v4.4+ CSS + Responsive containers are new in Bootstrap v4.4. They allow you to specify a contaier that is 100% wide until particular breakpoint is reached at which point a `max-width` is applied. For example, setting prop `breakpoint` to `'md'` will render a container that is 100% wide to start until the From 234e2820686db9c6feecabd857d3a941df298cbe Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Mon, 22 Jul 2019 15:25:02 -0300 Subject: [PATCH 005/100] Update container.js --- src/components/layout/container.js | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/components/layout/container.js b/src/components/layout/container.js index 48171a009e9..04c484b339e 100644 --- a/src/components/layout/container.js +++ b/src/components/layout/container.js @@ -7,13 +7,9 @@ export const props = { default: 'div' }, fluid: { - type: Boolean, + // String breakpoint name new in Bootstrap v4.4.x + type: [Boolean, String], default: false - }, - breakpoint: { - // New in Bootstrap v4.4.x - type: String, - default: null } } @@ -27,9 +23,10 @@ export const BContainer = /*#__PURE__*/ Vue.extend({ props.tag, mergeData(data, { class: { - container: !props.fluid && !props.breakpoint, - 'container-fluid': props.fluid && !props.breakpoint, - [`container-${props.breakpoint}`]: !!props.breakpoint + container: !(props.fluid || props.fluid === ''), + 'container-fluid': props.fluid === true || props.fluid === '', + // Bootstrap v4.4+ responsive containers + [`container-${props.fluid}`]: props.fluid && props.fluid !== true } }), children From da4e3eb060e195e00fdcb00f17c8717ff5e9f60d Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Mon, 22 Jul 2019 15:25:31 -0300 Subject: [PATCH 006/100] Update container.spec.js --- src/components/layout/container.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/layout/container.spec.js b/src/components/layout/container.spec.js index 9e5df98b45e..d3ef8d57bad 100644 --- a/src/components/layout/container.spec.js +++ b/src/components/layout/container.spec.js @@ -37,10 +37,10 @@ describe('layout > container', () => { expect(wrapper.text()).toEqual('') }) - it('should have container-md class when prop breakkpoint="md"', async () => { + it('should have container-md class when prop fluid="md"', async () => { const wrapper = mount(BContainer, { propsData: { - breakpoint: 'md' + fluid: 'md' } }) From b96f8fe9a905f2cb713118f934527aa307f18082 Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Mon, 22 Jul 2019 15:28:08 -0300 Subject: [PATCH 007/100] Update README.md --- src/components/layout/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/layout/README.md b/src/components/layout/README.md index 4c085223cf6..95dbf2bebc1 100644 --- a/src/components/layout/README.md +++ b/src/components/layout/README.md @@ -100,26 +100,26 @@ regardless of viewport breakpoint. ``` -### Responsive containers +### Responsive fluid containers Requires Bootstrap v4.4+ CSS Responsive containers are new in Bootstrap v4.4. They allow you to specify a contaier that is 100% wide until particular breakpoint is reached at which point a `max-width` is applied. For example, -setting prop `breakpoint` to `'md'` will render a container that is 100% wide to start until the -`'md'` breakpoint is reached, where it will remain through the higher breakpoints. +setting prop `fluid` to `'md'` will render a container that is 100% wide to start until the `'md'` +breakpoint is reached, at which point it will have set widths of a regular non-fluid container. ```html - + 100% wide until small breakpoint - + 100% wide until medium breakpoint - + 100% wide until large breakpoint - + 100% wide until extra large breakpoint ``` From b04045e35ef266ef96e95bf60c088aa83750fa63 Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Mon, 22 Jul 2019 15:34:41 -0300 Subject: [PATCH 008/100] Update README.md --- src/components/layout/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/layout/README.md b/src/components/layout/README.md index 95dbf2bebc1..4f0c799ca07 100644 --- a/src/components/layout/README.md +++ b/src/components/layout/README.md @@ -107,7 +107,7 @@ regardless of viewport breakpoint. Responsive containers are new in Bootstrap v4.4. They allow you to specify a contaier that is 100% wide until particular breakpoint is reached at which point a `max-width` is applied. For example, setting prop `fluid` to `'md'` will render a container that is 100% wide to start until the `'md'` -breakpoint is reached, at which point it will have set widths of a regular non-fluid container. +breakpoint is reached, at which point it will remain at that breakpoint's max-width. ```html From ef2ed4fb06a16bfe4e5a988d32095551baa9defe Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Mon, 22 Jul 2019 15:49:28 -0300 Subject: [PATCH 009/100] Update README.md --- src/components/layout/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/components/layout/README.md b/src/components/layout/README.md index 4f0c799ca07..aaecc7968e8 100644 --- a/src/components/layout/README.md +++ b/src/components/layout/README.md @@ -100,6 +100,9 @@ regardless of viewport breakpoint. ``` +Setting the `fluid` prop to true (or an empty string) is equivalent to the `.container-fluid` +class. + ### Responsive fluid containers Requires Bootstrap v4.4+ CSS @@ -124,6 +127,8 @@ breakpoint is reached, at which point it will remain at that breakpoint's max-wi ``` +Setting the fluid prop to a breakpoint name translates to the class `.container-{breakpoint}`. + ## Rows `` and `` `` components must be placed inside a `` component, or an element (such as a From fc64c4ce0cba51052ce7e5d1f16c27378f0a6630 Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Mon, 22 Jul 2019 23:14:24 -0300 Subject: [PATCH 010/100] Update README.md --- src/components/layout/README.md | 52 ++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/src/components/layout/README.md b/src/components/layout/README.md index aaecc7968e8..0465deaab3a 100644 --- a/src/components/layout/README.md +++ b/src/components/layout/README.md @@ -7,7 +7,7 @@ BootstrapVue provides several convenient _functional_ components tailored for layout, which can simplify your complex page markup compared to traditional Bootstrap v4 markup. Feel free to switch back and forth between traditional Bootstrap v4 markup (i.e. `
`s and classes) and BootstrapVue's -functional layout components. +convenient functional layout components. ## How it works @@ -76,7 +76,8 @@ breakpoint. While containers can be nested, most layouts do not require a nested container. The default breakpoint widths can be configured using Bootstrap V4.x SCSS variables. See the -[Theming](/docs/reference/theming) reference page for additional details. +[Theming](/docs/reference/theming) reference page for additional details, and the table in the +[Grid options](#grid-options) section below. ### Default container @@ -100,7 +101,7 @@ regardless of viewport breakpoint. ``` -Setting the `fluid` prop to true (or an empty string) is equivalent to the `.container-fluid` +Setting the `fluid` prop to true (or an empty string) is equivalent to the Bootstrap `.container-fluid` class. ### Responsive fluid containers @@ -108,9 +109,9 @@ class. Requires Bootstrap v4.4+ CSS Responsive containers are new in Bootstrap v4.4. They allow you to specify a contaier that is 100% -wide until particular breakpoint is reached at which point a `max-width` is applied. For example, +wide (fluid) until particular breakpoint is reached at which point a `max-width` is applied. For example, setting prop `fluid` to `'md'` will render a container that is 100% wide to start until the `'md'` -breakpoint is reached, at which point it will remain at that breakpoint's max-width. +breakpoint is reached, at which point it will remain at that breakpoint's container `max-width`. ```html @@ -127,28 +128,28 @@ breakpoint is reached, at which point it will remain at that breakpoint's max-wi ``` -Setting the fluid prop to a breakpoint name translates to the class `.container-{breakpoint}`. +Setting the fluid prop to a breakpoint name translates to the Bootstrap class `.container-{breakpoint}`. ## Rows `` and `` -`` components must be placed inside a `` component, or an element (such as a +`` components should be placed inside a `` component, or an element (such as a `
`) that has the class `container` or `container-fluid` applied to it. You can remove the margin from `` and padding from `` by setting the `no-gutters` prop on ``. Or, for compact margins (smaller gutters between columns), use the `` component, which -is typically used in [forms](/docs/components/form). +is typically used when laying out [forms](/docs/components/form). ## Columns `` `` Must be placed inside a `` component, or an element (such as a `
`) that has the class `row` applied to it, or - in the case of [forms](/docs/components/form) - inside a -`` component to obtain columns with more compact margins. +`` component (to obtain columns with more compact margins). ## Grid options -While Bootstrap uses `ems` or `rems` for defining most sizes, `px`s are used for grid breakpoints +While Bootstrap uses `em` or `rem` units for defining most sizes, `px`s are used for grid breakpoints and container widths. This is because the viewport width is in pixels and does not change with the [font size](https://drafts.csswg.org/mediaqueries-3/#units). @@ -159,30 +160,30 @@ See how aspects of the Bootstrap grid system work across multiple devices with a - Extra small
+ Extra small (xs)
<576px - Small
+ Small (sm)
≥576px - Medium
+ Medium (md)
≥768px - Large
+ Large (lg)
≥992px - Extra large
+ Extra large (xl)
≥1200px - Max container width + Max container width None (auto) 540px 720px @@ -190,7 +191,7 @@ See how aspects of the Bootstrap grid system work across multiple devices with a 1140px - Prop + Prop cols="*" sm="*" md="*" @@ -198,19 +199,19 @@ See how aspects of the Bootstrap grid system work across multiple devices with a xl="*" - # of columns + # of columns 12 - Gutter width + Gutter width 30px (15px on each side of a column) - Nestable + Nestable Yes - Offset + Offset offset="*" offset-sm="*" offset-md="*" @@ -218,7 +219,7 @@ See how aspects of the Bootstrap grid system work across multiple devices with a offset-xl="*" - Order + Order order="*" order-sm="*" order-md="*" @@ -228,7 +229,12 @@ See how aspects of the Bootstrap grid system work across multiple devices with a -Note: there is no `xs` prop. The `cols` prop refers to the `xs` (smallest) breakpoint. +**Notes:** + +- There is no `xs` prop. The `cols` prop refers to the `xs` (smallest) breakpoint. +- The above breakpoint values and names are the Bootstrap defaults. They can be customized via + [SCSS variables](/docs/reference/theming), and (if also using custom breakpoint names), via the + BootstrapVue [global configuration](/docs/misc/settings). ## Auto-layout columns From 50e3838da8562a56df3c068d713ea55446eb92f2 Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Mon, 22 Jul 2019 23:16:51 -0300 Subject: [PATCH 011/100] Update jumbotron.js --- src/components/jumbotron/jumbotron.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/jumbotron/jumbotron.js b/src/components/jumbotron/jumbotron.js index 65382843372..00d3ce991ab 100644 --- a/src/components/jumbotron/jumbotron.js +++ b/src/components/jumbotron/jumbotron.js @@ -13,7 +13,7 @@ export const props = { default: false }, containerFluid: { - type: Boolean, + type: [Boolean, String], default: false }, header: { From 00276a70811b82763ee6a3c6a19a0018602edd11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20M=C3=BCller?= Date: Tue, 23 Jul 2019 08:44:24 +0200 Subject: [PATCH 012/100] Update README.md --- src/components/layout/README.md | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/components/layout/README.md b/src/components/layout/README.md index 0465deaab3a..92122459205 100644 --- a/src/components/layout/README.md +++ b/src/components/layout/README.md @@ -6,8 +6,8 @@ BootstrapVue provides several convenient _functional_ components tailored for layout, which can simplify your complex page markup compared to traditional Bootstrap v4 markup. Feel free to switch -back and forth between traditional Bootstrap v4 markup (i.e. `
`s and classes) and BootstrapVue's -convenient functional layout components. +back and forth between traditional Bootstrap v4 markup (i.e. `
`s and classes) and +BootstrapVue's convenient functional layout components. ## How it works @@ -101,17 +101,18 @@ regardless of viewport breakpoint. ``` -Setting the `fluid` prop to true (or an empty string) is equivalent to the Bootstrap `.container-fluid` -class. +Setting the `fluid` prop to true (or an empty string) is equivalent to the Bootstrap +`.container-fluid` class. ### Responsive fluid containers Requires Bootstrap v4.4+ CSS -Responsive containers are new in Bootstrap v4.4. They allow you to specify a contaier that is 100% -wide (fluid) until particular breakpoint is reached at which point a `max-width` is applied. For example, -setting prop `fluid` to `'md'` will render a container that is 100% wide to start until the `'md'` -breakpoint is reached, at which point it will remain at that breakpoint's container `max-width`. +Responsive containers are new in Bootstrap v4.4. They allow you to specify a container that is 100% +wide (fluid) until particular breakpoint is reached at which point a `max-width` is applied. For +example, setting prop `fluid` to `'md'` will render a container that is 100% wide to start until the +`'md'` breakpoint is reached, at which point it will remain at that breakpoint's container +`max-width`. ```html @@ -128,7 +129,8 @@ breakpoint is reached, at which point it will remain at that breakpoint's contai ``` -Setting the fluid prop to a breakpoint name translates to the Bootstrap class `.container-{breakpoint}`. +Setting the fluid prop to a breakpoint name translates to the Bootstrap class +`.container-{breakpoint}`. ## Rows `` and `` @@ -149,9 +151,9 @@ the class `row` applied to it, or - in the case of [forms](/docs/components/form ## Grid options -While Bootstrap uses `em` or `rem` units for defining most sizes, `px`s are used for grid breakpoints -and container widths. This is because the viewport width is in pixels and does not change with the -[font size](https://drafts.csswg.org/mediaqueries-3/#units). +While Bootstrap uses `em` or `rem` units for defining most sizes, `px`s are used for grid +breakpoints and container widths. This is because the viewport width is in pixels and does not +change with the [font size](https://drafts.csswg.org/mediaqueries-3/#units). See how aspects of the Bootstrap grid system work across multiple devices with a handy table. From 96ca9d6d01b2b530e86b85ab45b89ec6d084831b Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Tue, 8 Oct 2019 13:53:05 -0300 Subject: [PATCH 013/100] Update package.json --- src/components/layout/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/layout/package.json b/src/components/layout/package.json index e4bee424406..1c95fa424d3 100644 --- a/src/components/layout/package.json +++ b/src/components/layout/package.json @@ -11,7 +11,7 @@ "props": [ { "prop": "fluid", - "description": "When set, makes the row 100% wide all the time" + "description": "When set to true, makes the row 100% wide all the time, or set to one of the Bootstrap breakpoint names for 100% width up to the breakpoint" } ] }, From 764931f4c4d843c49aa207b2cccb1a97653a3e78 Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Tue, 8 Oct 2019 13:55:19 -0300 Subject: [PATCH 014/100] Update package.json --- src/components/jumbotron/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/jumbotron/package.json b/src/components/jumbotron/package.json index 97876c29ec9..e10238e46fc 100644 --- a/src/components/jumbotron/package.json +++ b/src/components/jumbotron/package.json @@ -14,7 +14,7 @@ }, { "prop": "containerFluid", - "description": "When prop 'fluid' is set, this prop will make the inner container wrapper also fluid in width" + "description": "When prop 'fluid' is set, this prop will make the inner container wrapper also fluid in width. Can also be set to one of the Bootstrap breakpoint names" }, { "prop": "headerLevel", From a7509644c592e8ba23cb5b0f1dfdedd92ca0dc25 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 13 Nov 2019 10:34:51 +0100 Subject: [PATCH 015/100] chore(deps): update devdependency eslint-plugin-vue to ^6.0.1 (#4379) --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index ae4c924f720..4a4db588b0c 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,7 @@ "eslint-plugin-prettier": "^3.1.1", "eslint-plugin-promise": "^4.2.1", "eslint-plugin-standard": "^4.0.1", - "eslint-plugin-vue": "^6.0.0", + "eslint-plugin-vue": "^6.0.1", "esm": "^3.2.25", "gh-pages": "^2.1.1", "highlight.js": "^9.16.2", diff --git a/yarn.lock b/yarn.lock index 4d8865fd142..1a09b4c4f7d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5213,12 +5213,12 @@ eslint-plugin-standard@^4.0.1: resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz#ff0519f7ffaff114f76d1bd7c3996eef0f6e20b4" integrity sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ== -eslint-plugin-vue@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-6.0.0.tgz#fc7a4116dff614a27be8639fb47973703dd332fa" - integrity sha512-+LxTJCd6nDt+AKQ1X+ySD48xJHft8OkeQmAhiq6UoAMxRFTiEKIDusiGgEUJLwKyiwGUGWbbqEbbWvupH5TSjg== +eslint-plugin-vue@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-6.0.1.tgz#166d3eb24cf290f3ff24d44fe9fca496f3924fc2" + integrity sha512-5tgFPcxGDKjfVB/6Yi56bKiWxygUibfZmzSh26Np3kuwAk/lfaGbVld+Yt+MPgD84ppvcachtiL4/winsXLjXA== dependencies: - vue-eslint-parser "^6.0.4" + vue-eslint-parser "^6.0.5" eslint-scope@^4.0.0, eslint-scope@^4.0.3: version "4.0.3" @@ -12853,10 +12853,10 @@ vue-client-only@^2.0.0: resolved "https://registry.yarnpkg.com/vue-client-only/-/vue-client-only-2.0.0.tgz#ddad8d675ee02c761a14229f0e440e219de1da1c" integrity sha512-arhk1wtWAfLsJyxGMoEYhoBowM87/i6HLSG2LH/03Yog6i2d9JEN1peMP0Ceis+/n9DxdenGYZZTxbPPJyHciA== -vue-eslint-parser@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-6.0.4.tgz#56ff47e2c2644bff39951d5a284982c7ecd6f7fa" - integrity sha512-GYsDsDWwKaGtnkW4nGUxr01wqIO2FB9/QHQTW1Gl5SUr5OyQvpnR90/D+Gq2cIxURX7aJ7+VyD+37Yx9eFwTgw== +vue-eslint-parser@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-6.0.5.tgz#c1c067c2755748e28f3872cd42e8c1c4c1a8059f" + integrity sha512-Bvjlx7rH1Ulvus56KHeLXOjEi3JMOYTa1GAqZr9lBQhd8weK8mV7U7V2l85yokBZEWHJQjLn6X3nosY8TzkOKg== dependencies: debug "^4.1.1" eslint-scope "^4.0.0" From ed3b7360af415dc3cc56f0b6662c9d48cc165781 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20M=C3=BCller?= Date: Thu, 14 Nov 2019 17:00:44 +0100 Subject: [PATCH 016/100] feat(b-form-select): support paths for `valueField`, `textField`, `htmlField` and `disabledField` props (#4386) --- src/mixins/form-options.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/mixins/form-options.js b/src/mixins/form-options.js index af0dcfd588a..32df57457c7 100644 --- a/src/mixins/form-options.js +++ b/src/mixins/form-options.js @@ -1,3 +1,4 @@ +import get from '../utils/get' import { stripTags } from '../utils/html' import { isArray, isPlainObject, isUndefined } from '../utils/inspect' import { keys } from '../utils/object' @@ -40,13 +41,13 @@ export default { // Normalize flat-ish arrays to Array of Objects return options.map(option => { if (isPlainObject(option)) { - const value = option[valueField] - const text = String(option[textField]) + const value = get(option, valueField) + const text = String(get(option, textField)) return { value: isUndefined(value) ? text : value, text: stripTags(text), - html: option[htmlField], - disabled: Boolean(option[disabledField]) + html: get(option, htmlField), + disabled: Boolean(get(option, disabledField)) } } return { @@ -61,13 +62,13 @@ export default { return keys(options).map(key => { const option = options[key] || {} if (isPlainObject(option)) { - const value = option[valueField] - const text = option[textField] + const value = get(option, valueField) + const text = get(option, textField) return { value: isUndefined(value) ? key : value, text: isUndefined(text) ? stripTags(String(key)) : stripTags(String(text)), - html: option[htmlField], - disabled: Boolean(option[disabledField]) + html: get(option, htmlField), + disabled: Boolean(get(option, disabledField)) } } return { From 84ab2613bda124fc3ac5a2ca1fa42ad862df6fac Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2019 14:49:01 -0400 Subject: [PATCH 017/100] chore(deps): update devdependency eslint-plugin-jest to ^23.0.4 (#4389) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4a4db588b0c..11bf2e57ab4 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ "eslint-config-standard": "^14.1.0", "eslint-config-vue": "^2.0.2", "eslint-plugin-import": "^2.18.2", - "eslint-plugin-jest": "^23.0.3", + "eslint-plugin-jest": "^23.0.4", "eslint-plugin-markdown": "^1.0.1", "eslint-plugin-node": "^10.0.0", "eslint-plugin-prettier": "^3.1.1", diff --git a/yarn.lock b/yarn.lock index 1a09b4c4f7d..a4e2fc5e1cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5168,10 +5168,10 @@ eslint-plugin-import@^2.18.2: read-pkg-up "^2.0.0" resolve "^1.11.0" -eslint-plugin-jest@^23.0.3: - version "23.0.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.0.3.tgz#d3f157f7791f97713372c13259ba1dfc436eb4c1" - integrity sha512-9cNxr66zeOyz1S9AkQL4/ouilR6QHpYj8vKOQZ60fu9hAt5PJWS4KqWqfr1aqN5NFEZSPjFOla2Azn+KTWiGwg== +eslint-plugin-jest@^23.0.4: + version "23.0.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-23.0.4.tgz#1ab81ffe3b16c5168efa72cbd4db14d335092aa0" + integrity sha512-OaP8hhT8chJNodUPvLJ6vl8gnalcsU/Ww1t9oR3HnGdEWjm/DdCCUXLOral+IPGAeWu/EwgVQCK/QtxALpH1Yw== dependencies: "@typescript-eslint/experimental-utils" "^2.5.0" From 136a72b0352d4bb1339ab31f791087cbcda42fa5 Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Thu, 14 Nov 2019 21:08:38 -0400 Subject: [PATCH 018/100] feat(b-collapse): add new prop `appear` to animate an initially visible collapse (#4317) * feat(collapse): add new prop `appear` to animate initially visible collapse * Update package.json * Update README.md * Create bv-collapse helper transition component * Update bv-collapse.js * Update bv-collapse.js * Update collapse.js * Update collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update collapse.js * Update collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update README.md * Update collapse.js * Update package.json * Update bv-collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update bv-collapse.js * Update bv-collapse.js --- src/components/collapse/README.md | 4 ++ src/components/collapse/collapse.js | 43 ++++++--------- src/components/collapse/package.json | 5 ++ src/utils/bv-collapse.js | 79 ++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 27 deletions(-) create mode 100644 src/utils/bv-collapse.js diff --git a/src/components/collapse/README.md b/src/components/collapse/README.md index f11df98a1a2..1523c239335 100644 --- a/src/components/collapse/README.md +++ b/src/components/collapse/README.md @@ -56,6 +56,10 @@ To make the `` show initially, set the `visible` prop: ``` +By default, an initially visible collapse will not animate on mount. To enable the collapse +expanding animation on mount (when `visible` or `v-model` is `true`), set the `appear` prop on +``. + ## `v-model` support The component's collapsed (visible) state can also be set with `v-model` which binds internally to diff --git a/src/components/collapse/collapse.js b/src/components/collapse/collapse.js index 14c464e372e..3e843069dbb 100644 --- a/src/components/collapse/collapse.js +++ b/src/components/collapse/collapse.js @@ -3,15 +3,14 @@ import idMixin from '../../mixins/id' import listenOnRootMixin from '../../mixins/listen-on-root' import normalizeSlotMixin from '../../mixins/normalize-slot' import { isBrowser } from '../../utils/env' +import { BVCollapse } from '../../utils/bv-collapse' import { addClass, hasClass, removeClass, closest, matches, - reflow, getCS, - getBCR, eventOn, eventOff } from '../../utils/dom' @@ -54,6 +53,11 @@ export const BCollapse = /*#__PURE__*/ Vue.extend({ tag: { type: String, default: 'div' + }, + appear: { + // If `true` (and `visible` is `true` on mount), animate initially visible + type: Boolean, + default: false } }, data() { @@ -141,36 +145,26 @@ export const BCollapse = /*#__PURE__*/ Vue.extend({ this.show = !this.show }, onEnter(el) { - el.style.height = 0 - reflow(el) - el.style.height = el.scrollHeight + 'px' this.transitioning = true // This should be moved out so we can add cancellable events this.$emit('show') }, onAfterEnter(el) { - el.style.height = null this.transitioning = false this.$emit('shown') }, onLeave(el) { - el.style.height = 'auto' - el.style.display = 'block' - el.style.height = getBCR(el).height + 'px' - reflow(el) this.transitioning = true - el.style.height = 0 // This should be moved out so we can add cancellable events this.$emit('hide') }, onAfterLeave(el) { - el.style.height = null this.transitioning = false this.$emit('hidden') }, emitState() { this.$emit('input', this.show) - // Let v-b-toggle know the state of this collapse + // Let `v-b-toggle` know the state of this collapse this.$root.$emit(EVENT_STATE, this.safeId(), this.show) if (this.accordion && this.show) { // Tell the other collapses in this accordion to close @@ -184,13 +178,15 @@ export const BCollapse = /*#__PURE__*/ Vue.extend({ this.$root.$emit(EVENT_STATE_SYNC, this.safeId(), this.show) }, checkDisplayBlock() { - // Check to see if the collapse has `display: block !important;` set. - // We can't set `display: none;` directly on this.$el, as it would - // trigger a new transition to start (or cancel a current one). + // Check to see if the collapse has `display: block !important` set + // We can't set `display: none` directly on `this.$el`, as it would + // trigger a new transition to start (or cancel a current one) const restore = hasClass(this.$el, 'show') removeClass(this.$el, 'show') const isBlock = getCS(this.$el).display === 'block' - restore && addClass(this.$el, 'show') + if (restore) { + addClass(this.$el, 'show') + } return isBlock }, clickHandler(evt) { @@ -202,7 +198,7 @@ export const BCollapse = /*#__PURE__*/ Vue.extend({ } if (matches(el, '.nav-link,.dropdown-item') || closest('.nav-link,.dropdown-item', el)) { if (!this.checkDisplayBlock()) { - // Only close the collapse if it is not forced to be 'display: block !important;' + // Only close the collapse if it is not forced to be `display: block !important` this.show = false } } @@ -246,16 +242,9 @@ export const BCollapse = /*#__PURE__*/ Vue.extend({ [this.normalizeSlot('default')] ) return h( - 'transition', + BVCollapse, { - props: { - enterClass: '', - enterActiveClass: 'collapsing', - enterToClass: '', - leaveClass: '', - leaveActiveClass: 'collapsing', - leaveToClass: '' - }, + props: { appear: this.appear }, on: { enter: this.onEnter, afterEnter: this.onAfterEnter, diff --git a/src/components/collapse/package.json b/src/components/collapse/package.json index 9be02e5dcf4..8526099418a 100644 --- a/src/components/collapse/package.json +++ b/src/components/collapse/package.json @@ -33,6 +33,11 @@ { "prop": "visible", "description": "When 'true', expands the collapse" + }, + { + "prop": "appear", + "version": "2.2.0", + "description": "When set, and prop 'visible' is true on mount, will animate on initial mount" } ], "events": [ diff --git a/src/utils/bv-collapse.js b/src/utils/bv-collapse.js new file mode 100644 index 00000000000..41a5c1ea989 --- /dev/null +++ b/src/utils/bv-collapse.js @@ -0,0 +1,79 @@ +// Generic collapse transion helper component +// +// Note: +// Applies the classes `collapse`, `show` and `collapsing` +// during the enter/leave transition phases only +// Although it appears that Vue may be leaving the classes +// in-place after the transition completes +import Vue from './vue' +import { mergeData } from 'vue-functional-data-merge' +import { getBCR, reflow, requestAF } from './dom' + +// Transition event handler helpers +const onEnter = el => { + el.style.height = 0 + // Animaton frame delay neeeded for `appear` to work + requestAF(() => { + reflow(el) + el.style.height = `${el.scrollHeight}px` + }) +} + +const onAfterEnter = el => { + el.style.height = null +} + +const onLeave = el => { + el.style.height = 'auto' + el.style.display = 'block' + el.style.height = `${getBCR(el).height}px` + reflow(el) + el.style.height = 0 +} + +const onAfterLeave = el => { + el.style.height = null +} + +// Default transition props +// `appear` will use the enter classes +const TRANSITION_PROPS = { + css: true, + enterClass: '', + enterActiveClass: 'collapsing', + enterToClass: 'collapse show', + leaveClass: 'collapse show', + leaveActiveClass: 'collapsing', + leaveToClass: 'collapse' +} + +// Default transition handlers +// `appear` will use the enter handlers +const TRANSITION_HANDLERS = { + enter: onEnter, + afterEnter: onAfterEnter, + leave: onLeave, + afterLeave: onAfterLeave +} + +// @vue/component +export const BVCollapse = /*#__PURE__*/ Vue.extend({ + name: 'BVCollapse', + functional: true, + props: { + appear: { + // If `true` (and `visible` is `true` on mount), animate initially visible + type: Boolean, + default: false + } + }, + render(h, { props, data, children }) { + return h( + 'transition', + // We merge in the `appear` prop last + mergeData(data, { props: TRANSITION_PROPS, on: TRANSITION_HANDLERS }, { props }), + // Note: `` supports a single root element only + children + ) + } +}) From 9a81cd414a2c534b96de0d82c3d00d94651e5a7b Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Fri, 15 Nov 2019 04:28:40 -0400 Subject: [PATCH 019/100] fix(b-table, b-table-lite): handle edge case with row events when table is removed from dom. instantiate row event handlers only when listeners are registered (fixes #4384) (#4388) * fix(b-table, b-table-lite): handle edge case with row events when table is removed from dom (fixes #4384) * Update mixin-tbody.js * Update mixin-tbody-row.js * Update table-tbody-row-events.spec.js * Update table-tbody-row-events.spec.js * Update mixin-tbody-row.js * only emit events if listeners are registered * Update table-tbody-row-events.spec.js * Update mixin-tbody-row.js * Update mixin-tbody.js * Update mixin-tbody.js * Update mixin-tbody-row.js * Update mixin-tbody.js --- .../table/helpers/mixin-tbody-row.js | 10 ++- src/components/table/helpers/mixin-tbody.js | 43 ++++++----- .../table/table-tbody-row-events.spec.js | 74 +++++++++++++++++++ 3 files changed, 104 insertions(+), 23 deletions(-) diff --git a/src/components/table/helpers/mixin-tbody-row.js b/src/components/table/helpers/mixin-tbody-row.js index 2a7c77b96f4..5bc4537c9d7 100644 --- a/src/components/table/helpers/mixin-tbody-row.js +++ b/src/components/table/helpers/mixin-tbody-row.js @@ -69,17 +69,19 @@ export default { rowHovered(evt) { // `mouseenter` handler (non-bubbling) // `this.tbodyRowEvtStopped` from tbody mixin - if (!this.tbodyRowEvtStopped(evt)) { + const type = 'row-hovered' + if (this.$listeners[type] && !this.tbodyRowEvtStopped(evt)) { // `this.emitTbodyRowEvent` from tbody mixin - this.emitTbodyRowEvent('row-hovered', evt) + this.emitTbodyRowEvent(type, evt) } }, rowUnhovered(evt) { // `mouseleave` handler (non-bubbling) // `this.tbodyRowEvtStopped` from tbody mixin - if (!this.tbodyRowEvtStopped(evt)) { + const type = 'row-unhovered' + if (this.$listeners[type] && !this.tbodyRowEvtStopped(evt)) { // `this.emitTbodyRowEvent` from tbody mixin - this.emitTbodyRowEvent('row-unhovered', evt) + this.emitTbodyRowEvent(type, evt) } }, // Render helpers diff --git a/src/components/table/helpers/mixin-tbody.js b/src/components/table/helpers/mixin-tbody.js index ae27c17dc61..278334255c7 100644 --- a/src/components/table/helpers/mixin-tbody.js +++ b/src/components/table/helpers/mixin-tbody.js @@ -24,13 +24,12 @@ export default { // `this.$refs.itemRows` is an array of item TR components/elements // Rows should all be B-TR components, but we map to TR elements // Also note that `this.$refs.itemRows` may not always be in document order - const tbody = this.$refs.tbody.$el || this.$refs.tbody - const trs = (this.$refs.itemRows || []).map(tr => tr.$el || tr) - // TODO: This may take time for tables many rows, so we may want to cache - // the result of this during each render cycle on a non-reactive - // property. We clear out the cache as each render starts, and - // populate it on first access of this method if null - return arrayFrom(tbody.children).filter(tr => arrayIncludes(trs, tr)) + const refs = this.$refs || {} + const tbody = refs.tbody ? refs.tbody.$el || refs.tbody : null + const trs = (refs.itemRows || []).map(tr => tr.$el || tr) + return tbody && tbody.children && tbody.children.length > 0 && trs && trs.length > 0 + ? arrayFrom(tbody.children).filter(tr => arrayIncludes(trs, tr)) + : [] }, getTbodyTrIndex(el) { // Returns index of a particular TBODY item TR @@ -102,6 +101,7 @@ export default { } }, onTBodyRowClicked(evt) { + // Row-clicked handler is only added when needed if (this.tbodyRowEvtStopped(evt)) { // If table is busy, then don't propagate return @@ -113,18 +113,21 @@ export default { this.emitTbodyRowEvent('row-clicked', evt) }, onTbodyRowMiddleMouseRowClicked(evt) { - if (!this.tbodyRowEvtStopped(evt) && evt.which === 2) { - this.emitTbodyRowEvent('row-middle-clicked', evt) + const type = 'row-middle-clicked' + if (this.$listeners[type] && !this.tbodyRowEvtStopped(evt) && evt.which === 2) { + this.emitTbodyRowEvent(type, evt) } }, onTbodyRowContextmenu(evt) { - if (!this.tbodyRowEvtStopped(evt)) { - this.emitTbodyRowEvent('row-contextmenu', evt) + const type = 'row-contextmenu' + if (this.$listeners[type] && !this.tbodyRowEvtStopped(evt)) { + this.emitTbodyRowEvent(type, evt) } }, onTbodyRowDblClicked(evt) { - if (!this.tbodyRowEvtStopped(evt) && !filterEvent(evt)) { - this.emitTbodyRowEvent('row-dblclicked', evt) + const type = 'row-dblclicked' + if (this.$listeners[type] && !this.tbodyRowEvtStopped(evt) && !filterEvent(evt)) { + this.emitTbodyRowEvent(type, evt) } }, // Note: Row hover handlers are handled by the tbody-row mixin @@ -187,22 +190,24 @@ export default { $rows.push(this.renderBottomRow ? this.renderBottomRow() : h()) } + // Note: these events will only emit if a listener is registered const handlers = { - // TODO: We may want to to only instantiate these handlers - // if there is an event listener registered auxclick: this.onTbodyRowMiddleMouseRowClicked, - // TODO: Perhaps we do want to automatically prevent the - // default context menu from showing if there is - // a `row-contextmenu` listener registered. + // TODO: + // Perhaps we do want to automatically prevent the + // default context menu from showing if there is a + // `row-contextmenu` listener registered contextmenu: this.onTbodyRowContextmenu, // The following event(s) is not considered A11Y friendly dblclick: this.onTbodyRowDblClicked - // hover events (mouseenter/mouseleave) ad handled by tbody-row mixin + // Hover events (`mouseenter`/`mouseleave`) are handled by `tbody-row` mixin } + // Add in click/keydown listeners if needed if (hasRowClickHandler) { handlers.click = this.onTBodyRowClicked handlers.keydown = this.onTbodyRowKeydown } + // Assemble rows into the tbody const $tbody = h( BTbody, diff --git a/src/components/table/table-tbody-row-events.spec.js b/src/components/table/table-tbody-row-events.spec.js index 75627793a37..a2e62e6038f 100644 --- a/src/components/table/table-tbody-row-events.spec.js +++ b/src/components/table/table-tbody-row-events.spec.js @@ -82,6 +82,10 @@ describe('table > tbody row events', () => { propsData: { fields: testFields, items: testItems + }, + listeners: { + // Row-dblclicked will only occur if there is a registered listener + 'row-dblclicked': () => {} } }) expect(wrapper).toBeDefined() @@ -104,6 +108,10 @@ describe('table > tbody row events', () => { fields: testFields, items: testItems, busy: true + }, + listeners: { + // Row-dblclicked will only occur if there is a registered listener + 'row-dblclicked': () => {} } }) expect(wrapper).toBeDefined() @@ -121,6 +129,10 @@ describe('table > tbody row events', () => { propsData: { fields: testFields, items: testItems + }, + listeners: { + // Row-middle-clicked will only occur if there is a registered listener + 'row-middle-clicked': () => {} } }) expect(wrapper).toBeDefined() @@ -143,6 +155,10 @@ describe('table > tbody row events', () => { fields: testFields, items: testItems, busy: true + }, + listeners: { + // Row-middle-clicked will only occur if there is a registered listener + 'row-middle-clicked': () => {} } }) expect(wrapper).toBeDefined() @@ -160,6 +176,10 @@ describe('table > tbody row events', () => { propsData: { fields: testFields, items: testItems + }, + listeners: { + // Row-contextmenu will only occur if there is a registered listener + 'row-contextmenu': () => {} } }) expect(wrapper).toBeDefined() @@ -182,6 +202,10 @@ describe('table > tbody row events', () => { fields: testFields, items: testItems, busy: true + }, + listeners: { + // Row-contextmenu will only occur if there is a registered listener + 'row-contextmenu': () => {} } }) expect(wrapper).toBeDefined() @@ -199,6 +223,10 @@ describe('table > tbody row events', () => { propsData: { fields: testFields, items: testItems + }, + listeners: { + // Row-hovered will only occur if there is a registered listener + 'row-hovered': () => {} } }) expect(wrapper).toBeDefined() @@ -215,12 +243,33 @@ describe('table > tbody row events', () => { wrapper.destroy() }) + it('should not emit row-hovered event when a row is hovered and no listener', async () => { + const wrapper = mount(BTable, { + propsData: { + fields: testFields, + items: testItems + } + }) + expect(wrapper).toBeDefined() + const $rows = wrapper.findAll('tbody > tr') + expect($rows.length).toBe(3) + expect(wrapper.emitted('row-hovered')).not.toBeDefined() + $rows.at(1).trigger('mouseenter') + expect(wrapper.emitted('row-hovered')).not.toBeDefined() + + wrapper.destroy() + }) + it('should not emit row-hovered event when a row is hovered and table busy', async () => { const wrapper = mount(BTable, { propsData: { fields: testFields, items: testItems, busy: true + }, + listeners: { + // Row-hovered will only occur if there is a registered listener + 'row-hovered': () => {} } }) expect(wrapper).toBeDefined() @@ -238,6 +287,10 @@ describe('table > tbody row events', () => { propsData: { fields: testFields, items: testItems + }, + listeners: { + // Row-unhovered will only occur if there is a registered listener + 'row-unhovered': () => {} } }) expect(wrapper).toBeDefined() @@ -254,12 +307,33 @@ describe('table > tbody row events', () => { wrapper.destroy() }) + it('should not emit row-nhovered event when a row is hovered and no listener', async () => { + const wrapper = mount(BTable, { + propsData: { + fields: testFields, + items: testItems + } + }) + expect(wrapper).toBeDefined() + const $rows = wrapper.findAll('tbody > tr') + expect($rows.length).toBe(3) + expect(wrapper.emitted('row-unhovered')).not.toBeDefined() + $rows.at(1).trigger('mouseleave') + expect(wrapper.emitted('row-unhovered')).not.toBeDefined() + + wrapper.destroy() + }) + it('should not emit row-unhovered event when a row is unhovered and table busy', async () => { const wrapper = mount(BTable, { propsData: { fields: testFields, items: testItems, busy: true + }, + listeners: { + // Row-unhovered will only occur if there is a registered listener + 'row-unhovered': () => {} } }) expect(wrapper).toBeDefined() From cc6a585fd58be258b6f63405ad23d57b152aa620 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 17 Nov 2019 15:09:42 +0100 Subject: [PATCH 020/100] chore(deps): update devdependency eslint-config-prettier to ^6.6.0 (#4392) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 11bf2e57ab4..b1e56e5243b 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "core-js": ">=2.6.5 <3.0.0", "cross-env": "^6.0.3", "eslint": "^6.6.0", - "eslint-config-prettier": "^6.5.0", + "eslint-config-prettier": "^6.6.0", "eslint-config-standard": "^14.1.0", "eslint-config-vue": "^2.0.2", "eslint-plugin-import": "^2.18.2", diff --git a/yarn.lock b/yarn.lock index a4e2fc5e1cd..d73b64aa8e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5110,10 +5110,10 @@ escodegen@^1.11.0, escodegen@^1.9.1: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@^6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.5.0.tgz#aaf9a495e2a816865e541bfdbb73a65cc162b3eb" - integrity sha512-cjXp8SbO9VFGW/Z7mbTydqS9to8Z58E5aYhj3e1+Hx7lS9s6gL5ILKNpCqZAFOVYRcSkWPFYljHrEh8QFEK5EQ== +eslint-config-prettier@^6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.6.0.tgz#4e039f65af8245e32d8fba4a2f5b83ed7186852e" + integrity sha512-6RGaj7jD+HeuSVHoIT6A0WkBhVEk0ULg74kp2FAWIwkYrOERae0TjIO09Cw33oN//gJWmt7aFhVJErEVta7uvA== dependencies: get-stdin "^6.0.0" From 1fa25f67aaaa5ca58ce9a47d7e89a0ffb5d599f1 Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Sun, 17 Nov 2019 10:41:54 -0400 Subject: [PATCH 021/100] chore: create hasListener mixin (#4391) * chore: create hasListener mixin * Update has-listener.js * Update has-listener.js * Update table-lite.js * Update table.js * Update table-lite.js * Update table.js * Update has-listener.js * Update mixin-tbody.js * Update mixin-thead.js * Update mixin-tbody-row.js * Update has-listener.js * Update has-listener.js --- .../table/helpers/mixin-tbody-row.js | 10 ++++----- src/components/table/helpers/mixin-tbody.js | 20 +++++++---------- src/components/table/helpers/mixin-thead.js | 2 +- src/components/table/table-lite.js | 2 ++ src/components/table/table.js | 2 ++ src/mixins/has-listener.js | 22 +++++++++++++++++++ 6 files changed, 39 insertions(+), 19 deletions(-) create mode 100644 src/mixins/has-listener.js diff --git a/src/components/table/helpers/mixin-tbody-row.js b/src/components/table/helpers/mixin-tbody-row.js index 5bc4537c9d7..2a7c77b96f4 100644 --- a/src/components/table/helpers/mixin-tbody-row.js +++ b/src/components/table/helpers/mixin-tbody-row.js @@ -69,19 +69,17 @@ export default { rowHovered(evt) { // `mouseenter` handler (non-bubbling) // `this.tbodyRowEvtStopped` from tbody mixin - const type = 'row-hovered' - if (this.$listeners[type] && !this.tbodyRowEvtStopped(evt)) { + if (!this.tbodyRowEvtStopped(evt)) { // `this.emitTbodyRowEvent` from tbody mixin - this.emitTbodyRowEvent(type, evt) + this.emitTbodyRowEvent('row-hovered', evt) } }, rowUnhovered(evt) { // `mouseleave` handler (non-bubbling) // `this.tbodyRowEvtStopped` from tbody mixin - const type = 'row-unhovered' - if (this.$listeners[type] && !this.tbodyRowEvtStopped(evt)) { + if (!this.tbodyRowEvtStopped(evt)) { // `this.emitTbodyRowEvent` from tbody mixin - this.emitTbodyRowEvent(type, evt) + this.emitTbodyRowEvent('row-unhovered', evt) } }, // Render helpers diff --git a/src/components/table/helpers/mixin-tbody.js b/src/components/table/helpers/mixin-tbody.js index 278334255c7..7141f92c40a 100644 --- a/src/components/table/helpers/mixin-tbody.js +++ b/src/components/table/helpers/mixin-tbody.js @@ -43,7 +43,7 @@ export default { }, emitTbodyRowEvent(type, evt) { // Emits a row event, with the item object, row index and original event - if (type && evt && evt.target) { + if (type && this.hasListener(type) && evt && evt.target) { const rowIndex = this.getTbodyTrIndex(evt.target) if (rowIndex > -1) { // The array of TRs correlate to the `computedItems` array @@ -101,7 +101,6 @@ export default { } }, onTBodyRowClicked(evt) { - // Row-clicked handler is only added when needed if (this.tbodyRowEvtStopped(evt)) { // If table is busy, then don't propagate return @@ -113,21 +112,18 @@ export default { this.emitTbodyRowEvent('row-clicked', evt) }, onTbodyRowMiddleMouseRowClicked(evt) { - const type = 'row-middle-clicked' - if (this.$listeners[type] && !this.tbodyRowEvtStopped(evt) && evt.which === 2) { - this.emitTbodyRowEvent(type, evt) + if (!this.tbodyRowEvtStopped(evt) && evt.which === 2) { + this.emitTbodyRowEvent('row-middle-clicked', evt) } }, onTbodyRowContextmenu(evt) { - const type = 'row-contextmenu' - if (this.$listeners[type] && !this.tbodyRowEvtStopped(evt)) { - this.emitTbodyRowEvent(type, evt) + if (!this.tbodyRowEvtStopped(evt)) { + this.emitTbodyRowEvent('row-contextmenu', evt) } }, onTbodyRowDblClicked(evt) { - const type = 'row-dblclicked' - if (this.$listeners[type] && !this.tbodyRowEvtStopped(evt) && !filterEvent(evt)) { - this.emitTbodyRowEvent(type, evt) + if (!this.tbodyRowEvtStopped(evt) && !filterEvent(evt)) { + this.emitTbodyRowEvent('row-dblclicked', evt) } }, // Note: Row hover handlers are handled by the tbody-row mixin @@ -139,7 +135,7 @@ export default { const items = this.computedItems // Shortcut to `createElement` (could use `this._c()` instead) const h = this.$createElement - const hasRowClickHandler = this.$listeners['row-clicked'] || this.hasSelectableRowClick + const hasRowClickHandler = this.hasListener('row-clicked') || this.hasSelectableRowClick // Prepare the tbody rows const $rows = [] diff --git a/src/components/table/helpers/mixin-thead.js b/src/components/table/helpers/mixin-thead.js index 6b09047a2fd..c378d5ed726 100644 --- a/src/components/table/helpers/mixin-thead.js +++ b/src/components/table/helpers/mixin-thead.js @@ -73,7 +73,7 @@ export default { /* istanbul ignore next */ ariaLabel = startCase(field.key) } - const hasHeadClickListener = this.$listeners['head-clicked'] || this.isSortable + const hasHeadClickListener = this.hasListener('head-clicked') || this.isSortable const handlers = {} if (hasHeadClickListener) { handlers.click = evt => { diff --git a/src/components/table/table-lite.js b/src/components/table/table-lite.js index f81f276ffe8..5aed7d3287b 100644 --- a/src/components/table/table-lite.js +++ b/src/components/table/table-lite.js @@ -1,6 +1,7 @@ import Vue from '../../utils/vue' // Mixins +import hasListenerMixin from '../../mixins/has-listener' import idMixin from '../../mixins/id' import normalizeSlotMixin from '../../mixins/normalize-slot' @@ -24,6 +25,7 @@ export const BTableLite = /*#__PURE__*/ Vue.extend({ // They are merged from first to last, followed by this component. mixins: [ // Required mixins + hasListenerMixin, idMixin, normalizeSlotMixin, itemsMixin, diff --git a/src/components/table/table.js b/src/components/table/table.js index 4f914b15295..2042559d789 100644 --- a/src/components/table/table.js +++ b/src/components/table/table.js @@ -1,6 +1,7 @@ import Vue from '../../utils/vue' // Mixins +import hasListenerMixin from '../../mixins/has-listener' import idMixin from '../../mixins/id' import normalizeSlotMixin from '../../mixins/normalize-slot' @@ -33,6 +34,7 @@ export const BTable = /*#__PURE__*/ Vue.extend({ // They are merged from first to last, followed by this component. mixins: [ // Required Mixins + hasListenerMixin, idMixin, normalizeSlotMixin, itemsMixin, diff --git a/src/mixins/has-listener.js b/src/mixins/has-listener.js new file mode 100644 index 00000000000..8607a185369 --- /dev/null +++ b/src/mixins/has-listener.js @@ -0,0 +1,22 @@ +// Mixin to determine if an event listener has been registered +// either via `v-on:name` (in the parent) or programmatically +// via `vm.$on('name', ...)` +// See: https://github.com/vuejs/vue/issues/10825 +import { isArray, isUndefined } from '../utils/inspect' + +// @vue/component +export default { + methods: { + hasListener(name) { + // Only includes listeners registerd via `v-on:name` + const $listeners = this.$listeners || {} + // Includes `v-on:name` and `this.$on('name')` registerd listeners + // Note this property is not part of the public Vue API, but it is + // the only way to determine if a listener was added via `vm.$on` + const $events = this._events || {} + // Registered listeners in `this._events` are always an array, + // but might be zero length + return !isUndefined($listeners[name]) || (isArray($events[name]) && $events[name].length > 0) + } + } +} From a5f342e0e4de2186259e36e42cecda8c20e1c8ab Mon Sep 17 00:00:00 2001 From: Enrique Date: Mon, 18 Nov 2019 03:08:59 -0400 Subject: [PATCH 022/100] feat(b-dropdown): add splitClass property to dropdown component (#4394) * feat(b-dropdown): add splitClass property to dropdown component * Update package.json --- src/components/dropdown/dropdown.js | 5 +++++ src/components/dropdown/dropdown.spec.js | 15 +++++++++++++++ src/components/dropdown/package.json | 5 +++++ 3 files changed, 25 insertions(+) diff --git a/src/components/dropdown/dropdown.js b/src/components/dropdown/dropdown.js index 277115bc38d..11ed0a4ed28 100644 --- a/src/components/dropdown/dropdown.js +++ b/src/components/dropdown/dropdown.js @@ -60,6 +60,10 @@ export const props = { type: String, default: () => getComponentConfig(NAME, 'splitVariant') }, + splitClass: { + type: [String, Array], + default: null + }, splitButtonType: { type: String, default: 'button', @@ -144,6 +148,7 @@ export const BDropdown = /*#__PURE__*/ Vue.extend({ { ref: 'button', props: btnProps, + class: this.splitClass, attrs: { id: this.safeId('_BV_button_') }, diff --git a/src/components/dropdown/dropdown.spec.js b/src/components/dropdown/dropdown.spec.js index 85ae3bbbe2c..12ea2d28bb8 100644 --- a/src/components/dropdown/dropdown.spec.js +++ b/src/components/dropdown/dropdown.spec.js @@ -368,6 +368,21 @@ describe('dropdown', () => { wrapper.destroy() }) + it('split should have class specified in split class property', () => { + const splitClass = 'custom-button-class' + const wrapper = mount(BDropdown, { + attachToDocument: true, + propsData: { + splitClass, + split: true + } + }) + const $buttons = wrapper.findAll('button') + const $split = $buttons.at(0) + + expect($split.classes()).toContain(splitClass) + }) + it('menu should have class dropdown-menu-right when prop right set', async () => { const wrapper = mount(BDropdown, { attachToDocument: true, diff --git a/src/components/dropdown/package.json b/src/components/dropdown/package.json index 55a603944e0..0ac16fd8751 100644 --- a/src/components/dropdown/package.json +++ b/src/components/dropdown/package.json @@ -96,6 +96,11 @@ "prop": "splitButtonType", "description": "Value to place in the 'type' attribute on the split button: 'button', 'submit', 'reset'" }, + { + "prop": "splitClass", + "version": "2.2.0", + "description": "CSS class (or classes) to add to the split button" + }, { "prop": "boundary", "description": "The boundary constraint of the menu: 'scrollParent', 'window', 'viewport', or a reference to an HTMLElement" From 1cb73e0aa6a5efc3dc58714d14a41f5776fa2f38 Mon Sep 17 00:00:00 2001 From: Simon Knox Date: Mon, 18 Nov 2019 18:11:56 +1100 Subject: [PATCH 023/100] docs: fix prop name typo (#4395) --- src/components/form-input/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/form-input/README.md b/src/components/form-input/README.md index 34ddf6c1807..35edafa66af 100644 --- a/src/components/form-input/README.md +++ b/src/components/form-input/README.md @@ -90,7 +90,7 @@ rendered and a console warning will be issued. prop instead. - `v-model` modifiers `.number` and `.trim` can cause unexpected cursor jumps when the user is typing (this is a Vue issue with `v-model` on custom components). _Avoid using these modifiers_. - Use the `number` or `trip` props instead. + Use the `number` or `trim` props instead. - Older version of Firefox may not support `readonly` for `range` type inputs. - Input types that do not support `min`, `max` and `step` (i.e. `text`, `password`, `tel`, `email`, `url`, etc) will silently ignore these values (although they will still be rendered on the input From c31ecd697b2849951979ae3f1f8e93ffac527a1d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2019 11:25:34 +0100 Subject: [PATCH 024/100] chore(deps): update devdependency rollup to ^1.27.1 (#4396) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b1e56e5243b..87e8b2484c1 100644 --- a/package.json +++ b/package.json @@ -130,7 +130,7 @@ "postcss-cli": "^6.1.3", "prettier": "1.14.3", "require-context": "^1.1.0", - "rollup": "^1.27.0", + "rollup": "^1.27.1", "rollup-plugin-babel": "^4.3.3", "rollup-plugin-commonjs": "^10.1.0", "rollup-plugin-node-resolve": "^5.2.0", diff --git a/yarn.lock b/yarn.lock index d73b64aa8e9..6b4dc2c87fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11188,10 +11188,10 @@ rollup-pluginutils@^2.8.1: dependencies: estree-walker "^0.6.1" -rollup@^1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.27.0.tgz#7afe0da89c967cec5ccea7e919da6c89a1a68666" - integrity sha512-yaMna4MJ8LLEHhHl1ilgHakylf0LKeQctDxhngZLQ+W57GnXa5vtH7XKaK8zlAhNEhlWiH5YFVFt+QCDPUmNkw== +rollup@^1.27.1: + version "1.27.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.27.1.tgz#3f09a81be7f9869e18c42a852ec1a50ecc47561d" + integrity sha512-tRJcEYjJalj/wFiqM7GmynLeaKANS4CRPCYB8D7ylrl7Mrsmpgo6xuXE2v9K9EpX0kwFztAIwVltycA+Wr9b7Q== dependencies: "@types/estree" "*" "@types/node" "*" From f3f5279f86b0a18266750166280ef05d43f5a41d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2019 21:36:02 +0100 Subject: [PATCH 025/100] chore(deps): update all non-major dependencies (#4398) --- package.json | 4 +- yarn.lock | 294 ++++++++++++++++++++++++++++++--------------------- 2 files changed, 176 insertions(+), 122 deletions(-) diff --git a/package.json b/package.json index 87e8b2484c1..2d15581995c 100644 --- a/package.json +++ b/package.json @@ -130,12 +130,12 @@ "postcss-cli": "^6.1.3", "prettier": "1.14.3", "require-context": "^1.1.0", - "rollup": "^1.27.1", + "rollup": "^1.27.2", "rollup-plugin-babel": "^4.3.3", "rollup-plugin-commonjs": "^10.1.0", "rollup-plugin-node-resolve": "^5.2.0", "sass-loader": "^8.0.0", - "standard-version": "^7.0.0", + "standard-version": "^7.0.1", "terser": "^4.4.0", "vue": "^2.6.10", "vue-jest": "^3.0.5", diff --git a/yarn.lock b/yarn.lock index 6b4dc2c87fa..eaea2b6eddf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3948,71 +3948,72 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -conventional-changelog-angular@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.3.tgz#299fdd43df5a1f095283ac16aeedfb0a682ecab0" - integrity sha512-YD1xzH7r9yXQte/HF9JBuEDfvjxxwDGGwZU1+ndanbY0oFgA+Po1T9JDSpPLdP0pZT6MhCAsdvFKC4TJ4MTJTA== +conventional-changelog-angular@^5.0.5: + version "5.0.6" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz#269540c624553aded809c29a3508fdc2b544c059" + integrity sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA== dependencies: compare-func "^1.3.1" q "^1.5.1" -conventional-changelog-atom@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-2.0.1.tgz#dc88ce650ffa9ceace805cbe70f88bfd0cb2c13a" - integrity sha512-9BniJa4gLwL20Sm7HWSNXd0gd9c5qo49gCi8nylLFpqAHhkFTj7NQfROq3f1VpffRtzfTQp4VKU5nxbe2v+eZQ== +conventional-changelog-atom@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-2.0.3.tgz#3bd14280aa09fe3ec49a0e8fe97b5002db02aad4" + integrity sha512-szZe2ut97qNO6vCCMkm1I/tWu6ol4Rr8a9Lx0y/VlpDnpY0PNp+oGpFgU55lplhx+I3Lro9Iv4/gRj0knfgjzg== dependencies: q "^1.5.1" -conventional-changelog-codemirror@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.1.tgz#acc046bc0971460939a0cc2d390e5eafc5eb30da" - integrity sha512-23kT5IZWa+oNoUaDUzVXMYn60MCdOygTA2I+UjnOMiYVhZgmVwNd6ri/yDlmQGXHqbKhNR5NoXdBzSOSGxsgIQ== +conventional-changelog-codemirror@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.3.tgz#ebc088154684f8f5171446b8d546ba6b460d46f2" + integrity sha512-t2afackdgFV2yBdHhWPqrKbpaQeVnz2hSJKdWqjasPo5EpIB6TBL0er3cOP1mnGQmuzk9JSvimNSuqjWGDtU5Q== dependencies: q "^1.5.1" -conventional-changelog-config-spec@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.0.0.tgz#a9e8c9225d4a922d25f4ac501e454274ae4ad0b3" - integrity sha512-zQmcBP/pR8tN5MSv+nXG9hOmy+Z6rgEquBerpoEbOKTFPLoxBy/adeUUpshrMpqdZ/ycqbT2AgdTtiIu/9IHGg== +conventional-changelog-config-spec@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz#874a635287ef8b581fd8558532bf655d4fb59f2d" + integrity sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ== -conventional-changelog-conventionalcommits@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.1.0.tgz#eb7d47a9c5f1a6f9846a649482294e4ac50d7683" - integrity sha512-J3xolGrH8PTxpCqueHOuZtv3Cp73SQOWiBQzlsaugZAZ+hZgcJBonmC+1bQbfGs2neC2S18p2L1Gx+nTEglJTQ== +conventional-changelog-conventionalcommits@^4.2.1: + version "4.2.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.2.3.tgz#22855b32d57d0328951c1c2dc01b172a5f24ea37" + integrity sha512-atGa+R4vvEhb8N/8v3IoW59gCBJeeFiX6uIbPu876ENAmkMwsenyn0R21kdDHJFLQdy6zW4J6b4xN8KI3b9oww== dependencies: compare-func "^1.3.1" + lodash "^4.17.15" q "^1.5.1" -conventional-changelog-core@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz#b31410856f431c847086a7dcb4d2ca184a7d88fb" - integrity sha512-LMMX1JlxPIq/Ez5aYAYS5CpuwbOk6QFp8O4HLAcZxe3vxoCtABkhfjetk8IYdRB9CDQGwJFLR3Dr55Za6XKgUQ== +conventional-changelog-core@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.1.1.tgz#956f1a2fb476ef2f66c93f673ac040a4159de167" + integrity sha512-fBre5P6U9n914Da6Cj82vIfRU2DhTLGr1eDPXWA7AamxTpd4cd0jgdS7Aieas5Vn5WXOJNFRDNl6PrYLEonImg== dependencies: - conventional-changelog-writer "^4.0.6" - conventional-commits-parser "^3.0.3" + conventional-changelog-writer "^4.0.11" + conventional-commits-parser "^3.0.8" dateformat "^3.0.0" get-pkg-repo "^1.0.0" git-raw-commits "2.0.0" git-remote-origin-url "^2.0.0" - git-semver-tags "^2.0.3" - lodash "^4.2.1" + git-semver-tags "^3.0.1" + lodash "^4.17.15" normalize-package-data "^2.3.5" q "^1.5.1" read-pkg "^3.0.0" read-pkg-up "^3.0.0" through2 "^3.0.0" -conventional-changelog-ember@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-2.0.2.tgz#284ffdea8c83ea8c210b65c5b4eb3e5cc0f4f51a" - integrity sha512-qtZbA3XefO/n6DDmkYywDYi6wDKNNc98MMl2F9PKSaheJ25Trpi3336W8fDlBhq0X+EJRuseceAdKLEMmuX2tg== +conventional-changelog-ember@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-2.0.4.tgz#c29b78e4af7825cbecb6c3fd6086ca5c09471ac1" + integrity sha512-q1u73sO9uCnxN4TSw8xu6MRU8Y1h9kpwtcdJuNRwu/LSKI1IE/iuNSH5eQ6aLlQ3HTyrIpTfUuVybW4W0F17rA== dependencies: q "^1.5.1" -conventional-changelog-eslint@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.2.tgz#e9eb088cda6be3e58b2de6a5aac63df0277f3cbe" - integrity sha512-Yi7tOnxjZLXlCYBHArbIAm8vZ68QUSygFS7PgumPRiEk+9NPUeucy5Wg9AAyKoBprSV3o6P7Oghh4IZSLtKCvQ== +conventional-changelog-eslint@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.4.tgz#8f4736a23e0cd97e890e76fccc287db2f205f2ff" + integrity sha512-CPwTUENzhLGl3auunrJxiIEWncAGaby7gOFCdj2gslIuOFJ0KPJVOUhRz4Da/I53sdo/7UncUJkiLg94jEsjxg== dependencies: q "^1.5.1" @@ -4023,63 +4024,58 @@ conventional-changelog-express@^2.0.1: dependencies: q "^1.5.1" -conventional-changelog-jquery@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.4.tgz#7eb598467b83db96742178e1e8d68598bffcd7ae" - integrity sha512-IVJGI3MseYoY6eybknnTf9WzeQIKZv7aNTm2KQsiFVJH21bfP2q7XVjfoMibdCg95GmgeFlaygMdeoDDa+ZbEQ== +conventional-changelog-jquery@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.6.tgz#460236ad8fb1d29ff932a14fe4e3a45379b63c5e" + integrity sha512-gHAABCXUNA/HjnZEm+vxAfFPJkgtrZvCDIlCKfdPVXtCIo/Q0lN5VKpx8aR5p8KdVRQFF3OuTlvv5kv6iPuRqA== dependencies: q "^1.5.1" -conventional-changelog-jshint@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.1.tgz#11c0e8283abf156a4ff78e89be6fdedf9bd72202" - integrity sha512-kRFJsCOZzPFm2tzRHULWP4tauGMvccOlXYf3zGeuSW4U0mZhk5NsjnRZ7xFWrTFPlCLV+PNmHMuXp5atdoZmEg== +conventional-changelog-jshint@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.3.tgz#ef6e2caf2ee6ffdfda78fcdf7ce87cf6c512d728" + integrity sha512-Pc2PnMPcez634ckzr4EOWviwRSpZcURaK7bjyD9oK6N5fsC/a+3G7LW5m/JpcHPhA9ZxsfIbm7uqZ3ZDGsQ/sw== dependencies: compare-func "^1.3.1" q "^1.5.1" -conventional-changelog-preset-loader@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.1.1.tgz#65bb600547c56d5627d23135154bcd9a907668c4" - integrity sha512-K4avzGMLm5Xw0Ek/6eE3vdOXkqnpf9ydb68XYmCc16cJ99XMMbc2oaNMuPwAsxVK6CC1yA4/I90EhmWNj0Q6HA== - conventional-changelog-preset-loader@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.2.0.tgz#571e2b3d7b53d65587bea9eedf6e37faa5db4fcc" integrity sha512-zXB+5vF7D5Y3Cb/rJfSyCCvFphCVmF8mFqOdncX3BmjZwAtGAPfYrBcT225udilCKvBbHgyzgxqz2GWDB5xShQ== -conventional-changelog-writer@^4.0.6: - version "4.0.7" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.7.tgz#e4b7d9cbea902394ad671f67108a71fa90c7095f" - integrity sha512-p/wzs9eYaxhFbrmX/mCJNwJuvvHR+j4Fd0SQa2xyAhYed6KBiZ780LvoqUUvsayP4R1DtC27czalGUhKV2oabw== +conventional-changelog-writer@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz#9f56d2122d20c96eb48baae0bf1deffaed1edba4" + integrity sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw== dependencies: compare-func "^1.3.1" conventional-commits-filter "^2.0.2" dateformat "^3.0.0" - handlebars "^4.1.2" + handlebars "^4.4.0" json-stringify-safe "^5.0.1" - lodash "^4.2.1" - meow "^4.0.0" + lodash "^4.17.15" + meow "^5.0.0" semver "^6.0.0" split "^1.0.0" through2 "^3.0.0" -conventional-changelog@3.1.9: - version "3.1.9" - resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-3.1.9.tgz#5a6a19dadc1e4080c2db8dcddd00a6c0077c55a4" - integrity sha512-JbNVm1iGZ3aXxcFZjqKNDNfdgchQjSltWc8rvSniMrkHLsub9Wn20/JLdJNTBM74dt1IA2M+v/mzServ6N37YA== - dependencies: - conventional-changelog-angular "^5.0.3" - conventional-changelog-atom "^2.0.1" - conventional-changelog-codemirror "^2.0.1" - conventional-changelog-conventionalcommits "^4.0.0" - conventional-changelog-core "^3.2.3" - conventional-changelog-ember "^2.0.2" - conventional-changelog-eslint "^3.0.2" +conventional-changelog@3.1.12: + version "3.1.12" + resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-3.1.12.tgz#ede5b6803cfa8af6c7ea97e54ce5519508903afb" + integrity sha512-zyGKwii8Z5zOq1nGFm5jn9Ou1jQ6UBoRT0+nqBIU8fEzh64+AcVxrY97tVuK77Ati0xwpBiFHpDXAW7pkq1jEw== + dependencies: + conventional-changelog-angular "^5.0.5" + conventional-changelog-atom "^2.0.3" + conventional-changelog-codemirror "^2.0.3" + conventional-changelog-conventionalcommits "^4.2.1" + conventional-changelog-core "^4.0.2" + conventional-changelog-ember "^2.0.4" + conventional-changelog-eslint "^3.0.4" conventional-changelog-express "^2.0.1" - conventional-changelog-jquery "^3.0.4" - conventional-changelog-jshint "^2.0.1" - conventional-changelog-preset-loader "^2.1.1" + conventional-changelog-jquery "^3.0.6" + conventional-changelog-jshint "^2.0.3" + conventional-changelog-preset-loader "^2.2.0" conventional-commits-filter@^2.0.2: version "2.0.2" @@ -4089,28 +4085,28 @@ conventional-commits-filter@^2.0.2: lodash.ismatch "^4.4.0" modify-values "^1.0.0" -conventional-commits-parser@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.3.tgz#c3f972fd4e056aa8b9b4f5f3d0e540da18bf396d" - integrity sha512-KaA/2EeUkO4bKjinNfGUyqPTX/6w9JGshuQRik4r/wJz7rUw3+D3fDG6sZSEqJvKILzKXFQuFkpPLclcsAuZcg== +conventional-commits-parser@^3.0.5, conventional-commits-parser@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz#23310a9bda6c93c874224375e72b09fb275fe710" + integrity sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ== dependencies: JSONStream "^1.0.4" - is-text-path "^2.0.0" - lodash "^4.2.1" - meow "^4.0.0" + is-text-path "^1.0.1" + lodash "^4.17.15" + meow "^5.0.0" split2 "^2.0.0" through2 "^3.0.0" trim-off-newlines "^1.0.0" -conventional-recommended-bump@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-6.0.0.tgz#bdafad56bc32bc04d58dbbd8bd6b750375500edc" - integrity sha512-iIHkDOuWCC49J/E4WXvXBCCrO2NoGqwjfhm2iUOHPPEik8TVHxczt/hFaWY+4MXeZ/nC53BNfjmlr8+EXOrlvA== +conventional-recommended-bump@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-6.0.2.tgz#086e3380e8d66ca2b962d84af863a28d532f355a" + integrity sha512-9qWhAweJbT6CAHcCprBYzUb3tySsaRrUx0ckpMprHbtWOBfl3gxakUCBNd/4T3m2Iv9Cb8Y4P2Px3cR5ysXPDw== dependencies: concat-stream "^2.0.0" conventional-changelog-preset-loader "^2.2.0" conventional-commits-filter "^2.0.2" - conventional-commits-parser "^3.0.3" + conventional-commits-parser "^3.0.5" git-raw-commits "2.0.0" git-semver-tags "^3.0.0" meow "^4.0.0" @@ -6132,12 +6128,12 @@ git-semver-tags@3.0.0, git-semver-tags@^3.0.0: meow "^4.0.0" semver "^6.0.0" -git-semver-tags@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-2.0.3.tgz#48988a718acf593800f99622a952a77c405bfa34" - integrity sha512-tj4FD4ww2RX2ae//jSrXZzrocla9db5h0V7ikPl1P/WwoZar9epdUhwR7XHXSgc+ZkNq72BEEerqQuicoEQfzA== +git-semver-tags@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-3.0.1.tgz#9cb9e4974437de1f71f32da3bfe74f4d35afb1b9" + integrity sha512-Hzd1MOHXouITfCasrpVJbRDg9uvW7LfABk3GQmXYZByerBDrfrEMP9HXpNT7RxAbieiocP6u+xq20DkvjwxnCA== dependencies: - meow "^4.0.0" + meow "^5.0.0" semver "^6.0.0" git-username@^0.5.0: @@ -6330,6 +6326,17 @@ handlebars@^4.1.2: optionalDependencies: uglify-js "^3.1.4" +handlebars@^4.4.0: + version "4.5.3" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" + integrity sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -7208,12 +7215,12 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.0" -is-text-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-2.0.0.tgz#b2484e2b720a633feb2e85b67dc193ff72c75636" - integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== +is-text-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= dependencies: - text-extensions "^2.0.0" + text-extensions "^1.0.0" is-typedarray@~1.0.0: version "1.0.0" @@ -8176,7 +8183,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@4.x, lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@~4.17.10: +lodash@4.x, lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.10: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -8415,6 +8422,21 @@ meow@^4.0.0: redent "^2.0.0" trim-newlines "^2.0.0" +meow@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" + integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== + dependencies: + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" + loud-rejection "^1.0.0" + minimist-options "^3.0.1" + normalize-package-data "^2.3.4" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + yargs-parser "^10.0.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -11188,10 +11210,10 @@ rollup-pluginutils@^2.8.1: dependencies: estree-walker "^0.6.1" -rollup@^1.27.1: - version "1.27.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.27.1.tgz#3f09a81be7f9869e18c42a852ec1a50ecc47561d" - integrity sha512-tRJcEYjJalj/wFiqM7GmynLeaKANS4CRPCYB8D7ylrl7Mrsmpgo6xuXE2v9K9EpX0kwFztAIwVltycA+Wr9b7Q== +rollup@^1.27.2: + version "1.27.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.27.2.tgz#caf54a93df228bf7864f13dddcdb363d3e958509" + integrity sha512-sD3iyd0zlvgK1S3MmICi6F/Y+R/QWY5XxzsTGN4pAd+nCasDUizmAhgq2hdh1t2eLux974NHU2TW41fhuGPv+Q== dependencies: "@types/estree" "*" "@types/node" "*" @@ -11756,15 +11778,15 @@ stackframe@^1.0.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz#357b24a992f9427cba6b545d96a14ed2cbca187b" integrity sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw== -standard-version@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/standard-version/-/standard-version-7.0.0.tgz#4ce10ea5d20270ed4a32b22d15cce5fd1f1a5bbb" - integrity sha512-pbFXM9vutnxTkSGkqSWQeYCMYqWmFBaLUNdEc/sJDQnMgwB0Csw3CZeeDhi62VoVS3P8mQiYbvXGZWyOBWxUbw== +standard-version@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/standard-version/-/standard-version-7.0.1.tgz#33e950cf5c571ae0358a7ffae2292aa4547dc504" + integrity sha512-3GR9dPlNpC/osTwb9YsU2KQelGvSORMPUFN7zOUE3HN4yjCTsT57IJAFsyPXPP512QDMSxwwjhxa8Em5vF5F5Q== dependencies: chalk "2.4.2" - conventional-changelog "3.1.9" - conventional-changelog-config-spec "2.0.0" - conventional-recommended-bump "6.0.0" + conventional-changelog "3.1.12" + conventional-changelog-config-spec "2.1.0" + conventional-recommended-bump "6.0.2" detect-indent "6.0.0" detect-newline "3.0.0" dotgitignore "2.1.0" @@ -11773,8 +11795,8 @@ standard-version@^7.0.0: fs-access "1.0.1" git-semver-tags "3.0.0" semver "6.3.0" - stringify-package "1.0.0" - yargs "13.3.0" + stringify-package "1.0.1" + yargs "14.2.0" state-toggle@^1.0.0: version "1.0.2" @@ -11907,10 +11929,10 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -stringify-package@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.0.tgz#e02828089333d7d45cd8c287c30aa9a13375081b" - integrity sha512-JIQqiWmLiEozOC0b0BtxZ/AOUtdUZHCBPgqIZ2kSJJqGwgb9neo44XdTHUC4HZSGqi03hOeB7W/E8rAlKnGe9g== +stringify-package@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85" + integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg== strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" @@ -12205,10 +12227,10 @@ test-exclude@^5.2.3: read-pkg-up "^4.0.0" require-main-filename "^2.0.0" -text-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.0.0.tgz#43eabd1b495482fae4a2bf65e5f56c29f69220f6" - integrity sha512-F91ZqLgvi1E0PdvmxMgp+gcf6q8fMH7mhdwWfzXnl1k+GbpQDmi8l7DzLC5JTASKbwpY3TfxajAUzAXcv2NmsQ== +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== text-table@^0.2.0: version "0.2.0" @@ -13357,6 +13379,13 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yargs-parser@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== + dependencies: + camelcase "^4.1.0" + yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" @@ -13373,6 +13402,14 @@ yargs-parser@^13.1.1: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.0.tgz#cdd7a97490ec836195f59f3f4dbe5ea9e8f75f08" + integrity sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" @@ -13380,12 +13417,13 @@ yargs-parser@^5.0.0: dependencies: camelcase "^3.0.0" -yargs@13.3.0, yargs@^13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== +yargs@14.2.0: + version "14.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.0.tgz#f116a9242c4ed8668790b40759b4906c276e76c3" + integrity sha512-/is78VKbKs70bVZH7w4YaZea6xcJWOAwkhbR0CFuZBmYtfTYF0xjGJF43AYd8g2Uii1yJwmS5GR2vBmrc32sbg== dependencies: cliui "^5.0.0" + decamelize "^1.2.0" find-up "^3.0.0" get-caller-file "^2.0.1" require-directory "^2.1.1" @@ -13394,7 +13432,7 @@ yargs@13.3.0, yargs@^13.3.0: string-width "^3.0.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^13.1.1" + yargs-parser "^15.0.0" yargs@^12.0.1: version "12.0.5" @@ -13414,6 +13452,22 @@ yargs@^12.0.1: y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" +yargs@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1" + yargs@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" From f1ed0177c20f9d7e7e340a8815d1b6bc66f7cb76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20M=C3=BCller?= Date: Mon, 18 Nov 2019 21:39:21 +0100 Subject: [PATCH 026/100] feat(b-form-select): add group/tree support and dedicated option and option-group components (closes #3222) (#4267) * feat(b-form-select): add group/tree support and dedicated option and option-group components * Improve option property handling * Update package.json * Nested ``'s is invalid HTML... * remove duplicate import * Update index.js * Update mixin-options.js * Update form-datalist.spec.js * Create form-select-option.spec.js * Update form-options.js * Create form-select-option-group.spec.js * Update form-select.spec.js * Improve warnings * Update form-select.spec.js * Update form-select.spec.js * Update README.md * Update README.md * Update package.json * Update _slug.js * Update componentdoc.vue * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md --- docs/components/componentdoc.vue | 5 + docs/pages/docs/components/_slug.js | 4 +- src/components/form-checkbox/README.md | 120 ++++++++++++++- src/components/form-file/form-file.js | 7 +- src/components/form-radio/README.md | 120 ++++++++++++++- src/components/form-select/README.md | 85 ++++++++--- .../form-select/form-select-option-group.js | 32 ++++ .../form-select-option-group.spec.js | 138 ++++++++++++++++++ .../form-select/form-select-option.js | 33 +++++ .../form-select/form-select-option.spec.js | 67 +++++++++ src/components/form-select/form-select.js | 33 +++-- .../form-select/form-select.spec.js | 130 ++++++++++++++++- .../form-select/helpers/mixin-options.js | 48 ++++++ src/components/form-select/index.js | 10 +- src/components/form-select/package.json | 28 +++- src/components/form/form-datalist.spec.js | 2 +- src/components/modal/helpers/bv-modal.js | 2 +- .../pagination-nav/pagination-nav.js | 2 +- .../table/helpers/mixin-filtering.js | 8 +- .../table/helpers/mixin-provider.js | 5 +- src/components/toast/helpers/bv-toast.js | 2 +- src/components/toast/toaster.js | 5 +- src/components/tooltip/helpers/bv-tooltip.js | 2 +- src/index.js | 2 + src/mixins/form-options.js | 79 ++++------ src/utils/warn.js | 4 +- src/utils/warn.spec.js | 17 ++- 27 files changed, 875 insertions(+), 115 deletions(-) create mode 100644 src/components/form-select/form-select-option-group.js create mode 100644 src/components/form-select/form-select-option-group.spec.js create mode 100644 src/components/form-select/form-select-option.js create mode 100644 src/components/form-select/form-select-option.spec.js create mode 100644 src/components/form-select/helpers/mixin-options.js diff --git a/docs/components/componentdoc.vue b/docs/components/componentdoc.vue index f528fc68bab..e2c26e91d80 100644 --- a/docs/components/componentdoc.vue +++ b/docs/components/componentdoc.vue @@ -5,6 +5,7 @@ {{ tag }} + v{{ version }}+ [] + }, + version: { + type: String, + default: null } }, computed: { diff --git a/docs/pages/docs/components/_slug.js b/docs/pages/docs/components/_slug.js index 3dd9b6cc125..36110b9dbc5 100644 --- a/docs/pages/docs/components/_slug.js +++ b/docs/pages/docs/components/_slug.js @@ -33,9 +33,9 @@ export default { h(AnchoredHeading, { props: { id: 'component-reference' } }, 'Component reference'), // Component reference information ...this.meta.components.map( - ({ component, events, rootEventListeners, slots, aliases, props: propsMeta }) => + ({ component, events, rootEventListeners, slots, aliases, props: propsMeta, version }) => h(Componentdoc, { - props: { component, events, rootEventListeners, slots, aliases, propsMeta } + props: { component, events, rootEventListeners, slots, aliases, propsMeta, version } }) ), // Component importing information diff --git a/src/components/form-checkbox/README.md b/src/components/form-checkbox/README.md index 66b896b3021..be200bd0f07 100644 --- a/src/components/form-checkbox/README.md +++ b/src/components/form-checkbox/README.md @@ -89,8 +89,124 @@ named slot `first`. ## Checkbox group options array -Please see the [`` `options` prop](/docs/components/form-select#options-property) -docs for details on the formats and helper props associated with `options`. +`options` can be an array of strings or objects. Available fields: + +- **`value`** The selected value which will be set on `v-model` +- **`disabled`** Disables item for selection +- **`text`** Display text, or **`html`** Display basic inline html + +`value` can be a string, number, or simple object. Avoid using complex types in values. + +If both `html` and `text` are provided, `html` will take precedence. Only basic/native HTML is +supported in the `html` field (components will not work). Note that not all browsers will render +inline html (i.e. ``, ``, etc) inside `
@@ -119,7 +120,8 @@ Vue.use(BootstrapVueIcons) ``` BootstrapVue icons SCSS/CSS does not depend on any Bootstrap SASS variables, mixins, functions or -CSS classes. Please note that the icons CSS is _also_ included in the main BootstrapVue SCSS/CSS +CSS classes (other than the Bootstrap `text-{variant}` variant utility classes, if using the +`variant` prop). Please note that the icons CSS is _also_ included in the main BootstrapVue SCSS/CSS files. ### Browser From b3ad7264d9b10fb1b8dfba70c62eed11a56519d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20M=C3=BCller?= Date: Wed, 8 Jan 2020 02:12:32 +0100 Subject: [PATCH 094/100] feat(b-tooltip): add `noninteractive` prop (closes #4556) (#4563) * feat(b-tooltip): add `interactive` prop * Update package.json * Update README.md * Update README.md * Replace `interactive` prop/modifier by `noninteractive` * Update _tooltip.scss * Update README.md * Update _tooltip.scss * Update _popover.scss * Update package.json Co-authored-by: Troy Morehouse --- src/components/popover/_popover.scss | 2 + src/components/tooltip/README.md | 32 ++++++-- src/components/tooltip/_tooltip.scss | 8 ++ .../tooltip/helpers/bv-tooltip-template.js | 6 +- src/components/tooltip/helpers/bv-tooltip.js | 7 +- src/components/tooltip/package.json | 5 ++ src/components/tooltip/tooltip.js | 5 ++ src/components/tooltip/tooltip.spec.js | 74 +++++++++++++++++-- src/directives/tooltip/README.md | 38 +++++----- src/directives/tooltip/package.json | 4 + src/directives/tooltip/tooltip.js | 6 ++ src/directives/tooltip/tooltip.spec.js | 2 +- src/icons/package.json | 2 +- 13 files changed, 157 insertions(+), 34 deletions(-) diff --git a/src/components/popover/_popover.scss b/src/components/popover/_popover.scss index 234026be735..bcbac405e19 100644 --- a/src/components/popover/_popover.scss +++ b/src/components/popover/_popover.scss @@ -2,6 +2,8 @@ .popover.b-popover { display: block; opacity: 1; + // Needed due to Bootstrap v4.4 reboot.css changes + outline: 0; &.fade:not(.show) { opacity: 0; diff --git a/src/components/tooltip/README.md b/src/components/tooltip/README.md index 3338f9072ee..81b65b709ad 100644 --- a/src/components/tooltip/README.md +++ b/src/components/tooltip/README.md @@ -170,20 +170,42 @@ override the `pointer-events` on the disabled element. | Prop | Default | Description | Supported values | | -------------------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | -| `target` | `null` | Element String ID, or a reference to an element or component, or a function returning either of them, that you want to trigger the tooltip. **Required** | Any valid, in-document unique element ID, element reference or component reference or a function returning any such ID / reference | +| `target` | `null` | Element String ID, or a reference to an element or component, or a function returning either of them, that you want to trigger the tooltip **Required** | Any valid, in-document unique element ID, element reference or component reference or a function returning any such ID / reference | | `title` | `null` | Tooltip content (text only, no HTML). if HTML is required, place it in the default slot | Plain text | -| `placement` | `'top'` | Tooltip position, relative to the trigger element. | `top`, `bottom`, `left`, `right`, `auto`, `topleft`, `topright`, `bottomleft`, `bottomright`, `lefttop`, `leftbottom`, `righttop`, `rightbottom` | -| `fallback-placement` | `'flip'` | Auto-flip placement behaviour of the tooltip, relative to the trigger element. | `flip`, `clockwise`, `counterclockwise`, or an array of valid placements evaluated from left to right | +| `placement` | `'top'` | Tooltip position, relative to the trigger element | `top`, `bottom`, `left`, `right`, `auto`, `topleft`, `topright`, `bottomleft`, `bottomright`, `lefttop`, `leftbottom`, `righttop`, `rightbottom` | +| `fallback-placement` | `'flip'` | Auto-flip placement behaviour of the tooltip, relative to the trigger element | `flip`, `clockwise`, `counterclockwise`, or an array of valid placements evaluated from left to right | | `triggers` | `'hover focus'` | Space separated list of event(s), which will trigger open/close of tooltip | `hover`, `focus`, `click`. Note `blur` is a special use case to close tooltip on next click, usually used in conjunction with `click`. | | `no-fade` | `false` | Disable fade animation when set to `true` | `true` or `false` | | `delay` | `50` | Delay showing and hiding of tooltip by specified number of milliseconds. Can also be specified as an object in the form of `{ show: 100, hide: 400 }` allowing different show and hide delays | `0` and up, integers only. | | `offset` | `0` | Shift the center of the tooltip by specified number of pixels | Any negative or positive integer | | `container` | `null` | Element string ID to append rendered tooltip into. If `null` or element not found, tooltip is appended to `` (default) | Any valid in-document unique element ID. | | `boundary` | `'scrollParent'` | The container that the tooltip will be constrained visually. The default should suffice in most cases, but you may need to change this if your target element is in a small container with overflow scroll | `'scrollParent'` (default), `'viewport'`, `'window'`, or a reference to an HTML element. | -| `boundary-padding` | `5` | Amount of pixel used to define a minimum distance between the boundaries and the tooltip. This makes sure the tooltip always has a little padding between the edges of its container. | Any positive number | +| `boundary-padding` | `5` | Amount of pixel used to define a minimum distance between the boundaries and the tooltip. This makes sure the tooltip always has a little padding between the edges of its container | Any positive number | +| `noninteractive` | `false` | Wether the tooltip should not be user-interactive | `true` or `false` | | `variant` | `null` | Contextual color variant for the tooltip | Any contextual theme color variant name | | `custom-class` | `null` | A custom classname to apply to the tooltip outer wrapper element | A string | -| `id` | `null` | An ID to use on the tooltip root element. If none is provided, one will automatically be generated. If you do provide an ID, it _must_ be guaranteed to be unique on the rendered page. | A valid unique element ID string | +| `id` | `null` | An ID to use on the tooltip root element. If none is provided, one will automatically be generated. If you do provide an ID, it _must_ be guaranteed to be unique on the rendered page | A valid unique element ID string | + +### Noninteractive tooltips + +BootstrapVue's tooltips are user-interactive by default for accessability reasons. To restore +Bootstraps default behavior apply the `noninteractive` prop: + +```html +
+
+ My tooltip is interactive + I will stay open when hovered +
+ +
+ Mine is not... + Catch me if you can! +
+
+ + +``` ### Variants and custom class diff --git a/src/components/tooltip/_tooltip.scss b/src/components/tooltip/_tooltip.scss index 681b6a8a531..3fd98a8c8b6 100644 --- a/src/components/tooltip/_tooltip.scss +++ b/src/components/tooltip/_tooltip.scss @@ -2,6 +2,8 @@ .tooltip.b-tooltip { display: block; opacity: $tooltip-opacity; + // Needed due to Bootstrap v4.4 reboot.css changes + outline: 0; &.fade:not(.show) { opacity: 0; @@ -10,6 +12,12 @@ &.show { opacity: $tooltip-opacity; } + + // Disabled pointer events when in 'noninteractive' mode to hide + // the tooltip when the user hovers over its content + &.noninteractive { + pointer-events: none; + } } // Create custom variants for tooltips diff --git a/src/components/tooltip/helpers/bv-tooltip-template.js b/src/components/tooltip/helpers/bv-tooltip-template.js index 9c3150f89f1..a7274ce031d 100644 --- a/src/components/tooltip/helpers/bv-tooltip-template.js +++ b/src/components/tooltip/helpers/bv-tooltip-template.js @@ -29,7 +29,8 @@ export const BVTooltipTemplate = /*#__PURE__*/ Vue.extend({ title: '', content: '', variant: null, - customClass: null + customClass: null, + interactive: true } }, computed: { @@ -39,6 +40,9 @@ export const BVTooltipTemplate = /*#__PURE__*/ Vue.extend({ templateClasses() { return [ { + // Disables pointer events to hide the tooltip when the user + // hovers over its content + noninteractive: !this.interactive, [`b-${this.templateType}-${this.variant}`]: this.variant, // `attachment` will come from BVToolpop [`bs-${this.templateType}-${this.attachment}`]: this.attachment diff --git a/src/components/tooltip/helpers/bv-tooltip.js b/src/components/tooltip/helpers/bv-tooltip.js index f0cfe6aa72b..dae119fb6aa 100644 --- a/src/components/tooltip/helpers/bv-tooltip.js +++ b/src/components/tooltip/helpers/bv-tooltip.js @@ -88,6 +88,8 @@ const templateData = { // Arrow of Tooltip/popover will try and stay away from // the edge of tooltip/popover edge by this many pixels arrowPadding: 6, + // Interactive state (Boolean) + interactive: true, // Disabled state (Boolean) disabled: false, // ID to use for tooltip/popover @@ -162,7 +164,8 @@ export const BVTooltip = /*#__PURE__*/ Vue.extend({ content: this.content, variant: this.variant, customClass: this.customClass, - noFade: this.noFade + noFade: this.noFade, + interactive: this.interactive } } }, @@ -346,7 +349,7 @@ export const BVTooltip = /*#__PURE__*/ Vue.extend({ // So that the template updates accordingly const $tip = this.$_tip if ($tip) { - const props = ['title', 'content', 'variant', 'customClass', 'noFade'] + const props = ['title', 'content', 'variant', 'customClass', 'noFade', 'interactive'] // Only update the values if they have changed props.forEach(prop => { if ($tip[prop] !== this[prop]) { diff --git a/src/components/tooltip/package.json b/src/components/tooltip/package.json index 7f2d2d09e4f..a6e33a56eb6 100644 --- a/src/components/tooltip/package.json +++ b/src/components/tooltip/package.json @@ -58,6 +58,11 @@ { "prop": "show", "description": "When set will show the tooltip" + }, + { + "prop": "noninteractive", + "version": "2.2.0", + "description": "Wether the tooltip should not be user-interactive" } ], "events": [ diff --git a/src/components/tooltip/tooltip.js b/src/components/tooltip/tooltip.js index 88a1797803a..e17b1229919 100644 --- a/src/components/tooltip/tooltip.js +++ b/src/components/tooltip/tooltip.js @@ -88,6 +88,10 @@ export const BTooltip = /*#__PURE__*/ Vue.extend({ type: Boolean, default: false }, + noninteractive: { + type: Boolean, + default: false + }, disabled: { type: Boolean, default: false @@ -126,6 +130,7 @@ export const BTooltip = /*#__PURE__*/ Vue.extend({ delay: this.delay, offset: this.offset, noFade: this.noFade, + interactive: !this.noninteractive, disabled: this.disabled, id: this.id } diff --git a/src/components/tooltip/tooltip.spec.js b/src/components/tooltip/tooltip.spec.js index a01b1106444..f89d0ba8b05 100644 --- a/src/components/tooltip/tooltip.spec.js +++ b/src/components/tooltip/tooltip.spec.js @@ -9,6 +9,7 @@ const appDef = { props: [ 'triggers', 'show', + 'noninteractive', 'disabled', 'noFade', 'title', @@ -23,6 +24,7 @@ const appDef = { target: 'foo', triggers: this.triggers, show: this.show, + noninteractive: this.noninteractive || false, disabled: this.disabled, noFade: this.noFade || false, title: this.title || null, @@ -173,6 +175,7 @@ describe('b-tooltip', () => { expect(tip.tagName).toEqual('DIV') expect(tip.classList.contains('tooltip')).toBe(true) expect(tip.classList.contains('b-tooltip')).toBe(true) + expect(tip.classList.contains('interactive')).toBe(false) // Hide the tooltip wrapper.setProps({ @@ -694,9 +697,9 @@ describe('b-tooltip', () => { expect(tip.classList.contains('b-tooltip')).toBe(true) // Hide the tooltip by emitting event on instance - const btooltip = wrapper.find(BTooltip) - expect(btooltip.exists()).toBe(true) - btooltip.vm.$emit('close') + const bTooltip = wrapper.find(BTooltip) + expect(bTooltip.exists()).toBe(true) + bTooltip.vm.$emit('close') await waitNT(wrapper.vm) await waitRAF() await waitNT(wrapper.vm) @@ -712,7 +715,7 @@ describe('b-tooltip', () => { expect(document.getElementById(adb)).toBe(null) // Show the tooltip by emitting event on instance - btooltip.vm.$emit('open') + bTooltip.vm.$emit('open') await waitNT(wrapper.vm) await waitRAF() @@ -1068,7 +1071,66 @@ describe('b-tooltip', () => { wrapper.destroy() }) - it('Applies variant class', async () => { + it('applies noninteractive class based on noninteractive prop', async () => { + jest.useFakeTimers() + const App = localVue.extend(appDef) + const wrapper = mount(App, { + attachToDocument: true, + localVue: localVue, + propsData: { + show: true + }, + slots: { + default: 'title' + } + }) + + expect(wrapper.isVueInstance()).toBe(true) + await waitNT(wrapper.vm) + await waitRAF() + await waitNT(wrapper.vm) + await waitRAF() + jest.runOnlyPendingTimers() + await waitNT(wrapper.vm) + await waitRAF() + + expect(wrapper.is('article')).toBe(true) + expect(wrapper.attributes('id')).toBeDefined() + expect(wrapper.attributes('id')).toEqual('wrapper') + + // The trigger button + const $button = wrapper.find('button') + expect($button.exists()).toBe(true) + + // ID of the tooltip that will be in the body + const adb = $button.attributes('aria-describedby') + expect(adb).toBeDefined() + expect(adb).not.toBe('') + expect(adb).not.toBe(null) + + // Find the tooltip element in the document + const tip = document.getElementById(adb) + expect(tip).not.toBe(null) + expect(tip).toBeInstanceOf(HTMLElement) + expect(tip.tagName).toEqual('DIV') + expect(tip.classList.contains('tooltip')).toBe(true) + expect(tip.classList.contains('b-tooltip')).toBe(true) + expect(tip.classList.contains('noninteractive')).toBe(false) + + // Enable 'noninteractive'. Should be reactive + wrapper.setProps({ + noninteractive: true + }) + await waitNT(wrapper.vm) + await waitRAF() + expect(tip.classList.contains('tooltip')).toBe(true) + expect(tip.classList.contains('b-tooltip')).toBe(true) + expect(tip.classList.contains('noninteractive')).toBe(true) + + wrapper.destroy() + }) + + it('applies variant class', async () => { jest.useFakeTimers() const App = localVue.extend(appDef) const wrapper = mount(App, { @@ -1125,7 +1187,7 @@ describe('b-tooltip', () => { wrapper.destroy() }) - it('Applies custom class', async () => { + it('applies custom class', async () => { jest.useFakeTimers() const App = localVue.extend(appDef) const wrapper = mount(App, { diff --git a/src/directives/tooltip/README.md b/src/directives/tooltip/README.md index d7c1b3b0632..801b6ecf5ce 100644 --- a/src/directives/tooltip/README.md +++ b/src/directives/tooltip/README.md @@ -314,7 +314,7 @@ Where `[modX]` can be (all optional): `hover`. `blur` is a close handler only, and if specified by itself, will be converted to `focus`). Use `manual` if you only want to control the visibility manually. - `nofade` to turn off animation. -- `html` to enable rendering raw HTML. By default HTML is escaped and converted to text +- `html` to enable rendering raw HTML. By default HTML is escaped and converted to text. - A delay value in the format of `d###` (where `###` is in ms, defaults to `50`), applied to both `hide` and `show`. - A show delay value in the format of `ds###` (where `###` is in ms, defaults to `50`), applied to @@ -327,6 +327,7 @@ Where `[modX]` can be (all optional): tooltip. If not specified, the boundary defaults to the trigger element's scroll parent (in most cases this will suffice). - A contextual variant in the form of `v-XXX` (where `XXX` is the color variant name). +- `noninteractive` to make the tooltip not user-interactive. Where `` can be (optional): @@ -338,23 +339,24 @@ Where `` can be (optional): **Options configuration object properties:** -| Property | Type | Default | Description | -| ------------------- | ----------------------------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `animation` | Boolean | `true` | Apply a CSS fade transition to the tooltip. | -| `container` | String ID or HTMLElement or `false` | `false` | Appends the tooltip to a specific element. Example: `container: '#body'`. This option is particularly useful in that it allows you to position the tooltip in the flow of the document near the triggering element - which will prevent the tooltip from floating away from the triggering element during a window resize. When set to `false` the tooltip will be appended to `body`, or if the trigger element is inside a modal it will append to the modal's container. | -| `delay` | Number or Object | `50` | Delay showing and hiding the tooltip (ms). If a number is supplied, delay is applied to both hide/show. Object structure is: `delay: { "show": 500, "hide": 100 }` | -| `html` | Boolean | `false` | Allow HTML in the tooltip. If true, HTML tags in the tooltip's title will be rendered in the tooltip. If false, the title will be inserted as plain text. Use text if you're worried about XSS attacks. | -| `placement` | String or Function | `'top'` | How to position the tooltip - `auto`, `top`, `bottom`, `left`, `right`, `topleft`, `topright`, `bottomleft`, `bottomright`, `lefttop`, `leftbottom`, `righttop`, or `rightbottom`. When `auto` is specified, it will dynamically reorient the tooltip. | -| `title` | String or Element or Function | `''` | Default title value if title attribute isn't present. If a function is given, it must return a string. | -| `trigger` | String | `'hover focus'` | How tooltip is triggered: `click`, `hover`, `focus`. You may pass multiple triggers; separate them with a space. | -| `offset` | Number or String | `0` | Offset of the tooltip relative to its target. For more information refer to Popper.js's offset docs. | -| `fallbackPlacement` | String or Array | `'flip'` | Allow to specify which position Popper will use on fallback. Can be `flip`, `clockwise`, `counterclockwise` or an array of placements. For more information refer to Popper.js's behavior docs. | -| `boundary` | String ID or HTMLElement | `'scrollParent'` | The container that the tooltip will be constrained visually. The default should suffice in most cases, but you may need to change this if your target element is in a small container with overflow scroll. Supported values: `'scrollParent'` (default), `'viewport'`, `'window'`, or a reference to an HTML element. | -| `boundaryPadding` | Number | `5` | Amount of pixel used to define a minimum distance between the boundaries and the tooltip. This makes sure the tooltip always has a little padding between the edges of its container. | -| `variant` | String | `null` | Contextual color variant for the tooltip. | -| `customClass` | String | `null` | A custom classname to apply to the tooltip outer wrapper element. | -| `id` | String | `null` | An ID to use on the tooltip root element. If none is provided, one will automatically be generated. If you do provide an ID, it _must_ be guaranteed to be unique on the rendered page. | -| `disabled` | Boolean | `false` | Set to `true` to disable the tooltip | +| Property | Type | Default | Description | +| ------------------- | ----------------------------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `animation` | Boolean | `true` | Apply a CSS fade transition to the tooltip | +| `container` | String ID or HTMLElement or `false` | `false` | Appends the tooltip to a specific element. Example: `container: '#body'`. This option is particularly useful in that it allows you to position the tooltip in the flow of the document near the triggering element - which will prevent the tooltip from floating away from the triggering element during a window resize. When set to `false` the tooltip will be appended to `body`, or if the trigger element is inside a modal it will append to the modal's container | +| `delay` | Number or Object | `50` | Delay showing and hiding the tooltip (ms). If a number is supplied, delay is applied to both hide/show. Object structure is: `delay: { "show": 500, "hide": 100 }` | +| `html` | Boolean | `false` | Allow HTML in the tooltip. If true, HTML tags in the tooltip's title will be rendered in the tooltip. If false, the title will be inserted as plain text. Use text if you're worried about XSS attacks | +| `placement` | String or Function | `'top'` | How to position the tooltip - `auto`, `top`, `bottom`, `left`, `right`, `topleft`, `topright`, `bottomleft`, `bottomright`, `lefttop`, `leftbottom`, `righttop`, or `rightbottom`. When `auto` is specified, it will dynamically reorient the tooltip | +| `title` | String or Element or Function | `''` | Default title value if title attribute isn't present. If a function is given, it must return a string | +| `trigger` | String | `'hover focus'` | How tooltip is triggered: `click`, `hover`, `focus`. You may pass multiple triggers; separate them with a space | +| `offset` | Number or String | `0` | Offset of the tooltip relative to its target. For more information refer to Popper.js's offset docs | +| `fallbackPlacement` | String or Array | `'flip'` | Allow to specify which position Popper will use on fallback. Can be `flip`, `clockwise`, `counterclockwise` or an array of placements. For more information refer to Popper.js's behavior docs | +| `boundary` | String ID or HTMLElement | `'scrollParent'` | The container that the tooltip will be constrained visually. The default should suffice in most cases, but you may need to change this if your target element is in a small container with overflow scroll. Supported values: `'scrollParent'` (default), `'viewport'`, `'window'`, or a reference to an HTML element | +| `boundaryPadding` | Number | `5` | Amount of pixel used to define a minimum distance between the boundaries and the tooltip. This makes sure the tooltip always has a little padding between the edges of its container | +| `interactive` | Boolean | `true` | Wether the tooltip should be user-interactive | +| `variant` | String | `null` | Contextual color variant for the tooltip | +| `customClass` | String | `null` | A custom classname to apply to the tooltip outer wrapper element | +| `id` | String | `null` | An ID to use on the tooltip root element. If none is provided, one will automatically be generated. If you do provide an ID, it _must_ be guaranteed to be unique on the rendered page | +| `disabled` | Boolean | `false` | Set to `true` to disable the tooltip | ### Usage diff --git a/src/directives/tooltip/package.json b/src/directives/tooltip/package.json index 5f170e6a4fa..534942bec9c 100644 --- a/src/directives/tooltip/package.json +++ b/src/directives/tooltip/package.json @@ -72,6 +72,10 @@ "name": "html", "description": "Enables basic HTML in the title (use with caution)" }, + { + "name": "interactive", + "description": "Wether the tooltip should be user-interactive" + }, { "name": "viewport", "description": "Sets the boundary constraint to the viewport" diff --git a/src/directives/tooltip/tooltip.js b/src/directives/tooltip/tooltip.js index e9a0a0ec348..ccf6b6b581d 100644 --- a/src/directives/tooltip/tooltip.js +++ b/src/directives/tooltip/tooltip.js @@ -32,6 +32,7 @@ const validTriggers = { // Directive modifier test regular expressions. Pre-compile for performance const htmlRE = /^html$/i +const noninteractiveRE = /^noninteractive$/i const noFadeRE = /^nofade$/i const placementRE = /^(auto|top(left|right)?|bottom(left|right)?|left(top|bottom)?|right(top|bottom)?)$/i const boundaryRE = /^(window|viewport|scrollParent)$/i @@ -58,6 +59,7 @@ const parseBindings = (bindings, vnode) => /* istanbul ignore next: not easy to offset: 0, id: null, html: false, + interactive: true, disabled: false, delay: getComponentConfig(NAME, 'delay'), boundary: String(getComponentConfig(NAME, 'boundary')), @@ -105,6 +107,9 @@ const parseBindings = (bindings, vnode) => /* istanbul ignore next: not easy to if (htmlRE.test(mod)) { // Title allows HTML config.html = true + } else if (noninteractiveRE.test(mod)) { + // Noninteractive + config.interactive = false } else if (noFadeRE.test(mod)) { // No animation config.animation = false @@ -213,6 +218,7 @@ const applyTooltip = (el, bindings, vnode) => { offset: config.offset, noFade: !config.animation, id: config.id, + interactive: config.interactive, disabled: config.disabled, html: config.html } diff --git a/src/directives/tooltip/tooltip.spec.js b/src/directives/tooltip/tooltip.spec.js index 5be45a7bb17..b0e90c659a2 100644 --- a/src/directives/tooltip/tooltip.spec.js +++ b/src/directives/tooltip/tooltip.spec.js @@ -136,7 +136,7 @@ describe('v-b-tooltip directive', () => { wrapper.destroy() }) - it('should nowshow tooltip when title is empty', async () => { + it('should not show tooltip when title is empty', async () => { jest.useFakeTimers() const localVue = new CreateLocalVue() diff --git a/src/icons/package.json b/src/icons/package.json index b14f89036c7..21a08514ba9 100644 --- a/src/icons/package.json +++ b/src/icons/package.json @@ -12062,4 +12062,4 @@ } ] } -} \ No newline at end of file +} From 7d8eef75d2c2c83e7c677bf07a373b2d8d279072 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 8 Jan 2020 09:13:56 +0100 Subject: [PATCH 095/100] chore(deps): update devdependency husky to ^4.0.1 (#4569) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4cacbfe26e2..5bfce395914 100644 --- a/package.json +++ b/package.json @@ -133,7 +133,7 @@ "gh-pages": "^2.2.0", "highlight.js": "^9.17.1", "html-loader": "^0.5.5", - "husky": "^4.0.0", + "husky": "^4.0.1", "jest": "^24.9.0", "jest-environment-jsdom-fourteen": "^1.0.1", "lint-staged": "^9.5.0", diff --git a/yarn.lock b/yarn.lock index de198dcf74d..a752c032ada 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6272,10 +6272,10 @@ humps@^2.0.1: resolved "https://registry.yarnpkg.com/humps/-/humps-2.0.1.tgz#dd02ea6081bd0568dc5d073184463957ba9ef9aa" integrity sha1-3QLqYIG9BWjcXQcxhEY5V7qe+ao= -husky@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/husky/-/husky-4.0.0.tgz#654a72ecd7d59565de5360365a7d78a7bbb05286" - integrity sha512-h9kcWWpZgpGLrhlaBBtbMtA9Tsqu0yrfKSCU9ax6vulTvMSvVWEmFOsBehiLD38vJZVeFyrif5AcpcoiM0LJmw== +husky@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/husky/-/husky-4.0.1.tgz#b0d9e16e660ec352392b3c2164ba709694d86b4d" + integrity sha512-x2wzNz3mra5rSYBPb9w59Bg3d5HnJZ+DBAALbMl/1K15Yv8zhcAxhrS792nMyjkxLsoPZtNpmnX+RqLtIKxpDQ== dependencies: chalk "^3.0.0" ci-info "^2.0.0" From 7a5a629f0f43ea0029df602cf9df51d97e3db541 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 8 Jan 2020 12:42:19 +0100 Subject: [PATCH 096/100] chore(deps): update devdependency rollup to ^1.29.0 (#4571) Co-authored-by: Renovate Bot --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 5bfce395914..2c9e5d02794 100644 --- a/package.json +++ b/package.json @@ -145,7 +145,7 @@ "postcss-cli": "^7.0.0", "prettier": "1.14.3", "require-context": "^1.1.0", - "rollup": "^1.28.0", + "rollup": "^1.29.0", "rollup-plugin-babel": "^4.3.3", "rollup-plugin-commonjs": "^10.1.0", "rollup-plugin-node-resolve": "^5.2.0", diff --git a/yarn.lock b/yarn.lock index a752c032ada..b176f4e2d95 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10884,10 +10884,10 @@ rollup-pluginutils@^2.8.1: dependencies: estree-walker "^0.6.1" -rollup@^1.28.0: - version "1.28.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.28.0.tgz#d576a6a0fd7490b2e1f531ef8b411795fb80da87" - integrity sha512-v2J/DmQi9+Nf6frGqzwZRvbiuTTrqH0yzoUF4Eybf8sONT4UpLZzJYnYzW96Zm9X1+4SJmijfnFBWCzHDAXYnQ== +rollup@^1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.29.0.tgz#6a1a79eea43ca9d3d79a90c15a1ceecedc72097b" + integrity sha512-V63Iz0dSdI5qPPN5HmCN6OBRzBFhMqNWcvwgq863JtSCTU6Vdvqq6S2fYle/dSCyoPrBkIP3EIr1RVs3HTRqqg== dependencies: "@types/estree" "*" "@types/node" "*" From a75b7acb06c2f1b80b70ad06f05aab18ecaf7ba9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 8 Jan 2020 11:41:17 -0400 Subject: [PATCH 097/100] chore(deps): update devdependency terser to ^4.6.2 (#4572) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 2c9e5d02794..f575f717871 100644 --- a/package.json +++ b/package.json @@ -151,7 +151,7 @@ "rollup-plugin-node-resolve": "^5.2.0", "sass-loader": "^8.0.0", "standard-version": "^7.0.1", - "terser": "^4.6.1", + "terser": "^4.6.2", "vue": "^2.6.11", "vue-jest": "^3.0.5", "vue-router": "^3.1.3", diff --git a/yarn.lock b/yarn.lock index b176f4e2d95..9b101016c29 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11958,10 +11958,10 @@ terser@^4.4.3: source-map "~0.6.1" source-map-support "~0.5.12" -terser@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.1.tgz#913e35e0d38a75285a7913ba01d753c4089ebdbd" - integrity sha512-w0f2OWFD7ka3zwetgVAhNMeyzEbj39ht2Tb0qKflw9PmW9Qbo5tjTh01QJLkhO9t9RDDQYvk+WXqpECI2C6i2A== +terser@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.2.tgz#cb1cf055e7f70caa5863f00ba3e67dc3c97b5150" + integrity sha512-6FUjJdY2i3WZAtYBtnV06OOcOfzl+4hSKYE9wgac8rkLRBToPDDrBB2AcHwQD/OKDxbnvhVy2YgOPWO2SsKWqg== dependencies: commander "^2.20.0" source-map "~0.6.1" From 704d89a3d63b1bc6f20c26a940c8bd228d8378fb Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Wed, 8 Jan 2020 15:19:56 -0400 Subject: [PATCH 098/100] chore(docs): add caniuse link to form-input docs input type section --- src/components/form-input/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/form-input/README.md b/src/components/form-input/README.md index 35edafa66af..aacf4505949 100644 --- a/src/components/form-input/README.md +++ b/src/components/form-input/README.md @@ -75,7 +75,7 @@ rendered and a console warning will be issued. **Caveats with input types:** - Not all browsers support all input types, nor do some types render in the same format across - browser types/versions. + browser types/versions. Refer to [caniuse.com](https://caniuse.com/#search=input). - Browsers that do not support a particular type will fall back to a `text` input type (even though the rendered `type` attribute markup shows the requested type). - No testing is performed to see if the requested input type is supported by the browser. From 2e794fed56ef44ee905977793320b21de90c9ef2 Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Wed, 8 Jan 2020 18:38:10 -0400 Subject: [PATCH 099/100] chore(docs): use icons on landing page (#4576) --- docs/pages/index.vue | 96 ++++---------------------------------------- 1 file changed, 8 insertions(+), 88 deletions(-) diff --git a/docs/pages/index.vue b/docs/pages/index.vue index cffa53e059e..3520d945c18 100644 --- a/docs/pages/index.vue +++ b/docs/pages/index.vue @@ -190,28 +190,9 @@ - - + Responsive - Mobile first responsive layout @@ -219,29 +200,9 @@ - - + Modular - Import only the features that you need @@ -249,27 +210,15 @@ - - + > Accessible - Automated WAI-ARIA accessibility markup @@ -293,10 +242,8 @@ d="M356.9 64.3H280l-56 88.6-48-88.6H0L224 448 448 64.3h-91.1zm-301.2 32h53.8L224 294.5 338.4 96.3h53.8L224 384.5 55.7 96.3z" /> - Modern - Built with Vue.js v{{ vueVersionMinor }} and Bootstrap SCSS v{{ bootstrapVersionMinor }} @@ -305,34 +252,9 @@ - - + Configurable - Create themes with SCSS variables and global options @@ -354,10 +276,8 @@ d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z" /> - Free - Open sourced on GitHub, MIT License From 4853938f35a3a78984025c36f2a40e7bbb209c63 Mon Sep 17 00:00:00 2001 From: Troy Morehouse Date: Wed, 8 Jan 2020 19:39:14 -0400 Subject: [PATCH 100/100] chore: bump version and update changelog (#4573) --- CHANGELOG.md | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 81 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83abd6003c5..c1785cad9f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,86 @@ > [standard-version](https://github.com/conventional-changelog/standard-version) for commit > guidelines. + + +## [v2.2.0](https://github.com/bootstrap-vue/bootstrap-vue/compare/v2.1.0...v2.2.0) + +Released: 2020-01-08 + +### Overview v2.2.0 + +- New optional icon components based on `BootstrapIcons v1.0.0-alpha2` +- New tagged input component `` +- Support for `Bootstrap v4.4.1` CSS/SCSS + +### Features v2.2.0 + +- **icons:** new optional icon components + ([#4489](https://github.com/bootstrap-vue/bootstrap-vue/issues/4489)) + ([d2bef17](https://github.com/bootstrap-vue/bootstrap-vue/commit/d2bef1715636fcb83de6d51808683e6feda671d0)) +- **b-collapse:** add new prop `appear` to animate an initially visible collapse + ([#4317](https://github.com/bootstrap-vue/bootstrap-vue/issues/4317)) + ([136a72b](https://github.com/bootstrap-vue/bootstrap-vue/commit/136a72b0352d4bb1339ab31f791087cbcda42fa5)) +- **b-collapse:** add optional scoping to default slot + ([#4405](https://github.com/bootstrap-vue/bootstrap-vue/issues/4405)) + ([8e95bac](https://github.com/bootstrap-vue/bootstrap-vue/commit/8e95bacf9d00562f2676689d067ae0db009cbbb6)) +- **b-container:** add support for bootstrap v4.4.x new responsive containers + ([0e318f4](https://github.com/bootstrap-vue/bootstrap-vue/commit/0e318f4755e65eb569dcc579938d0d72c02abd62)) +- **b-dropdown:** add splitClass property to dropdown component + ([#4394](https://github.com/bootstrap-vue/bootstrap-vue/issues/4394)) + ([a5f342e](https://github.com/bootstrap-vue/bootstrap-vue/commit/a5f342e0e4de2186259e36e42cecda8c20e1c8ab)) +- **b-dropdown-form:** new `form-class` prop for adding classes to the form element (closes + [#4474](https://github.com/bootstrap-vue/bootstrap-vue/issues/4474)) + ([#4475](https://github.com/bootstrap-vue/bootstrap-vue/issues/4475)) + ([eef4200](https://github.com/bootstrap-vue/bootstrap-vue/commit/eef4200976f7921b1bb03f50c0ece8ee7c41ed0e)) +- **b-form-select:** add group/tree support and dedicated option and option-group components (closes + [#3222](https://github.com/bootstrap-vue/bootstrap-vue/issues/3222)) + ([#4267](https://github.com/bootstrap-vue/bootstrap-vue/issues/4267)) + ([f1ed017](https://github.com/bootstrap-vue/bootstrap-vue/commit/f1ed0177c20f9d7e7e340a8815d1b6bc66f7cb76)) +- **b-form-select:** support paths for `valueField`, `textField`, `htmlField` and `disabledField` + props ([#4386](https://github.com/bootstrap-vue/bootstrap-vue/issues/4386)) + ([ed3b736](https://github.com/bootstrap-vue/bootstrap-vue/commit/ed3b7360af415dc3cc56f0b6662c9d48cc165781)) +- **b-form-tags:** new tagged input component + ([#4409](https://github.com/bootstrap-vue/bootstrap-vue/issues/4409)) + ([00eb9d9](https://github.com/bootstrap-vue/bootstrap-vue/commit/00eb9d9fd460adca8227b3b344284b5cc49a734f)) +- **b-row:** add Bootstrap v4.4 row columns support + ([#4439](https://github.com/bootstrap-vue/bootstrap-vue/issues/4439)) + ([833b028](https://github.com/bootstrap-vue/bootstrap-vue/commit/833b028a2d6101d01b7012a7378359db1c801695)) +- **b-table:** better sort labeling for screen readers (closes + [#4487](https://github.com/bootstrap-vue/bootstrap-vue/issues/4487)) + ([#4488](https://github.com/bootstrap-vue/bootstrap-vue/issues/4488)) + ([d4e66fa](https://github.com/bootstrap-vue/bootstrap-vue/commit/d4e66fa48fdd1cd7fd4b93907fe999de3fc577f8)) +- **b-table, b-table-lite:** new `tbody-tr-attr` prop for arbitrary row attributes (closes + [#1864](https://github.com/bootstrap-vue/bootstrap-vue/issues/1864)) + ([#4481](https://github.com/bootstrap-vue/bootstrap-vue/issues/4481)) + ([4acf6ed](https://github.com/bootstrap-vue/bootstrap-vue/commit/4acf6ed863dd5edd85897a01b099c42322097d1b)) +- **b-tooltip:** add `noninteractive` prop (closes + [#4556](https://github.com/bootstrap-vue/bootstrap-vue/issues/4556)) + ([#4563](https://github.com/bootstrap-vue/bootstrap-vue/issues/4563)) + ([b3ad726](https://github.com/bootstrap-vue/bootstrap-vue/commit/b3ad7264d9b10fb1b8dfba70c62eed11a56519d6)) +- **build:** configure pre-commit hook (closes + [#4532](https://github.com/bootstrap-vue/bootstrap-vue/issues/4532)) + ([#4552](https://github.com/bootstrap-vue/bootstrap-vue/issues/4552)) + ([1bf9e59](https://github.com/bootstrap-vue/bootstrap-vue/commit/1bf9e59e8888a7a2cd6f135665103419f603a32d)) + +### Bug Fixes v2.2.0 + +- **b-table, b-table-lite:** handle edge case with row events when table is removed from dom. + instantiate row event handlers only when listeners are registered (fixes + [#4384](https://github.com/bootstrap-vue/bootstrap-vue/issues/4384)) + ([#4388](https://github.com/bootstrap-vue/bootstrap-vue/issues/4388)) + ([9a81cd4](https://github.com/bootstrap-vue/bootstrap-vue/commit/9a81cd414a2c534b96de0d82c3d00d94651e5a7b)) +- **b-toast:** fix interal `ensureToaster` method call when toaster name changes + ([#4468](https://github.com/bootstrap-vue/bootstrap-vue/issues/4468)) + ([744bb7a](https://github.com/bootstrap-vue/bootstrap-vue/commit/744bb7a77092a04184af31bf285e432110e1ab44)) +- **tooltips, popovers:** fix memory leak (closes + [#4400](https://github.com/bootstrap-vue/bootstrap-vue/issues/4400)) + ([#4401](https://github.com/bootstrap-vue/bootstrap-vue/issues/4401)) + ([c71352d](https://github.com/bootstrap-vue/bootstrap-vue/commit/c71352d674347e5e2d72fe8b82334fc87a4ffd8c)) +- **docs:** handle undocumented breaking changes in babel-standalone for IE11 + ([#4484](https://github.com/bootstrap-vue/bootstrap-vue/issues/4484)) + ([56f8bb5](https://github.com/bootstrap-vue/bootstrap-vue/commit/56f8bb5af7fb7188da035210e8be28d7ae1c7bc1)) + ## [v2.1.0](https://github.com/bootstrap-vue/bootstrap-vue/compare/v2.0.4...v2.1.0) diff --git a/package.json b/package.json index f575f717871..07440579b3a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bootstrap-vue", - "version": "2.1.0", + "version": "2.2.0", "description": "BootstrapVue, with over 40 plugins and more than 80 custom components, custom directives, and over 300 icons, provides one of the most comprehensive implementations of Bootstrap v4 components and grid system for Vue.js. With extensive and automated WAI-ARIA accessibility markup.", "main": "dist/bootstrap-vue.common.js", "web": "dist/bootstrap-vue.js",