diff --git a/client/src/containers/Accounting/MakeJournalEntries.schema.js b/client/src/containers/Accounting/MakeJournalEntries.schema.js index 485ae4bd0..c037f6789 100644 --- a/client/src/containers/Accounting/MakeJournalEntries.schema.js +++ b/client/src/containers/Accounting/MakeJournalEntries.schema.js @@ -1,23 +1,25 @@ import * as Yup from 'yup'; import { formatMessage } from 'services/intl'; +import { DATATYPES_LENGTH } from 'common/dataTypes'; const Schema = Yup.object().shape({ journal_number: Yup.string() .required() .min(1) - .max(255) + .max(DATATYPES_LENGTH.STRING) .label(formatMessage({ id: 'journal_number_' })), journal_type: Yup.string() .required() .min(1) - .max(255) + .max(DATATYPES_LENGTH.STRING) .label(formatMessage({ id: 'journal_type' })), date: Yup.date() .required() .label(formatMessage({ id: 'date' })), - currency_code: Yup.string(), - reference: Yup.string().min(1).max(255), - description: Yup.string().min(1).max(1024), + currency_code: Yup.string().max(3), + status: Yup.boolean(), + reference: Yup.string().nullable().min(1).max(DATATYPES_LENGTH.STRING), + description: Yup.string().min(1).max(DATATYPES_LENGTH.STRING), entries: Yup.array().of( Yup.object().shape({ credit: Yup.number().nullable(), @@ -30,10 +32,10 @@ const Schema = Yup.object().shape({ }), contact_id: Yup.number().nullable(), contact_type: Yup.string().nullable(), - note: Yup.string().max(255).nullable(), + note: Yup.string().max(DATATYPES_LENGTH.TEXT).nullable(), }), ), }); export const CreateJournalSchema = Schema; -export const EditJournalSchema = Schema; \ No newline at end of file +export const EditJournalSchema = Schema; diff --git a/client/src/containers/Accounting/MakeJournalEntriesForm.js b/client/src/containers/Accounting/MakeJournalEntriesForm.js index b03b2bb03..6a255b78c 100644 --- a/client/src/containers/Accounting/MakeJournalEntriesForm.js +++ b/client/src/containers/Accounting/MakeJournalEntriesForm.js @@ -1,10 +1,11 @@ -import React, { useMemo, useEffect, useCallback } from 'react'; +import React, { useMemo, useState, useEffect, useCallback } from 'react'; import { Formik, Form } from 'formik'; import moment from 'moment'; import { Intent } from '@blueprintjs/core'; import { useIntl } from 'react-intl'; import { pick } from 'lodash'; import classNames from 'classnames'; +import { useHistory } from 'react-router-dom'; import { CLASSES } from 'common/classes'; import { @@ -50,6 +51,7 @@ const defaultInitialValues = { description: '', reference: '', currency_code: '', + status: '', entries: [...repeatValue(defaultEntry, 4)], }; @@ -84,7 +86,9 @@ function MakeJournalEntriesForm({ onCancelForm, }) { const isNewMode = !manualJournalId; + const [submitPayload, setSubmitPayload] = useState({}); const { formatMessage } = useIntl(); + const history = useHistory(); const journalNumber = isNewMode ? `${journalNumberPrefix}-${journalNextNumber}` @@ -120,7 +124,7 @@ function MakeJournalEntriesForm({ ...pick(entry, Object.keys(defaultEntry)), })), } - : { + : { ...defaultInitialValues, journal_number: journalNumber, entries: orderingLinesIndexes(defaultInitialValues.entries), @@ -172,10 +176,10 @@ function MakeJournalEntriesForm({ setSubmitting(false); return; } - const form = { ...values, entries }; + const form = { ...values, status: submitPayload.publish, entries }; const handleError = (error) => { - transformErrors(error, { setErrors }); + transformErrors(error, { setErrors }); setSubmitting(false); }; @@ -191,8 +195,15 @@ function MakeJournalEntriesForm({ ), intent: Intent.SUCCESS, }); + setSubmitting(false); - resetForm(); + + if (submitPayload.redirect) { + history.push('/manual-journals'); + } + if (submitPayload.resetForm) { + resetForm(); + } }; if (isNewMode) { @@ -203,12 +214,24 @@ function MakeJournalEntriesForm({ .catch(handleError); } }; + + const handleCancelClick = useCallback(() => { + history.goBack(); + }, [history]); + + const handleSubmitClick = useCallback( + (event, payload) => { + setSubmitPayload({ ...payload }); + }, + [setSubmitPayload], + ); + console.log(submitPayload, 'RR'); return (
)} diff --git a/client/src/containers/Accounting/MakeJournalFormFloatingActions.js b/client/src/containers/Accounting/MakeJournalFormFloatingActions.js index 2e6f1c20d..75d3ca21c 100644 --- a/client/src/containers/Accounting/MakeJournalFormFloatingActions.js +++ b/client/src/containers/Accounting/MakeJournalFormFloatingActions.js @@ -1,63 +1,202 @@ import React from 'react'; -import { Intent, Button } from '@blueprintjs/core'; +import { + Intent, + Button, + ButtonGroup, + Popover, + PopoverInteractionKind, + Position, + Menu, + MenuItem, +} from '@blueprintjs/core'; import { useFormikContext } from 'formik'; import classNames from 'classnames'; import { FormattedMessage as T } from 'react-intl'; import { saveInvoke } from 'utils'; import { CLASSES } from 'common/classes'; +import { Icon, If } from 'components'; +/** + * Make Journal floating actions bar. + */ export default function MakeJournalFloatingAction({ isSubmitting, onSubmitClick, onCancelClick, - manualJournalId, + manualJournal, + manualJournalPublished, }) { - const { submitForm } = useFormikContext(); + const { submitForm, resetForm } = useFormikContext(); + + + + const handleSubmitPublishBtnClick = (event) => { + saveInvoke(onSubmitClick, event, { + redirect: true, + publish: true, + }); + }; + + const handleSubmitPublishAndNewBtnClick = (event) => { + submitForm(); + saveInvoke(onSubmitClick, event, { + redirect: false, + publish: true, + resetForm: true, + }); + }; + + const handleSubmitPublishContinueEditingBtnClick = (event) => { + submitForm(); + saveInvoke(onSubmitClick, event, { + redirect: false, + publish: true, + }); + }; + + const handleSubmitDraftBtnClick = (event) => { + saveInvoke(onSubmitClick, event, { + redirect: true, + publish: false, + }); + }; + + const handleSubmitDraftAndNewBtnClick = (event) => { + submitForm(); + saveInvoke(onSubmitClick, event, { + redirect: false, + publish: false, + resetForm: true, + }); + }; + + const handleSubmitDraftContinueEditingBtnClick = (event) => { + submitForm(); + saveInvoke(onSubmitClick, event, { + redirect: false, + publish: false, + }); + }; + + const handleCancelBtnClick = (event) => { + saveInvoke(onCancelClick, event); + }; + + const handleClearBtnClick = (event) => { + // saveInvoke(onClearClick, event); + resetForm(); + }; return (
+ {/* ----------- Save And Publish ----------- */} + + + - - - - - + onClick={handleClearBtnClick} + text={manualJournal ? : } + /> + {/* ----------- Cancel ----------- */} + className={'ml1'} + onClick={handleCancelBtnClick} + text={} + />
); } diff --git a/client/src/containers/Items/ItemForm.js b/client/src/containers/Items/ItemForm.js index 90b8af793..888a05157 100644 --- a/client/src/containers/Items/ItemForm.js +++ b/client/src/containers/Items/ItemForm.js @@ -232,7 +232,7 @@ function ItemForm({ {({ isSubmitting, handleSubmit }) => (
- +
diff --git a/client/src/containers/Items/ItemFormBody.js b/client/src/containers/Items/ItemFormBody.js index 6baf82f80..9750123e5 100644 --- a/client/src/containers/Items/ItemFormBody.js +++ b/client/src/containers/Items/ItemFormBody.js @@ -183,7 +183,7 @@ export default compose( withAccounts(({ accountsList }) => ({ accountsList, })), - withSettings(({ organization }) => ({ - baseCurrency: 'USD', + withSettings(({ organizationSettings }) => ({ + baseCurrency: organizationSettings?.baseCurrency, })), )(ItemFormBody); diff --git a/client/src/containers/Items/ItemFormPrimarySection.js b/client/src/containers/Items/ItemFormPrimarySection.js index ab318e55f..d35bcc4fc 100644 --- a/client/src/containers/Items/ItemFormPrimarySection.js +++ b/client/src/containers/Items/ItemFormPrimarySection.js @@ -38,10 +38,8 @@ function ItemFormPrimarySection({ changePageSubtitle, // #ownProps - itemId, + itemType, }) { - const { formatMessage } = useIntl(); - const isNewMode = !itemId; const itemTypeHintContent = ( <> @@ -91,7 +89,7 @@ function ItemFormPrimarySection({ changePageSubtitle(transitionItemTypeKeyToLabel(_value)); })} selectedValue={value} - disabled={value === 'inventory' && !isNewMode} + disabled={itemType === 'inventory'} > } value="service" /> } value="non-inventory" /> @@ -142,10 +140,7 @@ function ItemFormPrimarySection({ inline={true} intent={inputIntent({ error, touched })} helperText={} - className={classNames( - 'form-group--category', - Classes.FILL, - )} + className={classNames('form-group--category', Classes.FILL)} > {formatMessage({ id: row.type })} - ) : (''), + ) : ( + '' + ), className: 'item_type', width: 120, }, @@ -134,13 +136,23 @@ function ItemsDataTable({ }, { Header: formatMessage({ id: 'sell_price' }), - accessor: (row) => , + accessor: (row) => + !isBlank(row.sell_price) ? ( + + ) : ( + '' + ), className: 'sell-price', width: 150, }, { Header: formatMessage({ id: 'cost_price' }), - accessor: (row) => , + accessor: (row) => + !isBlank(row.sell_price) ? ( + + ) : ( + '' + ), className: 'cost-price', width: 150, }, @@ -230,13 +242,13 @@ export default compose( itemsTableLoading, itemsTableQuery, itemsCurrentViewId, - itemsPagination + itemsPagination, }) => ({ itemsCurrentPage, itemsTableLoading, itemsTableQuery, itemsCurrentViewId, - itemsPagination + itemsPagination, }), ), withItemsActions,