|
6 | 6 |
|
7 | 7 | import React from 'react'; |
8 | 8 | import { i18n } from '@kbn/i18n'; |
9 | | -import { EuiFormRow, EuiHorizontalRule, EuiRadio, EuiSelect, htmlIdGenerator } from '@elastic/eui'; |
| 9 | +import { EuiFormRow, EuiSwitch, EuiSelect } from '@elastic/eui'; |
10 | 10 | import { IndexPatternLayer, IndexPatternField } from '../types'; |
11 | 11 | import { hasField } from '../utils'; |
12 | 12 | import { IndexPatternColumn } from '../operations'; |
13 | 13 |
|
14 | | -const generator = htmlIdGenerator('lens-nesting'); |
15 | | - |
16 | 14 | function nestColumn(columnOrder: string[], outer: string, inner: string) { |
17 | 15 | const result = columnOrder.filter((c) => c !== inner); |
18 | 16 | const outerPosition = result.indexOf(outer); |
@@ -52,114 +50,57 @@ export function BucketNestingEditor({ |
52 | 50 | return null; |
53 | 51 | } |
54 | 52 |
|
55 | | - const fieldName = getFieldName(fieldMap, column); |
56 | | - |
57 | 53 | const prevColumn = layer.columnOrder[layer.columnOrder.indexOf(columnId) - 1]; |
58 | 54 |
|
59 | 55 | if (aggColumns.length === 1) { |
60 | 56 | const [target] = aggColumns; |
61 | | - |
62 | | - function toggleNesting() { |
63 | | - if (prevColumn) { |
64 | | - setColumns(nestColumn(layer.columnOrder, columnId, target.value)); |
65 | | - } else { |
66 | | - setColumns(nestColumn(layer.columnOrder, target.value, columnId)); |
67 | | - } |
68 | | - } |
69 | | - |
70 | | - // todo: move the copy to operations |
71 | | - const topLevelCopy: Record<string, string> = { |
72 | | - terms: i18n.translate('xpack.lens.indexPattern.groupingOverallTerms', { |
73 | | - defaultMessage: 'Overall top {field}', |
74 | | - values: { field: fieldName }, |
75 | | - }), |
76 | | - filters: i18n.translate('xpack.lens.indexPattern.groupingOverallFilters', { |
77 | | - defaultMessage: 'Top values for each filter', |
78 | | - }), |
79 | | - date_histogram: i18n.translate('xpack.lens.indexPattern.groupingOverallDateHistogram', { |
80 | | - defaultMessage: 'Top values for each {field}', |
81 | | - values: { field: fieldName }, |
82 | | - }), |
83 | | - range: i18n.translate('xpack.lens.indexPattern.groupingOverallRanges', { |
84 | | - defaultMessage: 'Top values for each {field}', |
85 | | - values: { field: fieldName }, |
86 | | - }), |
87 | | - }; |
88 | | - |
89 | | - const bottomLevelCopy: Record<string, string> = { |
90 | | - terms: i18n.translate('xpack.lens.indexPattern.groupingSecondTerms', { |
91 | | - defaultMessage: 'Top values for each {target}', |
92 | | - values: { target: target.fieldName }, |
93 | | - }), |
94 | | - filters: i18n.translate('xpack.lens.indexPattern.groupingSecondFilters', { |
95 | | - defaultMessage: 'Overall top {target}', |
96 | | - values: { target: target.fieldName }, |
97 | | - }), |
98 | | - date_histogram: i18n.translate('xpack.lens.indexPattern.groupingSecondDateHistogram', { |
99 | | - defaultMessage: 'Overall top {target}', |
100 | | - values: { target: target.fieldName }, |
101 | | - }), |
102 | | - range: i18n.translate('xpack.lens.indexPattern.groupingSecondRanges', { |
103 | | - defaultMessage: 'Overall top {target}', |
104 | | - values: { target: target.fieldName }, |
105 | | - }), |
106 | | - }; |
107 | | - |
| 57 | + const useAsTopLevelAggCopy = i18n.translate('xpack.lens.indexPattern.useAsTopLevelAgg', { |
| 58 | + defaultMessage: 'Group by this field first', |
| 59 | + }); |
108 | 60 | return ( |
109 | | - <> |
110 | | - <EuiHorizontalRule margin="m" /> |
111 | | - <EuiFormRow |
112 | | - label={i18n.translate('xpack.lens.indexPattern.groupingControlLabel', { |
113 | | - defaultMessage: 'Grouping', |
114 | | - })} |
115 | | - labelType="legend" |
116 | | - > |
117 | | - <> |
118 | | - <EuiRadio |
119 | | - id={generator('topLevel')} |
120 | | - data-test-subj="indexPattern-nesting-topLevel" |
121 | | - label={topLevelCopy[column.operationType]} |
122 | | - checked={!prevColumn} |
123 | | - onChange={toggleNesting} |
124 | | - /> |
125 | | - <EuiRadio |
126 | | - id={generator('bottomLevel')} |
127 | | - data-test-subj="indexPattern-nesting-bottomLevel" |
128 | | - label={bottomLevelCopy[column.operationType]} |
129 | | - checked={!!prevColumn} |
130 | | - onChange={toggleNesting} |
131 | | - /> |
132 | | - </> |
133 | | - </EuiFormRow> |
134 | | - </> |
| 61 | + <EuiFormRow label={useAsTopLevelAggCopy} display="columnCompressedSwitch"> |
| 62 | + <EuiSwitch |
| 63 | + compressed |
| 64 | + label={useAsTopLevelAggCopy} |
| 65 | + showLabel={false} |
| 66 | + data-test-subj="indexPattern-nesting-switch" |
| 67 | + name="nestingSwitch" |
| 68 | + checked={!prevColumn} |
| 69 | + onChange={() => { |
| 70 | + if (prevColumn) { |
| 71 | + setColumns(nestColumn(layer.columnOrder, columnId, target.value)); |
| 72 | + } else { |
| 73 | + setColumns(nestColumn(layer.columnOrder, target.value, columnId)); |
| 74 | + } |
| 75 | + }} |
| 76 | + /> |
| 77 | + </EuiFormRow> |
135 | 78 | ); |
136 | 79 | } |
137 | 80 |
|
138 | 81 | return ( |
139 | | - <> |
140 | | - <EuiHorizontalRule margin="m" /> |
141 | | - <EuiFormRow |
142 | | - label={i18n.translate('xpack.lens.indexPattern.groupByDropdown', { |
143 | | - defaultMessage: 'Group by', |
144 | | - })} |
145 | | - display="rowCompressed" |
146 | | - > |
147 | | - <EuiSelect |
148 | | - compressed |
149 | | - data-test-subj="indexPattern-nesting-select" |
150 | | - options={[ |
151 | | - { |
152 | | - value: '', |
153 | | - text: i18n.translate('xpack.lens.xyChart.nestUnderRoot', { |
154 | | - defaultMessage: 'Entire data set', |
155 | | - }), |
156 | | - }, |
157 | | - ...aggColumns.map(({ value, text }) => ({ value, text })), |
158 | | - ]} |
159 | | - value={prevColumn} |
160 | | - onChange={(e) => setColumns(nestColumn(layer.columnOrder, e.target.value, columnId))} |
161 | | - /> |
162 | | - </EuiFormRow> |
163 | | - </> |
| 82 | + <EuiFormRow |
| 83 | + label={i18n.translate('xpack.lens.indexPattern.groupByDropdown', { |
| 84 | + defaultMessage: 'Group by', |
| 85 | + })} |
| 86 | + display="columnCompressed" |
| 87 | + fullWidth |
| 88 | + > |
| 89 | + <EuiSelect |
| 90 | + compressed |
| 91 | + data-test-subj="indexPattern-nesting-select" |
| 92 | + options={[ |
| 93 | + { |
| 94 | + value: '', |
| 95 | + text: i18n.translate('xpack.lens.xyChart.nestUnderRoot', { |
| 96 | + defaultMessage: 'Entire data set', |
| 97 | + }), |
| 98 | + }, |
| 99 | + ...aggColumns.map(({ value, text }) => ({ value, text })), |
| 100 | + ]} |
| 101 | + value={prevColumn} |
| 102 | + onChange={(e) => setColumns(nestColumn(layer.columnOrder, e.target.value, columnId))} |
| 103 | + /> |
| 104 | + </EuiFormRow> |
164 | 105 | ); |
165 | 106 | } |
0 commit comments