Skip to content

Commit 32be24c

Browse files
committed
feat: don't show masters-only columns for courses without a masters track
1 parent 6778948 commit 32be24c

File tree

4 files changed

+70
-23
lines changed

4 files changed

+70
-23
lines changed

src/data/selectors/grades.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,11 @@ export const formatMinAssignmentGrade = (percentGrade, options) => (
9292
* @param {string} label - assignment filter label
9393
* @return {string[]} - list of table headers
9494
*/
95-
export const headingMapper = (category, label = 'All') => {
95+
export const headingMapper = (
96+
category,
97+
label = 'All',
98+
hasMastersTrack = false,
99+
) => {
96100
const filters = {
97101
all: section => section.label,
98102
byCategory: section => section.label && section.category === category,
@@ -105,17 +109,25 @@ export const headingMapper = (category, label = 'All') => {
105109
} else {
106110
filter = filters.byLabel;
107111
}
112+
108113
const {
109114
username,
110115
fullName,
111116
email,
112117
totalGrade,
113118
} = Headings;
119+
let userIdentificationHeadings;
120+
if (hasMastersTrack) {
121+
userIdentificationHeadings = [username, fullName, email];
122+
} else {
123+
userIdentificationHeadings = [username];
124+
}
125+
114126
const filteredLabels = (entry) => entry.filter(filter).map(s => s.label);
115127

116128
return (entry) => (
117129
entry
118-
? [username, fullName, email, ...filteredLabels(entry), totalGrade]
130+
? [...userIdentificationHeadings, ...filteredLabels(entry), totalGrade]
119131
: []
120132
);
121133
};

src/data/selectors/grades.test.js

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -182,35 +182,45 @@ describe('grades selectors', () => {
182182
});
183183

184184
describe('headingMapper', () => {
185-
const expectedHeaders = (subsectionLabels) => ([
185+
const expectedMastersHeaders = (subsectionLabels) => ([
186186
USERNAME_HEADING,
187187
FULL_NAME_HEADING,
188188
EMAIL_HEADING,
189189
...subsectionLabels,
190190
TOTAL_COURSE_GRADE_HEADING,
191191
]);
192192

193+
const expectedNonMastersHeaders = (subsectionLabels) => ([
194+
USERNAME_HEADING,
195+
...subsectionLabels,
196+
TOTAL_COURSE_GRADE_HEADING,
197+
]);
193198
const rows = genericResultsRows;
194199
const selector = selectors.headingMapper;
195-
it('creates headers for all assignments when no filtering is applied', () => {
196-
expect(selector('All')(genericResultsRows)).toEqual(
197-
expectedHeaders([rows[0].label, rows[1].label, rows[2].label]),
198-
);
199-
});
200-
it('creates headers for only matching assignment types when type filter is applied', () => {
201-
expect(
202-
selector('Homework')(genericResultsRows),
203-
).toEqual(
204-
expectedHeaders([rows[0].label, rows[1].label]),
205-
);
206-
});
207-
it('creates headers for only matching assignment when label filter is applied', () => {
208-
expect(selector('Homework', rows[1].label)(rows)).toEqual(
209-
expectedHeaders([rows[1].label]),
210-
);
211-
});
212-
it('returns an empty array when no entries are passed', () => {
213-
expect(selector('all')(undefined)).toEqual([]);
200+
[true, false].forEach((isMasters) => {
201+
const expectedHeaders = isMasters ? expectedMastersHeaders : expectedNonMastersHeaders;
202+
describe(isMasters ? 'Masters' : 'Not Masters', () => {
203+
it('creates headers for all assignments when no filtering is applied', () => {
204+
expect(selector('All', 'All', isMasters)(genericResultsRows)).toEqual(
205+
expectedHeaders([rows[0].label, rows[1].label, rows[2].label]),
206+
);
207+
});
208+
it('creates headers for only matching assignment types when type filter is applied', () => {
209+
expect(
210+
selector('Homework', 'All', isMasters)(genericResultsRows),
211+
).toEqual(
212+
expectedHeaders([rows[0].label, rows[1].label]),
213+
);
214+
});
215+
it('creates headers for only matching assignment when label filter is applied', () => {
216+
expect(selector('Homework', rows[1].label, isMasters)(rows)).toEqual(
217+
expectedHeaders([rows[1].label]),
218+
);
219+
});
220+
it('returns an empty array when no entries are passed', () => {
221+
expect(selector('all')(undefined)).toEqual([]);
222+
});
223+
});
214224
});
215225
});
216226

src/data/selectors/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ export const formattedGradeLimits = (state) => {
109109
export const getHeadings = (state) => grades.headingMapper(
110110
filters.assignmentType(state) || 'All',
111111
filters.selectedAssignmentLabel(state) || 'All',
112+
tracks.stateHasMastersTrack(state),
112113
)(grades.getExampleSectionBreakdown(state));
113114

114115
/**

src/data/selectors/index.test.js

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,20 +295,27 @@ describe('root selectors', () => {
295295
const selector = moduleSelectors.getHeadings;
296296
beforeEach(() => {
297297
selectors.grades.headingMapper = jest.fn(
298-
(type, label) => (breakdown) => ({ headingMapper: { type, label, breakdown } }),
298+
(type, label, hasMastersTrack) => (breakdown) => ({
299+
headingMapper: {
300+
type, label, hasMastersTrack, breakdown,
301+
},
302+
}),
299303
);
300304
selectors.filters.assignmentType = jest.fn();
301305
selectors.filters.selectedAssignmentLabel = jest.fn();
306+
selectors.tracks.stateHasMastersTrack = jest.fn();
302307
selectors.grades.getExampleSectionBreakdown = mockFn('getExampleSectionBreakdown');
303308
});
304309
describe('no assignmentType or label selected', () => {
305310
it('maps selected filters into getExampleSectionBreakdown', () => {
306311
selectors.filters.assignmentType.mockReturnValue(undefined);
307312
selectors.filters.selectedAssignmentLabel.mockReturnValue(undefined);
313+
selectors.tracks.stateHasMastersTrack.mockReturnValue(false);
308314
expect(selector(testState)).toEqual({
309315
headingMapper: {
310316
type: 'All',
311317
label: 'All',
318+
hasMastersTrack: false,
312319
breakdown: { getExampleSectionBreakdown: testState },
313320
},
314321
});
@@ -318,10 +325,27 @@ describe('root selectors', () => {
318325
it('maps selected filters into getExampleSectionBreakdown', () => {
319326
selectors.filters.assignmentType.mockReturnValue(mockAssignmentType);
320327
selectors.filters.selectedAssignmentLabel.mockReturnValue(mockAssignmentLabel);
328+
selectors.tracks.stateHasMastersTrack.mockReturnValue(false);
321329
expect(selector(testState)).toEqual({
322330
headingMapper: {
323331
type: mockAssignmentType,
324332
label: mockAssignmentLabel,
333+
hasMastersTrack: false,
334+
breakdown: { getExampleSectionBreakdown: testState },
335+
},
336+
});
337+
});
338+
});
339+
describe('has masters track', () => {
340+
it('maps selected filters into getExampleSectionBreakdown', () => {
341+
selectors.filters.assignmentType.mockReturnValue(undefined);
342+
selectors.filters.selectedAssignmentLabel.mockReturnValue(undefined);
343+
selectors.tracks.stateHasMastersTrack.mockReturnValue(true);
344+
expect(selector(testState)).toEqual({
345+
headingMapper: {
346+
type: 'All',
347+
label: 'All',
348+
hasMastersTrack: true,
325349
breakdown: { getExampleSectionBreakdown: testState },
326350
},
327351
});

0 commit comments

Comments
 (0)