mantine-react-table icon indicating copy to clipboard operation
mantine-react-table copied to clipboard

Missing props validation on Cell when defining columns

Open Kretiss opened this issue 1 year ago • 2 comments

mantine-react-table version

v1.0.0

react & react-dom versions

v18.2.0

Describe the bug and the steps to reproduce it

When defining columns for table, I am getting missing props validation from ESlint (first screenshoot). It occuried in earlier beta versions of v1 as well, but it can be turned of by using /* eslint-disable react/prop-types */. Is this bug related to ESlint or table? I have latest version of ESlint, Prettier as well as TypeScript.

Another ESlint warning is react/no-unstable-nested-components (second screenshoot), which can be turned off by last rule in ESlint config I attached.

'react/no-unstable-nested-components': [
      'error',
      {
        allowAsProps: true,
      },
    ],

Basically it complains about React will see a new component type on every render and destroy the entire subtree’s DOM nodes and state. But I need to use some data from hooks, use them to render component for Cell, so I dont know how to do that properly. Is this the right way tho and ESlint just trying to warn me or is this a bad way to do it? I just followed your examples .

Here are my columns:

const columns = useMemo<MRT_ColumnDef<TSpecimen>[]>(
    () => [
      {
        accessorKey: 'mutation',
        header: t('table.mutations'),
        maxSize: 110,
        Cell: ({ cell }) =>
          mutations.find((m) => m.id === Number(cell.getValue<string>()))?.name,
      },
      {
        accessorKey: 'publicationDate',
        header: t('table.publication_date'),
        Cell: ({ cell }) =>
          formatDateWithDashesToString(cell.getValue<string>()),
      },
      {
        accessorKey: 'name',
        header: t('table.name'),
      },
      {
        accessorKey: 'publication',
        header: t('table.publication'),
        maxSize: 110,
        Cell: ({ cell }) =>
          publications.find((p) => p.id === Number(cell.getValue<string>()))
            ?.name,
      },
      {
        accessorKey: 'number',
        header: t('table.number'),
        maxSize: 110,
      },
      {
        accessorKey: 'pagesCount',
        header: t('table.pages_count'),
        maxSize: 110,
      },
      {
        id: `owner${owners[0].name}`,
        accessorKey: 'owner',
        header: owners[0].name,
        Cell: ({ row }) => <OwnersBarCodeCell row={row} ownerRow={0} />,
      },
      {
        id: `owner${owners[1].name}`,
        accessorKey: 'owner',
        header: owners[1].name,
        Cell: ({ row }) => <OwnersBarCodeCell row={row} ownerRow={1} />,
      },
      {
        id: `owner${owners[2].name}`,
        accessorKey: 'owner',
        header: owners[2].name,
        Cell: ({ row }) => <OwnersBarCodeCell row={row} ownerRow={2} />,
      },
      {
        id: `owner${owners[3].name}`,
        accessorKey: 'owner',
        header: owners[3].name,
        Cell: ({ row }) => <OwnersBarCodeCell row={row} ownerRow={3} />,
      },
    ],
    [mutations, publications, t]
  )

Here is rendered component for Cell:

const OwnersBarCodeCell: FC<{
  row: MRT_Row<TSpecimen>
  ownerRow: 0 | 1 | 2 | 3
}> = ({ row, ownerRow }) => {
  const { classes } = useStyles()
  const { t, i18n } = useTranslation()

  return Number(row.original.owner) === owners[ownerRow].id ? (
    <Flex
      sx={(theme) => ({
        gap: theme.spacing.xs,
        alignItems: 'center',
        justifyContent: 'center',
      })}
    >
      {row.original.barCode}
      <Link
        className={classes.link}
        to={`/${i18n.resolvedLanguage}/${t('urls.volume_overview')}/${
          row.original.barCode
        }`}
      >
        <IconFileSymlink size={20} />
      </Link>
      {getSpecimenState(row.original)}
    </Flex>
  ) : undefined
}

Here is ESlint config:

module.exports = {
  settings: {
    react: {
      version: 'detect',
    },
  },
  env: {
    browser: true,
    es2022: true,
  },
  extends: [
    'airbnb',
    'airbnb-typescript',
    'airbnb/hooks',
    'plugin:react/recommended',
    'plugin:@typescript-eslint/recommended',
    'plugin:prettier/recommended',
  ],
  overrides: [],
  parser: '@typescript-eslint/parser',
  parserOptions: {
    ecmaVersion: 'latest',
    sourceType: 'module',
    project: ['./tsconfig.json'],
    tsconfigRootDir: __dirname,
  },
  ignorePatterns: ['vite.config.ts', 'vitest.config.ts'],
  plugins: ['react', '@typescript-eslint', 'prettier'],
  rules: {
    'react/react-in-jsx-scope': 0,
    'react/function-component-definition': 0,
    'react/require-default-props': ['error', { functions: 'defaultArguments' }],
    'prettier/prettier': 'error',
    'import/no-extraneous-dependencies': 0,
    'no-continue': 0,
    '@typescript-eslint/no-unused-vars': 1,
    'react/no-unstable-nested-components': [
      'error',
      {
        allowAsProps: true,
      },
    ],
  },
}

Minimal, Reproducible Example - (Optional, but Recommended)

Described above

Screenshots or Videos (Optional)

obrazek obrazek

Do you intend to try to help solve this bug with your own PR?

None

Terms

  • [X] I understand that if my bug cannot be reliably reproduced in a debuggable environment, it will probably not be fixed and this issue may even be closed.

Kretiss avatar Jul 19 '23 09:07 Kretiss

Did you ever solve this? I'm getting the same thing.

hillac avatar Feb 23 '24 08:02 hillac

getting the same thing in mui MRT

nitzcard avatar Sep 03 '24 07:09 nitzcard

Either turn the lint rule off, or define the component elsewhere statically

KevinVandy avatar Sep 03 '24 17:09 KevinVandy