diff --git a/.changeset/enhance-data-source-select.md b/.changeset/enhance-data-source-select.md new file mode 100644 index 00000000..0d8d25b7 --- /dev/null +++ b/.changeset/enhance-data-source-select.md @@ -0,0 +1,5 @@ +--- +"@hyperdx/app": patch +--- + +feat: Enhance data source select with context-aware icons and inline actions diff --git a/packages/app/package.json b/packages/app/package.json index 18ae7c83..a768126d 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -42,7 +42,7 @@ "@mantine/notifications": "^7.17.8", "@mantine/spotlight": "^7.17.8", "@microsoft/fetch-event-source": "^2.0.1", - "@tabler/icons-react": "^3.5.0", + "@tabler/icons-react": "^3.39.0", "@tanstack/react-query": "^5.56.2", "@tanstack/react-query-devtools": "^5.56.2", "@tanstack/react-table": "^8.7.9", diff --git a/packages/app/src/DBSearchPage.tsx b/packages/app/src/DBSearchPage.tsx index cfa5079a..454a9bde 100644 --- a/packages/app/src/DBSearchPage.tsx +++ b/packages/app/src/DBSearchPage.tsx @@ -11,7 +11,6 @@ import { } from 'react'; import dynamic from 'next/dynamic'; import Head from 'next/head'; -import Link from 'next/link'; import router from 'next/router'; import { parseAsBoolean, @@ -51,7 +50,6 @@ import { Flex, Grid, Group, - Menu, Modal, Paper, Select, @@ -67,10 +65,8 @@ import { import { notifications } from '@mantine/notifications'; import { IconBolt, - IconCirclePlus, IconPlayerPlay, IconPlus, - IconSettings, IconTags, IconX, } from '@tabler/icons-react'; @@ -191,59 +187,6 @@ export function getDefaultSourceId( return sources[0].id; } -function SourceEditMenu({ - setModalOpen, - setModelFormExpanded, -}: { - setModalOpen: (val: SetStateAction) => void; - setModelFormExpanded: (val: SetStateAction) => void; -}) { - return ( - - - - - - - - - - Sources - } - onClick={() => setModalOpen(true)} - > - Create New Source - - {IS_LOCAL_MODE ? ( - } - onClick={() => setModelFormExpanded(v => !v)} - > - Edit Source - - ) : ( - } - component={Link} - href="/team" - > - Edit Sources - - )} - - - ); -} - function SourceEditModal({ opened, onClose, @@ -1568,6 +1511,14 @@ function DBSearchPage() { setModelFormExpanded(false); }, [setModelFormExpanded]); + const onEditSources = useCallback(() => { + if (IS_LOCAL_MODE) { + setModelFormExpanded(v => !v); + } else { + router.push('/team'); + } + }, [setModelFormExpanded]); + const setNewSourceModalClosed = useCallback( () => setNewSourceModalOpened(false), [setNewSourceModalOpened], @@ -1609,22 +1560,18 @@ function DBSearchPage() { > {/* */} - - - - + & { onCreate?: () => void; + onEdit?: () => void; allowDeselect?: boolean; }; @@ -19,35 +25,47 @@ export default function SelectControlled(props: SelectControlledProps) { }, fieldState, } = useController(props); - const { onCreate, allowDeselect = true, ...restProps } = props; + const { onCreate, onEdit, allowDeselect = true, ...restProps } = props; - // This is needed as mantine does not clear the select - // if the value is not in the data after - // if it was previously in the data (ex. data was deleted) - const selected = props.data?.find(d => - typeof d === 'string' - ? d === fieldValue - : 'value' in d - ? d.value === fieldValue - : true, - ); + // Mantine does not clear the select if the value is removed from data + // after it was previously present (ex. data was deleted) + const selected = props.data?.some(d => { + if (typeof d === 'string') return d === fieldValue; + if ('value' in d) return d.value === fieldValue; + if ('items' in d) { + return d.items.some(item => + typeof item === 'string' + ? item === fieldValue + : item.value === fieldValue, + ); + } + return false; + }); const onChange = useCallback( (value: string | null) => { - if (value === '_create_new_value' && onCreate != null) { + if ( + value === SelectControlledSpecialValues.CreateNewValue && + onCreate != null + ) { onCreate(); + } else if ( + value === SelectControlledSpecialValues.EditValue && + onEdit != null + ) { + onEdit(); } else if (value !== null || allowDeselect) { fieldOnChange(value); } }, - [fieldOnChange, onCreate, allowDeselect], + [fieldOnChange, onCreate, onEdit, allowDeselect], ); return (