From 8cccf1f034c690fbe109bf92a16b6f0c4975f4ce Mon Sep 17 00:00:00 2001 From: bluestreamlds <85561356+bluestreamlds@users.noreply.github.com> Date: Fri, 4 Mar 2022 16:27:53 +0530 Subject: [PATCH] feat/delete-item-warehouse (#78) Delete item Delete warehouse Delete confirmation messages Bonus: Full cover image Co-authored-by: Llewellyn Dsouza --- .gitignore | 2 +- src/components/EnhancedTable/index.js | 27 +++++++++- src/layouts/AuthLayout/index.js | 1 + src/pages/editWarehouseDetails/index.js | 59 ++++++++++++++++++++- src/pages/itemListing/index.js | 70 ++++++++++++++++++++++++- src/pages/setup/index.js | 4 +- src/pages/useraccess/index.js | 2 +- src/redux/ItemRedux.js | 16 ++++++ src/redux/WarehouseRedux.js | 24 ++++++++- src/sagas/Item.js | 33 +++++++++++- src/sagas/Warehouse.js | 33 +++++++++++- 11 files changed, 258 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index bc76bde..09eaa98 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ # See https://help.github.com/ignore-files/ for more about ignoring files. # dependencies -/node_modules +node_modules .DS_Store # testing diff --git a/src/components/EnhancedTable/index.js b/src/components/EnhancedTable/index.js index 3410215..d822a1f 100644 --- a/src/components/EnhancedTable/index.js +++ b/src/components/EnhancedTable/index.js @@ -41,10 +41,11 @@ const StyledTableRow = styled(TableRow)(({ theme }) => ({ Row.propTypes = { rowData: PropTypes.array, tHeads: PropTypes.array, - editHandler: PropTypes.any + editHandler: PropTypes.any, + deleteHandler: PropTypes.any }; -function Row({ tHeads, rowData, editHandler }) { +function Row({ tHeads, rowData, editHandler, deleteHandler }) { return ( *': { borderBottom: 'unset' } }}> @@ -68,6 +69,25 @@ function Row({ tHeads, rowData, editHandler }) { > EDIT + { + deleteHandler(rowData._id); + }} + > + DELETE + {tHeads && tHeads @@ -87,6 +107,7 @@ function EnhancedTable({ data, tHeads, editHandler, + deleteHandler, filtersControl, resetFilters }) { @@ -172,6 +193,7 @@ function EnhancedTable({ @@ -304,6 +326,7 @@ EnhancedTable.propTypes = { data: PropTypes.array, tHeads: PropTypes.array, editHandler: PropTypes.any, + deleteHandler: PropTypes.any, filtersControl: PropTypes.any, resetFilters: PropTypes.any }; diff --git a/src/layouts/AuthLayout/index.js b/src/layouts/AuthLayout/index.js index 96f16e6..1f69265 100644 --- a/src/layouts/AuthLayout/index.js +++ b/src/layouts/AuthLayout/index.js @@ -38,6 +38,7 @@ function AuthLayout({ header, title, description, illustration, children }) { mt={2} sx={{ backgroundImage: `url(${illustration})`, + backgroundSize: 'cover', backgroundRepeat: 'no-repeat', backgroundPosition: 'center' }} diff --git a/src/pages/editWarehouseDetails/index.js b/src/pages/editWarehouseDetails/index.js index 3825366..1791320 100644 --- a/src/pages/editWarehouseDetails/index.js +++ b/src/pages/editWarehouseDetails/index.js @@ -12,7 +12,9 @@ import { DialogTitle, DialogContent, TextField, - DialogActions + DialogActions, + Button, + DialogContentText } from '@mui/material'; import DashboardNavbar from 'components/DashboardNavbar'; import DashboardLayout from 'layouts/DashboardLayout'; @@ -319,6 +321,9 @@ const WarehouseNestedDetails = () => { function EditWarehouseDetails() { const { warehouseId } = useParams(); const navigate = useNavigate(); + const navigateTo = (to) => { + navigate(to); + }; const warehouseData = useSelector(WarehouseSelectors.getWarehouseDetailById(warehouseId)); const inventoryTypes = useSelector(InventorySelectors.getInventoryDetail); @@ -372,6 +377,14 @@ function EditWarehouseDetails() { } }); + const [deleteAlertOpen, setDeleteAlertOpen] = React.useState(null); + const handleDeleteAlertClose = () => { + setDeleteAlertOpen(false); + }; + const handleDeleteAlertOpen = () => { + setDeleteAlertOpen(true); + }; + return ( <> @@ -516,7 +529,49 @@ function EditWarehouseDetails() { /> - + + + Delete Warehouse + + + Confirm Warehouse Delete + + + Are you sure you want to delete this warehouse? + + + + + + + { + setDeleteAlertOpen(null); + }; + const handleDeleteAlertOpen = (id) => { + setDeleteAlertOpen(id); + }; + return ( @@ -90,6 +108,53 @@ function ItemListing() { /> + + Confirm Delete + + + Are you sure you want to delete this item? + + + + + + + { navigateTo(`/setup/inventory/browse/${widgetName}/${inventoryId}/edit/${id}`); }} + deleteHandler={(id) => { + handleDeleteAlertOpen(id); + }} resetFilters={() => { setPFam(''); setSFam(''); diff --git a/src/pages/setup/index.js b/src/pages/setup/index.js index a9eca3f..9b0ac27 100644 --- a/src/pages/setup/index.js +++ b/src/pages/setup/index.js @@ -20,7 +20,7 @@ function SetupHome() { icon: }, { - name: 'User & Access', + name: 'User Access', path: '/setup/users-access', icon: }, @@ -33,7 +33,7 @@ function SetupHome() { return ( - + ); diff --git a/src/pages/useraccess/index.js b/src/pages/useraccess/index.js index 68e85f0..48b0b52 100644 --- a/src/pages/useraccess/index.js +++ b/src/pages/useraccess/index.js @@ -221,7 +221,7 @@ function UserAccessScreen() { route={[ { name: 'Home', path: '/home' }, { name: 'Setup', path: '/setup' }, - { name: 'Users and Access', path: '/setup/users-access' } + { name: 'Users Access' } ]} /> diff --git a/src/redux/ItemRedux.js b/src/redux/ItemRedux.js index f7fe178..2d94036 100644 --- a/src/redux/ItemRedux.js +++ b/src/redux/ItemRedux.js @@ -12,6 +12,8 @@ const { Types, Creators } = createActions({ addItemSuccess: ['data'], editItemRequest: ['payload'], editItemSuccess: ['data'], + deleteItemRequest: ['payload'], + deleteItemSuccess: ['data'], oneItemRequest: ['payload'], oneItemSuccess: ['data'] }); @@ -91,6 +93,18 @@ export const onEditItemSuccess = (state, { data }) => item: null }); +export const onDeleteItemRequest = (state, { payload }) => + state.merge({ + fetching: _.uniq([...state.fetching, payload?.loader]), + error: getErrorValue(state?.error, payload?.loader) + }); + +export const onDeleteItemSuccess = (state, { data }) => + state.merge({ + fetching: getFetchingValue(state.fetching, data?.loader), + error: getErrorValue(state?.error, data?.loader) + }); + export const onItemFailure = (state, { error }) => state.merge({ fetching: _.without(state.fetching, error?.loader), @@ -106,6 +120,8 @@ export const itemReducer = createReducer(INITIAL_STATE, { [Types.ADD_ITEM_SUCCESS]: onAddItemSuccess, [Types.EDIT_ITEM_REQUEST]: onEditItemRequest, [Types.EDIT_ITEM_SUCCESS]: onEditItemSuccess, + [Types.DELETE_ITEM_REQUEST]: onDeleteItemRequest, + [Types.DELETE_ITEM_SUCCESS]: onDeleteItemSuccess, [Types.ONE_ITEM_REQUEST]: onOneItemRequest, [Types.ONE_ITEM_SUCCESS]: onOneItemSuccess }); diff --git a/src/redux/WarehouseRedux.js b/src/redux/WarehouseRedux.js index 3a3b98b..cf76ab9 100644 --- a/src/redux/WarehouseRedux.js +++ b/src/redux/WarehouseRedux.js @@ -15,7 +15,10 @@ const { Types, Creators } = createActions({ editWarehouseAction: ['payload'], editWarehouseSuccess: ['data'], - editWarehouseFailure: ['error'] + editWarehouseFailure: ['error'], + + deleteWarehouseAction: ['payload'], + deleteWarehouseSuccess: ['data'] }); export const WarehouseTypes = Types; @@ -96,6 +99,21 @@ export const onEditWarehouseSuccess = (state, { data }) => ] }); +export const onDeleteWarehouseAction = (state, { payload }) => + state.merge({ + fetching: _.uniq([state.fetching, payload?.loader]), + error: getErrorValue(state?.error, payload?.loader) + }); + +export const onDeleteWarehouseSuccess = (state, { data }) => + state.merge({ + fetching: getFetchingValue(state.fetching, data?.loader), + error: getErrorValue(state?.error, data?.loader), + warehouseDetail: data?.deletedWarehouseID + ? [...state.warehouseDetail.filter((x) => x._id !== data?.deletedWarehouseID)] + : state.warehouseDetail + }); + export const onEditWarehouseFailure = (state, { error }) => state.merge({ fetching: _.without(state.fetching, error?.loader), @@ -113,5 +131,7 @@ export const warehouseReducer = createReducer(INITIAL_STATE, { [Types.EDIT_WAREHOUSE_ACTION]: onEditWarehouseAction, [Types.EDIT_WAREHOUSE_SUCCESS]: onEditWarehouseSuccess, - [Types.EDIT_WAREHOUSE_FAILURE]: onEditWarehouseFailure + [Types.EDIT_WAREHOUSE_FAILURE]: onEditWarehouseFailure, + [Types.DELETE_WAREHOUSE_ACTION]: onDeleteWarehouseAction, + [Types.DELETE_WAREHOUSE_SUCCESS]: onDeleteWarehouseSuccess }); diff --git a/src/sagas/Item.js b/src/sagas/Item.js index 98638e3..bdbd82b 100644 --- a/src/sagas/Item.js +++ b/src/sagas/Item.js @@ -159,9 +159,40 @@ export function* onEditRequestItem({ payload }) { } } +export function* onDeleteRequestItem({ payload }) { + const response = yield call( + ApiServices[payload?.method], + AuthorizedAPI, + payload?.slug + payload?.itemId + ); + if (response?.status === 200) { + toast.success(`Successfully deleted item`, { + theme: 'colored' + }); + payload.refreshDispatch(); + yield put( + ItemActions.deleteItemSuccess({ + loader: payload?.loader, + item: response?.data?.data + }) + ); + } else { + toast.error('Failed to delete item', { + theme: 'colored' + }); + yield put( + ItemActions.itemFailure({ + loader: payload?.loader, + error: response?.data + }) + ); + } +} + export default [ takeEvery(ItemTypes.ITEM_REQUEST, onRequestItem), takeEvery(ItemTypes.ONE_ITEM_REQUEST, onRequestOneItem), takeEvery(ItemTypes.ADD_ITEM_REQUEST, onAddRequestItem), - takeEvery(ItemTypes.EDIT_ITEM_REQUEST, onEditRequestItem) + takeEvery(ItemTypes.EDIT_ITEM_REQUEST, onEditRequestItem), + takeEvery(ItemTypes.DELETE_ITEM_REQUEST, onDeleteRequestItem) ]; diff --git a/src/sagas/Warehouse.js b/src/sagas/Warehouse.js index 43437f2..e0741dd 100644 --- a/src/sagas/Warehouse.js +++ b/src/sagas/Warehouse.js @@ -112,8 +112,39 @@ export function* onRequestEditWarehouse({ payload }) { } } +export function* onRequestDeleteWarehouse({ payload }) { + const response = yield call( + ApiServices[payload?.method], + AuthorizedAPI, + payload?.slug + payload?.warehouseId + ); + if (response?.status === 200) { + toast.success('Warehouse deleted successfully', { + theme: 'colored' + }); + payload.navigateTo('/setup/warehouse'); + yield put( + WarehouseActions.deleteWarehouseSuccess({ + loader: payload?.loader, + deletedWarehouseID: payload?.warehouseId + }) + ); + } else { + toast.error('Failed to delete warehouse', { + theme: 'colored' + }); + yield put( + WarehouseActions.editWarehouseFailure({ + loader: payload?.loader, + error: response?.data + }) + ); + } +} + export default [ takeLatest(WarehouseTypes.WAREHOUSE_DATA_ACTION, onRequestWarehouseData), takeLatest(WarehouseTypes.CREATE_WAREHOUSE_ACTION, onRequestCreateWarehouse), - takeLatest(WarehouseTypes.EDIT_WAREHOUSE_ACTION, onRequestEditWarehouse) + takeLatest(WarehouseTypes.EDIT_WAREHOUSE_ACTION, onRequestEditWarehouse), + takeLatest(WarehouseTypes.DELETE_WAREHOUSE_ACTION, onRequestDeleteWarehouse) ];