Skip to content
Snippets Groups Projects
Unverified Commit 20b514c0 authored by Dalton's avatar Dalton Committed by GitHub
Browse files

add renderItemWrapper fn to AccordionList (#19279)

parent 796cced9
No related merge requests found
import React from "react";
import styled from "styled-components";
import AccordionList from "metabase/components/AccordionList";
import TippyPopover from "metabase/components/Popover/TippyPopover";
export const component = AccordionList;
export const category = "pickers";
......@@ -8,6 +11,9 @@ export const description = `
An expandable and searchable list of sections and items.
`;
const PopoverContent = styled.div`
padding: 1em;
`;
const sections = [
{
name: "Widgets",
......@@ -51,4 +57,20 @@ export const examples = {
hideSingleSectionTitle
/>
),
"List Item Popover": (
<AccordionList
className="text-brand full"
sections={sections}
itemIsSelected={item => item.name === "Foo"}
renderItemWrapper={(itemContent, item) => (
<TippyPopover
placement="left-start"
interactive
content={<PopoverContent>{item.name}</PopoverContent>}
>
{itemContent}
</TippyPopover>
)}
/>
),
};
......@@ -73,6 +73,7 @@ export default class AccordionList extends Component {
renderItemDescription: PropTypes.func,
renderItemIcon: PropTypes.func,
renderItemExtra: PropTypes.func,
renderItemWrapper: PropTypes.func,
getItemClassName: PropTypes.func,
alwaysTogglable: PropTypes.bool,
......@@ -474,6 +475,7 @@ const AccordionListCell = ({
renderItemDescription,
renderItemIcon,
renderItemExtra,
renderItemWrapper,
searchText,
onChangeSearchText,
searchPlaceholder,
......@@ -601,6 +603,10 @@ const AccordionListCell = ({
)}
</div>
);
if (renderItemWrapper) {
content = renderItemWrapper(content, item);
}
}
return (
......
import React from "react";
import { render, screen, fireEvent } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import AccordionList from "metabase/components/AccordionList";
import TippyPopover from "metabase/components/Popover/TippyPopover";
const SECTIONS = [
{
......@@ -80,6 +82,28 @@ describe("AccordionList", () => {
fireEvent.change(SEARCH_FIELD, { target: { value: "Something Else" } });
assertAbsence(["Foo", "Bar", "Baz"]);
});
describe("with the `renderItemWrapper` prop", () => {
it("should be able to wrap the list items in components like popovers", async () => {
const renderItemWrapper = (itemContent, item) => {
return (
<TippyPopover content={<div>popover</div>}>
{itemContent}
</TippyPopover>
);
};
render(
<AccordionList
sections={SECTIONS}
renderItemWrapper={renderItemWrapper}
/>,
);
userEvent.hover(screen.getByText("Foo"));
expect(await screen.findByText("popover")).toBeVisible();
});
});
});
function assertAbsence(array) {
......
export { default } from "./AccordionList";
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment