import {Fragment} from 'react'; import styled from '@emotion/styled'; import {CompactSelect} from 'sentry/components/compactSelect'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import {trackAnalytics} from 'sentry/utils/analytics'; import {browserHistory} from 'sentry/utils/browserHistory'; import {useLocation} from 'sentry/utils/useLocation'; import useOrganization from 'sentry/utils/useOrganization'; import {getResourceTypeFilter} from 'sentry/views/insights/browser/common/queries/useResourcesQuery'; import RenderBlockingSelector from 'sentry/views/insights/browser/resources/components/renderBlockingSelector'; import ResourceTable from 'sentry/views/insights/browser/resources/components/tables/resourceTable'; import { FONT_FILE_EXTENSIONS, IMAGE_FILE_EXTENSIONS, } from 'sentry/views/insights/browser/resources/constants'; import { DEFAULT_RESOURCE_TYPES, RESOURCE_THROUGHPUT_UNIT, } from 'sentry/views/insights/browser/resources/settings'; import {ResourceSpanOps} from 'sentry/views/insights/browser/resources/types'; import { BrowserStarfishFields, useResourceModuleFilters, } from 'sentry/views/insights/browser/resources/utils/useResourceFilters'; import {useResourceSort} from 'sentry/views/insights/browser/resources/utils/useResourceSort'; import {QueryParameterNames} from 'sentry/views/insights/common/views/queryParameters'; import {TransactionSelector} from 'sentry/views/insights/common/views/spans/selectors/transactionSelector'; import {SpanTimeCharts} from 'sentry/views/insights/common/views/spans/spanTimeCharts'; import type {ModuleFilters} from 'sentry/views/insights/common/views/spans/useModuleFilters'; import {ModuleName} from 'sentry/views/insights/types'; const { SPAN_OP: RESOURCE_TYPE, SPAN_DOMAIN, TRANSACTION, RESOURCE_RENDER_BLOCKING_STATUS, USER_GEO_SUBREGION, } = BrowserStarfishFields; type Option = { label: string | React.ReactElement; value: string; }; function ResourceView() { const filters = useResourceModuleFilters(); const sort = useResourceSort(); const spanTimeChartsFilters: ModuleFilters = { 'span.op': `[${DEFAULT_RESOURCE_TYPES.join(',')}]`, ...(filters[SPAN_DOMAIN] ? {[SPAN_DOMAIN]: filters[SPAN_DOMAIN]} : {}), }; const extraQuery = [ ...getResourceTypeFilter(undefined, DEFAULT_RESOURCE_TYPES), ...(filters[USER_GEO_SUBREGION] ? [`user.geo.subregion:[${filters[USER_GEO_SUBREGION].join(',')}]`] : []), ]; return ( ); } function ResourceTypeSelector({value}: {value?: string}) { const location = useLocation(); const organization = useOrganization(); const hasImageView = organization.features.includes('insights-initial-modules'); const options: Option[] = [ {value: '', label: 'All'}, {value: 'resource.script', label: `${t('JavaScript')} (.js)`}, {value: 'resource.css', label: `${t('Stylesheet')} (.css)`}, { value: 'resource.font', label: `${t('Font')} (${FONT_FILE_EXTENSIONS.map(e => `.${e}`).join(', ')})`, }, ...(hasImageView ? [ { value: ResourceSpanOps.IMAGE, label: `${t('Image')} (${IMAGE_FILE_EXTENSIONS.map(e => `.${e}`).join(', ')})`, }, ] : []), ]; return ( { trackAnalytics('insight.asset.filter_by_type', { organization, filter: newValue?.value, }); browserHistory.push({ ...location, query: { ...location.query, [RESOURCE_TYPE]: newValue?.value, [QueryParameterNames.SPANS_CURSOR]: undefined, }, }); }} /> ); } export const SpanTimeChartsContainer = styled('div')` margin-bottom: ${space(2)}; `; const DropdownContainer = styled('div')` display: flex; gap: ${space(2)}; margin-bottom: ${space(2)}; flex-wrap: wrap; `; export default ResourceView;