diff --git a/src/containers/Alerts/Branches/BranchMarkPrimaryAlert.js b/src/containers/Alerts/Branches/BranchMarkPrimaryAlert.js new file mode 100644 index 000000000..e61159587 --- /dev/null +++ b/src/containers/Alerts/Branches/BranchMarkPrimaryAlert.js @@ -0,0 +1,70 @@ +import React from 'react'; +import intl from 'react-intl-universal'; +import { Intent, Alert } from '@blueprintjs/core'; +import { FormattedMessage as T } from 'components'; + +import { useMarkPrimaryBranches } from 'hooks/query'; +import { AppToaster } from 'components'; + +import withAlertActions from 'containers/Alert/withAlertActions'; +import withAlertStoreConnect from 'containers/Alert/withAlertStoreConnect'; + +import { compose } from 'utils'; + +/** + * branch mark primary alert. + */ +function BranchMarkPrimaryAlert({ + name, + + // #withAlertStoreConnect + isOpen, + payload: { branchId }, + + // #withAlertActions + closeAlert, +}) { + const { mutateAsync: markPrimaryBranchMutate, isLoading } = + useMarkPrimaryBranches(); + + // Handle cancel mark primary alert. + const handleCancelMarkPrimaryAlert = () => { + closeAlert(name); + }; + + // andle cancel mark primary confirm. + const handleConfirmMarkPrimaryBranch = () => { + markPrimaryBranchMutate(branchId) + .then(() => { + AppToaster.show({ + message: intl.get('branch.alert.mark_primary_message'), + intent: Intent.SUCCESS, + }); + closeAlert(name); + }) + .catch((error) => { + closeAlert(name); + }); + }; + + return ( + } + confirmButtonText={} + intent={Intent.WARNING} + isOpen={isOpen} + onCancel={handleCancelMarkPrimaryAlert} + onConfirm={handleConfirmMarkPrimaryBranch} + loading={isLoading} + > +

+ +

+
+ ); +} + +export default compose( + withAlertStoreConnect(), + withAlertActions, +)(BranchMarkPrimaryAlert); diff --git a/src/containers/Alerts/Warehouses/WarehouseMarkPrimaryAlert.js b/src/containers/Alerts/Warehouses/WarehouseMarkPrimaryAlert.js new file mode 100644 index 000000000..b51c7fa45 --- /dev/null +++ b/src/containers/Alerts/Warehouses/WarehouseMarkPrimaryAlert.js @@ -0,0 +1,70 @@ +import React from 'react'; +import intl from 'react-intl-universal'; +import { Intent, Alert } from '@blueprintjs/core'; +import { FormattedMessage as T } from 'components'; + +import { useMarkPrimaryWarehouse } from 'hooks/query'; +import { AppToaster } from 'components'; + +import withAlertActions from 'containers/Alert/withAlertActions'; +import withAlertStoreConnect from 'containers/Alert/withAlertStoreConnect'; + +import { compose } from 'utils'; + +/** + * warehouse mark primary alert. + */ +function WarehouseMarkPrimaryAlert({ + name, + + // #withAlertStoreConnect + isOpen, + payload: { warehouseId }, + + // #withAlertActions + closeAlert, +}) { + const { mutateAsync: markPrimaryWarehouseMutate, isLoading } = + useMarkPrimaryWarehouse(); + + // Handle cancel mark primary alert. + const handleCancelMarkPrimaryAlert = () => { + closeAlert(name); + }; + + // andle cancel mark primary confirm. + const handleConfirmMarkPrimaryWarehouse = () => { + markPrimaryWarehouseMutate(warehouseId) + .then(() => { + AppToaster.show({ + message: intl.get('warehouse.alert.mark_primary_message'), + intent: Intent.SUCCESS, + }); + closeAlert(name); + }) + .catch((error) => { + closeAlert(name); + }); + }; + + return ( + } + confirmButtonText={} + intent={Intent.WARNING} + isOpen={isOpen} + onCancel={handleCancelMarkPrimaryAlert} + onConfirm={handleConfirmMarkPrimaryWarehouse} + loading={isLoading} + > +

+ +

+
+ ); +} + +export default compose( + withAlertStoreConnect(), + withAlertActions, +)(WarehouseMarkPrimaryAlert); diff --git a/src/containers/Preferences/Branches/BranchesAlerts.js b/src/containers/Preferences/Branches/BranchesAlerts.js index c444030db..2facc34b8 100644 --- a/src/containers/Preferences/Branches/BranchesAlerts.js +++ b/src/containers/Preferences/Branches/BranchesAlerts.js @@ -3,5 +3,14 @@ import React from 'react'; const BranchDeleteAlert = React.lazy(() => import('../../Alerts/Branches/BranchDeleteAlert'), ); +const BranchMarkPrimaryAlert = React.lazy(() => + import('../../Alerts/Branches/BranchMarkPrimaryAlert'), +); -export default [{ name: 'branch-delete', component: BranchDeleteAlert }]; +export default [ + { name: 'branch-delete', component: BranchDeleteAlert }, + { + name: 'branch-mark-primary', + component: BranchMarkPrimaryAlert, + }, +]; diff --git a/src/containers/Preferences/Branches/BranchesDataTable.js b/src/containers/Preferences/Branches/BranchesDataTable.js index 1a47a03d8..e34affa54 100644 --- a/src/containers/Preferences/Branches/BranchesDataTable.js +++ b/src/containers/Preferences/Branches/BranchesDataTable.js @@ -27,22 +27,27 @@ function BranchesDataTable({ // Table columns. const columns = useBranchesTableColumns(); - const Time = true; - const { branches, isBranchesLoading, isBranchesFetching } = useBranchesContext(); + // Handle edit branch. const handleEditBranch = ({ id }) => { openDialog('branch-form', { branchId: id, action: 'edit' }); }; + // Handle delete branch. const handleDeleteBranch = ({ id }) => { openAlert('branch-delete', { branchId: id }); }; - if (Time) { - return ; - } + // Handle mark primary branch. + const handleMarkPrimaryBranch = ({ id }) => { + openAlert('branch-mark-primary', { branchId: id }); + }; + + // if (type) { + // return ; + // } return ( @@ -58,6 +63,7 @@ function BranchesDataTable({ payload={{ onEdit: handleEditBranch, onDelete: handleDeleteBranch, + onMarkPrimary: handleMarkPrimaryBranch, }} /> diff --git a/src/containers/Preferences/Branches/components.js b/src/containers/Preferences/Branches/components.js index 771681fba..defa408d6 100644 --- a/src/containers/Preferences/Branches/components.js +++ b/src/containers/Preferences/Branches/components.js @@ -9,7 +9,7 @@ import { Icon } from 'components'; * Context menu of Branches. */ export function ActionsMenu({ - payload: { onEdit, onDelete }, + payload: { onEdit, onDelete, onMarkPrimary }, row: { original }, }) { return ( @@ -19,6 +19,11 @@ export function ActionsMenu({ text={intl.get('branches.action.edit_branch')} onClick={safeCallback(onEdit, original)} /> + } + text={intl.get('branches.action.mark_as_primary')} + onClick={safeCallback(onMarkPrimary, original)} + /> } diff --git a/src/containers/Preferences/Warehouses/WarehousesAlerts.js b/src/containers/Preferences/Warehouses/WarehousesAlerts.js index 7e19d865a..bf2ce3883 100644 --- a/src/containers/Preferences/Warehouses/WarehousesAlerts.js +++ b/src/containers/Preferences/Warehouses/WarehousesAlerts.js @@ -3,8 +3,17 @@ import React from 'react'; const WarehouseDeleteAlert = React.lazy(() => import('../../Alerts/Warehouses/WarehouseDeleteAlert'), ); +const WarehouseMarkPrimaryAlert = React.lazy(() => + import('../../Alerts/Warehouses/WarehouseMarkPrimaryAlert'), +); /** * Warehouses alerts. */ -export default [{ name: 'warehouse-delete', component: WarehouseDeleteAlert }]; +export default [ + { name: 'warehouse-delete', component: WarehouseDeleteAlert }, + { + name: 'warehouse-mark-primary', + component: WarehouseMarkPrimaryAlert, + }, +]; diff --git a/src/containers/Preferences/Warehouses/WarehousesGridItems.js b/src/containers/Preferences/Warehouses/WarehousesGridItems.js index edc33ff22..4668ce10a 100644 --- a/src/containers/Preferences/Warehouses/WarehousesGridItems.js +++ b/src/containers/Preferences/Warehouses/WarehousesGridItems.js @@ -30,12 +30,18 @@ function WarehousesGridItems({ openAlert('warehouse-delete', { warehouseId: warehouse.id }); }; + // Handle mark primary warehouse. + const handleMarkPrimaryWarehouse = () => { + openAlert('warehouse-mark-primary', { warehouseId: warehouse.id }); + }; + return ( } > diff --git a/src/containers/Preferences/Warehouses/WarehousesList.js b/src/containers/Preferences/Warehouses/WarehousesList.js index d23f20632..c2e6c7816 100644 --- a/src/containers/Preferences/Warehouses/WarehousesList.js +++ b/src/containers/Preferences/Warehouses/WarehousesList.js @@ -17,7 +17,7 @@ function WarehousesList({ changePreferencesPageTitle(intl.get('warehouses.label')); }, [changePreferencesPageTitle]); - // if () { + // if (type) { // return ; // } diff --git a/src/containers/Preferences/Warehouses/WarehousesProvider.js b/src/containers/Preferences/Warehouses/WarehousesProvider.js index bbcfdcf38..69ba03b5f 100644 --- a/src/containers/Preferences/Warehouses/WarehousesProvider.js +++ b/src/containers/Preferences/Warehouses/WarehousesProvider.js @@ -28,11 +28,11 @@ function WarehousesProvider({ ...props }) { )} > - {isWarehouesLoading ? ( + {/* {isWarehouesLoading ? ( - ) : ( + ) : ( */} - )} + {/* )} */} ); diff --git a/src/containers/Preferences/Warehouses/components.js b/src/containers/Preferences/Warehouses/components.js index 7027343b5..bcaf8f419 100644 --- a/src/containers/Preferences/Warehouses/components.js +++ b/src/containers/Preferences/Warehouses/components.js @@ -22,7 +22,7 @@ export function WarehouseContextMenu({ onClick={safeCallback(onEditClick)} /> } + icon={} text={intl.get('warehouses.action.make_as_parimary')} onClick={safeCallback(onPrimary)} /> diff --git a/src/hooks/query/branches.js b/src/hooks/query/branches.js index 2eb95f58c..b9a9e75c7 100644 --- a/src/hooks/query/branches.js +++ b/src/hooks/query/branches.js @@ -113,3 +113,21 @@ export function useActivateBranches(props) { ...props, }); } + +/** + * Mark primary the given branch. + */ +export function useMarkPrimaryBranches(props) { + const queryClient = useQueryClient(); + const apiRequest = useApiRequest(); + + return useMutation((id) => apiRequest.post(`branches/${id}/mark-primary`), { + onSuccess: (res, id) => { + // Invalidate specific inventory adjustment. + queryClient.invalidateQueries([t.BRANCH, id]); + + commonInvalidateQueries(queryClient); + }, + ...props, + }); +} diff --git a/src/hooks/query/warehouses.js b/src/hooks/query/warehouses.js index 18bca2b04..2499aaed4 100644 --- a/src/hooks/query/warehouses.js +++ b/src/hooks/query/warehouses.js @@ -233,3 +233,21 @@ export function useActivateWarehouses(props) { ...props, }); } + +/** + * Mark primary the given branch. + */ +export function useMarkPrimaryWarehouse(props) { + const queryClient = useQueryClient(); + const apiRequest = useApiRequest(); + + return useMutation((id) => apiRequest.post(`warehouses/${id}/mark-primary`), { + onSuccess: (res, id) => { + // Invalidate specific inventory adjustment. + queryClient.invalidateQueries([t.WAREHOUSE, id]); + + commonInvalidateQueries(queryClient); + }, + ...props, + }); +} diff --git a/src/lang/en/index.json b/src/lang/en/index.json index 51c53548b..b41c21b0d 100644 --- a/src/lang/en/index.json +++ b/src/lang/en/index.json @@ -1816,12 +1816,12 @@ "warehouse_transfer.label.edit_warehouse_transfer": "Edit Warehouse Transfer", "warehouse_transfer.label.new_warehouse_transfer": "New Warehouse Transfer", "warehouse_transfer.label.warehouse_transfer_list": "Warehouse Transfers List", - "warehouse_transfer.success_message":"The warehouse transfer transaction has been created successfully.", - "warehouse_transfer.edit_success_message":"The warehouse transfer transaction has been created successfully.", - "select_warehouse_transfer":"Select Warehouse Transfer", - "warehouse_transfer.alert.delete_message":"The warehouse transfer transaction has been deleted successfully", - "warehouse_transfer.once_delete_this_warehouse_transfer":"Once you delete this warehouse transfer, you won't be able to restore it later. Are you sure you want to delete this warehouse transfer?", - "warehouse_transfer.error.could_not_transfer_item_from_source_to_destination":"Could not transfer item from source to destination on the same warehouse", + "warehouse_transfer.success_message": "The warehouse transfer transaction has been created successfully.", + "warehouse_transfer.edit_success_message": "The warehouse transfer transaction has been created successfully.", + "select_warehouse_transfer": "Select Warehouse Transfer", + "warehouse_transfer.alert.delete_message": "The warehouse transfer transaction has been deleted successfully", + "warehouse_transfer.once_delete_this_warehouse_transfer": "Once you delete this warehouse transfer, you won't be able to restore it later. Are you sure you want to delete this warehouse transfer?", + "warehouse_transfer.error.could_not_transfer_item_from_source_to_destination": "Could not transfer item from source to destination on the same warehouse", "credit_note_preview.dialog.title": "Credit Note PDF Preview", "payment_receive_preview.dialog.title": "Payment Receive PDF Preview", @@ -1829,6 +1829,7 @@ "branches.label.new_branch": "New Branch", "branches.action.edit_branch": "Edit Branch", "branches.action.delete_branch": "Delete Branch", + "branches.action.mark_as_primary": "Make as Primary", "branches.column.branch_name": "Branch name", "branches.column.address": "Address", "branches.column.phone_number": "Phone number", @@ -1845,8 +1846,15 @@ "branch.dialog.label.email": "Email", "branch.dialog.label.website": "Website", "branch.dialog.success_message": "The branch has been created successfully.", - "branch.alert.delete_message":"The branch has been deleted successfully", - "branch.once_delete_this_branch":"Once you delete this branch, you won't be able to restore it later. Are you sure you want to delete this branch?", - "realized_gain_or_loss.label":"Realized Gain or Loss", - "unrealized_gain_or_loss.label":"Unrealized Gain or Loss" + "branch.alert.delete_message": "The branch has been deleted successfully", + "branch.once_delete_this_branch": "Once you delete this branch, you won't be able to restore it later. Are you sure you want to delete this branch?", + "realized_gain_or_loss.label": "Realized Gain or Loss", + "unrealized_gain_or_loss.label": "Unrealized Gain or Loss", + "branch_activate.dialog_success_message": "Multi-branches feature has been activated successfully.", + "branch.alert.mark_primary_message": "The branch has been marked as primary.", + "branch.alert.are_you_sure_you_want_to_make": "Are you sure you want to make a primary branch?", + "warehouse_activate.dialog_success_message": "Multi-branches feature has been activated successfully.", + "warehouse.alert.mark_primary_message": "The given warehouse has been marked as primary.", + "warehouse.alert.are_you_sure_you_want_to_make": "Are you sure you want to make a primary warehouse?", + "make_primary": "Make Primary" } \ No newline at end of file