diff --git a/src/js/components/shepherd-modal/index.jsx b/src/js/components/shepherd-modal/index.jsx index 70a47ba84..042b27742 100644 --- a/src/js/components/shepherd-modal/index.jsx +++ b/src/js/components/shepherd-modal/index.jsx @@ -10,6 +10,8 @@ export default class ShepherdModal extends Component { this._onScreenChange = null; + this.classPrefix = props.classPrefix; + autoBind(this); // Setup initial state @@ -22,24 +24,25 @@ export default class ShepherdModal extends Component { } render(props, state) { + const { classPrefix, styles } = props; return this.modal = c}/>, document.body, existingModal); + const existingModal = document.querySelector(`.${this.classPrefix}shepherd-modal-overlay-container`); + render( + this.modal = c} + styles={this.styles} + />, + document.body, + existingModal + ); this._setTooltipDefaults(); this._setTourID(); diff --git a/src/js/utils/modal.jsx b/src/js/utils/modal.jsx index ce44549da..d89257678 100644 --- a/src/js/utils/modal.jsx +++ b/src/js/utils/modal.jsx @@ -1,15 +1,17 @@ /** * Remove any leftover modal target classes and add the modal target class to the currentElement * @param {HTMLElement} currentElement The element for the current step + * @param {string} classPrefix The prefix to add to the class name */ -function toggleShepherdModalClass(currentElement) { - const shepherdModal = document.querySelector('shepherd-modal-target'); +function toggleShepherdModalClass(currentElement, classPrefix) { + debugger; + const shepherdModalTarget = document.querySelector(`.${classPrefix}shepherd-modal-target`); - if (shepherdModal) { - shepherdModal.classList.remove('shepherd-modal-target'); + if (shepherdModalTarget) { + shepherdModalTarget.classList.remove(`${classPrefix}shepherd-modal-target`); } - currentElement.classList.add('shepherd-modal-target'); + currentElement.classList.add(`${classPrefix}shepherd-modal-target`); } export { diff --git a/test/cypress/integration/modal.spec.js b/test/cypress/integration/modal.spec.js index b80b3a025..3ee8d5b99 100644 --- a/test/cypress/integration/modal.spec.js +++ b/test/cypress/integration/modal.spec.js @@ -33,7 +33,7 @@ describe('Modal mode', () => { it('Displaying the modal during tours when modal mode is enabled', () => { tour.start(); - cy.get('#shepherdModalOverlayContainer').should('have.css', 'display', 'block'); + cy.get('.shepherd-modal-overlay-container').should('have.css', 'display', 'block'); cy.get('body').should('have.class', 'shepherd-modal-is-visible'); }); }); @@ -48,7 +48,7 @@ describe('Modal mode', () => { it('Hiding the modal during tours when modal mode is not enabled', () => { tour.start(); - cy.get('#shepherdModalOverlayContainer').should('have.css', 'display', 'none'); + cy.get('shepherd-modal-overlay-container').should('have.css', 'display', 'none'); cy.get('body').should('not.have.class', 'shepherd-modal-is-visible'); }); }); diff --git a/test/unit/components/shepherd-modal.spec.js b/test/unit/components/shepherd-modal.spec.js index 0b5e66c8d..d7c6898b4 100644 --- a/test/unit/components/shepherd-modal.spec.js +++ b/test/unit/components/shepherd-modal.spec.js @@ -22,18 +22,18 @@ describe('components/ShepherdModal', () => { modalComponent.rerender(); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('height')).to.equal(250); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('x')).to.equal(20); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('y')).to.equal(20); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('width')).to.equal(500); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('height')).to.equal(250); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('x')).to.equal(20); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('y')).to.equal(20); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('width')).to.equal(500); modalComponent.component().closeModalOpening(); modalComponent.rerender(); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('height')).to.equal(0); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('x')).to.equal(0); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('y')).to.equal(0); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('width')).to.equal(0); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('height')).to.equal(0); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('x')).to.equal(0); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('y')).to.equal(0); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('width')).to.equal(0); }); }); @@ -41,10 +41,10 @@ describe('components/ShepherdModal', () => { it('sets the correct attributes when positioning modal opening', () => { const modalComponent = shallow(); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('height')).to.equal(0); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('x')).to.equal(0); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('y')).to.equal(0); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('width')).to.equal(0); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('height')).to.equal(0); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('x')).to.equal(0); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('y')).to.equal(0); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('width')).to.equal(0); modalComponent.component().positionModalOpening({ getBoundingClientRect() { @@ -59,19 +59,19 @@ describe('components/ShepherdModal', () => { modalComponent.rerender(); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('height')).to.equal(250); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('x')).to.equal(20); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('y')).to.equal(20); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('width')).to.equal(500); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('height')).to.equal(250); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('x')).to.equal(20); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('y')).to.equal(20); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('width')).to.equal(500); }); it('sets the correct attributes with padding', () => { const modalComponent = shallow(); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('height')).to.equal(0); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('x')).to.equal(0); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('y')).to.equal(0); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('width')).to.equal(0); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('height')).to.equal(0); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('x')).to.equal(0); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('y')).to.equal(0); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('width')).to.equal(0); modalComponent.component().positionModalOpening({ getBoundingClientRect() { @@ -86,10 +86,10 @@ describe('components/ShepherdModal', () => { modalComponent.rerender(); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('height')).to.equal(270); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('x')).to.equal(10); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('y')).to.equal(10); - expect(modalComponent.find('#shepherdModalMaskOpening').attr('width')).to.equal(520); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('height')).to.equal(270); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('x')).to.equal(10); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('y')).to.equal(10); + expect(modalComponent.find('.shepherd-modal-mask-opening').attr('width')).to.equal(520); }); });