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

MarkUsProject / Markus / 20243384039

11 Dec 2025 06:21PM UTC coverage: 91.513%. First build
20243384039

Pull #7763

github

web-flow
Merge 9f55e660a into 0d3f24005
Pull Request #7763: Release 2.9.0

914 of 1805 branches covered (50.64%)

Branch coverage included in aggregate %.

1584 of 1666 new or added lines in 108 files covered. (95.08%)

43650 of 46892 relevant lines covered (93.09%)

121.64 hits per line

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

78.85
/app/javascript/Components/course_summaries_table.jsx
1
import React from "react";
2
import Table from "./table/table";
3
import {createColumnHelper, filterFns} from "@tanstack/react-table";
4

5
export class CourseSummaryTable extends React.Component {
6
  constructor(props) {
7
    super(props);
13✔
8
    this.state = {
13✔
9
      showHidden: false,
10
      columnFilters: [{id: "inactive", value: false}],
11
    };
12

13
    this.columnHelper = createColumnHelper();
13✔
14
  }
15

16
  static defaultProps = {
2✔
17
    assessments: [],
18
    marking_schemes: [],
19
    data: [],
20
  };
21
  nameColumns = () => {
13✔
22
    const columnHelper = this.columnHelper;
8✔
23
    return [
8✔
24
      columnHelper.accessor("hidden", {
25
        id: "inactive",
26
        filterFn: (row, columnId, filterValue) => {
27
          // Show all rows if filter true, else only show non-hidden rows
28
          return filterValue || !row.original.hidden;
7✔
29
        },
30
        enableColumnFilter: true,
31
        enableHiding: false,
32
        meta: {
33
          className: "rt-hidden",
34
          headerClassName: "rt-hidden",
35
        },
NEW
36
        cell: () => null,
×
NEW
37
        header: () => null,
×
38
        size: 0,
39
      }),
40
      columnHelper.accessor("user_name", {
41
        id: "user_name",
42
        header: () => I18n.t("activerecord.attributes.user.user_name"),
8✔
43
        enableColumnFilter: true,
44
      }),
45
      columnHelper.accessor("first_name", {
46
        header: () => I18n.t("activerecord.attributes.user.first_name"),
8✔
47
        enableColumnFilter: true,
48
      }),
49
      columnHelper.accessor("last_name", {
50
        header: () => I18n.t("activerecord.attributes.user.last_name"),
8✔
51
        enableColumnFilter: true,
52
      }),
53
    ];
54
  };
55

56
  updateShowHidden = event => {
13✔
57
    let showHidden = event.target.checked;
6✔
58
    let columnFilters = [];
6✔
59

60
    for (let i = 0; i < this.state.columnFilters.length; i++) {
6✔
61
      if (this.state.columnFilters[i].id !== "inactive") {
5✔
62
        columnFilters.push(this.state.columnFilters[i]);
2✔
63
      }
64
    }
65

66
    if (!showHidden) {
6✔
67
      columnFilters.push({id: "inactive", value: false});
3✔
68
    }
69
    this.setState({columnFilters, showHidden});
6✔
70
  };
71

72
  dataColumns = () => {
13✔
73
    const columnHelper = this.columnHelper;
11✔
74
    const columns = [];
11✔
75

76
    this.props.assessments.forEach(data => {
11✔
77
      columns.push(
4✔
78
        columnHelper.accessor(`assessment_marks.${data.id}.mark`, {
79
          filterFn: filterFns.equalsString,
80
          enableColumnFilter: true,
81
          header: () => data.name,
1✔
NEW
82
          cell: info => info.getValue(),
×
83
          meta: {
84
            className: "number",
85
            headerStyle: {textAlign: "right"},
86
          },
87
        })
88
      );
89
    });
90
    this.props.marking_schemes.forEach(data => {
11✔
91
      columns.push(
2✔
92
        columnHelper.accessor(`weighted_marks.${data.id}.mark`, {
93
          filterFn: filterFns.equalsString,
94
          enableColumnFilter: true,
NEW
95
          header: () => data.name,
×
NEW
96
          cell: info => info.getValue(),
×
97
          meta: {
98
            className: "number",
99
            headerStyle: {textAlign: "right"},
100
          },
101
        })
102
      );
103
    });
104
    return columns;
11✔
105
  };
106

107
  render() {
108
    const columns = this.props.student
7✔
109
      ? this.dataColumns()
110
      : [...this.nameColumns(), ...this.dataColumns()];
111

112
    return (
7✔
113
      <>
114
        {!this.props.student && (
13✔
115
          <div key="show-hidden" style={{height: "2em"}}>
116
            <input
117
              id="show_hidden"
118
              name="show_hidden"
119
              type="checkbox"
120
              checked={this.state.showHidden}
121
              onChange={this.updateShowHidden}
122
              style={{marginLeft: "5px", marginRight: "5px"}}
123
            />
124
            <label htmlFor="show_hidden">{I18n.t("students.display_inactive")}</label>
125
          </div>
126
        )}
127
        <Table
128
          data={this.props.data}
129
          columns={columns}
130
          columnFilters={this.state.columnFilters}
131
          onColumnFiltersChange={updaterOrValue => {
NEW
132
            this.setState(prevState => {
×
133
              const newFilters =
NEW
134
                typeof updaterOrValue === "function"
×
135
                  ? updaterOrValue(prevState.columnFilters)
136
                  : updaterOrValue;
NEW
137
              return {columnFilters: newFilters};
×
138
            });
139
          }}
140
          initialState={{sorting: [{id: "user_name", desc: false}]}}
141
          loading={this.props.loading}
142
          className={"auto-overflow"}
NEW
143
          getNoDataProps={() => ({
×
144
            loading: this.props.loading,
145
          })}
146
        />
147
      </>
148
    );
149
  }
150
}
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