diff --git a/src/common/classes.js b/src/common/classes.js index 6b0872396..1bbcf9873 100644 --- a/src/common/classes.js +++ b/src/common/classes.js @@ -41,6 +41,7 @@ const CLASSES = { PAGE_FORM_EXPENSE: 'page-form--expense', PAGE_FORM_CREDIT_NOTE:'page-form--credit-note', PAGE_FORM_VENDOR_CREDIT_NOTE:'page-form--vendor-credit-note', + PAGE_FORM_WAREHOUSE_TRANSFER:'page-form--warehouse-transfer', FORM_GROUP_LIST_SELECT: 'form-group--select-list', diff --git a/src/common/drawers.js b/src/common/drawers.js index 5ec6d05a2..205d7fc53 100644 --- a/src/common/drawers.js +++ b/src/common/drawers.js @@ -17,5 +17,6 @@ export const DRAWERS = { CREDIT_NOTE_DETAIL_DRAWER: 'credit-note-detail-drawer', VENDOR_CREDIT_DETAIL_DRAWER: 'vendor-credit-detail-drawer', REFUND_CREDIT_NOTE_DETAIL_DRAWER:'refund-credit-detail-drawer', - REFUND_VENDOR_CREDIT_DETAIL_DRAWER:'refund-vendor-detail-drawer' + REFUND_VENDOR_CREDIT_DETAIL_DRAWER:'refund-vendor-detail-drawer', + WAREHOUSE_TRANSFER_DETAIL_DRAWER:'warehouse-transfer-detail-drawer' }; diff --git a/src/components/DrawersContainer.js b/src/components/DrawersContainer.js index e508519bd..17090b5d9 100644 --- a/src/components/DrawersContainer.js +++ b/src/components/DrawersContainer.js @@ -21,6 +21,7 @@ import CreditNoteDetailDrawer from '../containers/Drawers/CreditNoteDetailDrawer import VendorCreditDetailDrawer from '../containers/Drawers/VendorCreditDetailDrawer'; import RefundCreditNoteDetailDrawer from '../containers/Drawers/RefundCreditNoteDetailDrawer'; import RefundVendorCreditDetailDrawer from '../containers/Drawers/RefundVendorCreditDetailDrawer'; +import WarehouseTransferDetailDrawer from '../containers/Drawers/WarehouseTransferDetailDrawer' import { DRAWERS } from 'common/drawers'; @@ -59,6 +60,7 @@ export default function DrawersContainer() { + ); } diff --git a/src/config/sidebarMenu.js b/src/config/sidebarMenu.js index 1ea65f2a0..14812dfea 100644 --- a/src/config/sidebarMenu.js +++ b/src/config/sidebarMenu.js @@ -78,6 +78,10 @@ export default [ ability: InventoryAdjustmentAction.View, }, }, + { + text: , + href: '/warehouse-transfers', + }, { text: , href: '/items/categories', @@ -113,6 +117,10 @@ export default [ ability: ItemAction.Create, }, }, + { + text: , + href: '/warehouse-transfers/new', + }, { text: , href: '/items/new', diff --git a/src/containers/Dialogs/WarehouseTransferNumberDialog/WarehouseTransferNumberDialogContent.js b/src/containers/Dialogs/WarehouseTransferNumberDialog/WarehouseTransferNumberDialogContent.js new file mode 100644 index 000000000..a992b8be0 --- /dev/null +++ b/src/containers/Dialogs/WarehouseTransferNumberDialog/WarehouseTransferNumberDialogContent.js @@ -0,0 +1,103 @@ +import React from 'react'; +import intl from 'react-intl-universal'; +import { useSaveSettings } from 'hooks/query'; + +import { WarehouseTransferNumberDialogProvider } from './WarehouseTransferNumberDialogProvider'; +import ReferenceNumberForm from 'containers/JournalNumber/ReferenceNumberForm'; + +import withDialogActions from 'containers/Dialog/withDialogActions'; +import withSettings from 'containers/Settings/withSettings'; +import withSettingsActions from 'containers/Settings/withSettingsActions'; +import { compose } from 'utils'; +import { + transformFormToSettings, + transformSettingsToForm, +} from 'containers/JournalNumber/utils'; + +/** + * Warehouse transfer no dialog content. + */ +function WarehouseTransferNumberDialogContent({ + // #ownProps + initialValues, + onConfirm, + + // #withSettings + nextNumber, + numberPrefix, + autoIncrement, + + // #withDialogActions + closeDialog, +}) { + const { mutateAsync: saveSettings } = useSaveSettings(); + const [referenceFormValues, setReferenceFormValues] = React.useState(null); + + // Handle the submit form. + const handleSubmitForm = (values, { setSubmitting }) => { + // Handle the form success. + const handleSuccess = () => { + setSubmitting(false); + closeDialog('warehouse-transfer-no-form'); + onConfirm(values); + }; + + // Handle the form errors. + const handleErrors = () => { + setSubmitting(false); + }; + + if (values.incrementMode === 'manual-transaction') { + handleSuccess(); + return; + } + // Transformes the form values to settings to save it. + const options = transformFormToSettings(values, 'warehouse_transfer'); + + // Save the settings. + saveSettings({ options }).then(handleSuccess).catch(handleErrors); + }; + + // Handle the dialog close. + const handleClose = () => { + closeDialog('warehouse-transfer-no-form'); + }; + + // Handle form change. + const handleChange = (values) => { + setReferenceFormValues(values); + }; + // Description. + const description = + referenceFormValues?.incrementMode === 'auto' + ? intl.get('warehouse_transfer.auto_increment.auto') + : intl.get('warehouse_transfer.auto_increment.manually'); + + return ( + + + + ); +} +export default compose( + withDialogActions, + withSettingsActions, + withSettings(({ warehouseTransferSettings }) => ({ + autoIncrement: warehouseTransferSettings?.autoIncrement, + nextNumber: warehouseTransferSettings?.nextNumber, + numberPrefix: warehouseTransferSettings?.numberPrefix, + })), +)(WarehouseTransferNumberDialogContent); diff --git a/src/containers/Dialogs/WarehouseTransferNumberDialog/WarehouseTransferNumberDialogProvider.js b/src/containers/Dialogs/WarehouseTransferNumberDialog/WarehouseTransferNumberDialogProvider.js new file mode 100644 index 000000000..0bbad114f --- /dev/null +++ b/src/containers/Dialogs/WarehouseTransferNumberDialog/WarehouseTransferNumberDialogProvider.js @@ -0,0 +1,34 @@ +import React from 'react'; +import { DialogContent } from 'components'; +import { useSettingsWarehouseTransfers } from 'hooks/query'; + +const WarehouseTransferNumberDilaogContext = React.createContext(); + +/** + * Warehouse transfer number dialog provier. + */ +function WarehouseTransferNumberDialogProvider({ query, ...props }) { + const { isLoading: isSettingsLoading } = useSettingsWarehouseTransfers(); + + // Provider payload. + const provider = { + isSettingsLoading, + }; + + return ( + + + + ); +} + +const useWarehouseTransferNumberDialogContext = () => + React.useContext(WarehouseTransferNumberDilaogContext); + +export { + WarehouseTransferNumberDialogProvider, + useWarehouseTransferNumberDialogContext, +}; diff --git a/src/containers/Dialogs/WarehouseTransferNumberDialog/index.js b/src/containers/Dialogs/WarehouseTransferNumberDialog/index.js new file mode 100644 index 000000000..6832ec825 --- /dev/null +++ b/src/containers/Dialogs/WarehouseTransferNumberDialog/index.js @@ -0,0 +1,40 @@ +import React from 'react'; +import { FormattedMessage as T } from 'components'; +import { Dialog, DialogSuspense } from 'components'; +import withDialogRedux from 'components/DialogReduxConnect'; +import { compose, saveInvoke } from 'utils'; + +const WarehouseTransferNumberDialogContent = React.lazy(() => + import('./WarehouseTransferNumberDialogContent'), +); + +/** + * Warehouse transfer number dialog. + */ +function WarehouseTransferNumberDilaog({ + dialogName, + payload: { initialFormValues }, + isOpen, + onConfirm, +}) { + const handleConfirm = (values) => { + saveInvoke(onConfirm, values); + }; + return ( + } + name={dialogName} + autoFocus={true} + canEscapeKeyClose={true} + isOpen={isOpen} + > + + + + + ); +} +export default compose(withDialogRedux())(WarehouseTransferNumberDilaog); diff --git a/src/containers/Drawers/WarehouseTransferDetailDrawer/WarehouseTransferDetail.js b/src/containers/Drawers/WarehouseTransferDetailDrawer/WarehouseTransferDetail.js new file mode 100644 index 000000000..4296e419c --- /dev/null +++ b/src/containers/Drawers/WarehouseTransferDetailDrawer/WarehouseTransferDetail.js @@ -0,0 +1,39 @@ +import React from 'react'; +import { Tab } from '@blueprintjs/core'; +import styled from 'styled-components'; +import intl from 'react-intl-universal'; +import { DrawerMainTabs } from 'components'; + +import WarehouseTransferDetailPanel from './WarehouseTransferDetailPanel'; +import WarehouseTransferDetailActionsBar from './WarehouseTransferDetailActionsBar'; + +/** + * Warehouse transfer view detail. + * @returns {React.JSX} + */ +export default function WarehouseTransferDetail() { + return ( + + + + + ); +} + +/** + * Warehouse transfer details tabs. + * @returns {React.JSX} + */ +function WarehouseTransferDetailsTabs() { + return ( + + } + /> + + ); +} + +const WarehouseTransferRoot = styled.div``; diff --git a/src/containers/Drawers/WarehouseTransferDetailDrawer/WarehouseTransferDetailActionsBar.js b/src/containers/Drawers/WarehouseTransferDetailDrawer/WarehouseTransferDetailActionsBar.js new file mode 100644 index 000000000..9202666f4 --- /dev/null +++ b/src/containers/Drawers/WarehouseTransferDetailDrawer/WarehouseTransferDetailActionsBar.js @@ -0,0 +1,74 @@ +import React from 'react'; +import { useHistory } from 'react-router-dom'; +import { + Button, + NavbarGroup, + Classes, + NavbarDivider, + Intent, +} from '@blueprintjs/core'; + +import { useWarehouseDetailDrawerContext } from './WarehouseTransferDetailDrawerProvider'; +import { + DrawerActionsBar, + Can, + Icon, + FormattedMessage as T, + If, +} from 'components'; +import withDialogActions from 'containers/Dialog/withDialogActions'; +import withAlertsActions from 'containers/Alert/withAlertActions'; +import withDrawerActions from 'containers/Drawer/withDrawerActions'; + +import { compose } from 'utils'; + +/** + * Warehouse transfer detail actions bar. + */ +function WarehouseTransferDetailActionsBar({ + // #withAlertsActions + openAlert, + + // #withDrawerActions + closeDrawer, +}) { + const history = useHistory(); + + // Handle edit warehosue transfer. + const handleEditWarehosueTransfer = () => { + // history.push(`/warehouse-transfers/${warehouseTransferId}/edit`); + closeDrawer('warehouse-transfer-detail-drawer'); + }; + + // Handle delete warehouse transfer. + const handleDeletetWarehosueTransfer = () => { + // openAlert('warehouse-transfer-delete', { warehouseTransferId }); + }; + + return ( + + +