|
|
|
@ -9,6 +9,7 @@ import { IconCodePlus, IconCopy, IconZoomCode } from "@tabler/icons-react"; |
|
|
|
|
import LabelsExplorer from "./LabelsExplorer"; |
|
|
|
|
import { useDebouncedValue } from "@mantine/hooks"; |
|
|
|
|
import classes from "./MetricsExplorer.module.css"; |
|
|
|
|
import CustomInfiniteScroll from "../../../components/CustomInfiniteScroll"; |
|
|
|
|
|
|
|
|
|
const fuz = new Fuzzy({ |
|
|
|
|
pre: '<b style="color: rgb(0, 102, 191)">', |
|
|
|
@ -83,95 +84,100 @@ const MetricsExplorer: FC<MetricsExplorerProps> = ({ |
|
|
|
|
} |
|
|
|
|
autoFocus |
|
|
|
|
/> |
|
|
|
|
<Table> |
|
|
|
|
<Table.Thead> |
|
|
|
|
<Table.Tr> |
|
|
|
|
<Table.Th>Metric</Table.Th> |
|
|
|
|
<Table.Th>Type</Table.Th> |
|
|
|
|
<Table.Th>Help</Table.Th> |
|
|
|
|
</Table.Tr> |
|
|
|
|
</Table.Thead> |
|
|
|
|
<Table.Tbody> |
|
|
|
|
{searchMatches.map((m) => ( |
|
|
|
|
<Table.Tr key={m.original}> |
|
|
|
|
<Table.Td> |
|
|
|
|
<Group justify="space-between"> |
|
|
|
|
{debouncedFilterText === "" ? ( |
|
|
|
|
m.original |
|
|
|
|
) : ( |
|
|
|
|
<div |
|
|
|
|
dangerouslySetInnerHTML={{ |
|
|
|
|
__html: sanitizeHTML(m.rendered, sanitizeOpts), |
|
|
|
|
}} |
|
|
|
|
/> |
|
|
|
|
)} |
|
|
|
|
<Group gap="xs"> |
|
|
|
|
<ActionIcon |
|
|
|
|
size="sm" |
|
|
|
|
color="gray" |
|
|
|
|
variant="light" |
|
|
|
|
title="Explore metric" |
|
|
|
|
onClick={() => { |
|
|
|
|
setSelectedMetric(m.original); |
|
|
|
|
}} |
|
|
|
|
> |
|
|
|
|
<IconZoomCode |
|
|
|
|
style={{ width: "70%", height: "70%" }} |
|
|
|
|
stroke={1.5} |
|
|
|
|
/> |
|
|
|
|
</ActionIcon> |
|
|
|
|
<ActionIcon |
|
|
|
|
size="sm" |
|
|
|
|
color="gray" |
|
|
|
|
variant="light" |
|
|
|
|
title="Insert at cursor and close explorer" |
|
|
|
|
onClick={() => { |
|
|
|
|
insertText(m.original); |
|
|
|
|
close(); |
|
|
|
|
}} |
|
|
|
|
> |
|
|
|
|
<IconCodePlus |
|
|
|
|
style={{ width: "70%", height: "70%" }} |
|
|
|
|
stroke={1.5} |
|
|
|
|
/> |
|
|
|
|
</ActionIcon> |
|
|
|
|
<ActionIcon |
|
|
|
|
size="sm" |
|
|
|
|
color="gray" |
|
|
|
|
variant="light" |
|
|
|
|
title="Copy to clipboard" |
|
|
|
|
onClick={() => { |
|
|
|
|
navigator.clipboard.writeText(m.original); |
|
|
|
|
}} |
|
|
|
|
> |
|
|
|
|
<IconCopy |
|
|
|
|
style={{ width: "70%", height: "70%" }} |
|
|
|
|
stroke={1.5} |
|
|
|
|
/> |
|
|
|
|
</ActionIcon> |
|
|
|
|
</Group> |
|
|
|
|
</Group> |
|
|
|
|
</Table.Td> |
|
|
|
|
<Table.Td px="lg"> |
|
|
|
|
{getMeta(m.original).map((meta, idx) => ( |
|
|
|
|
<React.Fragment key={idx}> |
|
|
|
|
<span className={classes.typeLabel}>{meta.type}</span> |
|
|
|
|
<br /> |
|
|
|
|
</React.Fragment> |
|
|
|
|
))} |
|
|
|
|
</Table.Td> |
|
|
|
|
<Table.Td> |
|
|
|
|
{getMeta(m.original).map((meta, idx) => ( |
|
|
|
|
<React.Fragment key={idx}> |
|
|
|
|
<span className={classes.helpLabel}>{meta.help}</span> |
|
|
|
|
<br /> |
|
|
|
|
</React.Fragment> |
|
|
|
|
))} |
|
|
|
|
</Table.Td> |
|
|
|
|
</Table.Tr> |
|
|
|
|
))} |
|
|
|
|
</Table.Tbody> |
|
|
|
|
</Table> |
|
|
|
|
<CustomInfiniteScroll |
|
|
|
|
allItems={searchMatches} |
|
|
|
|
child={({ items }) => ( |
|
|
|
|
<Table> |
|
|
|
|
<Table.Thead> |
|
|
|
|
<Table.Tr> |
|
|
|
|
<Table.Th>Metric</Table.Th> |
|
|
|
|
<Table.Th>Type</Table.Th> |
|
|
|
|
<Table.Th>Help</Table.Th> |
|
|
|
|
</Table.Tr> |
|
|
|
|
</Table.Thead> |
|
|
|
|
<Table.Tbody> |
|
|
|
|
{items.map((m) => ( |
|
|
|
|
<Table.Tr key={m.original}> |
|
|
|
|
<Table.Td> |
|
|
|
|
<Group justify="space-between"> |
|
|
|
|
{debouncedFilterText === "" ? ( |
|
|
|
|
m.original |
|
|
|
|
) : ( |
|
|
|
|
<div |
|
|
|
|
dangerouslySetInnerHTML={{ |
|
|
|
|
__html: sanitizeHTML(m.rendered, sanitizeOpts), |
|
|
|
|
}} |
|
|
|
|
/> |
|
|
|
|
)} |
|
|
|
|
<Group gap="xs"> |
|
|
|
|
<ActionIcon |
|
|
|
|
size="sm" |
|
|
|
|
color="gray" |
|
|
|
|
variant="light" |
|
|
|
|
title="Explore metric" |
|
|
|
|
onClick={() => { |
|
|
|
|
setSelectedMetric(m.original); |
|
|
|
|
}} |
|
|
|
|
> |
|
|
|
|
<IconZoomCode |
|
|
|
|
style={{ width: "70%", height: "70%" }} |
|
|
|
|
stroke={1.5} |
|
|
|
|
/> |
|
|
|
|
</ActionIcon> |
|
|
|
|
<ActionIcon |
|
|
|
|
size="sm" |
|
|
|
|
color="gray" |
|
|
|
|
variant="light" |
|
|
|
|
title="Insert at cursor and close explorer" |
|
|
|
|
onClick={() => { |
|
|
|
|
insertText(m.original); |
|
|
|
|
close(); |
|
|
|
|
}} |
|
|
|
|
> |
|
|
|
|
<IconCodePlus |
|
|
|
|
style={{ width: "70%", height: "70%" }} |
|
|
|
|
stroke={1.5} |
|
|
|
|
/> |
|
|
|
|
</ActionIcon> |
|
|
|
|
<ActionIcon |
|
|
|
|
size="sm" |
|
|
|
|
color="gray" |
|
|
|
|
variant="light" |
|
|
|
|
title="Copy to clipboard" |
|
|
|
|
onClick={() => { |
|
|
|
|
navigator.clipboard.writeText(m.original); |
|
|
|
|
}} |
|
|
|
|
> |
|
|
|
|
<IconCopy |
|
|
|
|
style={{ width: "70%", height: "70%" }} |
|
|
|
|
stroke={1.5} |
|
|
|
|
/> |
|
|
|
|
</ActionIcon> |
|
|
|
|
</Group> |
|
|
|
|
</Group> |
|
|
|
|
</Table.Td> |
|
|
|
|
<Table.Td px="lg"> |
|
|
|
|
{getMeta(m.original).map((meta, idx) => ( |
|
|
|
|
<React.Fragment key={idx}> |
|
|
|
|
<span className={classes.typeLabel}>{meta.type}</span> |
|
|
|
|
<br /> |
|
|
|
|
</React.Fragment> |
|
|
|
|
))} |
|
|
|
|
</Table.Td> |
|
|
|
|
<Table.Td> |
|
|
|
|
{getMeta(m.original).map((meta, idx) => ( |
|
|
|
|
<React.Fragment key={idx}> |
|
|
|
|
<span className={classes.helpLabel}>{meta.help}</span> |
|
|
|
|
<br /> |
|
|
|
|
</React.Fragment> |
|
|
|
|
))} |
|
|
|
|
</Table.Td> |
|
|
|
|
</Table.Tr> |
|
|
|
|
))} |
|
|
|
|
</Table.Tbody> |
|
|
|
|
</Table> |
|
|
|
|
)} |
|
|
|
|
/> |
|
|
|
|
</Stack> |
|
|
|
|
); |
|
|
|
|
}; |
|
|
|
|