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 branches found
No related tags found
No related merge requests found
import React from "react"; import React from "react";
import styled from "styled-components";
import AccordionList from "metabase/components/AccordionList"; import AccordionList from "metabase/components/AccordionList";
import TippyPopover from "metabase/components/Popover/TippyPopover";
export const component = AccordionList; export const component = AccordionList;
export const category = "pickers"; export const category = "pickers";
...@@ -8,6 +11,9 @@ export const description = ` ...@@ -8,6 +11,9 @@ export const description = `
An expandable and searchable list of sections and items. An expandable and searchable list of sections and items.
`; `;
const PopoverContent = styled.div`
padding: 1em;
`;
const sections = [ const sections = [
{ {
name: "Widgets", name: "Widgets",
...@@ -51,4 +57,20 @@ export const examples = { ...@@ -51,4 +57,20 @@ export const examples = {
hideSingleSectionTitle 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 { ...@@ -73,6 +73,7 @@ export default class AccordionList extends Component {
renderItemDescription: PropTypes.func, renderItemDescription: PropTypes.func,
renderItemIcon: PropTypes.func, renderItemIcon: PropTypes.func,
renderItemExtra: PropTypes.func, renderItemExtra: PropTypes.func,
renderItemWrapper: PropTypes.func,
getItemClassName: PropTypes.func, getItemClassName: PropTypes.func,
alwaysTogglable: PropTypes.bool, alwaysTogglable: PropTypes.bool,
...@@ -474,6 +475,7 @@ const AccordionListCell = ({ ...@@ -474,6 +475,7 @@ const AccordionListCell = ({
renderItemDescription, renderItemDescription,
renderItemIcon, renderItemIcon,
renderItemExtra, renderItemExtra,
renderItemWrapper,
searchText, searchText,
onChangeSearchText, onChangeSearchText,
searchPlaceholder, searchPlaceholder,
...@@ -601,6 +603,10 @@ const AccordionListCell = ({ ...@@ -601,6 +603,10 @@ const AccordionListCell = ({
)} )}
</div> </div>
); );
if (renderItemWrapper) {
content = renderItemWrapper(content, item);
}
} }
return ( return (
......
import React from "react"; import React from "react";
import { render, screen, fireEvent } from "@testing-library/react"; import { render, screen, fireEvent } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import AccordionList from "metabase/components/AccordionList"; import AccordionList from "metabase/components/AccordionList";
import TippyPopover from "metabase/components/Popover/TippyPopover";
const SECTIONS = [ const SECTIONS = [
{ {
...@@ -80,6 +82,28 @@ describe("AccordionList", () => { ...@@ -80,6 +82,28 @@ describe("AccordionList", () => {
fireEvent.change(SEARCH_FIELD, { target: { value: "Something Else" } }); fireEvent.change(SEARCH_FIELD, { target: { value: "Something Else" } });
assertAbsence(["Foo", "Bar", "Baz"]); 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) { 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