mirror of
https://github.com/strapi/strapi.git
synced 2025-12-14 00:29:32 +00:00
Basic delete feature in edit page
This commit is contained in:
parent
c20d0f72f8
commit
9fd67eb1aa
@ -39,6 +39,14 @@
|
|||||||
"config": {
|
"config": {
|
||||||
"policies": []
|
"policies": []
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"method": "DELETE",
|
||||||
|
"path": "/explorer/:model/:id",
|
||||||
|
"handler": "ContentManager.delete",
|
||||||
|
"config": {
|
||||||
|
"policies": []
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -45,7 +45,7 @@ module.exports = {
|
|||||||
|
|
||||||
const entries = await User
|
const entries = await User
|
||||||
.find({
|
.find({
|
||||||
_id
|
id
|
||||||
});
|
});
|
||||||
|
|
||||||
ctx.body = entries;
|
ctx.body = entries;
|
||||||
@ -53,8 +53,15 @@ module.exports = {
|
|||||||
|
|
||||||
update: async(ctx) => {
|
update: async(ctx) => {
|
||||||
const entryUpdated = await User
|
const entryUpdated = await User
|
||||||
.update({_id: ctx.request.body._id}, ctx.request.body);
|
.update({_id: ctx.request.params.id}, ctx.request.body);
|
||||||
|
|
||||||
return ctx.body = entryUpdated;
|
ctx.body = entryUpdated;
|
||||||
|
},
|
||||||
|
|
||||||
|
delete: async(ctx) => {
|
||||||
|
const entryDeleted = await User
|
||||||
|
.remove({_id: ctx.request.params.id});
|
||||||
|
|
||||||
|
ctx.body = entryDeleted;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -12,6 +12,9 @@ import {
|
|||||||
EDIT_RECORD,
|
EDIT_RECORD,
|
||||||
EDIT_RECORD_SUCCESS,
|
EDIT_RECORD_SUCCESS,
|
||||||
EDIT_RECORD_ERROR,
|
EDIT_RECORD_ERROR,
|
||||||
|
DELETE_RECORD,
|
||||||
|
DELETE_RECORD_SUCCESS,
|
||||||
|
DELETE_RECORD_ERROR,
|
||||||
} from './constants';
|
} from './constants';
|
||||||
|
|
||||||
export function setCurrentModelName(currentModelName) {
|
export function setCurrentModelName(currentModelName) {
|
||||||
@ -60,3 +63,21 @@ export function recordEditError() {
|
|||||||
type: EDIT_RECORD_ERROR,
|
type: EDIT_RECORD_ERROR,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function deleteRecord() {
|
||||||
|
return {
|
||||||
|
type: DELETE_RECORD,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function recordDeleted() {
|
||||||
|
return {
|
||||||
|
type: DELETE_RECORD_SUCCESS,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function recordDeleteError() {
|
||||||
|
return {
|
||||||
|
type: DELETE_RECORD_ERROR,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|||||||
@ -13,4 +13,8 @@ export const SET_RECORD_ATTRIBUTE = 'app/Edit/SET_RECORD_ATTRIBUTE';
|
|||||||
|
|
||||||
export const EDIT_RECORD = 'app/Edit/EDIT_RECORD';
|
export const EDIT_RECORD = 'app/Edit/EDIT_RECORD';
|
||||||
export const EDIT_RECORD_SUCCESS = 'app/Edit/EDIT_RECORD_SUCCESS';
|
export const EDIT_RECORD_SUCCESS = 'app/Edit/EDIT_RECORD_SUCCESS';
|
||||||
export const EDIT_RECORD_ERROR = 'app/Edit/EDIT_RECORD_ERROR';
|
export const EDIT_RECORD_ERROR = 'app/Edit/EDIT_RECORD_ERROR';
|
||||||
|
|
||||||
|
export const DELETE_RECORD = 'app/Edit/DELETE_RECORD';
|
||||||
|
export const DELETE_RECORD_SUCCESS = 'app/Edit/DELETE_RECORD_SUCCESS';
|
||||||
|
export const DELETE_RECORD_ERROR = 'app/Edit/DELETE_RECORD_ERROR';
|
||||||
@ -16,6 +16,7 @@ import {
|
|||||||
loadRecord,
|
loadRecord,
|
||||||
setRecordAttribute,
|
setRecordAttribute,
|
||||||
editRecord,
|
editRecord,
|
||||||
|
deleteRecord,
|
||||||
} from './actions';
|
} from './actions';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@ -23,6 +24,7 @@ import {
|
|||||||
makeSelectLoading,
|
makeSelectLoading,
|
||||||
makeSelectCurrentModelName,
|
makeSelectCurrentModelName,
|
||||||
makeSelectEditing,
|
makeSelectEditing,
|
||||||
|
makeSelectDeleting,
|
||||||
} from './selectors';
|
} from './selectors';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@ -65,6 +67,8 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
|
|||||||
}, {
|
}, {
|
||||||
label: 'Delete',
|
label: 'Delete',
|
||||||
class: 'btn-danger',
|
class: 'btn-danger',
|
||||||
|
onClick: this.props.deleteRecord,
|
||||||
|
disabled: this.props.deleting,
|
||||||
}];
|
}];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -109,6 +113,7 @@ Edit.propTypes = {
|
|||||||
]),
|
]),
|
||||||
editRecord: React.PropTypes.func,
|
editRecord: React.PropTypes.func,
|
||||||
editing: React.PropTypes.bool,
|
editing: React.PropTypes.bool,
|
||||||
|
deleting: React.PropTypes.bool,
|
||||||
};
|
};
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
@ -117,6 +122,7 @@ const mapStateToProps = createStructuredSelector({
|
|||||||
currentModelName: makeSelectCurrentModelName(),
|
currentModelName: makeSelectCurrentModelName(),
|
||||||
models: makeSelectModels(),
|
models: makeSelectModels(),
|
||||||
editing: makeSelectEditing(),
|
editing: makeSelectEditing(),
|
||||||
|
deleting: makeSelectDeleting(),
|
||||||
});
|
});
|
||||||
|
|
||||||
function mapDispatchToProps(dispatch) {
|
function mapDispatchToProps(dispatch) {
|
||||||
@ -125,6 +131,12 @@ function mapDispatchToProps(dispatch) {
|
|||||||
loadRecord: (id) => dispatch(loadRecord(id)),
|
loadRecord: (id) => dispatch(loadRecord(id)),
|
||||||
setRecordAttribute: (key, value) => dispatch(setRecordAttribute(key, value)),
|
setRecordAttribute: (key, value) => dispatch(setRecordAttribute(key, value)),
|
||||||
editRecord: () => dispatch(editRecord()),
|
editRecord: () => dispatch(editRecord()),
|
||||||
|
deleteRecord: () => {
|
||||||
|
// TODO: improve confirmation UX.
|
||||||
|
if (confirm('Are you sure ?')) {
|
||||||
|
dispatch(deleteRecord());
|
||||||
|
}
|
||||||
|
},
|
||||||
dispatch,
|
dispatch,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,6 +13,9 @@ import {
|
|||||||
EDIT_RECORD,
|
EDIT_RECORD,
|
||||||
EDIT_RECORD_SUCCESS,
|
EDIT_RECORD_SUCCESS,
|
||||||
EDIT_RECORD_ERROR,
|
EDIT_RECORD_ERROR,
|
||||||
|
DELETE_RECORD,
|
||||||
|
DELETE_RECORD_SUCCESS,
|
||||||
|
DELETE_RECORD_ERROR,
|
||||||
} from './constants';
|
} from './constants';
|
||||||
|
|
||||||
const initialState = fromJS({
|
const initialState = fromJS({
|
||||||
@ -20,6 +23,7 @@ const initialState = fromJS({
|
|||||||
loading: false,
|
loading: false,
|
||||||
record: null,
|
record: null,
|
||||||
editing: false,
|
editing: false,
|
||||||
|
deleting: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
function editReducer(state = initialState, action) {
|
function editReducer(state = initialState, action) {
|
||||||
@ -48,6 +52,15 @@ function editReducer(state = initialState, action) {
|
|||||||
case EDIT_RECORD_ERROR:
|
case EDIT_RECORD_ERROR:
|
||||||
return state
|
return state
|
||||||
.set('editing', false);
|
.set('editing', false);
|
||||||
|
case DELETE_RECORD:
|
||||||
|
return state
|
||||||
|
.set('deleting', true);
|
||||||
|
case DELETE_RECORD_SUCCESS:
|
||||||
|
return state
|
||||||
|
.set('deleting', false);
|
||||||
|
case DELETE_RECORD_ERROR:
|
||||||
|
return state
|
||||||
|
.set('deleting', false);
|
||||||
default:
|
default:
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,16 +1,20 @@
|
|||||||
import { takeLatest } from 'redux-saga';
|
import { takeLatest } from 'redux-saga';
|
||||||
import { put, select, fork, call } from 'redux-saga/effects';
|
import { put, select, fork, call } from 'redux-saga/effects';
|
||||||
import request from 'utils/request';
|
import request from 'utils/request';
|
||||||
|
import { browserHistory } from 'react-router';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
recordLoaded,
|
recordLoaded,
|
||||||
recordEdited,
|
recordEdited,
|
||||||
recordEditError,
|
recordEditError,
|
||||||
|
recordDeleted,
|
||||||
|
recordDeleteError,
|
||||||
} from './actions';
|
} from './actions';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
LOAD_RECORD,
|
LOAD_RECORD,
|
||||||
EDIT_RECORD,
|
EDIT_RECORD,
|
||||||
|
DELETE_RECORD,
|
||||||
} from './constants';
|
} from './constants';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@ -57,9 +61,32 @@ export function* editRecord() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function* deleteRecord() {
|
||||||
|
const currentModelName = yield select(makeSelectCurrentModelName());
|
||||||
|
const record = yield select(makeSelectRecord());
|
||||||
|
const recordJSON = record.toJSON();
|
||||||
|
|
||||||
|
try {
|
||||||
|
const requestURL = `http://localhost:1337/content-manager/explorer/${currentModelName}/${recordJSON.id}`;
|
||||||
|
|
||||||
|
// Call our request helper (see 'utils/request')
|
||||||
|
yield call(request, requestURL, {
|
||||||
|
method: 'DELETE',
|
||||||
|
});
|
||||||
|
|
||||||
|
yield put(recordDeleted());
|
||||||
|
window.Strapi.notification.success('The entry has been successfully deleted.');
|
||||||
|
// TODO: Redirect to the list page.
|
||||||
|
} catch (err) {
|
||||||
|
yield put(recordDeleteError());
|
||||||
|
window.Strapi.notification.error('An error occurred during record deletion.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function* defaultSaga() {
|
export function* defaultSaga() {
|
||||||
yield fork(takeLatest, LOAD_RECORD, getRecord);
|
yield fork(takeLatest, LOAD_RECORD, getRecord);
|
||||||
yield fork(takeLatest, EDIT_RECORD, editRecord);
|
yield fork(takeLatest, EDIT_RECORD, editRecord);
|
||||||
|
yield fork(takeLatest, DELETE_RECORD, deleteRecord);
|
||||||
}
|
}
|
||||||
|
|
||||||
// All sagas to be loaded
|
// All sagas to be loaded
|
||||||
|
|||||||
@ -36,10 +36,16 @@ const makeSelectEditing = () => createSelector(
|
|||||||
(substate) => substate.get('editing')
|
(substate) => substate.get('editing')
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const makeSelectDeleting = () => createSelector(
|
||||||
|
selectEditDomain(),
|
||||||
|
(substate) => substate.get('deleting')
|
||||||
|
);
|
||||||
|
|
||||||
export default selectEditDomain;
|
export default selectEditDomain;
|
||||||
export {
|
export {
|
||||||
makeSelectRecord,
|
makeSelectRecord,
|
||||||
makeSelectLoading,
|
makeSelectLoading,
|
||||||
makeSelectCurrentModelName,
|
makeSelectCurrentModelName,
|
||||||
makeSelectEditing,
|
makeSelectEditing,
|
||||||
|
makeSelectDeleting,
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user