From 2ec44372ebaaa2a5544f28ecfbe41f62093becf7 Mon Sep 17 00:00:00 2001 From: Winnie Hellmann Date: Fri, 16 Feb 2018 11:30:55 +0100 Subject: Add secondary button to gl-modal component --- .../javascripts/vue_shared/components/gl_modal.vue | 56 +++++++++++++-------- .../vue_shared/components/modal_button.vue | 32 ++++++++++++ .../unreleased/winh-more-modal-components.yml | 5 ++ doc/development/fe_guide/components.md | 21 ++++++++ .../fe_guide/img/gl-modal-secondary.png | Bin 0 -> 30994 bytes .../vue_shared/components/gl_modal_spec.js | 54 ++++++++++++++++++++ 6 files changed, 148 insertions(+), 20 deletions(-) create mode 100644 app/assets/javascripts/vue_shared/components/modal_button.vue create mode 100644 changelogs/unreleased/winh-more-modal-components.yml create mode 100644 doc/development/fe_guide/img/gl-modal-secondary.png diff --git a/app/assets/javascripts/vue_shared/components/gl_modal.vue b/app/assets/javascripts/vue_shared/components/gl_modal.vue index 67c9181c7b1..3520f984083 100644 --- a/app/assets/javascripts/vue_shared/components/gl_modal.vue +++ b/app/assets/javascripts/vue_shared/components/gl_modal.vue @@ -1,14 +1,13 @@ + + diff --git a/changelogs/unreleased/winh-more-modal-components.yml b/changelogs/unreleased/winh-more-modal-components.yml new file mode 100644 index 00000000000..8c1b6a8da62 --- /dev/null +++ b/changelogs/unreleased/winh-more-modal-components.yml @@ -0,0 +1,5 @@ +--- +title: Add secondary button to gl-modal component +merge_request: 17172 +author: +type: changed diff --git a/doc/development/fe_guide/components.md b/doc/development/fe_guide/components.md index 66a8abe42f7..255f92e8fbb 100644 --- a/doc/development/fe_guide/components.md +++ b/doc/development/fe_guide/components.md @@ -59,3 +59,24 @@ Here is an example of how to use it: ``` ![example modal](img/gl-modal.png) + +### Modals with secondary action + +You can also add a secondary button to modals: + +```html + + {{ s__('ModalExample|You’re about to let the dogs out.') }} + +``` + +![example modal with secondary action](img/gl-modal-secondary.png) diff --git a/doc/development/fe_guide/img/gl-modal-secondary.png b/doc/development/fe_guide/img/gl-modal-secondary.png new file mode 100644 index 00000000000..e34309935ff Binary files /dev/null and b/doc/development/fe_guide/img/gl-modal-secondary.png differ diff --git a/spec/javascripts/vue_shared/components/gl_modal_spec.js b/spec/javascripts/vue_shared/components/gl_modal_spec.js index d6148cb785b..2b2115041c0 100644 --- a/spec/javascripts/vue_shared/components/gl_modal_spec.js +++ b/spec/javascripts/vue_shared/components/gl_modal_spec.js @@ -80,6 +80,52 @@ describe('GlModal', () => { expect(primaryButton.innerHTML.trim()).toBe(props.footerPrimaryButtonText); }); }); + + describe('with footerSecondaryButtonVariant', () => { + const props = { + footerSecondaryButtonText: 'something to make the button visible', + footerSecondaryButtonVariant: 'danger', + }; + + beforeEach(() => { + vm = mountComponent(modalComponent, props); + }); + + it('sets the secondary button class', () => { + const secondaryButton = vm.$el.querySelector('.modal-footer button:nth-of-type(2)'); + expect(secondaryButton.classList).toContain(`btn-${props.footerSecondaryButtonVariant}`); + }); + }); + + describe('with footerSecondaryButtonText', () => { + const props = { + footerSecondaryButtonText: 'my second button text', + }; + + beforeEach(() => { + vm = mountComponent(modalComponent, props); + }); + + it('sets the secondary button text', () => { + const secondaryButton = vm.$el.querySelector('.modal-footer button:nth-of-type(2)'); + expect(secondaryButton.innerHTML.trim()).toBe(props.footerSecondaryButtonText); + }); + }); + + describe('without footerSecondaryButtonText', () => { + const props = { + footerSecondaryButtonText: null, + }; + + beforeEach(() => { + vm = mountComponent(modalComponent, props); + }); + + it('does not render a secondary button', () => { + const buttons = vm.$el.querySelectorAll('.modal-footer button'); + expect(buttons.length).toBe(2); + }); + }); }); it('works with data-toggle="modal"', (done) => { @@ -114,6 +160,14 @@ describe('GlModal', () => { }); }); + describe('emitSecondaryAction', () => { + it('emits a secondaryAction event', () => { + vm.emitSecondaryAction(dummyEvent); + + expect(vm.$emit).toHaveBeenCalledWith('secondaryAction', dummyEvent); + }); + }); + describe('emitSubmit', () => { it('emits a submit event', () => { vm.emitSubmit(dummyEvent); -- cgit v1.2.1