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

[Data Grid] - Styling built into data grid, full screen mode #2230

Merged
merged 30 commits into from
Sep 5, 2019
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
9ab846f
style selector dropdown uses hooks, new icon added, full screen mode
snide Aug 15, 2019
5842787
snaps
snide Aug 15, 2019
9d28b8a
setState return
thompsongl Aug 15, 2019
73bd35c
Merge pull request #9 from thompsongl/design/toolbar
snide Aug 15, 2019
0afdb3f
full screen kinda. need to rework a lot of this. just playing with co…
snide Aug 16, 2019
95c48d1
cleaup. grid now works in small containers
snide Aug 28, 2019
a38dd47
only set column widths initially, not on resize
snide Aug 28, 2019
c6ee314
more cleanup, density controls now merge!
snide Aug 29, 2019
b75d97e
Merge remote-tracking branch 'upstream/feature/euidatagrid' into desi…
snide Aug 29, 2019
ae53136
cleanup of docs and sass
snide Aug 30, 2019
272729c
fixed focus trap issues
Sep 3, 2019
4575bd8
Performance fix to avoid re-processing rows unaffected by changing ce…
chandlerprall Sep 3, 2019
22346c5
fix hook problems in datagrid
chandlerprall Sep 3, 2019
e32fe28
Fixed EuiDataGrid tests
chandlerprall Sep 3, 2019
742730b
feedback
snide Sep 4, 2019
e1391a5
fix drag and drop focus issue / coloring
snide Sep 4, 2019
497ce23
Update position of aria-label[ledby] in EuiDataGrid's role=grid
chandlerprall Sep 4, 2019
87f423b
style selector i18n
snide Sep 4, 2019
82c49e4
euiDataGrid i18n
snide Sep 4, 2019
a98779a
column selector i18n
snide Sep 4, 2019
278510e
full screen check
snide Sep 4, 2019
ed66269
const for screen width
snide Sep 4, 2019
9f2dce1
sass lint, stupid vim
snide Sep 4, 2019
c47a4ed
ie11 fixes and some i18n stuffs
snide Sep 4, 2019
698956f
Fix/update datagrid tests' popover helper utils
chandlerprall Sep 5, 2019
1550e28
Update EuiI18n types around defaults & children callback to provide m…
chandlerprall Sep 5, 2019
9f5cd07
fix for focus trap styles. hat tip to chandler
snide Sep 5, 2019
d32c8e2
Update src/components/datagrid/column_selector.tsx
snide Sep 5, 2019
ad66a76
Update src/components/datagrid/column_selector.tsx
snide Sep 5, 2019
36a9be2
fix ci, update docs
snide Sep 5, 2019
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
2 changes: 1 addition & 1 deletion src-docs/src/views/datagrid/datagrid.js
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ export default class DataGrid extends Component {
];

this.state = {
borderSelected: 'all',
borderSelected: 'none',
fontSizeSelected: 'm',
cellPaddingSelected: 'm',
stripes: false,
Expand Down
3 changes: 3 additions & 0 deletions src-docs/src/views/icon/icons.js
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,9 @@ const iconTypes = [
'submodule',
'symlink',
'tableOfContents',
'tableDensityComfortable',
snide marked this conversation as resolved.
Show resolved Hide resolved
'tableDensityCompact',
'tableDensityNormal',
'tag',
'tear',
'temperature',
Expand Down
70 changes: 63 additions & 7 deletions src/components/datagrid/__snapshots__/data_grid.test.tsx.snap
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,9 @@ exports[`EuiDataGrid pagination renders 1`] = `
`;

exports[`EuiDataGrid rendering renders with common and div attributes 1`] = `
Array [
<div
class="euiDataGrid euiDataGrid--bordersAll euiDataGrid--headerShade euiDataGrid--rowHoverHighlight testClass1 testClass2"
>
<div
class="euiDataGrid__controls"
>
Expand All @@ -131,7 +133,7 @@ Array [
class="euiPopover__anchor"
>
<button
class="euiButtonEmpty euiButtonEmpty--primary euiButtonEmpty--small"
class="euiButtonEmpty euiButtonEmpty--text euiButtonEmpty--xSmall"
type="button"
>
<span
Expand All @@ -149,16 +151,70 @@ Array [
<span
class="euiButtonEmpty__text"
>
Columns
Fields
</span>
</span>
</button>
</div>
</div>
</div>,
<div
class="euiPopover euiPopover--anchorDownCenter"
data-test-subj="dataGridColumnSelectorPopover"
>
<div
class="euiPopover__anchor"
>
<button
class="euiButtonEmpty euiButtonEmpty--text euiButtonEmpty--xSmall"
type="button"
>
<span
class="euiButtonEmpty__content"
>
<svg
aria-hidden="true"
class="euiIcon euiIcon--medium euiIcon-isLoading euiButtonEmpty__icon"
focusable="false"
height="16"
viewBox="0 0 16 16"
width="16"
xmlns="http://www.w3.org/2000/svg"
/>
<span
class="euiButtonEmpty__text"
>
Density
</span>
</span>
</button>
</div>
</div>
<button
class="euiButtonEmpty euiButtonEmpty--text euiButtonEmpty--xSmall"
type="button"
>
<span
class="euiButtonEmpty__content"
>
<svg
aria-hidden="true"
class="euiIcon euiIcon--medium euiIcon-isLoading euiButtonEmpty__icon"
focusable="false"
height="16"
viewBox="0 0 16 16"
width="16"
xmlns="http://www.w3.org/2000/svg"
/>
<span
class="euiButtonEmpty__text"
>
Full screen
</span>
</span>
</button>
</div>
<div
aria-label="aria-label"
class="euiDataGrid euiDataGrid--bordersAll euiDataGrid--headerShade euiDataGrid--rowHoverHighlight testClass1 testClass2"
data-test-subj="test subject string"
role="grid"
>
Expand Down Expand Up @@ -270,6 +326,6 @@ Array [
<div
class="euiSpacer euiSpacer--s"
/>
</div>,
]
</div>
</div>
`;
14 changes: 13 additions & 1 deletion src/components/datagrid/_data_grid.scss
Original file line number Diff line number Diff line change
@@ -1,11 +1,22 @@
.euiDataGrid--fullScreen {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: $euiZModal;
background: $euiColorEmptyShade;
}

.euiDataGrid__content {
@include euiScrollBar;

font-feature-settings: 'tnum' 1; // Tabular numbers
overflow-x: auto;
scroll-padding: 0;
max-width: 100%;
width: 100%;
background: $euiColorLightestShade;
background: $euiPageBackgroundColor;
}

.euiDataGrid__controls {
Expand All @@ -16,4 +27,5 @@
border-top: $euiBorderThin;
border-right: $euiBorderThin;
border-left: $euiBorderThin;
padding: $euiSizeXS;
}
7 changes: 4 additions & 3 deletions src/components/datagrid/column_selector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,11 @@ export const useColumnSelector = (
button={
<Fragment>
<EuiButtonEmpty
size="s"
iconType="list"
size="xs"
iconType="kqlField"
color="text"
onClick={() => setIsOpen(!isOpen)}>
Columns
Fields
</EuiButtonEmpty>
</Fragment>
}>
Expand Down
70 changes: 34 additions & 36 deletions src/components/datagrid/data_grid.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import React, {
useState,
useRef,
useEffect,
Fragment,
} from 'react';
import classNames from 'classnames';
import { EuiDataGridHeaderRow } from './data_grid_header_row';
Expand All @@ -15,31 +14,24 @@ import {
EuiDataGridColumn,
EuiDataGridColumnWidths,
EuiDataGridPaginationProps,
EuiDataGridStyle,
EuiDataGridStyleBorders,
EuiDataGridStyleCellPaddings,
EuiDataGridStyleFontSizes,
EuiDataGridStyleHeader,
EuiDataGridStyleRowHover,
} from './data_grid_types';
import { EuiDataGridCellProps } from './data_grid_cell';
import { keyCodes } from '../../services';
import { EuiSpacer } from '../spacer';
// @ts-ignore-next-line
import { EuiButtonEmpty } from '../button';
import { EuiDataGridBody } from './data_grid_body';
import { useColumnSelector } from './column_selector';
import { useStyleSelector } from './style_selector';
// @ts-ignore-next-line
import { EuiTablePagination } from '../table/table_pagination';

// Types for styling options, passed down through the `gridStyle` prop
type EuiDataGridStyleFontSizes = 's' | 'm' | 'l';
type EuiDataGridStyleBorders = 'all' | 'horizontal' | 'none';
type EuiDataGridStyleHeader = 'shade' | 'underline';
type EuiDataGridStyleRowHover = 'highlight' | 'none';
type EuiDataGridStyleCellPaddings = 's' | 'm' | 'l';

interface EuiDataGridStyle {
fontSize?: EuiDataGridStyleFontSizes;
border?: EuiDataGridStyleBorders;
stripes?: boolean;
header?: EuiDataGridStyleHeader;
rowHover?: EuiDataGridStyleRowHover;
cellPadding?: EuiDataGridStyleCellPaddings;
}

type CommonGridProps = CommonProps &
HTMLAttributes<HTMLDivElement> & {
columns: EuiDataGridColumn[];
Expand Down Expand Up @@ -153,6 +145,8 @@ export const EuiDataGrid: FunctionComponent<EuiDataGridProps> = props => {
}
}, []);

const [isFullScreen, setIsFullScreen] = useState(false);

const [focusedCell, setFocusedCell] = useState<[number, number]>(ORIGIN);
const onCellFocus = useCallback(
(x: number, y: number) => {
Expand Down Expand Up @@ -200,37 +194,42 @@ export const EuiDataGrid: FunctionComponent<EuiDataGridProps> = props => {
rowCount,
renderCellValue,
className,
gridStyle = {},
gridStyle,
pagination,
...rest
} = props;

const fontSize = gridStyle.fontSize || 'm';
const border = gridStyle.border || 'all';
const header = gridStyle.header || 'shade';
const rowHover = gridStyle.rowHover || 'highlight';
const stripes = gridStyle.stripes ? true : false;
const cellPadding = gridStyle.cellPadding || 'm';
const [ColumnSelector, visibleColumns] = useColumnSelector(columns);
const [StyleSelector, gridStyles] = useStyleSelector(gridStyle);
thompsongl marked this conversation as resolved.
Show resolved Hide resolved

const classes = classNames(
'euiDataGrid',
fontSizesToClassMap[fontSize],
bordersToClassMap[border],
headerToClassMap[header],
rowHoverToClassMap[rowHover],
cellPaddingsToClassMap[cellPadding],
fontSizesToClassMap[gridStyles.fontSize || 'm'],
bordersToClassMap[gridStyles.border || 'all'],
headerToClassMap[gridStyles.header || 'shade'],
rowHoverToClassMap[gridStyles.rowHover || 'highlight'],
cellPaddingsToClassMap[gridStyles.cellPadding || 'm'],
{
'euiDataGrid--stripes': gridStyles.stripes || false,
},
{
'euiDataGrid--stripes': stripes,
'euiDataGrid--fullScreen': isFullScreen,
},
className
);

const [ColumnSelector, visibleColumns] = useColumnSelector(columns);

return (
<Fragment>
<div className={classes}>
<div className="euiDataGrid__controls">
<ColumnSelector />
<StyleSelector />
<EuiButtonEmpty
size="xs"
iconType="fullScreen"
color="text"
onClick={() => setIsFullScreen(!isFullScreen)}>
Full screen
</EuiButtonEmpty>
</div>
{/* Unsure why this element causes errors as focus follows spec */}
{/* eslint-disable-next-line jsx-a11y/interactive-supports-focus */}
Expand All @@ -239,8 +238,7 @@ export const EuiDataGrid: FunctionComponent<EuiDataGridProps> = props => {
onKeyDown={handleKeyDown}
ref={gridRef}
// {...label}
{...rest}
className={classes}>
{...rest}>
<div className="euiDataGrid__content">
<EuiDataGridHeaderRow
columns={visibleColumns}
Expand All @@ -260,6 +258,6 @@ export const EuiDataGrid: FunctionComponent<EuiDataGridProps> = props => {
<EuiSpacer size="s" />
{renderPagination(props)}
</div>
</Fragment>
</div>
);
};
15 changes: 15 additions & 0 deletions src/components/datagrid/data_grid_types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,18 @@ export interface EuiDataGridPaginationProps {
onChangeItemsPerPage: (itemsPerPage: number) => void;
onChangePage: (pageIndex: number) => void;
}
// Types for styling options, passed down through the `gridStyle` prop
export type EuiDataGridStyleFontSizes = 's' | 'm' | 'l';
export type EuiDataGridStyleBorders = 'all' | 'horizontal' | 'none';
export type EuiDataGridStyleHeader = 'shade' | 'underline';
export type EuiDataGridStyleRowHover = 'highlight' | 'none';
export type EuiDataGridStyleCellPaddings = 's' | 'm' | 'l';

export interface EuiDataGridStyle {
fontSize: EuiDataGridStyleFontSizes;
border: EuiDataGridStyleBorders;
stripes: boolean;
header: EuiDataGridStyleHeader;
rowHover: EuiDataGridStyleRowHover;
cellPadding: EuiDataGridStyleCellPaddings;
}
Loading