Merge pull request #113 from edx/matthugs/add-configurability-of-bulk-management-features
Add support for waffling off bulk management
This commit is contained in:
@@ -683,7 +683,7 @@ export default class Gradebook extends React.Component {
|
||||
options={[{ label: 'Percent', value: 'percent' }, { label: 'Absolute', value: 'absolute' }]}
|
||||
onChange={this.props.toggleFormat}
|
||||
/>
|
||||
{this.props.showDownloadButtons && (
|
||||
{this.props.showBulkManagement && (
|
||||
<div>
|
||||
<StatefulButton
|
||||
buttonType="primary"
|
||||
@@ -904,7 +904,6 @@ Gradebook.defaultProps = {
|
||||
errorFetchingGradeOverrideHistory: false,
|
||||
totalUsersCount: null,
|
||||
filteredUsersCount: null,
|
||||
showDownloadButtons: false,
|
||||
};
|
||||
|
||||
Gradebook.propTypes = {
|
||||
@@ -990,7 +989,6 @@ Gradebook.propTypes = {
|
||||
})),
|
||||
totalUsersCount: PropTypes.number,
|
||||
filteredUsersCount: PropTypes.number,
|
||||
showDownloadButtons: PropTypes.bool,
|
||||
initializeFilters: PropTypes.func.isRequired,
|
||||
updateGradesIfAssignmentGradeFiltersSet: PropTypes.func.isRequired,
|
||||
updateCourseGradeFilter: PropTypes.func.isRequired,
|
||||
|
||||
@@ -105,8 +105,7 @@ const mapStateToProps = (state, ownProps) => (
|
||||
'',
|
||||
uploadSuccess: !!(state.grades.bulkManagement &&
|
||||
state.grades.bulkManagement.uploadSuccess),
|
||||
showBulkManagement: stateHasMastersTrack(state),
|
||||
showDownloadButtons: stateHasMastersTrack(state),
|
||||
showBulkManagement: stateHasMastersTrack(state) && state.config.bulkManagementAvailable,
|
||||
bulkManagementHistory: getBulkManagementHistory(state),
|
||||
totalUsersCount: state.grades.totalUsersCount,
|
||||
filteredUsersCount: state.grades.filteredUsersCount,
|
||||
|
||||
@@ -4,12 +4,17 @@ import {
|
||||
ERROR_FETCHING_ASSIGNMENT_TYPES,
|
||||
GOT_ARE_GRADES_FROZEN,
|
||||
} from '../constants/actionTypes/assignmentTypes';
|
||||
import GOT_BULK_MANAGEMENT_CONFIG from '../constants/actionTypes/config';
|
||||
import LmsApiService from '../services/LmsApiService';
|
||||
|
||||
const startedFetchingAssignmentTypes = () => ({ type: STARTED_FETCHING_ASSIGNMENT_TYPES });
|
||||
const errorFetchingAssignmentTypes = () => ({ type: ERROR_FETCHING_ASSIGNMENT_TYPES });
|
||||
const gotAssignmentTypes = assignmentTypes => ({ type: GOT_ASSIGNMENT_TYPES, assignmentTypes });
|
||||
const gotGradesFrozen = areGradesFrozen => ({ type: GOT_ARE_GRADES_FROZEN, areGradesFrozen });
|
||||
const gotBulkManagementConfig = bulkManagementEnabled => ({
|
||||
type: GOT_BULK_MANAGEMENT_CONFIG,
|
||||
data: bulkManagementEnabled,
|
||||
});
|
||||
|
||||
const fetchAssignmentTypes = courseId => (
|
||||
(dispatch) => {
|
||||
@@ -19,6 +24,7 @@ const fetchAssignmentTypes = courseId => (
|
||||
.then((data) => {
|
||||
dispatch(gotAssignmentTypes(Object.keys(data.assignment_types)));
|
||||
dispatch(gotGradesFrozen(data.grades_frozen));
|
||||
dispatch(gotBulkManagementConfig(data.can_see_bulk_management));
|
||||
})
|
||||
.catch(() => {
|
||||
dispatch(errorFetchingAssignmentTypes());
|
||||
|
||||
@@ -11,6 +11,7 @@ import {
|
||||
ERROR_FETCHING_ASSIGNMENT_TYPES,
|
||||
GOT_ARE_GRADES_FROZEN,
|
||||
} from '../constants/actionTypes/assignmentTypes';
|
||||
import GOT_BULK_MANAGEMENT_CONFIG from '../constants/actionTypes/config';
|
||||
|
||||
const mockStore = configureMockStore([thunk]);
|
||||
const axiosMock = new MockAdapter(apiClient);
|
||||
@@ -42,12 +43,14 @@ describe('actions', () => {
|
||||
},
|
||||
},
|
||||
grades_frozen: false,
|
||||
can_see_bulk_management: true,
|
||||
};
|
||||
it('dispatches success action after fetching fetchAssignmentTypes', () => {
|
||||
const expectedActions = [
|
||||
{ type: STARTED_FETCHING_ASSIGNMENT_TYPES },
|
||||
{ type: GOT_ASSIGNMENT_TYPES, assignmentTypes: Object.keys(responseData.assignment_types) },
|
||||
{ type: GOT_ARE_GRADES_FROZEN, areGradesFrozen: responseData.grades_frozen },
|
||||
{ type: GOT_BULK_MANAGEMENT_CONFIG, data: true },
|
||||
];
|
||||
const store = mockStore();
|
||||
|
||||
@@ -79,6 +82,7 @@ describe('actions', () => {
|
||||
{ type: STARTED_FETCHING_ASSIGNMENT_TYPES },
|
||||
{ type: GOT_ASSIGNMENT_TYPES, assignmentTypes: Object.keys(responseData.assignment_types) },
|
||||
{ type: GOT_ARE_GRADES_FROZEN, areGradesFrozen: true },
|
||||
{ type: GOT_BULK_MANAGEMENT_CONFIG, data: true },
|
||||
];
|
||||
const store = mockStore();
|
||||
responseData.grades_frozen = true;
|
||||
|
||||
3
src/data/constants/actionTypes/config.js
Normal file
3
src/data/constants/actionTypes/config.js
Normal file
@@ -0,0 +1,3 @@
|
||||
const GOT_BULK_MANAGEMENT_CONFIG = 'GOT_BULK_MANAGEMENT_CONFIG';
|
||||
|
||||
export default GOT_BULK_MANAGEMENT_CONFIG;
|
||||
15
src/data/reducers/config.js
Normal file
15
src/data/reducers/config.js
Normal file
@@ -0,0 +1,15 @@
|
||||
import GOT_BULK_MANAGEMENT_CONFIG from '../constants/actionTypes/config';
|
||||
|
||||
const reducer = (state = {}, action) => {
|
||||
switch (action.type) {
|
||||
case GOT_BULK_MANAGEMENT_CONFIG:
|
||||
return {
|
||||
...state,
|
||||
bulkManagementAvailable: action.data,
|
||||
};
|
||||
default:
|
||||
return state;
|
||||
}
|
||||
};
|
||||
|
||||
export default reducer;
|
||||
@@ -6,6 +6,7 @@ import tracks from './tracks';
|
||||
import assignmentTypes from './assignmentTypes';
|
||||
import roles from './roles';
|
||||
import filters from './filters';
|
||||
import config from './config';
|
||||
|
||||
const rootReducer = combineReducers({
|
||||
grades,
|
||||
@@ -14,6 +15,7 @@ const rootReducer = combineReducers({
|
||||
assignmentTypes,
|
||||
roles,
|
||||
filters,
|
||||
config,
|
||||
});
|
||||
|
||||
export default rootReducer;
|
||||
|
||||
Reference in New Issue
Block a user