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
);