diff --git a/src/components/Exercises/AttachedFilesTable/SupplementaryFilesTableHeaderRow.js b/src/components/Exercises/AttachedFilesTable/SupplementaryFilesTableHeaderRow.js index 8423aa24a..ffb94f210 100644 --- a/src/components/Exercises/AttachedFilesTable/SupplementaryFilesTableHeaderRow.js +++ b/src/components/Exercises/AttachedFilesTable/SupplementaryFilesTableHeaderRow.js @@ -21,6 +21,7 @@ const SupplementaryFilesTableHeaderRow = () => defaultMessage="Uploaded at" /> + ; export default SupplementaryFilesTableHeaderRow; diff --git a/src/components/Exercises/AttachedFilesTable/SupplementaryFilesTableRow.js b/src/components/Exercises/AttachedFilesTable/SupplementaryFilesTableRow.js index fd7807a24..9ebe711a7 100644 --- a/src/components/Exercises/AttachedFilesTable/SupplementaryFilesTableRow.js +++ b/src/components/Exercises/AttachedFilesTable/SupplementaryFilesTableRow.js @@ -2,8 +2,12 @@ import React from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import prettyBytes from 'pretty-bytes'; -import { FormattedDate, FormattedTime } from 'react-intl'; +import { FormattedDate, FormattedTime, FormattedMessage } from 'react-intl'; +import { Button } from 'react-bootstrap'; +import Confirm from '../../../components/forms/Confirm'; +import { DeleteIcon } from '../../../components/icons'; import { downloadSupplementaryFile } from '../../../redux/modules/files'; +import { removeSupplementaryFile } from '../../../redux/modules/supplementaryFiles'; const SupplementaryFilesTableRow = ({ id, @@ -11,7 +15,8 @@ const SupplementaryFilesTableRow = ({ hashName, size, uploadedAt, - downloadFile + downloadFile, + removeSupplementaryFile }) => @@ -27,6 +32,27 @@ const SupplementaryFilesTableRow = ({   + + removeSupplementaryFile(id)} + question={ + + } + className="pull-right" + > + + + ; SupplementaryFilesTableRow.propTypes = { @@ -35,7 +61,8 @@ SupplementaryFilesTableRow.propTypes = { hashName: PropTypes.string.isRequired, size: PropTypes.number.isRequired, uploadedAt: PropTypes.number.isRequired, - downloadFile: PropTypes.func.isRequired + downloadFile: PropTypes.func.isRequired, + removeSupplementaryFile: PropTypes.func.isRequired }; export default connect( @@ -44,6 +71,7 @@ export default connect( downloadFile: e => { e.preventDefault(); dispatch(downloadSupplementaryFile(id)); - } + }, + removeSupplementaryFile: fileId => dispatch(removeSupplementaryFile(fileId)) }) )(SupplementaryFilesTableRow); diff --git a/src/components/forms/Confirm/Confirm.js b/src/components/forms/Confirm/Confirm.js index 8547929d0..7e34cad02 100644 --- a/src/components/forms/Confirm/Confirm.js +++ b/src/components/forms/Confirm/Confirm.js @@ -32,15 +32,13 @@ class Confirm extends Component { id, yes = ( - - {' '} + {' '} ), no = ( - - {' '} + {' '} ) @@ -52,8 +50,12 @@ class Confirm extends Component {
- - + +
@@ -62,9 +64,12 @@ class Confirm extends Component { } render() { - const { children } = this.props; + const { children, className = '' } = this.props; return ( - + {React.cloneElement(children, { onClick: e => this.askForConfirmation(e) })} @@ -87,7 +92,8 @@ Confirm.propTypes = { question: stringOrFormattedMessage.isRequired, yes: stringOrFormattedMessage, no: stringOrFormattedMessage, - children: PropTypes.element.isRequired + children: PropTypes.element.isRequired, + className: PropTypes.string }; export default Confirm; diff --git a/src/redux/modules/supplementaryFiles.js b/src/redux/modules/supplementaryFiles.js index bc5e28a83..3ad0feb22 100644 --- a/src/redux/modules/supplementaryFiles.js +++ b/src/redux/modules/supplementaryFiles.js @@ -17,7 +17,9 @@ export const actionTypes = { ADD_FILES: 'recodex/supplementaryFiles/ADD_FILES', ADD_FILES_PENDING: 'recodex/supplementaryFiles/ADD_FILES_PENDING', ADD_FILES_FULFILLED: 'recodex/supplementaryFiles/ADD_FILES_FULFILLED', - ADD_FILES_FAILED: 'recodex/supplementaryFiles/ADD_FILES_REJECTED' + ADD_FILES_FAILED: 'recodex/supplementaryFiles/ADD_FILES_REJECTED', + REMOVE_FILE: 'recodex/supplementaryFiles/REMOVE_FILE', + REMOVE_FILE_FULFILLED: 'recodex/supplementaryFiles/REMOVE_FILE_FULFILLED' }; export const fetchSupplementaryFilesForExercise = exerciseId => @@ -42,6 +44,14 @@ export const addSupplementaryFiles = (exerciseId, files) => } }); +export const removeSupplementaryFile = fileId => + createApiAction({ + type: actionTypes.REMOVE_FILE, + endpoint: `/uploaded-files/${fileId}`, + method: 'DELETE', + meta: { fileId } + }); + /** * Reducer */ @@ -56,7 +66,11 @@ const reducer = handleActions( createRecord({ data, state: resourceStatus.FULFILLED }) ), state - ) + ), + [actionTypes.REMOVE_FILE_FULFILLED]: ( + state, + { payload, meta: { fileId } } + ) => state.deleteIn(['resources', fileId]) }), initialState );