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

[Discover] Update layout for unified histogram #139446

Merged
Show file tree
Hide file tree
Changes from 31 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
58862e7
[Discover] Replace view mode toggle group with tabs
davismcphee Aug 25, 2022
3ef0c2f
[Discover] Clean up new Discover tabs
davismcphee Aug 25, 2022
45d66b9
[Discover] Refactor layout to have resizable sections
davismcphee Aug 25, 2022
bab3dc7
[Discover] Getting histogram resizing to work
davismcphee Aug 25, 2022
a2c4cdd
[Discover] Set panel sizes on load
davismcphee Aug 26, 2022
5605075
[Discover] Create discover_main_content component
davismcphee Aug 26, 2022
f528233
[Discover] Improve layout resizing so chart stays fixed when window i…
davismcphee Aug 26, 2022
a0bd4b1
[Discover] Clean up Discover layout resize code, and implement auto r…
davismcphee Aug 26, 2022
6d11c20
[Discover] Improving mobile support
davismcphee Aug 26, 2022
08c4c52
[Discover] Simplify histogram layout
davismcphee Aug 27, 2022
f4a7218
[Discover] Fix field stats layout
davismcphee Aug 27, 2022
69da3fc
[Discover] Comment flexbox CSS fix
davismcphee Aug 27, 2022
9f1eecb
[Discover] Refactor discover_main_content to include a fixed panels l…
davismcphee Aug 29, 2022
ef60218
[Discover] Fix Discover layout performance issues when resizing to an…
davismcphee Sep 1, 2022
197dcaa
[Discover] Refactor reverse portals usage to clean things up
davismcphee Sep 1, 2022
6395d8a
[Discover] Rename Discover panel tsx files
davismcphee Sep 1, 2022
7abe3e4
[Discover] Rollback unnecessary css change
davismcphee Sep 1, 2022
7acc29e
[Discover] Fix component names for Discover layout
davismcphee Sep 1, 2022
7ddd66b
[Discover] Fix broken discover_layout Jest test
davismcphee Sep 7, 2022
17df871
[Discover] Decoupled discover_panels from discover_main_content to im…
davismcphee Sep 7, 2022
bc79f5b
[Discover] Clean up discover panels for testing
davismcphee Sep 8, 2022
f8d6098
[Discover] Add Discover panels Jest tests
davismcphee Sep 8, 2022
4cef14c
[Discover] Clean up Jest tests
davismcphee Sep 8, 2022
6386012
[Discover] Add functional test for resizable layout panels
davismcphee Sep 8, 2022
fe4c5a4
[Discover] Fix broken discover_layout Jest tests
davismcphee Sep 8, 2022
75a6601
[Discover] Removing unnecessary CSS in discover_panels_fixed.tsx
davismcphee Sep 8, 2022
d4d3528
Merge branch 'main' into enhancement-discover-unified-histogram-layout
kibanamachine Sep 12, 2022
fbbc618
Merge branch 'main' into enhancement-discover-unified-histogram-layout
davismcphee Sep 12, 2022
b506306
Merge branch 'main' into enhancement-discover-unified-histogram-layout
davismcphee Sep 12, 2022
03cf671
[Discover] Fix issue where resizable panels with extra whitespace are…
davismcphee Sep 12, 2022
f81bb09
Merge branch 'main' into enhancement-discover-unified-histogram-layout
davismcphee Sep 12, 2022
5f4ac30
Merge branch 'main' into enhancement-discover-unified-histogram-layout
davismcphee Sep 15, 2022
b074b59
[Discover] Change Discover view mode tabs to use smaller font, and fo…
davismcphee Sep 15, 2022
9592ea5
[Discover] Fix data-test-subj casing for resizable layout work
davismcphee Sep 15, 2022
c7bc6ad
Merge branch 'main' into enhancement-discover-unified-histogram-layout
davismcphee Sep 15, 2022
8c461ae
[CI] Auto-commit changed files from 'node scripts/precommit_hook.js -…
kibanamachine Sep 15, 2022
1da083e
Merge branch 'main' into enhancement-discover-unified-histogram-layout
davismcphee Sep 15, 2022
e957982
Merge branch 'main' into enhancement-discover-unified-histogram-layout
kibanamachine Sep 19, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
import React, { memo, useCallback, useEffect, useRef, useState } from 'react';
import React, { memo, ReactElement, useCallback, useEffect, useRef, useState } from 'react';
import moment from 'moment';
import {
EuiButtonIcon,
Expand All @@ -14,7 +14,6 @@ import {
EuiFlexItem,
EuiPopover,
EuiToolTip,
EuiSpacer,
} from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import type { DataView } from '@kbn/data-views-plugin/public';
Expand All @@ -24,8 +23,6 @@ import { GetStateReturn } from '../../services/discover_state';
import { DiscoverHistogram } from './histogram';
import { DataCharts$, DataTotalHits$ } from '../../hooks/use_saved_search';
import { useChartPanels } from './use_chart_panels';
import { VIEW_MODE, DocumentViewModeToggle } from '../../../../components/view_mode_toggle';
import { SHOW_FIELD_STATISTICS } from '../../../../../common';
import { useDiscoverServices } from '../../../../hooks/use_discover_services';
import {
getVisualizeInformation,
Expand All @@ -36,33 +33,32 @@ const DiscoverHistogramMemoized = memo(DiscoverHistogram);
export const CHART_HIDDEN_KEY = 'discover:chartHidden';

export function DiscoverChart({
className,
resetSavedSearch,
savedSearch,
savedSearchDataChart$,
savedSearchDataTotalHits$,
stateContainer,
dataView,
viewMode,
setDiscoverViewMode,
hideChart,
interval,
isTimeBased,
appendHistogram,
}: {
className?: string;
resetSavedSearch: () => void;
savedSearch: SavedSearch;
savedSearchDataChart$: DataCharts$;
savedSearchDataTotalHits$: DataTotalHits$;
stateContainer: GetStateReturn;
dataView: DataView;
viewMode: VIEW_MODE;
setDiscoverViewMode: (viewMode: VIEW_MODE) => void;
isTimeBased: boolean;
hideChart?: boolean;
interval?: string;
appendHistogram?: ReactElement;
}) {
const { uiSettings, data, storage } = useDiscoverServices();
const { data, storage } = useDiscoverServices();
const [showChartOptionsPopover, setShowChartOptionsPopover] = useState(false);
const showViewModeToggle = uiSettings.get(SHOW_FIELD_STATISTICS) ?? false;

const chartRef = useRef<{ element: HTMLElement | null; moveFocus: boolean }>({
element: null,
Expand Down Expand Up @@ -126,9 +122,15 @@ export function DiscoverChart({
);

return (
<EuiFlexGroup direction="column" alignItems="stretch" gutterSize="none" responsive={false}>
<EuiFlexGroup
className={className}
direction="column"
alignItems="stretch"
gutterSize="none"
responsive={false}
>
<EuiFlexItem grow={false} className="dscResultCount">
<EuiFlexGroup justifyContent="spaceBetween" responsive={false}>
<EuiFlexGroup justifyContent="spaceBetween" gutterSize="none" responsive={false}>
<EuiFlexItem
grow={false}
className="dscResultCount__title eui-textTruncate eui-textNoWrap"
Expand All @@ -139,14 +141,6 @@ export function DiscoverChart({
onResetQuery={resetSavedSearch}
/>
</EuiFlexItem>
{showViewModeToggle && (
<EuiFlexItem grow={false}>
<DocumentViewModeToggle
viewMode={viewMode}
setDiscoverViewMode={setDiscoverViewMode}
/>
</EuiFlexItem>
)}
{isTimeBased && (
<EuiFlexItem className="dscResultCount__toggle" grow={false}>
<EuiFlexGroup direction="row" gutterSize="s" responsive={false}>
Expand Down Expand Up @@ -203,7 +197,7 @@ export function DiscoverChart({
</EuiFlexGroup>
</EuiFlexItem>
{isTimeBased && !hideChart && (
<EuiFlexItem grow={false}>
<EuiFlexItem>
<section
ref={(element) => (chartRef.current.element = element)}
tabIndex={-1}
Expand All @@ -218,7 +212,7 @@ export function DiscoverChart({
stateContainer={stateContainer}
/>
</section>
<EuiSpacer size="s" />
{appendHistogram}
</EuiFlexItem>
)}
</EuiFlexGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import {
isErrorEmbeddable,
} from '@kbn/embeddable-plugin/public';
import type { SavedSearch } from '@kbn/saved-search-plugin/public';
import { EuiFlexItem } from '@elastic/eui';
import { css } from '@emotion/react';
import { useDiscoverServices } from '../../../../hooks/use_discover_services';
import { FIELD_STATISTICS_LOADED } from './constants';
import type { GetStateReturn } from '../../services/discover_state';
Expand Down Expand Up @@ -226,13 +228,22 @@ export const FieldStatisticsTable = (props: FieldStatisticsTableProps) => {
};
}, [embeddable, embeddableRoot, trackUiMetric]);

const statsTableCss = css`
overflow-y: auto;

.kbnDocTableWrapper {
overflow-x: hidden;
}
`;

return (
<div
data-test-subj="dscFieldStatsEmbeddedContent"
ref={embeddableRoot}
style={{ height: '100%', overflowY: 'auto', overflowX: 'hidden' }}
// Match the scroll bar of the Discover doc table
className="kbnDocTableWrapper"
/>
<EuiFlexItem css={statsTableCss}>
<div
data-test-subj="dscFieldStatsEmbeddedContent"
ref={embeddableRoot}
// Match the scroll bar of the Discover doc table
className="kbnDocTableWrapper"
/>
</EuiFlexItem>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,9 @@ discover-app {
}

.dscTimechart {
display: block;
flex-grow: 1;
display: flex;
flex-direction: column;
position: relative;

// SASSTODO: the visualizing component should have an option or a modifier
Expand All @@ -81,13 +83,12 @@ discover-app {
}

.dscHistogram {
height: $euiSize * 7;
padding: 0 $euiSizeS $euiSizeS * 2 $euiSizeS;
flex-grow: 1;
padding: 0 $euiSizeS $euiSizeS $euiSizeS;
}

.dscHistogramTimeRange {
padding: 0 $euiSizeS 0 $euiSizeS;
margin-top: - $euiSizeS;
}

.dscTable {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,24 +172,27 @@ function mountComponent(

describe('Discover component', () => {
test('selected data view without time field displays no chart toggle', () => {
const component = mountComponent(dataViewMock);
expect(component.find('[data-test-subj="discoverChartOptionsToggle"]').exists()).toBeFalsy();
const container = document.createElement('div');
mountComponent(dataViewMock, undefined, { attachTo: container });
expect(container.querySelector('[data-test-subj="discoverChartOptionsToggle"]')).toBeNull();
});

test('selected data view with time field displays chart toggle', () => {
const component = mountComponent(dataViewWithTimefieldMock);
expect(component.find('[data-test-subj="discoverChartOptionsToggle"]').exists()).toBeTruthy();
const container = document.createElement('div');
mountComponent(dataViewWithTimefieldMock, undefined, { attachTo: container });
expect(container.querySelector('[data-test-subj="discoverChartOptionsToggle"]')).not.toBeNull();
});

test('sql query displays no chart toggle', () => {
const component = mountComponent(
const container = document.createElement('div');
mountComponent(
dataViewWithTimefieldMock,
false,
{},
{ attachTo: container },
{ sql: 'SELECT * FROM test' },
true
);
expect(component.find('[data-test-subj="discoverChartOptionsToggle"]').exists()).toBeFalsy();
expect(container.querySelector('[data-test-subj="discoverChartOptionsToggle"]')).toBeNull();
});

test('the saved search title h1 gains focus on navigate', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import {
EuiFlexGroup,
EuiFlexItem,
EuiHideFor,
EuiHorizontalRule,
EuiPage,
EuiPageBody,
EuiPageContent_Deprecated as EuiPageContent,
Expand All @@ -34,20 +33,17 @@ import { SEARCH_FIELDS_FROM_SOURCE, SHOW_FIELD_STATISTICS } from '../../../../..
import { popularizeField } from '../../../../utils/popularize_field';
import { DiscoverTopNav } from '../top_nav/discover_topnav';
import { DocViewFilterFn } from '../../../../services/doc_views/doc_views_types';
import { DiscoverChart } from '../chart';
import { getResultState } from '../../utils/get_result_state';
import { DiscoverUninitialized } from '../uninitialized/uninitialized';
import { DataMainMsg, RecordRawType } from '../../hooks/use_saved_search';
import { useColumns } from '../../../../hooks/use_data_grid_columns';
import { DiscoverDocuments } from './discover_documents';
import { FetchStatus } from '../../../types';
import { useDataState } from '../../hooks/use_data_state';
import { FieldStatisticsTable } from '../field_stats_table';
import { VIEW_MODE } from '../../../../components/view_mode_toggle';
import { DOCUMENTS_VIEW_CLICK, FIELD_STATISTICS_VIEW_CLICK } from '../field_stats_table/constants';
import { hasActiveFilter } from './utils';
import { getRawRecordType } from '../../utils/get_raw_record_type';
import { SavedSearchURLConflictCallout } from '../../../../components/saved_search_url_conflict_callout/saved_search_url_conflict_callout';
import { DiscoverMainContent } from './discover_main_content';

/**
* Local storage key for sidebar persistence state
Expand All @@ -56,8 +52,6 @@ export const SIDEBAR_CLOSED_KEY = 'discover:sidebarClosed';

const SidebarMemoized = React.memo(DiscoverSidebarResponsive);
const TopNavMemoized = React.memo(DiscoverTopNav);
const DiscoverChartMemoized = React.memo(DiscoverChart);
const FieldStatisticsTableMemoized = React.memo(FieldStatisticsTable);

export function DiscoverLayout({
dataView,
Expand Down Expand Up @@ -88,7 +82,7 @@ export function DiscoverLayout({
spaces,
inspector,
} = useDiscoverServices();
const { main$, charts$, totalHits$ } = savedSearchData$;
const { main$ } = savedSearchData$;
const [inspectorSession, setInspectorSession] = useState<InspectorSession | undefined>(undefined);
const dataState: DataMainMsg = useDataState(main$);

Expand All @@ -97,21 +91,6 @@ export function DiscoverLayout({
return state.viewMode ?? VIEW_MODE.DOCUMENT_LEVEL;
}, [uiSettings, state.viewMode]);

const setDiscoverViewMode = useCallback(
(mode: VIEW_MODE) => {
stateContainer.setAppState({ viewMode: mode });

if (trackUiMetric) {
if (mode === VIEW_MODE.AGGREGATED_LEVEL) {
trackUiMetric(METRIC_TYPE.CLICK, FIELD_STATISTICS_VIEW_CLICK);
} else {
trackUiMetric(METRIC_TYPE.CLICK, DOCUMENTS_VIEW_CLICK);
}
}
},
[trackUiMetric, stateContainer]
);

const fetchCounter = useRef<number>(0);

useEffect(() => {
Expand Down Expand Up @@ -219,6 +198,8 @@ export function DiscoverLayout({
}
}, [dataState.error, isPlainRecord]);

const resizeRef = useRef<HTMLDivElement>(null);

return (
<EuiPage className="dscPage" data-fetch-counter={fetchCounter.current}>
<h1
Expand Down Expand Up @@ -303,6 +284,7 @@ export function DiscoverLayout({
</EuiHideFor>
<EuiFlexItem className="dscPageContent__wrapper">
<EuiPageContent
panelRef={resizeRef}
verticalPosition={contentCentered ? 'center' : undefined}
horizontalPosition={contentCentered ? 'center' : undefined}
paddingSize="none"
Expand All @@ -327,61 +309,25 @@ export function DiscoverLayout({
)}
{resultState === 'loading' && <LoadingSpinner />}
{resultState === 'ready' && (
<EuiFlexGroup
className="dscPageContent__inner"
direction="column"
alignItems="stretch"
gutterSize="none"
responsive={false}
>
{!isPlainRecord && (
<>
<EuiFlexItem grow={false}>
<DiscoverChartMemoized
resetSavedSearch={resetSavedSearch}
savedSearch={savedSearch}
savedSearchDataChart$={charts$}
savedSearchDataTotalHits$={totalHits$}
stateContainer={stateContainer}
dataView={dataView}
viewMode={viewMode}
setDiscoverViewMode={setDiscoverViewMode}
hideChart={state.hideChart}
interval={state.interval}
isTimeBased={isTimeBased}
/>
</EuiFlexItem>
<EuiHorizontalRule margin="none" />
</>
)}
{viewMode === VIEW_MODE.DOCUMENT_LEVEL ? (
<DiscoverDocuments
documents$={savedSearchData$.documents$}
expandedDoc={expandedDoc}
dataView={dataView}
navigateTo={navigateTo}
onAddFilter={!isPlainRecord ? (onAddFilter as DocViewFilterFn) : undefined}
savedSearch={savedSearch}
setExpandedDoc={setExpandedDoc}
state={state}
stateContainer={stateContainer}
onFieldEdited={!isPlainRecord ? onFieldEdited : undefined}
/>
) : (
<FieldStatisticsTableMemoized
availableFields$={savedSearchData$.availableFields$}
savedSearch={savedSearch}
dataView={dataView}
query={state.query}
filters={state.filters}
columns={columns}
stateContainer={stateContainer}
onAddFilter={!isPlainRecord ? (onAddFilter as DocViewFilterFn) : undefined}
trackUiMetric={trackUiMetric}
savedSearchRefetch$={savedSearchRefetch$}
/>
)}
</EuiFlexGroup>
<DiscoverMainContent
isPlainRecord={isPlainRecord}
dataView={dataView}
navigateTo={navigateTo}
resetSavedSearch={resetSavedSearch}
expandedDoc={expandedDoc}
setExpandedDoc={setExpandedDoc}
savedSearch={savedSearch}
savedSearchData$={savedSearchData$}
savedSearchRefetch$={savedSearchRefetch$}
state={state}
stateContainer={stateContainer}
isTimeBased={isTimeBased}
viewMode={viewMode}
onAddFilter={onAddFilter as DocViewFilterFn}
onFieldEdited={onFieldEdited}
columns={columns}
resizeRef={resizeRef}
/>
)}
</EuiPageContent>
</EuiFlexItem>
Expand Down
Loading