import styled from '@emotion/styled';
import Feature from 'sentry/components/acl/feature';
import {COL_WIDTH_UNDEFINED} from 'sentry/components/gridEditable';
import * as Layout from 'sentry/components/layouts/thirds';
import {NoAccess} from 'sentry/components/noAccess';
import {DatePageFilter} from 'sentry/components/organizations/datePageFilter';
import {EnvironmentPageFilter} from 'sentry/components/organizations/environmentPageFilter';
import PageFilterBar from 'sentry/components/organizations/pageFilterBar';
import PageFiltersContainer from 'sentry/components/organizations/pageFilters/container';
import {ProjectPageFilter} from 'sentry/components/organizations/projectPageFilter';
import TransactionNameSearchBar from 'sentry/components/performance/searchBar';
import * as TeamKeyTransactionManager from 'sentry/components/performance/teamKeyTransactionsManager';
import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle';
import {trackAnalytics} from 'sentry/utils/analytics';
import {
canUseMetricsData,
useMEPSettingContext,
} from 'sentry/utils/performance/contexts/metricsEnhancedSetting';
import {PageAlert, usePageAlert} from 'sentry/utils/performance/contexts/pageAlert';
import {PerformanceDisplayProvider} from 'sentry/utils/performance/contexts/performanceDisplayContext';
import {MutableSearch} from 'sentry/utils/tokenizeSearch';
import {useLocation} from 'sentry/utils/useLocation';
import {useNavigate} from 'sentry/utils/useNavigate';
import useOrganization from 'sentry/utils/useOrganization';
import useProjects from 'sentry/utils/useProjects';
import {useUserTeams} from 'sentry/utils/useUserTeams';
import * as ModuleLayout from 'sentry/views/insights/common/components/moduleLayout';
import {ToolRibbon} from 'sentry/views/insights/common/components/ribbon';
import {ViewTrendsButton} from 'sentry/views/insights/common/components/viewTrendsButton';
import {useOnboardingProject} from 'sentry/views/insights/common/queries/useOnboardingProject';
import {AiHeader} from 'sentry/views/insights/pages/ai/aiPageHeader';
import {AI_LANDING_TITLE} from 'sentry/views/insights/pages/ai/settings';
import {OVERVIEW_PAGE_TITLE} from 'sentry/views/insights/pages/settings';
import {generateGenericPerformanceEventView} from 'sentry/views/performance/data';
import {TripleChartRow} from 'sentry/views/performance/landing/widgets/components/widgetChartRow';
import {filterAllowedChartsMetrics} from 'sentry/views/performance/landing/widgets/utils';
import {PerformanceWidgetSetting} from 'sentry/views/performance/landing/widgets/widgetDefinitions';
import Onboarding from 'sentry/views/performance/onboarding';
import Table from 'sentry/views/performance/table';
import {
getTransactionSearchQuery,
ProjectPerformanceType,
} from 'sentry/views/performance/utils';
export const AI_COLUMN_TITLES = [
'transaction',
'project',
'operation',
'tpm',
'p50()',
'p75()',
'p95()',
'users',
];
function AiOverviewPage() {
const organization = useOrganization();
const location = useLocation();
const {setPageError} = usePageAlert();
const {projects} = useProjects();
const onboardingProject = useOnboardingProject();
const navigate = useNavigate();
const {teams} = useUserTeams();
const mepSetting = useMEPSettingContext();
const withStaticFilters = canUseMetricsData(organization);
const eventView = generateGenericPerformanceEventView(
location,
withStaticFilters,
organization
);
// TODO - this should come from MetricsField / EAP fields
eventView.fields = [
{field: 'team_key_transaction'},
{field: 'transaction'},
{field: 'project'},
{field: 'transaction.op'},
{field: 'tpm()'},
{field: 'p50(transaction.duration)'},
{field: 'p75(transaction.duration)'},
{field: 'p95(transaction.duration)'},
].map(field => ({...field, width: COL_WIDTH_UNDEFINED}));
const showOnboarding = onboardingProject !== undefined;
const tripleChartRowCharts = filterAllowedChartsMetrics(
organization,
[
PerformanceWidgetSetting.TPM_AREA,
PerformanceWidgetSetting.DURATION_HISTOGRAM,
PerformanceWidgetSetting.P50_DURATION_AREA,
PerformanceWidgetSetting.P75_DURATION_AREA,
PerformanceWidgetSetting.P95_DURATION_AREA,
PerformanceWidgetSetting.P99_DURATION_AREA,
PerformanceWidgetSetting.FAILURE_RATE_AREA,
],
mepSetting
);
const sharedProps = {eventView, location, organization, withStaticFilters};
const getFreeTextFromQuery = (query: string) => {
const conditions = new MutableSearch(query);
const transactionValues = conditions.getFilterValues('transaction');
if (transactionValues.length) {
return transactionValues[0];
}
if (conditions.freeText.length > 0) {
// raw text query will be wrapped in wildcards in generatePerformanceEventView
// so no need to wrap it here
return conditions.freeText.join(' ');
}
return '';
};
function handleSearch(searchQuery: string) {
trackAnalytics('performance.domains.ai.search', {organization});
navigate({
pathname: location.pathname,
query: {
...location.query,
cursor: undefined,
query: String(searchQuery).trim() || undefined,
isDefaultQuery: false,
},
});
}
const derivedQuery = getTransactionSearchQuery(location, eventView.query);
return (
} />
{!showOnboarding && (
{
handleSearch(query);
}}
query={getFreeTextFromQuery(derivedQuery)}
/>
)}
{!showOnboarding && (
)}
{showOnboarding && (
)}
);
}
function AiOverviewPageWithProviders() {
const organization = useOrganization();
return (
);
}
const StyledTransactionNameSearchBar = styled(TransactionNameSearchBar)`
flex: 2;
`;
export default AiOverviewPageWithProviders;