• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

CSCfi / metadata-submitter-frontend / 20331691855

18 Dec 2025 09:07AM UTC coverage: 55.065% (-3.3%) from 58.346%
20331691855

push

github

Hang Le
Update dependency @vitest/coverage-v8 to v4 (merge commit)

Merge branch 'renovate/vitest-coverage-v8-4.x' into 'main'
* Update dependency @vitest/coverage-v8 to v4

See merge request https://gitlab.ci.csc.fi/sds-dev/sd-submit/metadata-submitter-frontend/-/merge_requests/1182

Approved-by: Liisa Lado-Villar <145-lilado@users.noreply.gitlab.ci.csc.fi>
Co-authored-by: renovate-bot <group_183_bot_aa67d732ac40e4c253df6728543b928a@noreply.gitlab.ci.csc.fi>
Merged by Hang Le <lhang@csc.fi>

476 of 1055 branches covered (45.12%)

Branch coverage included in aggregate %.

1307 of 2183 relevant lines covered (59.87%)

8.04 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

58.33
/src/components/DataTable.tsx
1
import React from "react"
2

3
import Box from "@mui/material/Box"
4
import Stack from "@mui/material/Stack"
5
import { styled } from "@mui/material/styles"
6
import { DataGrid, GridColDef, GridSortModel } from "@mui/x-data-grid"
7
import { useTranslation } from "react-i18next"
8

9
import WizardPagination from "components/SubmissionWizard/WizardComponents/WizardPagination"
10
import type { SubmissionRow, DataBucketRow, DataFileRow } from "types"
11

12
const Table = styled(DataGrid)(({ theme }) => ({
6✔
13
  "& .MuiDataGrid-columnSeparator, & .MuiDataGrid-cell:last-of-type": {
14
    display: "none",
15
  },
16
  "& .MuiDataGrid-columnHeaders .MuiDataGrid-columnHeader": {
17
    backgroundColor: theme.palette.common.white,
18
    "&:hover": {
19
      color: theme.palette.primary.main,
20
      backgroundColor: theme.palette.primary.lightest,
21
      "& .MuiDataGrid-sortIcon": {
22
        color: theme.palette.primary.main,
23
      },
24
    },
25
    flex: "1 1 auto",
26
  },
27
  "& .MuiDataGrid-columnHeaderTitle": {
28
    fontWeight: 700,
29
  },
30
  "& .MuiDataGrid-columnHeaderTitleContainer": {
31
    padding: 0,
32
    justifyContent: "left",
33
    "& .MuiDataGrid-sortIcon": {
34
      color: theme.palette.text.primary,
35
      fontSize: "2rem",
36
    },
37
  },
38
  "& .MuiDataGrid-actionsCell": {
39
    color: theme.palette.primary.main,
40
    alignItems: "flex-start",
41
    [theme.breakpoints.down("sm")]: {
42
      display: "flex",
43
      flexDirection: "column",
44
      gridGap: 0,
45
      "& .MuiMenuItem-root.MuiMenuItem-gutters.MuiButtonBase-root": { minHeight: "0 !important" },
46
    },
47
  },
48
  "& .MuiDataGrid-actionsCell > *": {
49
    padding: 0,
50
    marginRight: theme.spacing(1),
51
    "&:last-child": {
52
      marginRight: 0,
53
    },
54
    "& .MuiButtonBase-root": {
55
      backgroundColor: "transparent",
56
    },
57
    "&:hover": { backgroundColor: "theme.palette.action.hover" },
58
  },
59
  "& .MuiMenuItem-root .MuiListItemIcon-root": {
60
    minWidth: "unset",
61
    marginRight: theme.spacing(0.5),
62
  },
63
  "& .MuiDataGrid-overlayWrapper": { height: "10rem" },
64
  "& .MuiDataGrid-row:hover": {
65
    cursor: "pointer",
66
    backgroundColor: theme.palette.primary.lightest,
67
  },
68
}))
69

70
type DataTableProps = {
71
  columns: GridColDef[]
72
  rows: Array<SubmissionRow | DataBucketRow | DataFileRow>
73
  page?: number
74
  totalItems?: number
75
  sortingModel: GridSortModel
76
  fetchPageOnChange?: (page: number) => void
77
}
78

79
/*
80
 * Render a customizable table of data such as Submission, Data bucket, REMS
81
 */
82
const DataTable: React.FC<DataTableProps> = props => {
6✔
83
  const { columns, rows, totalItems, sortingModel, fetchPageOnChange } = props
4✔
84
  const { t } = useTranslation()
4✔
85

86
  const [paginationModel, setPaginationModel] = React.useState({ pageSize: 5, page: 0 })
4✔
87
  const [sortModel, setSortModel] = React.useState<GridSortModel>(sortingModel)
4✔
88

89
  const handleChangePage = (_e: unknown, newPage: number) => {
4✔
90
    fetchPageOnChange ? fetchPageOnChange(newPage) : null
×
91
    setPaginationModel(prev => ({ ...prev, page: newPage }))
×
92
  }
93

94
  const DataGridPagination = () =>
4✔
95
    totalItems && paginationModel.page !== undefined && paginationModel.pageSize ? (
4!
96
      <WizardPagination
97
        totalNumberOfItems={totalItems}
98
        page={paginationModel.page}
99
        itemsPerPage={paginationModel.pageSize}
100
        handleChangePage={handleChangePage}
101
        handleItemsPerPageChange={e =>
102
          setPaginationModel(prev => ({
×
103
            ...prev,
104
            pageSize: parseInt(e.target.value, 10),
105
            page: 0,
106
          }))
107
        }
108
      />
109
    ) : null
110

111
  const NoRowsOverlay = () => (
4✔
112
    <Stack height="100%" alignItems="center" justifyContent="center">
8✔
113
      {t("dataTable.noResults")}
114
    </Stack>
115
  )
116

117
  return (
4✔
118
    <Box sx={{ display: "flex" }}>
119
      <Table
120
        rows={rows}
121
        columns={columns}
122
        disableRowSelectionOnClick
123
        disableColumnMenu
124
        disableColumnFilter
125
        disableColumnSelector
126
        hideFooterSelectedRowCount
127
        slots={{
128
          pagination: DataGridPagination,
129
          noRowsOverlay: NoRowsOverlay,
130
        }}
131
        paginationModel={paginationModel}
132
        onPaginationModelChange={newPaginationModel => setPaginationModel(newPaginationModel)}
×
133
        sortModel={sortModel}
134
        onSortModelChange={(newSortModel: GridSortModel) => setSortModel(newSortModel)}
×
135
      />
136
    </Box>
137
  )
138
}
139

140
export default DataTable
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc