fix issues.

This commit is contained in:
Ahmed Bouhuolia
2020-05-05 04:21:37 +02:00
parent 3b25056cbe
commit bd7eb0eb76
41 changed files with 364 additions and 216 deletions

View File

@@ -12,7 +12,7 @@ import {
Checkbox,
Position,
} from '@blueprintjs/core';
import AuthenticationToaster from 'components/AppToaster';
import Toaster from 'components/AppToaster';
import ErrorMessage from 'components/ErrorMessage';
import AuthInsider from 'containers/Authentication/AuthInsider';
import Icon from 'components/Icon';
@@ -69,7 +69,6 @@ function Login({
message: `The email and password you entered did not match our records.
Please double-check and try again.`,
intent: Intent.DANGER,
position: Position.BOTTOM,
});
}
if (errors.find((e) => e.type === ERRORS_TYPES.USER_INACTIVE)) {
@@ -79,7 +78,7 @@ function Login({
});
}
toastBuilders.forEach(builder => {
AuthenticationToaster.show(builder);
Toaster.show(builder);
});
setSubmitting(false);
});
@@ -114,7 +113,6 @@ function Login({
<InputGroup
intent={(errors.crediential && touched.crediential) && Intent.DANGER}
large={true}
placeholder={'name@company.com'}
{...getFieldProps('crediential')}
/>
</FormGroup>
@@ -130,7 +128,6 @@ function Login({
large={true}
intent={(errors.password && touched.password) && Intent.DANGER}
type={shown ? 'text' : 'password'}
placeholder={'password'}
{...getFieldProps('password')}
/>
</FormGroup>

View File

@@ -32,6 +32,8 @@ function AccountsChart({
const [bulkDelete, setBulkDelete] = useState(false);
const [selectedRows, setSelectedRows] = useState([]);
const [tableLoading, setTableLoading] = useState(false);
// Fetch accounts resource views and fields.
const fetchHook = useAsync(async () => {
await Promise.all([
@@ -66,7 +68,8 @@ function AccountsChart({
setDeleteAccount(false);
if (errors.find((e) => e.type === 'ACCOUNT.PREDEFINED')) {
AppToaster.show({
message: 'cannot_delete_predefined_account'
message: 'cannot_delete_predefined_account',
intent: Intent.DANGER,
});
}
if (errors.find((e) => e.type === 'ACCOUNT.HAS.ASSOCIATED.TRANSACTIONS')) {
@@ -96,7 +99,7 @@ function AccountsChart({
});
}, [inactiveAccount, requestFetchAccountsTable, requestInactiveAccount]);
const handleEditAccount = (account) => {
};
@@ -138,7 +141,11 @@ function AccountsChart({
// Refetch accounts data table when current custom view changed.
const handleViewChanged = useCallback(() => {
fetchAccountsHook.execute();
setTableLoading(true);
fetchAccountsHook.execute().finally(() => {
setTableLoading(false);
});
}, [fetchAccountsHook]);
// Handle fetch data of accounts datatable.
@@ -177,7 +184,8 @@ function AccountsChart({
onRestoreAccount={handleRestoreAccount}
onEditAccount={handleEditAccount}
onFetchData={handleFetchData}
onSelectedRowsChange={handleSelectedRowsChange} />
onSelectedRowsChange={handleSelectedRowsChange}
loading={tableLoading} />
</Route>
</Switch>

View File

@@ -7,7 +7,8 @@ import {
Intent,
TextArea,
MenuItem,
Checkbox
Checkbox,
Position
} from '@blueprintjs/core';
import { Select } from '@blueprintjs/select';
import * as Yup from 'yup';
@@ -92,7 +93,8 @@ function AccountFormDialog({
}).then((response) => {
closeDialog(name);
AppToaster.show({
message: 'the_account_has_been_edited'
message: 'the_account_has_been_edited',
intent: Intent.SUCCESS,
});
setSubmitting(false);
}).catch((errors) => {
@@ -103,7 +105,9 @@ function AccountFormDialog({
requestSubmitAccount({ form: { ...omit(values, exclude) } }).then(response => {
closeDialog(name);
AppToaster.show({
message: 'the_account_has_been_submit'
message: 'the_account_has_been_submit',
intent: Intent.SUCCESS,
position: Position.BOTTOM,
});
setSubmitting(false);
}).catch((errors) => {

View File

@@ -1,4 +1,4 @@
import React, { useMemo } from 'react';
import React, { useMemo, useCallback } from 'react';
import { useIntl } from 'react-intl';
import { useFormik } from 'formik';
import * as Yup from 'yup';
@@ -90,9 +90,9 @@ function InviteUserDialog({
fetchHook.execute();
};
const onDialogClosed = () => {
const onDialogClosed = useCallback(() => {
formik.resetForm();
};
}, [formik.resetForm]);
const handleClose = () => {
closeDialog(name);

View File

@@ -1,4 +1,4 @@
import React, { useMemo } from 'react';
import React, { useMemo, useCallback } from 'react';
import { useIntl } from 'react-intl';
import { useFormik } from 'formik';
import * as Yup from 'yup';
@@ -49,7 +49,14 @@ function UserFormDialog({
)),
};
const formik = useFormik({
const {
values,
errors,
touched,
resetForm,
getFieldProps,
handleSubmit,
} = useFormik({
enableReinitialize: true,
initialValues,
validationSchema,
@@ -74,15 +81,13 @@ function UserFormDialog({
}
},
});
const { values, errors, touched } = useMemo(() => formik, [formik]);
const onDialogOpening = () => {
fetchHook.execute();
};
const onDialogClosed = () => {
formik.resetForm();
};
const onDialogClosed = useCallback(() => {
resetForm();
}, [resetForm]);
const handleClose = () => {
closeDialog(name);
@@ -103,19 +108,21 @@ function UserFormDialog({
onClosed={onDialogClosed}
onOpening={onDialogOpening}
>
<form onSubmit={formik.handleSubmit}>
<form onSubmit={handleSubmit}>
<div className={Classes.DIALOG_BODY}>
<p class="mb2">Your teammate will get an email that gives them access to your team.</p>
<FormGroup
label={'Email'}
className={'form-group--email'}
intent={errors.email && touched.email && Intent.DANGER}
helperText={<ErrorMessage name='email' {...formik} />}
className={classNames('form-group--email', Classes.FILL)}
intent={(errors.email && touched.email) && Intent.DANGER}
helperText={<ErrorMessage name='email' {...{errors, touched}} />}
inline={true}
>
<InputGroup
medium={true}
intent={errors.email && touched.email && Intent.DANGER}
{...formik.getFieldProps('email')}
intent={(errors.email && touched.email) && Intent.DANGER}
{...getFieldProps('email')}
/>
</FormGroup>
</div>

View File

@@ -79,6 +79,20 @@ const ItemsActionsBar = ({
<NavbarDivider />
<Button
className={Classes.MINIMAL}
icon={<Icon icon='plus' />}
text='New Item'
onClick={onClickNewItem}
/>
<Button
className={Classes.MINIMAL}
icon={<Icon icon='plus' />}
text='New Category'
onClick={onClickNewCategory}
/>
<Popover
content={filterDropdown}
interactionKind={PopoverInteractionKind.CLICK}
@@ -91,19 +105,6 @@ const ItemsActionsBar = ({
/>
</Popover>
<Button
className={Classes.MINIMAL}
icon={<Icon icon='plus' />}
text='New Item'
onClick={onClickNewItem}
/>
<Button
className={Classes.MINIMAL}
icon={<Icon icon='plus' />}
text='New Category'
onClick={onClickNewCategory}
/>
{hasSelectedRows && (
<Button
className={Classes.MINIMAL}

View File

@@ -63,7 +63,7 @@ const ItemCategoriesList = ({
}, [setSelectedRows]);
return (
<DashboardInsider loading={fetchHook.pending}>
<DashboardInsider loading={fetchHook.pending} name="items-categories">
<ItemsCategoryActionsBar
views={views}
onDeleteCategory={handelDeleteCategory}

View File

@@ -41,7 +41,7 @@ function ItemsList({
await Promise.all([
fetchResourceViews('items'),
fetchResourceFields('items'),
])
]);
});
const fetchItems = useAsync(async () => {

View File

@@ -11,9 +11,7 @@ function Currencies({ openDialog }) {
return (
<div className={'preferences__inside-content'}>
<div className={'preferences__tabs'}>
<Button intent={Intent.PRIMARY} onClick={onClickNewCurrency}>
New Currency
</Button>
</div>
</div>
);

View File

@@ -0,0 +1,31 @@
import React, {useCallback} from 'react';
import {
Button,
Intent,
} from '@blueprintjs/core';
import Icon from 'components/Icon';
import DialogConnect from 'connectors/Dialog.connector';
import {compose} from 'utils';
function CurrenciesActions({
openDialog,
}) {
const handleClickNewCurrency = useCallback(() => {
openDialog('currency-form');
}, []);
return (
<div class="users-actions">
<Button
icon={<Icon icon='plus' iconSize={12} />}
onClick={handleClickNewCurrency}
intent={Intent.PRIMARY}>
New Currency
</Button>
</div>
);
}
export default compose(
DialogConnect,
)(CurrenciesActions);

View File

@@ -19,8 +19,6 @@ import DialogConnect from 'connectors/Dialog.connector';
import DashboardConnect from 'connectors/Dashboard.connector';
import LoadingIndicator from 'components/LoadingIndicator';
import DataTable from 'components/DataTable';
import Currencies from './Currencies';
import useAsync from 'hooks/async';
import AppToaster from 'components/AppToaster';
function CurrenciesList({
@@ -109,11 +107,9 @@ function CurrenciesList({
const handleDatatableFetchData = useCallback(() => {
onFetchData && onFetchData();
}, []);
console.log({ currencies }, 'X');
return (
<LoadingIndicator>
<Currencies />
<DataTable
columns={columns}
data={Object.values(currencies)}

View File

@@ -6,26 +6,12 @@ import connector from 'connectors/UsersPreferences.connector';
function UsersPreferences({ openDialog }) {
const onChangeTabs = (currentTabId) => {};
const onClickNewUser = useCallback(() => {
openDialog('user-form');
}, [openDialog]);
return (
<div class='preferences__inside-content preferences__inside-content--users-roles'>
<div class='preferences__tabs'>
<Tabs animate={true} large={true} onChange={onChangeTabs}>
<Tabs animate={true} onChange={onChangeTabs}>
<Tab id='users' title='Users' />
<Tab id='roles' title='Roles' />
<div class='preferences__tabs-extra-actions'>
<Button intent={Intent.PRIMARY} onClick={onClickNewUser}>
Invite User
</Button>
<Button intent={Intent.PRIMARY} onClick={onClickNewUser}>
New Role
</Button>
</div>
</Tabs>
</div>
<PreferencesSubContent preferenceTab='users' />

View File

@@ -0,0 +1,38 @@
import React, {useCallback} from 'react';
import {
Button,
Intent,
} from '@blueprintjs/core';
import Icon from 'components/Icon';
import DialogConnect from 'connectors/Dialog.connector';
import {compose} from 'utils';
function UsersActions({
openDialog,
closeDialog,
}) {
const onClickNewUser = useCallback(() => {
openDialog('user-form');
}, []);
return (
<div claass="preferences-actions">
<Button
icon={<Icon icon='plus' iconSize={12} />}
onClick={onClickNewUser}
intent={Intent.PRIMARY}>
Invite User
</Button>
<Button
icon={<Icon icon='plus' iconSize={12} />}
onClick={onClickNewUser}>
New Role
</Button>
</div>
);
}
export default compose(
DialogConnect,
)(UsersActions);

View File

@@ -83,10 +83,7 @@ function UsersListPreferences({
};
const handleConfirmUserDelete = () => {
if (!deleteUserState) {
return;
}
if (!deleteUserState) { return; }
requestDeleteUser(deleteUserState.id).then((response) => {
setDeleteUserState(false);
AppToaster.show({