|
@@ -6,7 +6,6 @@ import {ComboBox} from 'sentry/components/comboBox';
|
|
|
import type {ComboBoxOption} from 'sentry/components/comboBox/types';
|
|
|
import type {SelectOption} from 'sentry/components/compactSelect';
|
|
|
import {CompactSelect} from 'sentry/components/compactSelect';
|
|
|
-import {Tag} from 'sentry/components/tag';
|
|
|
import {IconLightning, IconReleases} from 'sentry/icons';
|
|
|
import {t} from 'sentry/locale';
|
|
|
import {space} from 'sentry/styles/space';
|
|
@@ -32,6 +31,8 @@ import {middleEllipsis} from 'sentry/utils/middleEllipsis';
|
|
|
import useKeyPress from 'sentry/utils/useKeyPress';
|
|
|
import useOrganization from 'sentry/utils/useOrganization';
|
|
|
import usePageFilters from 'sentry/utils/usePageFilters';
|
|
|
+import useProjects from 'sentry/utils/useProjects';
|
|
|
+import {MetricListItemDetails} from 'sentry/views/metrics/metricListItemDetails';
|
|
|
import {MetricSearchBar} from 'sentry/views/metrics/metricSearchBar';
|
|
|
|
|
|
type QueryBuilderProps = {
|
|
@@ -71,12 +72,14 @@ function useMriMode() {
|
|
|
|
|
|
export const QueryBuilder = memo(function QueryBuilder({
|
|
|
metricsQuery,
|
|
|
- projects,
|
|
|
+ projects: projectIds,
|
|
|
onChange,
|
|
|
}: QueryBuilderProps) {
|
|
|
const organization = useOrganization();
|
|
|
const pageFilters = usePageFilters();
|
|
|
const breakpoints = useBreakpoints();
|
|
|
+ const {projects} = useProjects();
|
|
|
+
|
|
|
const {data: meta, isLoading: isMetaLoading} = useMetricsMeta(pageFilters.selection);
|
|
|
const mriMode = useMriMode();
|
|
|
|
|
@@ -85,10 +88,22 @@ export const QueryBuilder = memo(function QueryBuilder({
|
|
|
const {data: tagsData = [], isLoading: tagsIsLoading} = useMetricsTags(
|
|
|
metricsQuery.mri,
|
|
|
{
|
|
|
- projects,
|
|
|
+ projects: projectIds,
|
|
|
}
|
|
|
);
|
|
|
|
|
|
+ const selectedProjects = useMemo(
|
|
|
+ () =>
|
|
|
+ projects.filter(project =>
|
|
|
+ projectIds[0] === -1
|
|
|
+ ? true
|
|
|
+ : projectIds.length === 0
|
|
|
+ ? project.isMember
|
|
|
+ : projectIds.includes(parseInt(project.id, 10))
|
|
|
+ ),
|
|
|
+ [projectIds, projects]
|
|
|
+ );
|
|
|
+
|
|
|
const tags = useMemo(() => {
|
|
|
return uniqBy(tagsData, 'key');
|
|
|
}, [tagsData]);
|
|
@@ -108,7 +123,9 @@ export const QueryBuilder = memo(function QueryBuilder({
|
|
|
type: parsedMri.type,
|
|
|
unit: parsedMri.unit,
|
|
|
operations: [],
|
|
|
- },
|
|
|
+ projectIds: [],
|
|
|
+ blockingStatus: [],
|
|
|
+ } satisfies MetricMeta,
|
|
|
...result,
|
|
|
];
|
|
|
}
|
|
@@ -182,21 +199,26 @@ export const QueryBuilder = memo(function QueryBuilder({
|
|
|
const mriOptions = useMemo(
|
|
|
() =>
|
|
|
displayedMetrics.map<ComboBoxOption<MRI>>(metric => ({
|
|
|
- label: mriMode ? metric.mri : formatMRI(metric.mri),
|
|
|
+ label: mriMode
|
|
|
+ ? metric.mri
|
|
|
+ : middleEllipsis(formatMRI(metric.mri) ?? '', 55, /\.|-|_/),
|
|
|
// enable search by mri, name, unit (millisecond), type (c:), and readable type (counter)
|
|
|
textValue: `${metric.mri}${getReadableMetricType(metric.type)}`,
|
|
|
value: metric.mri,
|
|
|
- trailingItems: mriMode ? undefined : (
|
|
|
- <Fragment>
|
|
|
- <Tag tooltipText={t('Type')}>{getReadableMetricType(metric.type)}</Tag>
|
|
|
- <Tag tooltipText={t('Unit')}>{metric.unit}</Tag>
|
|
|
- </Fragment>
|
|
|
- ),
|
|
|
+ details:
|
|
|
+ metric.projectIds.length > 0 ? (
|
|
|
+ <MetricListItemDetails metric={metric} selectedProjects={selectedProjects} />
|
|
|
+ ) : null,
|
|
|
+ showDetailsInOverlay: true,
|
|
|
+ trailingItems:
|
|
|
+ mriMode || parseMRI(metric.mri)?.useCase !== 'custom' ? undefined : (
|
|
|
+ <CustomMetricInfoText>{t('Custom')}</CustomMetricInfoText>
|
|
|
+ ),
|
|
|
})),
|
|
|
- [displayedMetrics, mriMode]
|
|
|
+ [displayedMetrics, mriMode, selectedProjects]
|
|
|
);
|
|
|
|
|
|
- const projectIdStrings = useMemo(() => projects.map(String), [projects]);
|
|
|
+ const projectIdStrings = useMemo(() => projectIds.map(String), [projectIds]);
|
|
|
|
|
|
return (
|
|
|
<QueryBuilderWrapper>
|
|
@@ -207,10 +229,12 @@ export const QueryBuilder = memo(function QueryBuilder({
|
|
|
placeholder={t('Select a metric')}
|
|
|
sizeLimit={100}
|
|
|
size="md"
|
|
|
+ menuSize="sm"
|
|
|
isLoading={isMetaLoading}
|
|
|
options={mriOptions}
|
|
|
value={metricsQuery.mri}
|
|
|
onChange={handleMRIChange}
|
|
|
+ menuWidth="400px"
|
|
|
/>
|
|
|
) : (
|
|
|
<MetricSelect
|
|
@@ -225,7 +249,6 @@ export const QueryBuilder = memo(function QueryBuilder({
|
|
|
options={mriOptions}
|
|
|
value={metricsQuery.mri}
|
|
|
onChange={handleMRIChange}
|
|
|
- shouldUseVirtualFocus
|
|
|
/>
|
|
|
)}
|
|
|
<FlexBlock>
|
|
@@ -277,6 +300,10 @@ export const QueryBuilder = memo(function QueryBuilder({
|
|
|
);
|
|
|
});
|
|
|
|
|
|
+const CustomMetricInfoText = styled('span')`
|
|
|
+ color: ${p => p.theme.subText};
|
|
|
+`;
|
|
|
+
|
|
|
const QueryBuilderWrapper = styled('div')`
|
|
|
display: flex;
|
|
|
flex-grow: 1;
|
|
@@ -292,9 +319,7 @@ const FlexBlock = styled('div')`
|
|
|
|
|
|
const MetricComboBox = styled(ComboBox)`
|
|
|
min-width: 200px;
|
|
|
- & > button {
|
|
|
- width: 100%;
|
|
|
- }
|
|
|
+ max-width: min(500px, 100%);
|
|
|
`;
|
|
|
const MetricSelect = styled(CompactSelect)`
|
|
|
min-width: 200px;
|