From 34ff307da7781512067615beb2a5ba33de85718d Mon Sep 17 00:00:00 2001 From: Gavin Jefferies Date: Sun, 22 Mar 2020 21:59:53 -0700 Subject: [PATCH] issue #134: use an UncontrolledPopover to fix popovers for Safari --- src/components/Form/FormHelpButton.test.tsx | 48 +++++++++++++++------ src/components/Form/FormHelpButton.tsx | 17 +++----- 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/src/components/Form/FormHelpButton.test.tsx b/src/components/Form/FormHelpButton.test.tsx index 088cafb81..be79d4714 100644 --- a/src/components/Form/FormHelpButton.test.tsx +++ b/src/components/Form/FormHelpButton.test.tsx @@ -1,5 +1,5 @@ import React from 'react' -import { render, fireEvent } from '@testing-library/react' +import { render, fireEvent, waitForElementToBeRemoved } from '@testing-library/react' import FormHelpButton from './FormHelpButton' describe('FormHelpButton', () => { @@ -15,28 +15,52 @@ describe('FormHelpButton', () => { expect(queryByText('def')).toBeNull() }) - it('opens', () => { - const { getByLabelText, queryByText } = render() + it('opens', async () => { + const { getByLabelText, findByText, queryByText } = render() - fireEvent.focus(getByLabelText('help')) + fireEvent.click(getByLabelText('help')) + await findByText('def') expect(queryByText('def')).not.toBeNull() }) - it('displays help', () => { - const { getByLabelText, getByText } = render() + it('displays help', async () => { + const { getByLabelText, findByText, queryByText } = render( + , + ) - fireEvent.focus(getByLabelText('help')) + fireEvent.click(getByLabelText('help')) - expect(getByText('some help')).toBeTruthy() + await findByText('some help') + expect(queryByText('some help')).toBeTruthy() }) - it('closes', () => { - const { getByLabelText, queryByText } = render() + it('closes inside', async () => { + const { getByLabelText, findByText, queryByText } = render() + fireEvent.click(getByLabelText('help')) + await findByText('def') + expect(queryByText('def')).not.toBeNull() + + fireEvent.click(getByLabelText('help')) + + await waitForElementToBeRemoved(() => queryByText('def')) + expect(queryByText('def')).toBeNull() + }) + + it('closes outside', async () => { + const { getByLabelText, findByText, getByText, queryByText } = render( +
+ + click outside +
, + ) + fireEvent.click(getByLabelText('help')) + await findByText('def') + expect(queryByText('def')).not.toBeNull() - fireEvent.focus(getByLabelText('help')) - fireEvent.blur(getByLabelText('help')) + fireEvent.click(getByText('click outside')) + await waitForElementToBeRemoved(() => queryByText('def')) expect(queryByText('def')).toBeNull() }) }) diff --git a/src/components/Form/FormHelpButton.tsx b/src/components/Form/FormHelpButton.tsx index f2ced9e08..10307ee47 100644 --- a/src/components/Form/FormHelpButton.tsx +++ b/src/components/Form/FormHelpButton.tsx @@ -1,6 +1,6 @@ -import React, { useState } from 'react' +import React from 'react' -import { Button, Card, CardBody, CardHeader, Popover } from 'reactstrap' +import { Button, Card, CardBody, CardHeader, UncontrolledPopover } from 'reactstrap' import { FaQuestion } from 'react-icons/fa' @@ -17,33 +17,26 @@ export interface FormHelpButtonProps { } export default function FormHelpButton({ identifier, label, help }: FormHelpButtonProps) { - const [popoverOpen, setPopoverOpen] = useState(false) - return ( <> - + {label} {help} - + ) }