in x-pack/platform/plugins/shared/lens/public/datasources/form_based/operations/definitions/terms/index.tsx [736:1137]
otherBucket: getOtherBucketSwitchDefault(currentColumn, value),
},
},
} as Record<string, TermsIndexPatternColumn>,
});
}}
/>
{currentColumn.params.orderBy.type === 'rare' && (
<ValuesInput
value={currentColumn.params.orderBy.maxDocCount}
label={i18n.translate('xpack.lens.indexPattern.terms.maxDocCount', {
defaultMessage: 'Max doc count per term',
})}
maxValue={MAXIMUM_MAX_DOC_COUNT}
onChange={(value) => {
paramEditorUpdater(
updateColumnParam({
layer,
columnId,
paramName: 'orderBy',
value: { ...currentColumn.params.orderBy, maxDocCount: value },
})
);
}}
/>
)}
<EuiFormRow
label={
<>
{i18n.translate('xpack.lens.indexPattern.terms.orderBy', {
defaultMessage: 'Rank by',
})}{' '}
<EuiIconTip
color="subdued"
content={i18n.translate('xpack.lens.indexPattern.terms.orderByHelp', {
defaultMessage: `Specifies the dimension the top values are ranked by.`,
})}
iconProps={{
className: 'eui-alignTop',
}}
position="top"
size="s"
type="questionInCircle"
/>
</>
}
display="rowCompressed"
fullWidth
>
<EuiSelect
compressed
fullWidth
data-test-subj="indexPattern-terms-orderBy"
options={orderOptions}
value={toValue(currentColumn.params.orderBy)}
onChange={(e: React.ChangeEvent<HTMLSelectElement>) => {
const newOrderByValue = fromValue(e.target.value);
let updatedLayer = updateDefaultLabels(
updateColumnParam({
layer,
columnId,
paramName: 'orderBy',
value: newOrderByValue,
}),
indexPattern
);
if (newOrderByValue.type === 'custom') {
const initialOperation = (
operationDefinitionMap.count as OperationDefinition<
GenericIndexPatternColumn,
'field'
>
).buildColumn({
layer,
indexPattern,
field: indexPattern.getFieldByName(DOCUMENT_FIELD_NAME)!,
});
updatedLayer = updateColumnParam({
layer: updatedLayer,
columnId,
paramName: 'orderAgg',
value: initialOperation,
});
} else {
updatedLayer = updateColumnParam({
layer: updatedLayer,
columnId,
paramName: 'orderAgg',
value: undefined,
});
}
setIncompleteColumn(undefined);
paramEditorUpdater(
updateColumnParam({
layer: updatedLayer,
columnId,
paramName: 'orderDirection',
value: newOrderByValue.type === 'alphabetical' ? 'asc' : 'desc',
})
);
}}
aria-label={i18n.translate('xpack.lens.indexPattern.terms.orderBy', {
defaultMessage: 'Rank by',
})}
/>
</EuiFormRow>
{currentColumn.params.orderAgg && ReferenceEditor && (
<>
<EuiSpacer size="s" />
<ReferenceEditor
operationDefinitionMap={operationDefinitionMap}
functionLabel={i18n.translate('xpack.lens.indexPattern.terms.orderAgg.rankFunction', {
defaultMessage: 'Rank function',
})}
fieldLabel={i18n.translate('xpack.lens.indexPattern.terms.orderAgg.rankField', {
defaultMessage: 'Rank field',
})}
isInline={true}
paramEditorCustomProps={{
...paramEditorCustomProps,
isInline: true,
labels: getLabelForRankFunctions(currentColumn.params.orderAgg.operationType),
}}
layer={layer}
selectionStyle="full"
columnId={`${columnId}-orderAgg`}
currentIndexPattern={indexPattern}
paramEditorUpdater={(setter) => {
if (!isColumn(setter)) {
throw new Error('Setter should always be a column when ran here.');
}
paramEditorUpdater(
updateColumnParam({
layer,
columnId,
paramName: 'orderAgg',
value: setter,
})
);
}}
column={currentColumn.params.orderAgg}
incompleteColumn={incompleteColumn}
onResetIncomplete={() => setIncompleteColumn(undefined)}
onDeleteColumn={() => {
throw new Error('Should not be called');
}}
onChooseField={(choice) => {
const field = choice.field && indexPattern.getFieldByName(choice.field);
if (field) {
const hypotethicalColumn = (
operationDefinitionMap[choice.operationType] as OperationDefinition<
GenericIndexPatternColumn,
'field'
>
).buildColumn({
previousColumn: currentColumn.params.orderAgg,
layer,
indexPattern,
field,
});
setIncompleteColumn(undefined);
paramEditorUpdater(
updateColumnParam({
layer,
columnId,
paramName: 'orderAgg',
value: hypotethicalColumn,
})
);
} else {
setIncompleteColumn({
sourceField: choice.field,
operationType: choice.operationType,
});
}
}}
onChooseFunction={(operationType: string, field?: IndexPatternField) => {
if (field) {
const hypotethicalColumn = (
operationDefinitionMap[operationType] as OperationDefinition<
GenericIndexPatternColumn,
'field'
>
).buildColumn({
previousColumn: currentColumn.params.orderAgg,
layer,
indexPattern,
field,
});
setIncompleteColumn(undefined);
paramEditorUpdater(
updateColumnParam({
layer,
columnId,
paramName: 'orderAgg',
value: hypotethicalColumn,
})
);
} else {
setIncompleteColumn({ operationType });
}
}}
validation={{
input: ['field', 'managedReference'],
validateMetadata: (meta: OperationMetadata) =>
meta.dataType === 'number' && !meta.isBucketed,
}}
{...rest}
/>
<EuiSpacer size="m" />
</>
)}
<EuiFormRow
label={i18n.translate('xpack.lens.indexPattern.terms.orderDirection', {
defaultMessage: 'Rank direction',
})}
display="rowCompressed"
fullWidth
>
<EuiButtonGroup
isFullWidth
legend={i18n.translate('xpack.lens.indexPattern.terms.orderDirection', {
defaultMessage: 'Rank direction',
})}
data-test-subj="indexPattern-terms-orderDirection-groups"
buttonSize="compressed"
aria-label={i18n.translate('xpack.lens.indexPattern.terms.orderDirection', {
defaultMessage: 'Rank direction',
})}
isDisabled={isRareOrSignificant(currentColumn.params.orderBy)}
options={[
{
id: `${idPrefix}asc`,
'data-test-subj': 'indexPattern-terms-orderDirection-groups-asc',
value: 'asc',
label: i18n.translate('xpack.lens.indexPattern.terms.orderAscending', {
defaultMessage: 'Ascending',
}),
},
{
id: `${idPrefix}desc`,
'data-test-subj': 'indexPattern-terms-orderDirection-groups-desc',
value: 'desc',
label: i18n.translate('xpack.lens.indexPattern.terms.orderDescending', {
defaultMessage: 'Descending',
}),
},
]}
idSelected={`${idPrefix}${currentColumn.params.orderDirection}`}
onChange={(id) => {
const value = id.replace(
idPrefix,
''
) as TermsIndexPatternColumn['params']['orderDirection'];
paramEditorUpdater(
updateColumnParam({
layer,
columnId,
paramName: 'orderDirection',
value,
})
);
}}
/>
</EuiFormRow>
{dataSectionExtra && (
<>
<EuiSpacer size="m" />
{dataSectionExtra}
</>
)}
{!hasRestrictions && (
<>
<EuiSpacer size="m" />
<EuiAccordion
css={css`
color: ${euiTheme.colors.primary};
`}
id="lnsTermsAdvanced"
arrowProps={{ color: 'primary' }}
buttonContent={
<EuiTitle size="xxs">
<h5>
<EuiTextColor color={euiTheme.colors.primary}>
{i18n.translate('xpack.lens.indexPattern.terms.advancedSettings', {
defaultMessage: 'Advanced',
})}
</EuiTextColor>
</h5>
</EuiTitle>
}
data-test-subj="indexPattern-terms-advanced"
className="lnsIndexPatternDimensionEditor-advancedOptions"
>
<EuiSpacer size="s" />
<EuiSwitch
label={
<EuiText size="xs">
{i18n.translate('xpack.lens.indexPattern.terms.missingBucketDescription', {
defaultMessage: 'Include documents without the selected field',
})}
</EuiText>
}
compressed
disabled={
!currentColumn.params.otherBucket ||
indexPattern.getFieldByName(currentColumn.sourceField)?.type !== 'string' ||
isRareOrSignificant(currentColumn.params.orderBy)
}
data-test-subj="indexPattern-terms-missing-bucket"
checked={Boolean(currentColumn.params.missingBucket)}
onChange={(e: EuiSwitchEvent) =>
paramEditorUpdater(
updateColumnParam({
layer,
columnId,
paramName: 'missingBucket',
value: e.target.checked,
})
)
}
/>
<EuiSpacer size="s" />
<EuiSwitch
label={
<EuiText size="xs">
{i18n.translate('xpack.lens.indexPattern.terms.otherBucketDescription', {
defaultMessage: 'Group remaining values as "Other"',
})}
</EuiText>
}
compressed
data-test-subj="indexPattern-terms-other-bucket"
checked={Boolean(currentColumn.params.otherBucket)}
disabled={isRareOrSignificant(currentColumn.params.orderBy)}
onChange={(e: EuiSwitchEvent) =>
paramEditorUpdater(
updateColumnParam({
layer,
columnId,
paramName: 'otherBucket',
value: e.target.checked,
})
)
}
/>
<EuiSpacer size="s" />
<EuiSwitch
label={
<EuiText size="xs">
{i18n.translate('xpack.lens.indexPattern.terms.accuracyModeDescription', {
defaultMessage: 'Enable accuracy mode',
})}{' '}
<EuiIconTip
color="subdued"
content={i18n.translate('xpack.lens.indexPattern.terms.accuracyModeHelp', {
defaultMessage: `Improves results for high-cardinality data, but increases the load on the Elasticsearch cluster.`,
})}
iconProps={{
className: 'eui-alignTop',
}}
position="top"
size="s"
type="questionInCircle"
/>
</EuiText>
}
compressed
disabled={currentColumn.params.orderBy.type === 'rare'}
data-test-subj="indexPattern-accuracy-mode"
checked={Boolean(
currentColumn.params.accuracyMode && currentColumn.params.orderBy.type !== 'rare'
)}
onChange={(e: EuiSwitchEvent) =>
paramEditorUpdater(
updateColumnParam({
layer,
columnId,
paramName: 'accuracyMode',
value: e.target.checked,
})
)
}
/>
{(currentColumn.dataType === 'number' || currentColumn.dataType === 'string') &&
!currentColumn.params.secondaryFields?.length && (
<>
<IncludeExcludeRow
include={currentColumn.params.include}
exclude={currentColumn.params.exclude}
includeIsRegex={Boolean(currentColumn.params.includeIsRegex)}
excludeIsRegex={Boolean(currentColumn.params.excludeIsRegex)}
tableRows={activeData?.[rest.layerId]?.rows}
columnId={columnId}
isNumberField={Boolean(currentColumn.dataType === 'number')}
updateParams={(operation, operationValue, regex, regexValue) =>
paramEditorUpdater({
...layer,
columns: {
...layer.columns,
[columnId]: {