signoz/frontend/src/container/QueryTable/contextConfig.tsx

152 lines
3.8 KiB
TypeScript
Raw Normal View History

2025-07-08 15:31:13 +05:30
import { QUERY_BUILDER_OPERATORS_BY_TYPES } from 'constants/queryBuilder';
import BreakoutOptions from 'container/QueryTable/BreakoutOptions';
import { getBaseMeta } from 'container/QueryTable/drilldownUtils';
2025-07-09 02:43:35 +05:30
import ContextMenu, { ClickedData } from 'periscope/components/ContextMenu';
2025-06-27 02:07:23 +05:30
import { ReactNode } from 'react';
2025-07-02 16:02:13 +05:30
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
2025-07-08 15:31:13 +05:30
import { IBuilderQuery, Query } from 'types/api/queryBuilder/queryBuilderData';
2025-07-09 02:43:35 +05:30
import { getAggregateColumnHeader } from './drilldownUtils';
2025-07-08 15:31:13 +05:30
import { AGGREGATE_OPTIONS, SUPPORTED_OPERATORS } from './menuOptions';
import { getBreakoutQuery, getQueryData } from './tableDrilldownUtils';
import { AggregateData } from './useAggregateDrilldown';
2025-06-27 02:07:23 +05:30
export type ContextMenuItem = ReactNode;
2025-07-03 14:29:43 +05:30
export enum ConfigType {
GROUP = 'group',
AGGREGATE = 'aggregate',
}
2025-07-08 15:31:13 +05:30
export interface ContextMenuConfigParams {
2025-07-03 14:29:43 +05:30
configType: ConfigType;
query: Query;
2025-07-09 02:43:35 +05:30
clickedData: ClickedData;
2025-07-03 18:51:36 +05:30
panelType?: string;
2025-07-08 15:31:13 +05:30
onColumnClick: (key: string, query?: Query) => void;
subMenu?: string;
2025-07-03 14:29:43 +05:30
}
2025-07-08 15:31:13 +05:30
export interface GroupContextMenuConfig {
2025-07-03 14:29:43 +05:30
header?: string;
items?: ContextMenuItem;
}
2025-07-08 15:31:13 +05:30
export interface AggregateContextMenuConfig {
2025-07-09 02:43:35 +05:30
header?: string | ReactNode;
2025-07-03 18:51:36 +05:30
items?: ContextMenuItem;
}
2025-07-08 15:31:13 +05:30
export interface BreakoutOptionsProps {
queryData: IBuilderQuery;
onColumnClick: (groupBy: BaseAutocompleteData) => void;
}
export function getGroupContextMenuConfig({
2025-07-03 14:29:43 +05:30
query,
clickedData,
panelType,
onColumnClick,
}: Omit<ContextMenuConfigParams, 'configType'>): GroupContextMenuConfig {
2025-07-03 18:51:36 +05:30
const filterKey = clickedData?.column?.dataIndex;
2025-07-02 16:02:13 +05:30
const header = `Filter by ${filterKey}`;
2025-07-09 02:43:35 +05:30
const filterDataType =
getBaseMeta(query, filterKey as string)?.dataType || 'string';
2025-07-02 16:02:13 +05:30
const operators =
QUERY_BUILDER_OPERATORS_BY_TYPES[
filterDataType as keyof typeof QUERY_BUILDER_OPERATORS_BY_TYPES
];
const filterOperators = operators.filter(
(operator) => SUPPORTED_OPERATORS[operator],
);
2025-06-27 02:07:23 +05:30
if (
panelType === 'table' &&
clickedData?.column &&
!(clickedData.column as any).queryName
) {
return {
2025-07-02 16:02:13 +05:30
header,
items: filterOperators.map((operator) => (
<ContextMenu.Item
2025-07-02 16:02:13 +05:30
key={operator}
icon={SUPPORTED_OPERATORS[operator].icon}
2025-07-02 16:02:13 +05:30
onClick={(): void => onColumnClick(SUPPORTED_OPERATORS[operator].value)}
>
{SUPPORTED_OPERATORS[operator].label}
</ContextMenu.Item>
2025-07-02 16:02:13 +05:30
)),
2025-06-27 02:07:23 +05:30
};
}
2025-07-03 14:29:43 +05:30
return {};
}
export function getAggregateContextMenuConfig({
2025-07-08 15:31:13 +05:30
subMenu,
query,
2025-07-03 18:51:36 +05:30
onColumnClick,
aggregateData,
}: {
subMenu?: string;
query: Query;
onColumnClick: (key: string, query?: Query) => void;
aggregateData: AggregateData | null;
}): AggregateContextMenuConfig {
console.log('getAggregateContextMenuConfig', { query, aggregateData });
2025-07-08 15:31:13 +05:30
if (subMenu === 'breakout') {
const queryData = getQueryData(query, aggregateData);
2025-07-08 15:31:13 +05:30
return {
header: 'Breakout by',
items: (
<BreakoutOptions
queryData={queryData}
onColumnClick={(groupBy: BaseAutocompleteData): void => {
// Use aggregateData.filters
const filtersToAdd = aggregateData?.filters || [];
2025-07-08 15:31:13 +05:30
const breakoutQuery = getBreakoutQuery(
query,
aggregateData,
2025-07-08 15:31:13 +05:30
groupBy,
filtersToAdd,
);
onColumnClick('breakout', breakoutQuery);
}}
/>
),
};
}
2025-07-03 18:51:36 +05:30
// Use aggregateData.queryName
const queryName = aggregateData?.queryName;
2025-07-09 02:43:35 +05:30
const { dataSource, aggregations } = getAggregateColumnHeader(
query,
queryName as string,
2025-07-09 02:43:35 +05:30
);
console.log('dataSource', dataSource);
console.log('aggregations', aggregations);
2025-07-03 18:51:36 +05:30
return {
2025-07-09 02:43:35 +05:30
header: (
<div>
<div style={{ textTransform: 'capitalize' }}>{dataSource}</div>
<div>{aggregations}</div>
</div>
),
2025-07-08 15:31:13 +05:30
items: AGGREGATE_OPTIONS.map(({ key, label, icon }) => (
2025-07-03 18:51:36 +05:30
<ContextMenu.Item
key={key}
icon={icon}
onClick={(): void => onColumnClick(key)}
>
{label}
</ContextMenu.Item>
)),
};
}