- {/* Vend name */}
+ {/* Vendor name */}
}
inline={true}
@@ -94,7 +104,7 @@ function PaymentMadeFormHeader({
}
>
}
itemRenderer={handleVenderRenderer}
itemPredicate={handleFilterVender}
@@ -144,6 +154,20 @@ function PaymentMadeFormHeader({
errors.payment_number && touched.payment_number && Intent.DANGER
}
minimal={true}
+ rightElement={
+
,
+ }}
+ tooltip={true}
+ tooltipProps={{
+ content: 'Setting your auto-generated payment number',
+ position: Position.BOTTOM_LEFT,
+ }}
+ />
+ }
+ minimal={true}
{...getFieldProps('payment_number')}
/>
@@ -199,10 +223,12 @@ function PaymentMadeFormHeader({
}
export default compose(
- withVender(({ vendorsCurrentPage }) => ({
+ withVender(({ vendorsCurrentPage, vendorItems }) => ({
vendorsCurrentPage,
+ vendorItems,
})),
withAccounts(({ accountsList }) => ({
accountsList,
})),
+ withDialogActions,
)(PaymentMadeFormHeader);
diff --git a/client/src/containers/Purchases/PaymentMades/withPaymentMade.js b/client/src/containers/Purchases/PaymentMades/withPaymentMade.js
index bf8a85075..e9e30bce0 100644
--- a/client/src/containers/Purchases/PaymentMades/withPaymentMade.js
+++ b/client/src/containers/Purchases/PaymentMades/withPaymentMade.js
@@ -7,7 +7,6 @@ import {
getPaymentMadeTableQuery,
} from 'store/PaymentMades/paymentMade.selector';
-
export default (mapState) => {
const getPyamentMadesItems = getPaymentMadeCurrentPageFactory();
const getPyamentMadesPaginationMeta = getPaymentMadePaginationMetaFactory();
@@ -18,8 +17,14 @@ export default (mapState) => {
paymentMadeViews: getResourceViews(state, props, 'bill_payments'),
paymentMadeItems: state.paymentMades.items,
paymentMadeTableQuery: query,
- paymentMadePageination: getPyamentMadesPaginationMeta(state, props, query),
+ paymentMadePageination: getPyamentMadesPaginationMeta(
+ state,
+ props,
+ query,
+ ),
paymentMadesLoading: state.paymentMades.loading,
+ nextPaymentNumberChanged:
+ state.paymentMades.nextPaymentNumberChanged,
};
return mapState ? mapState(mapped, state, props) : mapped;
};
diff --git a/client/src/containers/Purchases/PaymentMades/withPaymentMadeActions.js b/client/src/containers/Purchases/PaymentMades/withPaymentMadeActions.js
index 30fb5f97a..867f486f3 100644
--- a/client/src/containers/Purchases/PaymentMades/withPaymentMadeActions.js
+++ b/client/src/containers/Purchases/PaymentMades/withPaymentMadeActions.js
@@ -27,5 +27,10 @@ const mapDispatchToProps = (dispatch) => ({
type: t.PAYMENT_MADE_TABLE_QUERIES_ADD,
queries,
}),
+ setPaymentNumberChange: (isChanged) =>
+ dispatch({
+ type: t.PAYMENT_MADES_NUMBER_CHANGED,
+ payload: { isChanged },
+ }),
});
export default connect(null, mapDispatchToProps);
diff --git a/client/src/containers/Sales/Estimate/EstimateForm.js b/client/src/containers/Sales/Estimate/EstimateForm.js
index 4fe46e069..31a927647 100644
--- a/client/src/containers/Sales/Estimate/EstimateForm.js
+++ b/client/src/containers/Sales/Estimate/EstimateForm.js
@@ -21,6 +21,7 @@ import withEstimateActions from './withEstimateActions';
import withEstimateDetail from './withEstimateDetail';
import withDashboardActions from 'containers/Dashboard/withDashboardActions';
import withMediaActions from 'containers/Media/withMediaActions';
+import withSettings from 'containers/Settings/withSettings';
import AppToaster from 'components/AppToaster';
import Dragzone from 'components/Dragzone';
@@ -43,6 +44,10 @@ const EstimateForm = ({
changePageTitle,
changePageSubtitle,
+ // #withSettings
+ estimateNextNumber,
+ estimateNumberPrefix,
+
//#withEstimateDetail
estimate,
@@ -92,7 +97,7 @@ const EstimateForm = ({
expiration_date: Yup.date()
.required()
.label(formatMessage({ id: 'expiration_date_' })),
- estimate_number: Yup.number()
+ estimate_number: Yup.string()
.required()
.nullable()
.label(formatMessage({ id: 'estimate_number_' })),
@@ -110,18 +115,6 @@ const EstimateForm = ({
entries: Yup.array().of(
Yup.object().shape({
quantity: Yup.number().nullable(),
- //Cyclic dependency
- rate: Yup.number().nullable(),
- // .when(['item_id'], {
- // is: (item_id) => item_id,
- // then: Yup.number().required(),
- // }),
-
- // rate: Yup.number().test((value) => {
- // const { item_id } = this.parent;
- // if (!item_id) return value != null;
- // return false;
- // }),
item_id: Yup.number()
.nullable()
.when(['quantity', 'rate'], {
@@ -152,13 +145,16 @@ const EstimateForm = ({
}),
[],
);
+ const estimateNumber = estimateNumberPrefix
+ ? `${estimateNumberPrefix}-${estimateNextNumber}`
+ : estimateNextNumber;
const defaultInitialValues = useMemo(
() => ({
customer_id: '',
estimate_date: moment(new Date()).format('YYYY-MM-DD'),
expiration_date: moment(new Date()).format('YYYY-MM-DD'),
- estimate_number: '',
+ estimate_number: estimateNumber,
reference: '',
note: '',
terms_conditions: '',
@@ -208,7 +204,6 @@ const EstimateForm = ({
}, [estimate]);
const formik = useFormik({
- enableReinitialize: true,
validationSchema,
initialValues: {
...initialValues,
@@ -226,9 +221,12 @@ const EstimateForm = ({
if (estimate && estimate.id) {
requestEditEstimate(estimate.id, requestForm).then((response) => {
AppToaster.show({
- message: formatMessage({
- id: 'the_estimate_has_been_successfully_edited',
- }),
+ message: formatMessage(
+ {
+ id: 'the_estimate_has_been_successfully_edited',
+ },
+ { number: values.estimate_number },
+ ),
intent: Intent.SUCCESS,
});
setSubmitting(false);
@@ -255,7 +253,11 @@ const EstimateForm = ({
}
},
});
- console.log(formik.errors ,'ERROR');
+
+ useEffect(() => {
+ formik.setFieldValue('estimate_number', estimateNumber);
+ }, [estimateNumber]);
+
const handleSubmitClick = useCallback(
(payload) => {
setPayload(payload);
@@ -353,7 +355,11 @@ const EstimateForm = ({
export default compose(
withEstimateActions,
+ withEstimateDetail(),
withDashboardActions,
withMediaActions,
- withEstimateDetail(),
+ withSettings(({ estimatesSettings }) => ({
+ estimateNextNumber: estimatesSettings?.next_number,
+ estimateNumberPrefix: estimatesSettings?.number_prefix,
+ })),
)(EstimateForm);
diff --git a/client/src/containers/Sales/Estimate/EstimateFormHeader.js b/client/src/containers/Sales/Estimate/EstimateFormHeader.js
index 695907f7b..a6a4b1ed4 100644
--- a/client/src/containers/Sales/Estimate/EstimateFormHeader.js
+++ b/client/src/containers/Sales/Estimate/EstimateFormHeader.js
@@ -13,15 +13,24 @@ import { Row, Col } from 'react-grid-system';
import moment from 'moment';
import { momentFormatter, compose, tansformDateValue } from 'utils';
import classNames from 'classnames';
-import { ListSelect, ErrorMessage, FieldRequiredHint, Hint } from 'components';
+import {
+ ListSelect,
+ ErrorMessage,
+ FieldRequiredHint,
+ Icon,
+ InputPrependButton,
+} from 'components';
import withCustomers from 'containers/Customers/withCustomers';
+import withDialogActions from 'containers/Dialog/withDialogActions';
function EstimateFormHeader({
formik: { errors, touched, setFieldValue, getFieldProps, values },
//#withCustomers
customers,
+ // #withDialogActions
+ openDialog,
}) {
const handleDateChange = useCallback(
(date_filed) => (date) => {
@@ -67,6 +76,10 @@ function EstimateFormHeader({
[setFieldValue],
);
+ const handleEstimateNumberChange = useCallback(() => {
+ openDialog('estimate-number-form', {});
+ }, [openDialog]);
+
return (
@@ -171,6 +184,19 @@ function EstimateFormHeader({
errors.estimate_number && touched.estimate_number && Intent.DANGER
}
minimal={true}
+ rightElement={
+ ,
+ }}
+ tooltip={true}
+ tooltipProps={{
+ content: 'Setting your auto-generated estimate number',
+ position: Position.BOTTOM_LEFT,
+ }}
+ />
+ }
{...getFieldProps('estimate_number')}
/>
@@ -196,4 +222,5 @@ export default compose(
withCustomers(({ customers }) => ({
customers,
})),
+ withDialogActions,
)(EstimateFormHeader);
diff --git a/client/src/containers/Sales/Estimate/EstimateList.js b/client/src/containers/Sales/Estimate/EstimateList.js
index 56de0e5ca..ba96eca58 100644
--- a/client/src/containers/Sales/Estimate/EstimateList.js
+++ b/client/src/containers/Sales/Estimate/EstimateList.js
@@ -42,15 +42,15 @@ function EstimateList({
const [deleteEstimate, setDeleteEstimate] = useState(false);
const [selectedRows, setSelectedRows] = useState([]);
- const fetchResourceViews = useQuery(
- ['resource-views', 'sales_estimates'],
- (key, resourceName) => requestFetchResourceViews(resourceName),
- );
+ // const fetchResourceViews = useQuery(
+ // ['resource-views', 'sales_estimates'],
+ // (key, resourceName) => requestFetchResourceViews(resourceName),
+ // );
- const fetchResourceFields = useQuery(
- ['resource-fields', 'sales_estimates'],
- (key, resourceName) => requestFetchResourceFields(resourceName),
- );
+ // const fetchResourceFields = useQuery(
+ // ['resource-fields', 'sales_estimates'],
+ // (key, resourceName) => requestFetchResourceFields(resourceName),
+ // );
const fetchEstimate = useQuery(['estimates-table', estimateTableQuery], () =>
requestFetchEstimatesTable(),
@@ -86,16 +86,6 @@ function EstimateList({
});
}, [deleteEstimate, requestDeleteEstimate, formatMessage]);
- // // Handle filter change to re-fetch data-table.
- // const handleFilterChanged = useCallback(
- // (filterConditions) => {
- // addEstimatesTableQueries({
- // filter_roles: filterConditions || '',
- // });
- // },
- // [fetchEstimate],
- // );
-
// Handle filter change to re-fetch data-table.
const handleFilterChanged = useCallback(() => {}, [fetchEstimate]);
@@ -136,7 +126,7 @@ function EstimateList({
);
return (
{
payload.redirect && history.push('/estimates');
@@ -44,6 +53,8 @@ function Estimates({
history.goBack();
}, [history]);
+ const fetchSettings = useQuery(['settings'], () => requestFetchOptions({}));
+
return (
(