Merge remote-tracking branch 'origin/accounts_fix'

This commit is contained in:
Ahmed Bouhuolia
2020-07-01 18:24:42 +02:00
18 changed files with 271 additions and 245 deletions

View File

@@ -1,7 +1,7 @@
import React, { useEffect, useState, useMemo, useCallback } from 'react';
import { Route, Switch } from 'react-router-dom';
import { Alert, Intent } from '@blueprintjs/core';
import { useQuery } from 'react-query';
import { useQuery, queryCache } from 'react-query';
import {
FormattedMessage as T,
FormattedHTMLMessage,
@@ -139,16 +139,22 @@ function AccountsChart({
}, []);
// Handle confirm account activation.
const handleConfirmAccountActive = useCallback(() => {
requestInactiveAccount(inactiveAccount.id).then(() => {
setInactiveAccount(false);
AppToaster.show({
message: formatMessage({
id: 'the_account_has_been_successfully_inactivated',
}),
intent: Intent.SUCCESS,
requestInactiveAccount(inactiveAccount.id)
.then(() => {
setInactiveAccount(false);
AppToaster.show({
message: formatMessage({
id: 'the_account_has_been_successfully_inactivated',
}),
intent: Intent.SUCCESS,
});
queryCache.invalidateQueries('accounts-table');
})
.catch((error) => {
setInactiveAccount(false);
});
});
}, [inactiveAccount, requestInactiveAccount, formatMessage]);
// Handle activate account click.
@@ -163,16 +169,21 @@ function AccountsChart({
// Handle activate account confirm.
const handleConfirmAccountActivate = useCallback(() => {
requestActivateAccount(activateAccount.id).then(() => {
setActivateAccount(false);
AppToaster.show({
message: formatMessage({
id: 'the_account_has_been_successfully_activated',
}),
intent: Intent.SUCCESS,
requestActivateAccount(activateAccount.id)
.then(() => {
setActivateAccount(false);
AppToaster.show({
message: formatMessage({
id: 'the_account_has_been_successfully_activated',
}),
intent: Intent.SUCCESS,
});
queryCache.invalidateQueries('accounts-table');
})
.catch((error) => {
setActivateAccount(false);
});
});
});
}, [activateAccount, requestActivateAccount, formatMessage]);
const handleRestoreAccount = (account) => {};

View File

@@ -114,7 +114,11 @@ function AccountsDataTable({
const handleNewParentAccount = useCallback(
(account) => {
openDialog('account-form', { action: 'new_child', id: account.id });
openDialog('account-form', {
action: 'new_child',
parentAccountId: account.id,
accountTypeId: account.account_type_id,
});
},
[openDialog],
);

View File

@@ -10,7 +10,7 @@ import {
deleteBulkAccounts,
bulkActivateAccounts,
bulkInactiveAccounts,
editAccount
editAccount,
} from 'store/accounts/accounts.actions';
const mapActionsToProps = (dispatch) => ({
@@ -22,9 +22,9 @@ const mapActionsToProps = (dispatch) => ({
requestActivateAccount: (id) => dispatch(activateAccount({ id })),
requestFetchAccount: (id) => dispatch(fetchAccount({ id })),
requestDeleteBulkAccounts: (ids) => dispatch(deleteBulkAccounts({ ids })),
requestBulkActivateAccounts:(ids)=>dispatch(bulkActivateAccounts({ids})),
requestBulkInactiveAccounts:(ids)=>dispatch(bulkInactiveAccounts({ids})),
requestEditAccount:({id,form}) => dispatch(editAccount({id,form}))
requestBulkActivateAccounts: (ids) => dispatch(bulkActivateAccounts({ ids })),
requestBulkInactiveAccounts: (ids) => dispatch(bulkInactiveAccounts({ ids })),
requestEditAccount: (id, form) => dispatch(editAccount(id, form)),
});
export default connect(null, mapActionsToProps);
export default connect(null, mapActionsToProps);

View File

@@ -8,12 +8,16 @@ import withAccounts from 'containers/Accounts/withAccounts';
export const mapStateToProps = (state, props) => ({
dialogName: 'account-form',
accountId:
props.payload.action === 'edit' && props.payload.id
? props.payload.id
: null,
});
const AccountFormDialogConnect = connect(mapStateToProps);
export default compose(
AccountFormDialogConnect,
withDialogRedux(null, 'account-form'),
AccountFormDialogConnect,
withAccountsActions,
withAccountDetail,
withAccounts(({ accountsTypes, accounts }) => ({

View File

@@ -13,6 +13,7 @@ import {
import * as Yup from 'yup';
import { useFormik } from 'formik';
import { FormattedMessage as T, useIntl } from 'react-intl';
import { If } from 'components';
import { omit, pick } from 'lodash';
import { useQuery, queryCache } from 'react-query';
import classNames from 'classnames';
@@ -61,14 +62,16 @@ function AccountFormDialog({
.nullable()
.required()
.label(formatMessage({ id: 'account_type_id' })),
description: Yup.string().trim(),
description: Yup.string().nullable().trim(),
// parent_account_id: Yup.string().nullable(),
});
const initialValues = useMemo(
() => ({
account_type_id: null,
name: '',
description: '',
code: '',
type: '',
}),
[],
);
@@ -94,7 +97,11 @@ function AccountFormDialog({
} = useFormik({
enableReinitialize: true,
initialValues: {
...(payload.action === 'edit' && account ? account : initialValues),
// ...initialValues,
// ...(payload.action === 'edit' && account ? account : initialValues),
...(payload.action === 'edit' &&
pick(account, Object.keys(initialValues))),
},
validationSchema: accountFormValidationSchema,
onSubmit: (values, { setSubmitting, setErrors }) => {
@@ -104,21 +111,10 @@ function AccountFormDialog({
: values.name;
if (payload.action === 'edit') {
requestEditAccount({
payload: payload.id,
// form: { ...omit(values, [...exclude, 'account_type_id']) },
form: {
...pick(values, [
...exclude,
'account_type_id',
'name',
'description',
]),
},
})
requestEditAccount(payload.id, values)
.then((response) => {
closeDialog(dialogName);
queryCache.refetchQueries('accounts-table', { force: true });
queryCache.invalidateQueries('accounts-table', { force: true });
AppToaster.show({
message: formatMessage(
@@ -137,10 +133,13 @@ function AccountFormDialog({
setSubmitting(false);
});
} else {
requestSubmitAccount({ form: { ...omit(values, exclude) } })
requestSubmitAccount({
payload: payload.parent_account_id,
form: { ...omit(values, exclude) },
})
.then((response) => {
closeDialog(dialogName);
queryCache.refetchQueries('accounts-table', { force: true });
queryCache.invalidateQueries('accounts-table', { force: true });
AppToaster.show({
message: formatMessage(
@@ -155,6 +154,7 @@ function AccountFormDialog({
});
})
.catch((errors) => {
debugger;
const errorsTransformed = transformApiErrors(errors);
setErrors({ ...errorsTransformed });
setSubmitting(false);
@@ -227,7 +227,7 @@ function AccountFormDialog({
const fetchAccountsList = useQuery(
'accounts-list',
() => requestFetchAccounts(),
{ enabled: true },
{ enabled: false },
);
// Fetches accounts types.
@@ -236,13 +236,13 @@ function AccountFormDialog({
async () => {
await requestFetchAccountTypes();
},
{ enabled: true },
{ enabled: false },
);
// Fetch the given account id on edit mode.
const fetchAccount = useQuery(
['account', payload.id],
(key, id) => requestFetchAccount(id),
(key, _id) => requestFetchAccount(_id),
{ enabled: false },
);
@@ -258,8 +258,13 @@ function AccountFormDialog({
if (payload.action === 'edit' && payload.id) {
fetchAccount.refetch();
}
}, [payload, fetchAccount, fetchAccountsList, fetchAccountsTypes]);
}
if (payload.action === 'new_child') {
setFieldValue('subaccount', true);
setFieldValue('parent_account_id', payload.parentAccountId);
setFieldValue('account_type_id', payload.accountTypeId);
}
}, [fetchAccount, fetchAccountsList, fetchAccountsTypes]);
const onChangeAccountType = useCallback(
(accountType) => {
@@ -367,7 +372,7 @@ function AccountFormDialog({
intent={errors.code && touched.code && Intent.DANGER}
helperText={<ErrorMessage name="code" {...{ errors, touched }} />}
inline={true}
labelInfo={<Hint content={<T id='account_code_hint' />} />}
labelInfo={<Hint content={<T id="account_code_hint" />} />}
>
<InputGroup
medium={true}
@@ -385,10 +390,11 @@ function AccountFormDialog({
inline={true}
label={subAccountLabel}
{...getFieldProps('subaccount')}
checked={values.subaccount}
/>
</FormGroup>
{values.subaccount && (
<If condition={values.subaccount}>
<FormGroup
label={<T id={'parent_account'} />}
className={classNames(
@@ -411,7 +417,7 @@ function AccountFormDialog({
labelProp={'name'}
/>
</FormGroup>
)}
</If>
<FormGroup
label={<T id={'description'} />}

View File

@@ -91,7 +91,7 @@ function CurrencyDialog({
intent: Intent.SUCCESS,
});
setSubmitting(false);
queryCache.refetchQueries('currencies', { force: true });
queryCache.invalidateQueries('currencies');
})
.catch((error) => {
setSubmitting(false);
@@ -107,7 +107,7 @@ function CurrencyDialog({
intent: Intent.SUCCESS,
});
setSubmitting(false);
queryCache.refetchQueries('currencies', { force: true });
queryCache.invalidateQueries('currencies');
})
.catch((error) => {
setSubmitting(false);

View File

@@ -70,8 +70,10 @@ function ExchangeRateDialog({
[],
);
const fetchExchangeRatesDialog = useQuery('exchange-rates-dialog', () =>
requestFetchExchangeRates(),
const fetchExchangeRatesDialog = useQuery(
'exchange-rates-dialog',
() => requestFetchExchangeRates(),
{ manual: true },
);
const {
@@ -102,7 +104,7 @@ function ExchangeRateDialog({
intent: Intent.SUCCESS,
});
setSubmitting(false);
queryCache.removeQueries('exchange-rates-dialog', { force: true });
queryCache.invalidateQueries('exchange-rates-dialog');
})
.catch((error) => {
setSubmitting(false);
@@ -118,7 +120,7 @@ function ExchangeRateDialog({
intent: Intent.SUCCESS,
});
setSubmitting(false);
queryCache.refetchQueries('exchange-rates-table', { force: true });
queryCache.invalidateQueries('exchange-rates-table');
})
.catch((errors) => {
if (

View File

@@ -92,7 +92,7 @@ function InviteUserDialog({
intent: Intent.SUCCESS,
});
setSubmitting(false);
queryCache.refetchQueries('users-table', { force: true });
queryCache.invalidateQueries('users-table');
})
.catch((error) => {
setSubmitting(false);

View File

@@ -106,9 +106,7 @@ function ItemCategoryDialog({
intent: Intent.SUCCESS,
});
setSubmitting(false);
queryCache.refetchQueries('items-categories-table', {
force: true,
});
queryCache.invalidateQueries('items-categories-table');
})
.catch((error) => {
setSubmitting(false);
@@ -124,9 +122,7 @@ function ItemCategoryDialog({
intent: Intent.SUCCESS,
});
setSubmitting(false);
queryCache.refetchQueries('items-categories-table', {
force: true,
});
queryCache.invalidateQueries('items-categories-table');
})
.catch((error) => {
setSubmitting(false);

View File

@@ -80,7 +80,7 @@ function UserFormDialog({
intent: Intent.SUCCESS,
});
setSubmitting(false);
queryCache.refetchQueries('users-table', { force: true });
queryCache.invalidateQueries('users-table');
})
.catch((errors) => {
setSubmitting(false);

View File

@@ -48,8 +48,6 @@ function ExpenseForm({
expenseId,
onFormSubmit,
onCancelForm,
onClickAddNewRow,
onClickRemoveRow,
}) {
const { formatMessage } = useIntl();
const [payload, setPayload] = useState({});
@@ -76,16 +74,13 @@ function ExpenseForm({
useEffect(() => {
if (expense && expense.id) {
changePageTitle(formatMessage({ id: 'edit_expense' }));
// changePageSubtitle(`No. ${expenseDetail.payment_account_id}`);
} else {
changePageTitle(formatMessage({ id: 'new_expense' }));
}
// @todo not functions just states.
}, [changePageTitle, changePageSubtitle, expense, formatMessage]);
}, [changePageTitle, expense, formatMessage]);
const validationSchema = Yup.object().shape({
beneficiary: Yup.string()
.label(formatMessage({ id: 'beneficiary' })),
beneficiary: Yup.string().label(formatMessage({ id: 'beneficiary' })),
payment_account_id: Yup.string()
.required()
.label(formatMessage({ id: 'payment_account_' })),
@@ -272,7 +267,6 @@ function ExpenseForm({
const handleSubmitClick = useCallback(
(payload) => {
setPayload(payload);
formik.resetForm();
formik.handleSubmit();
},
[setPayload, formik],

View File

@@ -51,7 +51,6 @@ function ExpenseTable({
setRow(newRows);
setFieldValue(
'categories',
newRows.map((row, index) => ({
...omit(row, ['rowType']),
index: index + 1,

View File

@@ -193,8 +193,6 @@ function GeneralPreferences({
.label(formatMessage({ id: 'date_format_' })),
});
const query = queryCache.refetchQueries('settings');
const {
values,
errors,
@@ -224,7 +222,7 @@ function GeneralPreferences({
});
setSubmitting(false);
resetForm();
queryCache.refetchQueries('settings', { force: true });
queryCache.invalidateQueries('settings');
})
.catch((error) => {
setSubmitting(false);

View File

@@ -79,7 +79,7 @@ function UsersListPreferences({
}),
intent: Intent.SUCCESS,
});
queryCache.refetchQueries('users-table', { force: true });
queryCache.invalidateQueries('users-table');
})
.catch((error) => {
setInactiveUserState(false);
@@ -108,7 +108,6 @@ function UsersListPreferences({
);
// Handle confirm User delete
const handleConfirmUserDelete = useCallback(() => {
if (!deleteUserState) {
return;
@@ -122,7 +121,7 @@ function UsersListPreferences({
}),
intent: Intent.SUCCESS,
});
queryCache.refetchQueries('users-table', { force: true });
queryCache.invalidateQueries('users-table');
})
.catch((errors) => {
setDeleteUserState(false);

View File

@@ -78,8 +78,8 @@ function ViewForm({
const validationSchema = Yup.object().shape({
resource_name: Yup.string().required(),
name: Yup.string().required(),
logic_expression: Yup.string().required(),
name: Yup.string().required().label(intl.formatMessage({id:'name_'})),
logic_expression: Yup.string().required().label(intl.formatMessage({id:'logic_expression'})),
roles: Yup.array().of(
Yup.object().shape({
comparator: Yup.string().required(),