|
1 | | -import React, { ReactElement } from "react"; |
2 | | -import { Avatar, Badge, Card, CardContent, CardHeader, Chip, Divider, Grid, IconButton, Link, ListItem, ListItemAvatar, ListItemText, Skeleton, Stack, Tooltip, Typography, useTheme } from "@mui/material"; |
| 1 | +import React, { ReactElement, useState } from "react"; |
| 2 | +import { Accordion, AccordionDetails, AccordionSummary, Avatar, Badge, Box, Card, CardContent, CardHeader, Chip, Divider, Grid, IconButton, Link, ListItem, ListItemAvatar, ListItemText, Skeleton, Stack, Tooltip, Typography, useTheme } from "@mui/material"; |
3 | 3 | import { ld_to_str } from "../query/jsonld_helpers"; |
4 | 4 | import { labelize } from "../query/labels"; |
5 | 5 | import { colorize } from "./theme"; |
6 | | -import { Link as LinkIcon } from "@mui/icons-material"; |
| 6 | +import { ExpandMore, Link as LinkIcon } from "@mui/icons-material"; |
7 | 7 | import { useAppSelector } from "../store"; |
8 | 8 | import { sort_sources_keys } from "./details_sources"; |
9 | 9 |
|
@@ -74,28 +74,43 @@ type DetailsCardProps = { |
74 | 74 | children?: React.ReactElement | React.ReactElement[]; |
75 | 75 | loading?: boolean |
76 | 76 | infodialog?: React.ReactElement; |
| 77 | + defaultExpanded?: boolean |
77 | 78 | } |
78 | | -export const DetailsCard = ({title, children, loading, infodialog}: DetailsCardProps) => { |
| 79 | +export const DetailsCard = ({title, children, loading, infodialog, defaultExpanded}: DetailsCardProps) => { |
| 80 | + const [state, setState] = useState(defaultExpanded == null ? true : defaultExpanded) |
| 81 | + const toggle = () => setState(!state) |
79 | 82 | const sources_disabled = useAppSelector(s => s.details.sources_disabled) |
80 | 83 | const loading_component = [<DetailsListItemSkeleton key="0" />] |
81 | 84 | const hidden_component = [<DetailsListItem key="0" primary="Hidden" secondary="Expand source filter" disabled />] |
82 | 85 | const missing_component = [<DetailsListItem key="0" primary="No data" disabled />] |
83 | 86 | return ( |
84 | 87 | <Card> |
85 | | - <CardHeader title={title} action={infodialog} titleTypographyProps={{variant: 'h6'}} /> |
86 | | - <Divider /> |
87 | | - <CardContent> |
88 | | - <Stack direction="column" spacing={1}> |
89 | | - <DetailsSwitch |
90 | | - items={children} |
91 | | - filter={filter_children_src(sources_disabled)} |
92 | | - loading={loading} |
93 | | - loading_component={loading_component} |
94 | | - missing_component={missing_component} |
95 | | - hidden_component={hidden_component} |
96 | | - /> |
97 | | - </Stack> |
98 | | - </CardContent> |
| 88 | + <Accordion expanded={state} disableGutters> |
| 89 | + <CardContent sx={{p: 0}}> |
| 90 | + <AccordionSummary expandIcon={<ExpandMore onClick={toggle} />}> |
| 91 | + <Box sx={{ width: "100%", display: "flex", alignItems: "center" }}> |
| 92 | + <Typography variant="h6" onClick={toggle} >{title}</Typography> |
| 93 | + {infodialog} |
| 94 | + <Box sx={{ flex: 1 }} onClick={toggle} > </Box> |
| 95 | + </Box> |
| 96 | + </AccordionSummary> |
| 97 | + </CardContent> |
| 98 | + <Divider /> |
| 99 | + <CardContent> |
| 100 | + <AccordionDetails sx={{m: 0, p: 0}}> |
| 101 | + <Stack direction="column" spacing={1}> |
| 102 | + <DetailsSwitch |
| 103 | + items={children} |
| 104 | + filter={filter_children_src(sources_disabled)} |
| 105 | + loading={loading} |
| 106 | + loading_component={loading_component} |
| 107 | + missing_component={missing_component} |
| 108 | + hidden_component={hidden_component} |
| 109 | + /> |
| 110 | + </Stack> |
| 111 | + </AccordionDetails> |
| 112 | + </CardContent> |
| 113 | + </Accordion> |
99 | 114 | </Card> |
100 | 115 | )} |
101 | 116 |
|
|
0 commit comments