diff --git a/src/containers/Purchases/Bills/BillForm/BillForm.js b/src/containers/Purchases/Bills/BillForm/BillForm.js index c9ec20a01..1a07118de 100644 --- a/src/containers/Purchases/Bills/BillForm/BillForm.js +++ b/src/containers/Purchases/Bills/BillForm/BillForm.js @@ -12,6 +12,7 @@ import BillFormHeader from './BillFormHeader'; import BillFloatingActions from './BillFloatingActions'; import BillFormFooter from './BillFormFooter'; import BillItemsEntriesEditor from './BillItemsEntriesEditor'; +import BillFormTopBar from './BillFormTopBar'; import { AppToaster } from 'components'; @@ -125,6 +126,7 @@ function BillForm({ onSubmit={handleFormSubmit} >
+ diff --git a/src/containers/Purchases/Bills/BillForm/BillForm.schema.js b/src/containers/Purchases/Bills/BillForm/BillForm.schema.js index 2b0e32c08..c221da83c 100644 --- a/src/containers/Purchases/Bills/BillForm/BillForm.schema.js +++ b/src/containers/Purchases/Bills/BillForm/BillForm.schema.js @@ -23,6 +23,8 @@ const BillFormSchema = Yup.object().shape({ .max(DATATYPES_LENGTH.TEXT) .label(intl.get('note')), open: Yup.boolean(), + branch_id: Yup.string(), + warehouse_id: Yup.string(), entries: Yup.array().of( Yup.object().shape({ quantity: Yup.number() diff --git a/src/containers/Purchases/Bills/BillForm/BillFormProvider.js b/src/containers/Purchases/Bills/BillForm/BillFormProvider.js index 2d1018626..dcece4f2e 100644 --- a/src/containers/Purchases/Bills/BillForm/BillFormProvider.js +++ b/src/containers/Purchases/Bills/BillForm/BillFormProvider.js @@ -5,6 +5,8 @@ import { useVendors, useItems, useBill, + useWarehouses, + useBranches, useSettings, useCreateBill, useEditBill, @@ -14,8 +16,20 @@ const BillFormContext = createContext(); // Filter all purchasable items only. const stringifiedFilterRoles = JSON.stringify([ - { index: 1, fieldKey: 'purchasable', value: true, condition: '&&', comparator: 'equals' }, - { index: 2, fieldKey: 'active', value: true, condition: '&&', comparator: 'equals' }, + { + index: 1, + fieldKey: 'purchasable', + value: true, + condition: '&&', + comparator: 'equals', + }, + { + index: 2, + fieldKey: 'active', + value: true, + condition: '&&', + comparator: 'equals', + }, ]); /** @@ -45,6 +59,20 @@ function BillFormProvider({ billId, ...props }) { enabled: !!billId, }); + // Fetch warehouses list. + const { + data: warehouses, + isLoading: isWarehouesLoading, + isSuccess: isWarehousesSuccess, + } = useWarehouses(); + + // Fetches the branches list. + const { + data: branches, + isLoading: isBranchesLoading, + isSuccess: isBranchesSuccess, + } = useBranches(); + // Handle fetching bill settings. const { isFetching: isSettingLoading } = useSettings(); @@ -57,11 +85,16 @@ function BillFormProvider({ billId, ...props }) { const isNewMode = !billId; + // Determines whether the warehouse and branches are loading. + const isFeatureLoading = isWarehouesLoading || isBranchesLoading; + const provider = { accounts, vendors, items, bill, + warehouses, + branches, submitPayload, isNewMode, @@ -70,6 +103,9 @@ function BillFormProvider({ billId, ...props }) { isAccountsLoading, isItemsLoading, isVendorsLoading, + isFeatureLoading, + isBranchesSuccess, + isWarehousesSuccess, createBillMutate, editBillMutate, diff --git a/src/containers/Purchases/Bills/BillForm/BillFormTopBar.js b/src/containers/Purchases/Bills/BillForm/BillFormTopBar.js new file mode 100644 index 000000000..3604f9b35 --- /dev/null +++ b/src/containers/Purchases/Bills/BillForm/BillFormTopBar.js @@ -0,0 +1,118 @@ +import React from 'react'; +import intl from 'react-intl-universal'; +import { + Alignment, + Navbar, + NavbarGroup, + NavbarDivider, + Button, + Classes, +} from '@blueprintjs/core'; +import styled from 'styled-components'; +import { + useSetPrimaryBranchToForm, + useSetPrimaryWarehouseToForm, +} from './utils'; +import { useFeatureCan } from 'hooks/state'; +import { Icon, BranchSelect, FeatureCan, WarehouseSelect } from 'components'; +import { useBillFormContext } from './BillFormProvider'; +import { Features } from 'common'; + +/** + * Bill form topbar . + * @returns {JSX.Element} + */ +export default function BillFormTopBar() { + // Features guard. + const { featureCan } = useFeatureCan(); + + // Sets the primary warehouse to form. + useSetPrimaryWarehouseToForm(); + + // Sets the primary branch to form. + useSetPrimaryBranchToForm(); + + // Can't display the navigation bar if warehouses or branches feature is not enabled. + if (!featureCan(Features.Warehouses) || !featureCan(Features.Branches)) { + return null; + } + + return ( + + + + + + {featureCan(Features.Warehouses) && featureCan(Features.Branches) && ( + + )} + + + + + + ); +} + +function BillFormSelectBranch() { + // Bill form context. + const { branches, isBranchesLoading } = useBillFormContext(); + + return isBranchesLoading ? ( + + ) : ( + + ); +} + +function BillFormSelectWarehouse() { + // Bill form context. + const { warehouses, isWarehouesLoading } = useBillFormContext(); + + return isWarehouesLoading ? ( + + ) : ( + + ); +} + +function BillWarehouseSelectButton({ label }) { + return ( +