Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Lens] Improve Ignore global filters UI #154441

Merged
merged 10 commits into from
Apr 18, 2023
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ import type {
IndexPatternField,
IndexPattern,
IndexPatternRef,
DatasourceLayerSettingsProps,
DataSourceInfo,
UserMessage,
FrameDatasourceAPI,
Expand Down Expand Up @@ -429,10 +428,7 @@ export function getFormBasedDatasource({
toExpression: (state, layerId, indexPatterns, dateRange, searchSessionId) =>
toExpression(state, layerId, indexPatterns, uiSettings, dateRange, searchSessionId),

renderLayerSettings(
domElement: Element,
props: DatasourceLayerSettingsProps<FormBasedPrivateState>
) {
renderLayerSettings(domElement, props) {
render(
<KibanaThemeProvider theme$={core.theme.theme$}>
<I18nProvider>
Expand Down
161 changes: 73 additions & 88 deletions x-pack/plugins/lens/public/datasources/form_based/layer_settings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -109,101 +109,86 @@ export function LayerSettingsPanel({
setState,
layerId,
}: DatasourceLayerSettingsProps<FormBasedPrivateState>) {
const { euiTheme } = useEuiTheme();
const isSamplingValueDisabled = !isSamplingValueEnabled(state.layers[layerId]);
const currentValue = isSamplingValueDisabled
? samplingValues[samplingValues.length - 1]
: state.layers[layerId].sampling;
return (
<div id={layerId}>
<EuiText
size="s"
css={css`
margin-bottom: ${euiTheme.size.base};
`}
>
<h4>
{i18n.translate('xpack.lens.indexPattern.layerSettings.headingData', {
defaultMessage: 'Data',
})}
</h4>
</EuiText>
<EuiFormRow
display="rowCompressed"
data-test-subj="lns-indexPattern-random-sampling-row"
fullWidth
helpText={
<>
<EuiSpacer size="s" />
<p>
<FormattedMessage
id="xpack.lens.indexPattern.randomSampling.help"
defaultMessage="Lower sampling percentages increases the performance, but lowers the accuracy. Lower sampling percentages are best for large datasets. {link}"
values={{
link: (
<EuiLink
href="https://www.elastic.co/guide/en/elasticsearch/reference/master/search-aggregations-random-sampler-aggregation.html"
target="_blank"
external
>
<FormattedMessage
id="xpack.lens.indexPattern.randomSampling.learnMore"
defaultMessage="View documentation"
/>
</EuiLink>
),
}}
/>
</p>
</>
}
label={
<>
{i18n.translate('xpack.lens.indexPattern.randomSampling.label', {
defaultMessage: 'Sampling',
})}{' '}
<EuiToolTip
content={i18n.translate('xpack.lens.indexPattern.randomSampling.experimentalLabel', {
<EuiFormRow
display="rowCompressed"
data-test-subj="lns-indexPattern-random-sampling-row"
fullWidth
helpText={
<>
<EuiSpacer size="s" />
<p>
<FormattedMessage
id="xpack.lens.indexPattern.randomSampling.help"
defaultMessage="Lower sampling percentages increases the performance, but lowers the accuracy. Lower sampling percentages are best for large datasets. {link}"
values={{
link: (
<EuiLink
href="https://www.elastic.co/guide/en/elasticsearch/reference/master/search-aggregations-random-sampler-aggregation.html"
target="_blank"
external
>
<FormattedMessage
id="xpack.lens.indexPattern.randomSampling.learnMore"
defaultMessage="View documentation"
/>
</EuiLink>
),
}}
/>
</p>
</>
}
label={
<>
{i18n.translate('xpack.lens.indexPattern.randomSampling.label', {
defaultMessage: 'Sampling',
})}{' '}
<EuiToolTip
content={i18n.translate('xpack.lens.indexPattern.randomSampling.experimentalLabel', {
defaultMessage: 'Technical preview',
})}
>
<EuiBetaBadge
css={css`
vertical-align: middle;
`}
iconType="beaker"
label={i18n.translate('xpack.lens.indexPattern.randomSampling.experimentalLabel', {
defaultMessage: 'Technical preview',
})}
>
<EuiBetaBadge
css={css`
vertical-align: middle;
`}
iconType="beaker"
label={i18n.translate('xpack.lens.indexPattern.randomSampling.experimentalLabel', {
defaultMessage: 'Technical preview',
})}
size="s"
/>
</EuiToolTip>
</>
}
>
<SamplingSlider
disabled={isSamplingValueDisabled}
disabledReason={i18n.translate('xpack.lens.indexPattern.randomSampling.disabledMessage', {
defaultMessage:
'In order to select a reduced sampling percentage, you must remove any maximum or minimum functions applied on this layer.',
})}
values={samplingValues}
currentValue={currentValue}
data-test-subj="lns-indexPattern-random-sampling-slider"
onChange={(newSamplingValue) => {
setState({
...state,
layers: {
...state.layers,
[layerId]: {
...state.layers[layerId],
sampling: newSamplingValue,
},
size="s"
/>
</EuiToolTip>
</>
}
>
<SamplingSlider
disabled={isSamplingValueDisabled}
disabledReason={i18n.translate('xpack.lens.indexPattern.randomSampling.disabledMessage', {
defaultMessage:
'In order to select a reduced sampling percentage, you must remove any maximum or minimum functions applied on this layer.',
})}
values={samplingValues}
currentValue={currentValue}
data-test-subj="lns-indexPattern-random-sampling-slider"
onChange={(newSamplingValue) => {
setState({
...state,
layers: {
...state.layers,
[layerId]: {
...state.layers[layerId],
sampling: newSamplingValue,
},
});
}}
/>
</EuiFormRow>
</div>
},
});
}}
/>
</EuiFormRow>
);
}
25 changes: 24 additions & 1 deletion x-pack/plugins/lens/public/datasources/form_based/layerpanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@
import React from 'react';
import { I18nProvider } from '@kbn/i18n-react';
import { i18n } from '@kbn/i18n';
import { useEuiTheme } from '@elastic/eui';
import { DatasourceLayerPanelProps } from '../../types';
import { FormBasedPrivateState } from './types';
import { ChangeIndexPattern } from '../../shared_components/dataview_picker/dataview_picker';
import { getSamplingValue } from './utils';
import { RandomSamplingIcon } from './sampling_icon';

export interface FormBasedLayerPanelProps extends DatasourceLayerPanelProps<FormBasedPrivateState> {
state: FormBasedPrivateState;
Expand All @@ -25,6 +27,7 @@ export function LayerPanel({
dataViews,
}: FormBasedLayerPanelProps) {
const layer = state.layers[layerId];
const { euiTheme } = useEuiTheme();

const indexPattern = dataViews.indexPatterns[layer.indexPatternId];
const notFoundTitleLabel = i18n.translate('xpack.lens.layerPanel.missingDataView', {
Expand All @@ -38,6 +41,26 @@ export function LayerPanel({
};
});

const samplingValue = getSamplingValue(layer);
const extraIconLabelProps =
samplingValue !== 1
? {
icon: {
component: (
<RandomSamplingIcon color={euiTheme.colors.disabledText} fill="currentColor" />
),
value: `${samplingValue * 100}%`,
tooltipValue: i18n.translate('xpack.lens.indexPattern.randomSamplingInfo', {
defaultMessage: '{value}% sampling',
values: {
value: samplingValue * 100,
},
}),
'data-test-subj': 'lnsChangeIndexPatternSamplingInfo',
},
}
: {};

return (
<I18nProvider>
<ChangeIndexPattern
Expand All @@ -48,7 +71,7 @@ export function LayerPanel({
'data-test-subj': 'lns_layerIndexPatternLabel',
size: 's',
fontWeight: 'normal',
samplingValue: getSamplingValue(layer),
...extraIconLabelProps,
}}
indexPatternId={layer.indexPatternId}
indexPatternRefs={indexPatternRefs}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,16 @@ export function LayerPanel(
const [datasource] = Object.values(framePublicAPI.datasourceLayers);
const isTextBasedLanguage = Boolean(datasource?.isTextBasedLanguage());

const visualizationLayerSettings = useMemo(
() =>
activeVisualization.hasLayerSettings?.({
layerId,
state: visualizationState,
frame: props.framePublicAPI,
}) || { data: false, appearance: false },
[activeVisualization, layerId, props.framePublicAPI, visualizationState]
);

const compatibleActions = useMemo<LayerAction[]>(
() =>
[
Expand All @@ -341,11 +351,7 @@ export function LayerPanel(
isOnlyLayer,
isTextBasedLanguage,
hasLayerSettings: Boolean(
(activeVisualization.hasLayerSettings?.({
layerId,
state: visualizationState,
frame: props.framePublicAPI,
}) &&
(Object.values(visualizationLayerSettings).some(Boolean) &&
activeVisualization.renderLayerSettings) ||
layerDatasource?.renderLayerSettings
),
Expand All @@ -364,8 +370,8 @@ export function LayerPanel(
layerIndex,
onCloneLayer,
onRemoveLayer,
props.framePublicAPI,
updateVisualization,
visualizationLayerSettings,
visualizationState,
]
);
Expand Down Expand Up @@ -682,22 +688,64 @@ export function LayerPanel(
>
<div id={layerId}>
<div className="lnsIndexPatternDimensionEditor--padded">
{layerDatasource?.renderLayerSettings || visualizationLayerSettings.data ? (
<EuiText
size="s"
css={css`
margin-bottom: ${euiThemeVars.euiSize};
`}
>
<h4>
{i18n.translate('xpack.lens.editorFrame.layerSettings.headingData', {
defaultMessage: 'Data',
})}
</h4>
</EuiText>
) : null}
{layerDatasource?.renderLayerSettings && (
<>
<NativeRenderer
render={layerDatasource.renderLayerSettings}
nativeProps={layerDatasourceConfigProps}
/>
<EuiSpacer size="m" />
</>
)}
{layerDatasource?.renderLayerSettings && visualizationLayerSettings.data ? (
<EuiSpacer size="m" />
) : null}
{activeVisualization?.renderLayerSettings && visualizationLayerSettings.data ? (
<NativeRenderer
render={activeVisualization?.renderLayerSettings}
nativeProps={{
...layerVisualizationConfigProps,
setState: props.updateVisualization,
panelRef: settingsPanelRef,
section: 'data',
}}
/>
) : null}
{visualizationLayerSettings.appearance ? (
<EuiText
size="s"
css={css`
margin-bottom: ${euiThemeVars.euiSize};
`}
>
<h4>
{i18n.translate('xpack.lens.editorFrame.layerSettings.headingAppearance', {
defaultMessage: 'Appearance',
})}
</h4>
</EuiText>
) : null}
{activeVisualization?.renderLayerSettings && (
<NativeRenderer
render={activeVisualization?.renderLayerSettings}
nativeProps={{
...layerVisualizationConfigProps,
setState: props.updateVisualization,
panelRef: settingsPanelRef,
section: 'appearance',
}}
/>
)}
Expand Down
Loading