From: Revanshu Paliwal Date: Wed, 12 Apr 2023 15:01:22 +0000 (+0200) Subject: SONAR-19021 Accordion component for overview qg section X-Git-Tag: 10.1.0.73491~445 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=d019ecce3e7c88272a4ac00152261e62a71e15f0;p=sonarqube.git SONAR-19021 Accordion component for overview qg section --- diff --git a/server/sonar-web/design-system/src/components/Accordion.tsx b/server/sonar-web/design-system/src/components/Accordion.tsx new file mode 100644 index 00000000000..d1af31d9096 --- /dev/null +++ b/server/sonar-web/design-system/src/components/Accordion.tsx @@ -0,0 +1,65 @@ +/* + * SonarQube + * Copyright (C) 2009-2023 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +import classNames from 'classnames'; +import { uniqueId } from 'lodash'; +import * as React from 'react'; +import { BareButton } from './buttons'; +import { OpenCloseIndicator } from './icons/OpenCloseIndicator'; + +interface AccordionProps { + children: React.ReactNode; + className?: string; + data?: string; + header: React.ReactNode; + onClick: (data?: string) => void; + open: boolean; +} + +export function Accordion(props: AccordionProps) { + const { className, open, header, data, onClick } = props; + + const id = React.useMemo(() => uniqueId('accordion-'), []); + const handleClick = React.useCallback(() => { + onClick(data); + }, [onClick, data]); + + return ( +
+ + {header} + + +
+ {open &&
{props.children}
} +
+
+ ); +} diff --git a/server/sonar-web/design-system/src/components/__tests__/Accordion-test.tsx b/server/sonar-web/design-system/src/components/__tests__/Accordion-test.tsx new file mode 100644 index 00000000000..323175c072c --- /dev/null +++ b/server/sonar-web/design-system/src/components/__tests__/Accordion-test.tsx @@ -0,0 +1,53 @@ +/* + * SonarQube + * Copyright (C) 2009-2023 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +import { screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import * as React from 'react'; +import { render } from '../../helpers/testUtils'; +import { Accordion } from '../Accordion'; + +it('should behave correctly', async () => { + const user = userEvent.setup(); + const children = 'hello'; + renderAccordion(children); + expect(screen.queryByText(children)).not.toBeInTheDocument(); + await user.click(screen.getByRole('button', { expanded: false })); + expect(screen.getByText(children)).toBeInTheDocument(); +}); + +function renderAccordion(children: React.ReactNode) { + function AccordionTest() { + const [open, setOpen] = React.useState(false); + + return ( + { + setOpen(!open); + }} + open={open} + > +
{children}
+
+ ); + } + + return render(); +} diff --git a/server/sonar-web/design-system/src/components/icons/OpenCloseIndicator.tsx b/server/sonar-web/design-system/src/components/icons/OpenCloseIndicator.tsx new file mode 100644 index 00000000000..4f4a5f4fe73 --- /dev/null +++ b/server/sonar-web/design-system/src/components/icons/OpenCloseIndicator.tsx @@ -0,0 +1,31 @@ +/* + * SonarQube + * Copyright (C) 2009-2023 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import { ChevronDownIcon } from './ChevronDownIcon'; +import { ChevronRightIcon } from './ChevronRightIcon'; +import { IconProps } from './Icon'; + +interface Props extends IconProps { + open: boolean; +} + +export function OpenCloseIndicator({ open, ...iconProps }: Props) { + return open ? : ; +} diff --git a/server/sonar-web/design-system/src/components/icons/index.ts b/server/sonar-web/design-system/src/components/icons/index.ts index 846f8271ac7..fd76e9c1719 100644 --- a/server/sonar-web/design-system/src/components/icons/index.ts +++ b/server/sonar-web/design-system/src/components/icons/index.ts @@ -34,6 +34,7 @@ export { HomeIcon } from './HomeIcon'; export { MainBranchIcon } from './MainBranchIcon'; export { MenuHelpIcon } from './MenuHelpIcon'; export { MenuSearchIcon } from './MenuSearchIcon'; +export { OpenCloseIndicator } from './OpenCloseIndicator'; export { OpenNewTabIcon } from './OpenNewTabIcon'; export { OverviewQGNotComputedIcon } from './OverviewQGNotComputedIcon'; export { OverviewQGPassedIcon } from './OverviewQGPassedIcon'; diff --git a/server/sonar-web/design-system/src/components/index.ts b/server/sonar-web/design-system/src/components/index.ts index b75799cde77..1a9eb75d615 100644 --- a/server/sonar-web/design-system/src/components/index.ts +++ b/server/sonar-web/design-system/src/components/index.ts @@ -18,6 +18,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +export * from './Accordion'; export * from './Avatar'; export { default as Badge } from './Badge'; export { default as DeferredSpinner } from './DeferredSpinner';