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

[Dashboard][Collapsable Panels] Responsive layout #200771

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
da31420
[Dashboard][Collapsable Panels] Responsive layout
mbondyra Nov 21, 2024
3f272f1
fixes https://github.com/elastic/kibana/pull/200771#discussion_r18530…
mbondyra Nov 22, 2024
d8a85fe
refactor `isRsponsive` and move the subjects
mbondyra Nov 22, 2024
f8cf272
display instead of transform (TBD)
mbondyra Nov 22, 2024
e1f3ade
extract GridRowSummary
mbondyra Nov 22, 2024
cd143d7
separate subscriptions
mbondyra Nov 22, 2024
76fe5ad
[CI] Auto-commit changed files from 'node scripts/eslint --no-cache -…
kibanamachine Nov 22, 2024
337c22f
=set Edit default mode
mbondyra Nov 25, 2024
577bae8
reversed display:none in favor of translate for maximizing the panel …
mbondyra Nov 25, 2024
d3793b6
changed the classname from kbnGrid--nonInteractive to kbnGrid--static
mbondyra Nov 25, 2024
faf4263
Merge commit 'fcf319e7c447f3fe5057461a33d4a814ebc6a2c8' into dashboar…
mbondyra Nov 25, 2024
fbaf3de
Merge branch 'main' into dashboard/collapsible_panels/maximize_panel
mbondyra Nov 25, 2024
2e49430
Merge branch 'dashboard/collapsible_panels/maximize_panel' of github.…
mbondyra Nov 25, 2024
24d0b94
make the ref local
mbondyra Nov 25, 2024
600e177
fix scrolling after resizing
mbondyra Nov 25, 2024
4827f5c
Merge commit 'e0607f7fadd0147a1372da62584a585d21e3eda8' into dashboar…
mbondyra Nov 26, 2024
53ee088
divide subscriptions
mbondyra Nov 26, 2024
e073619
update the view/edit mode when switching between the mode in mobile view
mbondyra Nov 26, 2024
6e22deb
separate subscription for a row
mbondyra Nov 27, 2024
5bdbb9f
move subscriptions to a single useEffect
mbondyra Nov 27, 2024
97eb603
naming
mbondyra Nov 27, 2024
17abcc6
GridRowHeader name
mbondyra Nov 27, 2024
5134fcd
fix non-adapting height
mbondyra Nov 27, 2024
1c95802
just some whitespaces
mbondyra Nov 27, 2024
e959031
experiment to check out: https://caniuse.com/?search=fill-available
mbondyra Nov 27, 2024
2a8c9e5
Revert "experiment to check out: https://caniuse.com/?search=fill-ava…
mbondyra Nov 28, 2024
45568de
Merge commit 'ac6025eaa1b5e0e733bab0110b60928e27ee6860' into dashboar…
mbondyra Nov 28, 2024
b68b89d
remove the not-needed code
mbondyra Nov 28, 2024
9583785
using flex outside of the plugin
mbondyra Nov 28, 2024
1029888
a lil refactoring
mbondyra Nov 28, 2024
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
54 changes: 53 additions & 1 deletion examples/grid_example/public/app.tsx
Heenawter marked this conversation as resolved.
Show resolved Hide resolved
Heenawter marked this conversation as resolved.
Show resolved Hide resolved
Heenawter marked this conversation as resolved.
Show resolved Hide resolved
Heenawter marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ import {
EuiPageTemplate,
EuiProvider,
EuiSpacer,
EuiButtonGroup,
EuiButtonIcon,
} from '@elastic/eui';
import { AppMountParameters } from '@kbn/core-application-browser';
import { CoreStart } from '@kbn/core-lifecycle-browser';
Expand All @@ -46,6 +48,8 @@ const DASHBOARD_GRID_COLUMN_COUNT = 48;
export const GridExample = ({ coreStart }: { coreStart: CoreStart }) => {
const savedState = useRef<MockSerializedDashboardState>(getSerializedDashboardState());
const [hasUnsavedChanges, setHasUnsavedChanges] = useState<boolean>(false);
const [expandedPanelId, setExpandedPanelId] = useState<string | undefined>();
const [isResponsive, setIsResponsive] = useState<boolean>(true);
const [currentLayout, setCurrentLayout] = useState<GridLayoutData>(
dashboardInputToGridLayout(savedState.current)
);
Expand All @@ -72,6 +76,7 @@ export const GridExample = ({ coreStart }: { coreStart: CoreStart }) => {
<div style={{ padding: 8 }}>{id}</div>
<EuiButtonEmpty
onClick={() => {
setExpandedPanelId(undefined);
mockDashboardApi.removePanel(id);
}}
>
Expand All @@ -81,6 +86,7 @@ export const GridExample = ({ coreStart }: { coreStart: CoreStart }) => {
</EuiButtonEmpty>
<EuiButtonEmpty
onClick={async () => {
setExpandedPanelId(undefined);
const newPanelId = await getPanelId({
coreStart,
suggestion: id,
Expand All @@ -92,10 +98,25 @@ export const GridExample = ({ coreStart }: { coreStart: CoreStart }) => {
defaultMessage: 'Replace panel',
})}
</EuiButtonEmpty>
<EuiButtonIcon
iconType={expandedPanelId ? 'minimize' : 'expand'}
onClick={() => setExpandedPanelId((expandedId) => (expandedId ? undefined : id))}
aria-label={
expandedPanelId
? i18n.translate('examples.gridExample.minimizePanel', {
defaultMessage: 'Minimize panel {id}',
values: { id },
})
: i18n.translate('examples.gridExample.maximizePanel', {
defaultMessage: 'Maximize panel {id}',
values: { id },
})
}
/>
</>
);
},
[coreStart, mockDashboardApi]
[coreStart, mockDashboardApi, setExpandedPanelId, expandedPanelId]
);

return (
Expand Down Expand Up @@ -132,6 +153,7 @@ export const GridExample = ({ coreStart }: { coreStart: CoreStart }) => {
<EuiFlexItem grow={false}>
<EuiButton
onClick={async () => {
setExpandedPanelId(undefined);
const panelId = await getPanelId({
coreStart,
suggestion: uuidv4(),
Expand All @@ -146,6 +168,34 @@ export const GridExample = ({ coreStart }: { coreStart: CoreStart }) => {
</EuiFlexItem>
<EuiFlexItem grow={false}>
<EuiFlexGroup gutterSize="xs" alignItems="center">
<EuiFlexItem grow={false}>
<EuiButtonGroup
legend={i18n.translate('examples.gridExample.layoutOptionsLegend', {
defaultMessage: 'Layout options',
})}
options={[
{
id: 'responsive',
label: i18n.translate('examples.gridExample.responsiveLayoutOption', {
defaultMessage: 'Responsive layout',
}),
toolTipContent:
'The layout adjusts when the window is resized. Panel interactivity, such as moving and resizing within the grid, is disabled.',
},
{
id: 'fixed',
label: i18n.translate('examples.gridExample.fixedLayoutOption', {
defaultMessage: 'Fixed layout',
}),
toolTipContent: 'The layout does not adjust when the window is resized.',
},
Heenawter marked this conversation as resolved.
Show resolved Hide resolved
]}
idSelected={isResponsive ? 'responsive' : 'fixed'}
onChange={(id) => {
setIsResponsive(id === 'responsive');
}}
/>
</EuiFlexItem>
{hasUnsavedChanges && (
<EuiFlexItem grow={false}>
<EuiBadge color="warning">
Expand Down Expand Up @@ -190,6 +240,8 @@ export const GridExample = ({ coreStart }: { coreStart: CoreStart }) => {
</EuiFlexGroup>
<EuiSpacer size="m" />
<GridLayout
isResponsive={isResponsive}
expandedPanelId={expandedPanelId}
layout={currentLayout}
gridSettings={{
gutterSize: DASHBOARD_MARGIN_SIZE,
Expand Down
23 changes: 22 additions & 1 deletion packages/kbn-grid-layout/grid/grid_height_smoother.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,12 @@
import { css } from '@emotion/react';
import React, { PropsWithChildren, useEffect, useRef } from 'react';
import { combineLatest } from 'rxjs';
import { euiThemeVars } from '@kbn/ui-theme';
import { GridLayoutStateManager } from './types';

const getViewportHeight = () =>
window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
Heenawter marked this conversation as resolved.
Show resolved Hide resolved

export const GridHeightSmoother = ({
children,
gridLayoutStateManager,
Expand All @@ -22,8 +26,25 @@ export const GridHeightSmoother = ({
const subscription = combineLatest([
gridLayoutStateManager.gridDimensions$,
gridLayoutStateManager.interactionEvent$,
]).subscribe(([dimensions, interactionEvent]) => {
gridLayoutStateManager.expandedPanelId$,
Heenawter marked this conversation as resolved.
Show resolved Hide resolved
]).subscribe(([dimensions, interactionEvent, expandedPanelId]) => {
if (!smoothHeightRef.current) return;

if (expandedPanelId) {
const viewPortHeight = getViewportHeight();
const smoothHeightRefY = smoothHeightRef.current.getBoundingClientRect().y;

// When panel is expanded, ensure the page occupies the full viewport height, no more, no less, so
// smoothHeight height = viewport height - smoothHeight position - EuiPanel padding.

const height = viewPortHeight - smoothHeightRefY - parseFloat(euiThemeVars.euiSizeL);
smoothHeightRef.current.style.height = height + 'px';
smoothHeightRef.current.style.transition = 'none';
return;
} else {
smoothHeightRef.current.style.transition = '';
Heenawter marked this conversation as resolved.
Show resolved Hide resolved
}

if (!interactionEvent) {
smoothHeightRef.current.style.height = `${dimensions.height}px`;
return;
Expand Down
45 changes: 44 additions & 1 deletion packages/kbn-grid-layout/grid/grid_layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,18 @@

import { cloneDeep } from 'lodash';
import React, { useEffect, useMemo, useState } from 'react';
import { combineLatest, distinctUntilChanged, filter, map, pairwise, skip } from 'rxjs';
import classNames from 'classnames';
import {
BehaviorSubject,
combineLatest,
distinctUntilChanged,
filter,
map,
pairwise,
skip,
} from 'rxjs';

import { css } from '@emotion/react';
import { GridHeightSmoother } from './grid_height_smoother';
import { GridRow } from './grid_row';
import { GridLayoutData, GridSettings } from './types';
Expand All @@ -24,17 +34,42 @@ interface GridLayoutProps {
gridSettings: GridSettings;
renderPanelContents: (panelId: string) => React.ReactNode;
onLayoutChange: (newLayout: GridLayoutData) => void;
expandedPanelId?: string;
isResponsive?: boolean;
}

export const GridLayout = ({
layout,
gridSettings,
renderPanelContents,
onLayoutChange,
expandedPanelId,
isResponsive,
}: GridLayoutProps) => {
const expandedPanelId$ = useMemo(
() => new BehaviorSubject<string | undefined>(expandedPanelId),
// eslint-disable-next-line react-hooks/exhaustive-deps
[]
);
useEffect(() => {
expandedPanelId$.next(expandedPanelId);
}, [expandedPanelId, expandedPanelId$]);

const isResponsive$ = useMemo(
() => new BehaviorSubject<boolean>(Boolean(isResponsive)),
// eslint-disable-next-line react-hooks/exhaustive-deps
[]
);

useEffect(() => {
isResponsive$.next(Boolean(isResponsive));
}, [isResponsive, isResponsive$]);
Heenawter marked this conversation as resolved.
Show resolved Hide resolved

const { gridLayoutStateManager, setDimensionsRef } = useGridLayoutState({
layout,
gridSettings,
expandedPanelId$,
isResponsive$,
});
useGridLayoutEvents({ gridLayoutStateManager });

Expand Down Expand Up @@ -132,12 +167,20 @@ export const GridLayout = ({
});
}, [rowCount, gridLayoutStateManager, renderPanelContents]);

const gridClassNames = classNames('kbnGrid', {
'kbnGrid--nonInteractive': expandedPanelId || isResponsive,
});

return (
<GridHeightSmoother gridLayoutStateManager={gridLayoutStateManager}>
<div
ref={(divElement) => {
setDimensionsRef(divElement);
}}
className={gridClassNames}
css={css`
height: 100%;
`}
>
{children}
</div>
Expand Down
Loading