@gitlab/ui 33.0.1 → 33.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gitlab/ui",
3
- "version": "33.0.1",
3
+ "version": "33.1.0",
4
4
  "description": "GitLab UI Components",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -67,11 +67,6 @@ $gl-popover-max-width: $grid-size * 35;
67
67
  @include gl-font-sm;
68
68
  @include gl-font-weight-bold;
69
69
  @include gl-m-0;
70
-
71
- .gl-button.close {
72
- margin-top: -$gl-spacing-scale-3;
73
- margin-right: -$gl-spacing-scale-4;
74
- }
75
70
  }
76
71
 
77
72
  .popover-body {
@@ -5,16 +5,18 @@ import GlPopover from './popover.vue';
5
5
  describe('GlPopover', () => {
6
6
  let wrapper;
7
7
 
8
- const createWrapper = (props) => {
8
+ const createWrapper = (props, stubs = {}) => {
9
9
  wrapper = shallowMount(GlPopover, {
10
10
  propsData: {
11
11
  target: document.body,
12
12
  ...props,
13
13
  },
14
+ stubs,
14
15
  });
15
16
  };
16
17
 
17
18
  const findBVPopover = () => wrapper.findComponent({ ref: 'bPopover' });
19
+ const findCloseButton = () => findBVPopover().find('[data-testid="close-button"]');
18
20
 
19
21
  it.each(tooltipActionEvents)('passes through the %s event to the bvPopover instance', (event) => {
20
22
  createWrapper();
@@ -46,4 +48,43 @@ describe('GlPopover', () => {
46
48
  expect(findBVPopover().props('title')).toBe(title);
47
49
  });
48
50
  });
51
+
52
+ describe('close button', () => {
53
+ let doCloseMock;
54
+
55
+ beforeEach(() => {
56
+ doCloseMock = jest.fn();
57
+ createWrapper(
58
+ { showCloseButton: true },
59
+ {
60
+ BPopover: {
61
+ template: `
62
+ <div>
63
+ <slot name="title" />
64
+ </div>
65
+ `,
66
+ methods: {
67
+ doClose: doCloseMock,
68
+ },
69
+ },
70
+ }
71
+ );
72
+ });
73
+
74
+ it('renders a close button', () => {
75
+ expect(findCloseButton().exists()).toBe(true);
76
+ });
77
+
78
+ it("calls BPopover's doClose method when clicking on the close button", () => {
79
+ findCloseButton().vm.$emit('click');
80
+
81
+ expect(doCloseMock).toHaveBeenCalled();
82
+ });
83
+
84
+ it('emits close-button-clicked event when clicking on the close button', () => {
85
+ findCloseButton().vm.$emit('click');
86
+
87
+ expect(wrapper.emitted('close-button-clicked')).toHaveLength(1);
88
+ });
89
+ });
49
90
  });
@@ -60,6 +60,24 @@ documentedStoriesOf('base/popover', '')
60
60
  template,
61
61
  props: generateProps(),
62
62
  }))
63
+ .add('with close button', () => ({
64
+ template: `
65
+ <div class="gl-display-flex gl-justify-content-center gl-p-6">
66
+ <gl-button id="pop-with-close-button">{{placement}}</gl-button>
67
+ <gl-popover
68
+ target="pop-with-close-button"
69
+ data-testid="popover-with-close-button"
70
+ triggers="hover focus"
71
+ :title="title"
72
+ :placement="placement"
73
+ content="${contentString}"
74
+ show
75
+ show-close-button
76
+ />
77
+ </div>
78
+ `,
79
+ props: generateProps(),
80
+ }))
63
81
  .add(
64
82
  'on click',
65
83
  () => ({
@@ -1,12 +1,14 @@
1
1
  <script>
2
2
  import { BPopover } from 'bootstrap-vue';
3
3
  import tooltipMixin from '../../mixins/tooltip_mixin';
4
+ import CloseButton from '../../shared_components/close_button/close_button.vue';
4
5
 
5
6
  const popoverRefName = 'bPopover';
6
7
 
7
8
  export default {
8
9
  components: {
9
10
  BPopover,
11
+ CloseButton,
10
12
  },
11
13
  mixins: [tooltipMixin(popoverRefName)],
12
14
  inheritAttrs: false,
@@ -21,11 +23,30 @@ export default {
21
23
  required: false,
22
24
  default: 'hover focus',
23
25
  },
26
+ title: {
27
+ type: String,
28
+ required: false,
29
+ default: '',
30
+ },
31
+ showCloseButton: {
32
+ type: Boolean,
33
+ required: false,
34
+ default: false,
35
+ },
24
36
  },
25
37
  computed: {
26
38
  customClass() {
27
39
  return ['gl-popover', ...this.cssClasses].join(' ');
28
40
  },
41
+ shouldShowTitle() {
42
+ return this.$scopedSlots.title || this.title || this.showCloseButton;
43
+ },
44
+ },
45
+ methods: {
46
+ close(e) {
47
+ this.$refs[popoverRefName].doClose();
48
+ this.$emit('close-button-clicked', e);
49
+ },
29
50
  },
30
51
  popoverRefName,
31
52
  };
@@ -36,11 +57,20 @@ export default {
36
57
  :ref="$options.popoverRefName"
37
58
  :custom-class="customClass"
38
59
  :triggers="triggers"
60
+ :title="title"
39
61
  v-bind="$attrs"
40
62
  v-on="$listeners"
41
63
  >
42
- <template v-if="$scopedSlots.title" #title>
43
- <slot name="title"></slot>
64
+ <template v-if="shouldShowTitle" #title>
65
+ <slot name="title">
66
+ {{ title }}
67
+ </slot>
68
+ <close-button
69
+ v-if="showCloseButton"
70
+ class="gl-float-right gl-mt-n2 gl-mr-n3"
71
+ data-testid="close-button"
72
+ @click="close"
73
+ />
44
74
  </template>
45
75
  <slot></slot>
46
76
  </b-popover>