index.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import cloneDeep from 'lodash/cloneDeep';
  2. import ExternalLink from 'sentry/components/links/externalLink';
  3. import {t, tct} from 'sentry/locale';
  4. import {Organization, TagCollection} from 'sentry/types';
  5. import {
  6. generateFieldAsString,
  7. getColumnsAndAggregatesAsStrings,
  8. QueryFieldValue,
  9. } from 'sentry/utils/discover/fields';
  10. import {getDatasetConfig} from 'sentry/views/dashboardsV2/datasetConfig/base';
  11. import {DisplayType, WidgetQuery, WidgetType} from 'sentry/views/dashboardsV2/types';
  12. import {DataSet} from '../../utils';
  13. import {BuildStep} from '../buildStep';
  14. import {ColumnFields} from './columnFields';
  15. import {ReleaseColumnFields} from './releaseColumnFields';
  16. interface Props {
  17. dataSet: DataSet;
  18. displayType: DisplayType;
  19. explodedFields: QueryFieldValue[];
  20. onQueryChange: (queryIndex: number, newQuery: WidgetQuery) => void;
  21. onYAxisOrColumnFieldChange: (newFields: QueryFieldValue[]) => void;
  22. organization: Organization;
  23. queries: WidgetQuery[];
  24. tags: TagCollection;
  25. widgetType: WidgetType;
  26. queryErrors?: Record<string, any>[];
  27. }
  28. export function ColumnsStep({
  29. dataSet,
  30. displayType,
  31. onQueryChange,
  32. organization,
  33. queries,
  34. widgetType,
  35. onYAxisOrColumnFieldChange,
  36. queryErrors,
  37. explodedFields,
  38. tags,
  39. }: Props) {
  40. const datasetConfig = getDatasetConfig(widgetType);
  41. return (
  42. <BuildStep
  43. title={t('Choose your columns')}
  44. description={
  45. dataSet === DataSet.ISSUES
  46. ? tct(
  47. '[fieldTagLink: Field and tag] columns will help you view more details about the issues (e.g., title).',
  48. {
  49. fieldTagLink: (
  50. <ExternalLink href="https://docs.sentry.io/product/sentry-basics/search/searchable-properties/#event-properties" />
  51. ),
  52. }
  53. )
  54. : dataSet === DataSet.RELEASES
  55. ? tct(
  56. 'To stack sessions, add [functionLink: functions] f(x) that may take in additional parameters. [fieldTagLink: Field and tag] columns will help you view more details about the sessions (e.g., releases).',
  57. {
  58. functionLink: (
  59. <ExternalLink href="https://docs.sentry.io/product/discover-queries/query-builder/#filter-by-table-columns" />
  60. ),
  61. fieldTagLink: (
  62. <ExternalLink href="https://docs.sentry.io/product/sentry-basics/search/searchable-properties/#release-properties" />
  63. ),
  64. }
  65. )
  66. : tct(
  67. 'To stack events, add [functionLink: functions] f(x) that may take in additional parameters. [fieldTagLink: Field and tag] columns will help you view more details about the events (e.g., title).',
  68. {
  69. functionLink: (
  70. <ExternalLink href="https://docs.sentry.io/product/discover-queries/query-builder/#filter-by-table-columns" />
  71. ),
  72. fieldTagLink: (
  73. <ExternalLink href="https://docs.sentry.io/product/sentry-basics/search/searchable-properties/#event-properties" />
  74. ),
  75. }
  76. )
  77. }
  78. >
  79. {dataSet === DataSet.EVENTS ? (
  80. <ColumnFields
  81. displayType={displayType}
  82. organization={organization}
  83. widgetType={widgetType}
  84. fields={explodedFields}
  85. errors={queryErrors}
  86. fieldOptions={datasetConfig.getTableFieldOptions({organization}, tags)}
  87. onChange={onYAxisOrColumnFieldChange}
  88. />
  89. ) : dataSet === DataSet.ISSUES ? (
  90. <ColumnFields
  91. displayType={displayType}
  92. organization={organization}
  93. widgetType={widgetType}
  94. fields={explodedFields}
  95. errors={queryErrors?.[0] ? [queryErrors?.[0]] : undefined}
  96. fieldOptions={datasetConfig.getTableFieldOptions({organization}, tags)}
  97. onChange={newFields => {
  98. const fieldStrings = newFields.map(generateFieldAsString);
  99. const splitFields = getColumnsAndAggregatesAsStrings(newFields);
  100. const newQuery = cloneDeep(queries[0]);
  101. newQuery.fields = fieldStrings;
  102. newQuery.aggregates = splitFields.aggregates;
  103. newQuery.columns = splitFields.columns;
  104. newQuery.fieldAliases = splitFields.fieldAliases;
  105. onQueryChange(0, newQuery);
  106. }}
  107. />
  108. ) : (
  109. <ReleaseColumnFields
  110. displayType={displayType}
  111. organization={organization}
  112. widgetType={widgetType}
  113. explodedFields={explodedFields}
  114. queryErrors={queryErrors}
  115. onYAxisOrColumnFieldChange={onYAxisOrColumnFieldChange}
  116. />
  117. )}
  118. </BuildStep>
  119. );
  120. }