Skip to content

Commit

Permalink
Final docs pass
Browse files Browse the repository at this point in the history
- more docs copy

- rename file with prop name

- promote caching the various custom elements by pulling them out to top-level `const`s

- remove props/extra demo details that aren't relevant to the toolbar
  • Loading branch information
cee-chen committed Sep 24, 2023
1 parent 2fa8e08 commit ab6e553
Show file tree
Hide file tree
Showing 3 changed files with 157 additions and 187 deletions.
175 changes: 0 additions & 175 deletions src-docs/src/views/datagrid/toolbar/datagrid_custom_toolbar.tsx

This file was deleted.

33 changes: 21 additions & 12 deletions src-docs/src/views/datagrid/toolbar/datagrid_toolbar_example.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ const dataGridToolbarVisibilitySource = require('!!raw-loader!./_grid');
import DataGridControls from './additional_controls';
const dataGridControlsSource = require('!!raw-loader!./additional_controls');

import DataGridCustomToolbar from './datagrid_custom_toolbar';
const dataGridCustomToolbarSource = require('!!raw-loader!./datagrid_custom_toolbar');
import DataGridCustomToolbar from './render_custom_toolbar';
const dataGridCustomToolbarSource = require('!!raw-loader!./render_custom_toolbar');

import ToolbarPropsTable from './_props';

Expand All @@ -20,7 +20,6 @@ import {
EuiDataGridToolBarVisibilityColumnSelectorOptions,
EuiDataGridToolBarVisibilityDisplaySelectorOptions,
EuiDataGridToolBarAdditionalControlsLeftOptions,
EuiDataGridToolbarProps,
EuiDataGridCustomToolbarProps,
} from '!!prop-loader!../../../../../src/components/datagrid/data_grid_types';

Expand Down Expand Up @@ -191,7 +190,7 @@ export const DataGridToolbarExample = {
demo: <DataGridControls />,
},
{
title: 'Custom toolbar layout',
title: 'Completely custom toolbar rendering',
source: [
{
type: GuideSectionTypes.TSX,
Expand All @@ -201,18 +200,28 @@ export const DataGridToolbarExample = {
text: (
<>
<p>
For advanced use cases, the <EuiCode>renderCustomToolbar</EuiCode>
prop for <EuiCode>EuiDataGrid</EuiCode> may be used to take complete
control over the whole toolbar element (by returning a react
element). This may be useful where a custom layout (e.g., all
buttons on the right side) is required. The default individual
controls will be available as function parameters.
If more customized control over the toolbar is required than{' '}
<EuiCode>toolbarVisibility</EuiCode> or{' '}
<EuiCode>additionalControls</EuiCode> allows, you can use the{' '}
<EuiCode>renderCustomToolbar</EuiCode> prop to pass a component. The
default datagrid controls are passed back as parameters for optional
usage.
</p>
<p>
<EuiCode>renderCustomToolbar</EuiCode> should only be used when a
very custom layout (e.g. moving default buttons between sides,
interspering custom controls between default controls, custom
responsive behavior, etc.) is required. We would caution you to keep
consistency in mind also when customizing the toolbar: if using
multiple datagrid instances across your app, users will typically
want to reach for the same controls for each grid. Changing the
available controls inconsistently across your app may result in user
frustration.
</p>
</>
),
demo: <DataGridCustomToolbar />,
props: {
EuiDataGridToolbarProps,
EuiDataGridCustomToolbarProps,
},
snippet: `<EuiDataGrid
Expand All @@ -226,7 +235,7 @@ export const DataGridToolbarExample = {
allowResetButton: false,
additionalDisplaySettings: <div>Custom settings content</div>
}
}}
}}
/>`,
},
{
Expand Down
136 changes: 136 additions & 0 deletions src-docs/src/views/datagrid/toolbar/render_custom_toolbar.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
import React, { useCallback, useState } from 'react';
import { css } from '@emotion/react';
import { faker } from '@faker-js/faker';

import {
EuiDataGrid,
EuiDataGridSorting,
EuiDataGridColumnSortingConfig,
EuiDataGridToolbarProps,
EuiButtonEmpty,
EuiFormRow,
EuiRange,
EuiFlexGroup,
EuiFlexItem,
euiScreenReaderOnly,
} from '../../../../../src';

const raw_data: Array<{ [key: string]: string }> = [];
for (let i = 0; i < 5; i++) {
raw_data.push({
name: `${faker.person.lastName()}, ${faker.person.firstName()}`,
email: faker.internet.email(),
location: `${faker.location.city()}, ${faker.location.country()}`,
date: `${faker.date.past()}`,
amount: faker.commerce.price({ min: 1, max: 1000, dec: 2, symbol: '$' }),
});
}
const columns = [
{ id: 'name', displayAsText: 'Name' },
{ id: 'email', displayAsText: 'Email address' },
{ id: 'location', displayAsText: 'Location' },
{ id: 'date', displayAsText: 'Date' },
{ id: 'amount', displayAsText: 'Amount' },
];

// Custom toolbar renderer
const renderCustomToolbar: EuiDataGridToolbarProps['renderCustomToolbar'] = ({
hasRoomForGridControls,
columnControl,
columnSortingControl,
displayControl,
fullScreenControl,
keyboardShortcutsControl,
}) => {
const mobileStyles =
!hasRoomForGridControls &&
css`
.euiDataGrid__controlBtn .euiButtonEmpty__text {
${euiScreenReaderOnly()}
}
`;
return (
<EuiFlexGroup
responsive={false}
gutterSize="s"
justifyContent="spaceBetween"
alignItems="center"
css={mobileStyles}
>
<EuiFlexItem grow={false}>
{hasRoomForGridControls && (
<EuiButtonEmpty size="xs" color="primary">
Custom left side
</EuiButtonEmpty>
)}
</EuiFlexItem>

<EuiFlexItem grow={false}>
<EuiFlexGroup responsive={false} gutterSize="s" alignItems="center">
<EuiFlexItem grow={false}>{columnControl}</EuiFlexItem>
<EuiFlexItem grow={false}>{columnSortingControl}</EuiFlexItem>
<EuiFlexItem grow={false}>{keyboardShortcutsControl}</EuiFlexItem>
<EuiFlexItem grow={false}>{displayControl}</EuiFlexItem>
<EuiFlexItem grow={false}>{fullScreenControl}</EuiFlexItem>
</EuiFlexGroup>
</EuiFlexItem>
</EuiFlexGroup>
);
};

// Some additional custom settings to show in the Display popover
const AdditionalDisplaySettings = () => {
const [exampleSettingValue, setExampleSettingValue] = useState<number>(10);

return (
<EuiFormRow label="Example additional setting" display="columnCompressed">
<EuiRange
compressed
fullWidth
showInput
min={1}
max={100}
step={1}
value={exampleSettingValue}
data-test-subj="exampleAdditionalSetting"
onChange={(event) => {
setExampleSettingValue(Number(event.currentTarget.value));
}}
/>
</EuiFormRow>
);
};

export default () => {
// Column visibility
const [visibleColumns, setVisibleColumns] = useState(() =>
columns.map(({ id }) => id)
);

// Sorting
const [sortingColumns, setSortingColumns] = useState<
EuiDataGridColumnSortingConfig[]
>([]);
const onSort = useCallback<EuiDataGridSorting['onSort']>((sortingColumns) => {
setSortingColumns(sortingColumns);
}, []);

return (
<EuiDataGrid
aria-label="Data grid custom toolbar demo"
columns={columns}
columnVisibility={{ visibleColumns, setVisibleColumns }}
sorting={{ columns: sortingColumns, onSort }}
rowCount={raw_data.length}
renderCellValue={({ rowIndex, columnId }) => raw_data[rowIndex][columnId]}
gridStyle={{ border: 'none', header: 'underline' }}
renderCustomToolbar={renderCustomToolbar}
toolbarVisibility={{
showDisplaySelector: {
allowResetButton: false,
additionalDisplaySettings: <AdditionalDisplaySettings />,
},
}}
/>
);
};

0 comments on commit ab6e553

Please sign in to comment.