grommet/grommet

View on GitHub
src/js/components/DataTable/stories/Controlled.js

Summary

Maintainability
C
1 day
Test Coverage
import React from 'react';

import { Box, DataTable, CheckBox } from 'grommet';

// Source code for the data can be found here
// https://github.com/grommet/grommet/blob/master/src/js/components/DataTable/stories/data.js
import { columns, DATA } from './data';

const controlledColumns = columns.map((col) => ({ ...col }));
delete controlledColumns[0].footer;
delete controlledColumns[3].footer;
delete controlledColumns[4].footer;
delete controlledColumns[4].aggregate;

export const ControlledDataTable = () => {
  const [checked, setChecked] = React.useState([]);

  const onCheck = (event, value) => {
    if (event.target.checked) {
      setChecked([...checked, value]);
    } else {
      setChecked(checked.filter((item) => item !== value));
    }
  };

  const onCheckAll = (event) =>
    setChecked(event.target.checked ? DATA.map((datum) => datum.name) : []);

  return (
    // Uncomment <Grommet> lines when using outside of storybook
    // <Grommet theme={grommet}>
    <Box align="center" pad="medium">
      <DataTable
        columns={[
          {
            property: 'checkbox',
            render: ({ name }) => (
              <CheckBox
                key={name}
                checked={checked.indexOf(name) !== -1}
                onChange={(e) => onCheck(e, name)}
                aria-label="row checkbox"
              />
            ),
            header: (
              <CheckBox
                checked={checked.length === DATA.length}
                indeterminate={
                  checked.length > 0 && checked.length < DATA.length
                }
                onChange={onCheckAll}
                aria-label="header checkbox"
              />
            ),
            sortable: false,
          },
          ...controlledColumns,
        ].map((col) => ({ ...col }))}
        data={DATA}
        sortable
        size="medium"
      />
    </Box>
    // </Grommet>
  );
};

ControlledDataTable.storyName = 'Controlled';

export default {
  title: 'Visualizations/DataTable/Controlled',
};