Skip to content

Commit aca759e

Browse files
committed
feat: add column for full name for masters students
1 parent 541a661 commit aca759e

File tree

10 files changed

+69
-28
lines changed

10 files changed

+69
-28
lines changed

src/components/GradesView/GradebookTable/Fields.jsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,16 @@ Username.propTypes = {
2929
};
3030

3131
/**
32-
* Fields.Email
33-
* Simple label field for email value.
34-
* @param {string} email - email for display
32+
* Fields.SimpleText
33+
* Simple label field for text value.
34+
* @param {string} value - value for display
3535
*/
36-
const Email = ({ email }) => <span className="wrap-text-in-cell">{email}</span>;
37-
Email.propTypes = {
38-
email: PropTypes.string.isRequired,
36+
const SimpleText = ({ value }) => (<span className="wrap-text-in-cell">{value}</span>);
37+
SimpleText.propTypes = {
38+
value: PropTypes.string.isRequired,
3939
};
4040

4141
export default StrictDict({
42-
Email,
42+
SimpleText,
4343
Username,
4444
});

src/components/GradesView/GradebookTable/Fields.test.jsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,13 @@ describe('Gradebook Table Fields', () => {
4141
});
4242
});
4343

44-
describe('Email', () => {
45-
const email = '[email protected]';
44+
describe('SimpleText', () => {
45+
const value = '[email protected]';
4646
test('snapshot', () => {
47-
expect(shallow(<Fields.Email email={email} />)).toMatchSnapshot();
47+
expect(shallow(<Fields.SimpleText value={value} />)).toMatchSnapshot();
4848
});
49-
test('wraps entry email', () => {
50-
expect(shallow(<Fields.Email email={email} />).text()).toEqual(email);
49+
test('wraps entry value', () => {
50+
expect(shallow(<Fields.SimpleText value={value} />).text()).toEqual(value);
5151
});
5252
});
5353
});

src/components/GradesView/GradebookTable/__snapshots__/Fields.test.jsx.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

3-
exports[`Gradebook Table Fields Email snapshot 1`] = `
3+
exports[`Gradebook Table Fields SimpleText snapshot 1`] = `
44
<span
55
className="wrap-text-in-cell"
66
>

src/components/GradesView/GradebookTable/__snapshots__/test.jsx.snap

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@ exports[`GradebookTable component snapshot - fields1 and 2 between email and tot
1212
"Header": <UsernameLabelReplacement />,
1313
"accessor": "Username",
1414
},
15+
Object {
16+
"Header": <FormattedMessage
17+
defaultMessage="Full Name*"
18+
description="Gradebook table full name column header"
19+
id="gradebook.GradesView.table.headings.fullName"
20+
/>,
21+
"accessor": "Full Name",
22+
},
1523
Object {
1624
"Header": <FormattedMessage
1725
defaultMessage="Email*"

src/components/GradesView/GradebookTable/index.jsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ export class GradebookTable extends React.Component {
3939
label = <LabelReplacements.UsernameLabelReplacement />;
4040
} else if (heading === Headings.email) {
4141
label = <FormattedMessage {...messages.emailHeading} />;
42+
} else if (heading === Headings.fullName) {
43+
label = <FormattedMessage {...messages.fullNameHeading} />;
4244
} else {
4345
label = heading;
4446
}
@@ -49,7 +51,8 @@ export class GradebookTable extends React.Component {
4951
[Headings.username]: (
5052
<Fields.Username username={entry.username} userKey={entry.external_user_key} />
5153
),
52-
[Headings.email]: (<Fields.Email email={entry.email} />),
54+
[Headings.fullName]: (<Fields.SimpleText value={entry.full_name} />),
55+
[Headings.email]: (<Fields.SimpleText value={entry.email} />),
5356
[Headings.totalGrade]: `${roundGrade(entry.percent * 100)}${getLocalizedPercentSign()}`,
5457
...entry.section_breakdown.reduce((acc, subsection) => ({
5558
...acc,

src/components/GradesView/GradebookTable/messages.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import { defineMessages } from '@edx/frontend-platform/i18n';
22

33
const messages = defineMessages({
4+
fullNameHeading: {
5+
id: 'gradebook.GradesView.table.headings.fullName',
6+
defaultMessage: 'Full Name*',
7+
description: 'Gradebook table full name column header',
8+
},
49
emailHeading: {
510
id: 'gradebook.GradesView.table.headings.email',
611
defaultMessage: 'Email*',

src/components/GradesView/GradebookTable/test.jsx

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jest.mock('./Fields', () => ({
2222
__esModule: true,
2323
default: {
2424
Username: () => 'Fields.Username',
25-
Email: () => 'Fields.Email',
25+
SimpleText: () => 'Fields.SimpleText',
2626
},
2727
}));
2828
jest.mock('./LabelReplacements', () => ({
@@ -75,6 +75,7 @@ describe('GradebookTable', () => {
7575
],
7676
headings: [
7777
Headings.username,
78+
Headings.fullName,
7879
Headings.email,
7980
fields.field1,
8081
fields.field2,
@@ -104,17 +105,22 @@ describe('GradebookTable', () => {
104105
expect(heading.accessor).toEqual(Headings.username);
105106
expect(heading.Header.type).toEqual(LabelReplacements.UsernameLabelReplacement);
106107
});
107-
test('email sets key and Header from header', () => {
108+
test('full name sets key and Header from header', () => {
108109
const heading = headings[1];
110+
expect(heading.accessor).toEqual(Headings.fullName);
111+
expect(heading.Header).toEqual(<FormattedMessage {...messages.fullNameHeading} />);
112+
});
113+
test('email sets key and Header from header', () => {
114+
const heading = headings[2];
109115
expect(heading.accessor).toEqual(Headings.email);
110116
expect(heading.Header).toEqual(<FormattedMessage {...messages.emailHeading} />);
111117
});
112118
test('subsections set key and Header from header', () => {
113-
expect(headings[2]).toEqual({ accessor: fields.field1, Header: fields.field1 });
114-
expect(headings[3]).toEqual({ accessor: fields.field2, Header: fields.field2 });
119+
expect(headings[3]).toEqual({ accessor: fields.field1, Header: fields.field1 });
120+
expect(headings[4]).toEqual({ accessor: fields.field2, Header: fields.field2 });
115121
});
116122
test('totalGrade sets key and replaces Header with component', () => {
117-
const heading = headings[4];
123+
const heading = headings[5];
118124
expect(heading.accessor).toEqual(Headings.totalGrade);
119125
expect(heading.Header.type).toEqual(LabelReplacements.TotalGradeLabelReplacement);
120126
});
@@ -139,10 +145,15 @@ describe('GradebookTable', () => {
139145
userKey: entry.external_user_key,
140146
});
141147
});
142-
test('email set to Email Field', () => {
148+
test('fullName set to SimpleText Field', () => {
149+
const field = row[Headings.fullName];
150+
expect(field.type).toEqual(Fields.SimpleText);
151+
expect(field.props).toEqual({ value: entry.full_name });
152+
});
153+
test('email set to SimpleText Field', () => {
143154
const field = row[Headings.email];
144-
expect(field.type).toEqual(Fields.Email);
145-
expect(field.props).toEqual({ email: entry.email });
155+
expect(field.type).toEqual(Fields.SimpleText);
156+
expect(field.props).toEqual({ value: entry.email });
146157
});
147158
test('totalGrade set to rounded percent grade * 100', () => {
148159
expect(

src/data/constants/grades.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,25 @@ import { StrictDict } from 'utils';
33
const EMAIL_HEADING = 'Email';
44
const TOTAL_COURSE_GRADE_HEADING = 'Total Grade (%)';
55
const USERNAME_HEADING = 'Username';
6+
const FULL_NAME_HEADING = 'Full Name';
67

78
const GradeFormats = StrictDict({
89
absolute: 'absolute',
910
percent: 'percent',
1011
});
1112

1213
const Headings = StrictDict({
13-
email: 'Email',
14-
totalGrade: 'Total Grade (%)',
15-
username: 'Username',
14+
email: EMAIL_HEADING,
15+
totalGrade: TOTAL_COURSE_GRADE_HEADING,
16+
username: USERNAME_HEADING,
17+
fullName: FULL_NAME_HEADING,
1618
});
1719

1820
export {
1921
EMAIL_HEADING,
2022
TOTAL_COURSE_GRADE_HEADING,
2123
USERNAME_HEADING,
24+
FULL_NAME_HEADING,
2225
GradeFormats,
2326
Headings,
2427
};

src/data/selectors/grades.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,17 @@ export const headingMapper = (category, label = 'All') => {
105105
} else {
106106
filter = filters.byLabel;
107107
}
108-
const { username, email, totalGrade } = Headings;
108+
const {
109+
username,
110+
fullName,
111+
email,
112+
totalGrade,
113+
} = Headings;
109114
const filteredLabels = (entry) => entry.filter(filter).map(s => s.label);
110115

111116
return (entry) => (
112117
entry
113-
? [username, email, ...filteredLabels(entry), totalGrade]
118+
? [username, fullName, email, ...filteredLabels(entry), totalGrade]
114119
: []
115120
);
116121
};

src/data/selectors/grades.test.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { EMAIL_HEADING, TOTAL_COURSE_GRADE_HEADING, USERNAME_HEADING } from '../constants/grades';
1+
import {
2+
EMAIL_HEADING,
3+
FULL_NAME_HEADING,
4+
TOTAL_COURSE_GRADE_HEADING,
5+
USERNAME_HEADING,
6+
} from '../constants/grades';
27
import { formatDateForDisplay } from '../actions/utils';
38
import * as selectors from './grades';
49
import exportedSelectors from './grades';
@@ -179,6 +184,7 @@ describe('grades selectors', () => {
179184
describe('headingMapper', () => {
180185
const expectedHeaders = (subsectionLabels) => ([
181186
USERNAME_HEADING,
187+
FULL_NAME_HEADING,
182188
EMAIL_HEADING,
183189
...subsectionLabels,
184190
TOTAL_COURSE_GRADE_HEADING,

0 commit comments

Comments
 (0)