diff --git a/client/src/components/Accounts/AccountsViewsTabs.js b/client/src/components/Accounts/AccountsViewsTabs.js index fde698a69..93dee0a20 100644 --- a/client/src/components/Accounts/AccountsViewsTabs.js +++ b/client/src/components/Accounts/AccountsViewsTabs.js @@ -80,6 +80,7 @@ function AccountsViewsTabs({ className='button--new-view' icon={} onClick={handleClickNewView} + minimal={true} /> diff --git a/client/src/components/AccountsSelectList.js b/client/src/components/AccountsSelectList.js index f826d33c7..32c58bd9d 100644 --- a/client/src/components/AccountsSelectList.js +++ b/client/src/components/AccountsSelectList.js @@ -5,11 +5,12 @@ import { } from '@blueprintjs/core'; import {Select} from '@blueprintjs/select'; -export default function AccountsMultiSelect({ +export default function AccountsSelectList({ accounts, onAccountSelected, error, initialAccount, + defautlSelectText = 'Select account' }) { const [selectedAccount, setSelectedAccount] = useState( initialAccount || null @@ -36,7 +37,7 @@ export default function AccountsMultiSelect({ onItemSelect={onAccountSelect}> - diff --git a/client/src/containers/Dashboard/Dialogs/ItemCategoryDialog.js b/client/src/containers/Dashboard/Dialogs/ItemCategoryDialog.js index 53ced0aa5..6c8ffb821 100644 --- a/client/src/containers/Dashboard/Dialogs/ItemCategoryDialog.js +++ b/client/src/containers/Dashboard/Dialogs/ItemCategoryDialog.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useMemo, useCallback } from 'react'; import { Button, Classes, @@ -9,7 +9,7 @@ import { MenuItem } from '@blueprintjs/core'; import { Select } from '@blueprintjs/select'; -import { omit, pick } from 'lodash'; +import { pick } from 'lodash'; import * as Yup from 'yup'; import { useIntl } from 'react-intl'; import { useFormik } from 'formik'; @@ -20,6 +20,9 @@ import AppToaster from 'components/AppToaster'; import DialogConnect from 'connectors/Dialog.connector'; import DialogReduxConnect from 'components/DialogReduxConnect'; import ItemsCategoryConnect from 'connectors/ItemsCategory.connect'; +import ErrorMessage from 'components/ErrorMessage'; +import classNames from 'classnames'; +import Icon from 'components/Icon'; function ItemCategoryDialog({ name, @@ -33,9 +36,8 @@ function ItemCategoryDialog({ requestEditItemCategory, editItemCategory }) { - const [state, setState] = useState({ - selectedParentCategory: null - }); + const [selectedParentCategory, setParentCategory] = useState(null); + const intl = useIntl(); const ValidationSchema = Yup.object().shape({ name: Yup.string().required(intl.formatMessage({ id: 'required' })), @@ -43,11 +45,12 @@ function ItemCategoryDialog({ description: Yup.string().trim() }); - const initialValues = { + const initialValues = useMemo(() => ({ name: '', description: '', parent_category_id: null - }; + }), []); + //Formik const formik = useFormik({ enableReinitialize: true, @@ -56,30 +59,35 @@ function ItemCategoryDialog({ pick(editItemCategory, Object.keys(initialValues))) }, validationSchema: ValidationSchema, - onSubmit: values => { + onSubmit: (values, { setSubmitting }) => { if (payload.action === 'edit') { requestEditItemCategory(payload.id, values).then(response => { closeDialog(name); AppToaster.show({ message: 'the_category_has_been_edited' }); + setSubmitting(false); + }).catch((error) => { + setSubmitting(false); }); } else { requestSubmitItemCategory(values) - .then(response => { + .then((response) => { closeDialog(name); AppToaster.show({ message: 'the_category_has_been_submit' }); + setSubmitting(false); }) - .catch(error => { - alert(error.message); + .catch((error) => { + setSubmitting(false); }); } } }); + const { values, errors, touched } = useMemo(() => formik, [formik]); - const filterItemCategory = (query, category, _index, exactMatch) => { + const filterItemCategory = useCallback((query, category, _index, exactMatch) => { const normalizedTitle = category.name.toLowerCase(); const normalizedQuery = query.toLowerCase(); @@ -88,73 +96,80 @@ function ItemCategoryDialog({ } else { return normalizedTitle.indexOf(normalizedQuery) >= 0; } - }; + }, []); - const parentCategoryItem = (category, { handleClick, modifiers, query }) => { + const parentCategoryItem = useCallback((category, { handleClick, modifiers, query }) => { return ( ); - }; - const handleClose = () => { - closeDialog(name); - }; + }, []); + + const handleClose = useCallback(() => { closeDialog(name); }, [name, closeDialog]); const fetchHook = useAsync(async () => { - await Promise.all([requestFetchItemCategories()]); + await Promise.all([ + requestFetchItemCategories(), + ]); }, false); - const onDialogOpening = () => { - fetchHook.execute(); - }; + const onDialogOpening = useCallback(() => { fetchHook.execute(); }, [fetchHook]); - const onChangeParentCategory = parentCategory => { - setState({ ...state, selectedParentCategory: parentCategory.name }); + const onChangeParentCategory = useCallback((parentCategory) => { + setParentCategory(parentCategory); formik.setFieldValue('parent_category_id', parentCategory.id); - }; + }, [formik]); - const onDialogClosed = () => { + const onDialogClosed = useCallback(() => { formik.resetForm(); closeDialog(name); - }; + }, [formik, closeDialog, name]); + + const requiredSpan = useMemo(() => (*), []); + const infoIcon = useMemo(() => (), []); return (
)} inline={true} > )} + intent={(errors.parent_category_id && touched.parent_category_id) && Intent.DANGER} > @@ -174,8 +190,8 @@ function ItemCategoryDialog({ )} inline={true} >