From ad766b9fdd87b3ad0e7cf09b4fa54617f2a19140 Mon Sep 17 00:00:00 2001 From: Caio Alexandre Troti Caetano Date: Thu, 19 Dec 2024 11:06:35 -0300 Subject: [PATCH] :sparkles: feat: Main pages --- .../ledgers/[id]/transactions/create/page.tsx | 205 ++++++++++++++++ .../[id]/transactions/create/review/page.tsx | 229 ++++++++++++++++++ src/app/(routes)/transactions/create/page.tsx | 7 - 3 files changed, 434 insertions(+), 7 deletions(-) create mode 100644 src/app/(routes)/ledgers/[id]/transactions/create/page.tsx create mode 100644 src/app/(routes)/ledgers/[id]/transactions/create/review/page.tsx delete mode 100644 src/app/(routes)/transactions/create/page.tsx diff --git a/src/app/(routes)/ledgers/[id]/transactions/create/page.tsx b/src/app/(routes)/ledgers/[id]/transactions/create/page.tsx new file mode 100644 index 00000000..04faa5d4 --- /dev/null +++ b/src/app/(routes)/ledgers/[id]/transactions/create/page.tsx @@ -0,0 +1,205 @@ +'use client' + +import { Button } from '@/components/ui/button' +import { Form } from '@/components/ui/form' +import { LoadingButton } from '@/components/ui/loading-button' +import { ArrowRight, Info } from 'lucide-react' +import { useIntl } from 'react-intl' +import { Stepper } from './stepper' +import { PageFooter, PageFooterSection } from '@/components/page-footer' +import Image from 'next/image' +import { + OperationAccordion, + OperationEmptyAccordion +} from './operation-accordion' +import { OperationSourceField } from './operation-source-field' +import { useTransactionForm } from './provider' +import { StepperContent } from '@/components/transactions/primitives/stepper' +import { MetadataAccordion } from './metadata-accordion' +import ArrowRightCircle from '/public/svg/arrow-right-circle.svg' +import { BasicInformationPaper } from './basic-information-paper' +import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' +import { useRouter } from 'next/navigation' +import { useConfirmDialog } from '@/components/confirmation-dialog/use-confirm-dialog' +import ConfirmationDialog from '@/components/confirmation-dialog' + +export default function CreateTransactionPage() { + const intl = useIntl() + const router = useRouter() + + const { + form, + currentStep, + multipleSources, + values, + addSource, + addDestination, + handleReview + } = useTransactionForm() + + const { handleDialogOpen, dialogProps } = useConfirmDialog({ + onConfirm: () => router.push('/transactions') + }) + console.log(form.getValues(), form.formState.errors) + return ( + <> + + +
+
+
+ + +
+ + + +
+ + + + + + + + +
+ {intl.formatMessage({ + id: 'common.operations', + defaultMessage: 'Operations' + })} +
+ + {multipleSources && ( + + + + {intl.formatMessage({ + id: 'transactions.operations.alert.title', + defaultMessage: 'Multiple origins and destinations' + })} + + + {intl.formatMessage({ + id: 'transactions.operations.alert.description', + defaultMessage: + 'Fill in the value fields to adjust the amount transacted. Remember: the total Credits must equal the total Debits.' + })} + + + )} + +
+ {values.source?.map((source, index) => ( + 1} + control={form.control} + /> + ))} + {values.destination?.map((destination, index) => ( + 1} + control={form.control} + /> + ))} +
+ + +
+
+ +
+
+ +
+
+
+ + 0}> + + + + + } + iconPlacement="end" + onClick={form.handleSubmit(handleReview)} + > + {intl.formatMessage({ + id: 'transactions.create.review.button', + defaultMessage: 'Go to Review' + })} + + + +
+ + ) +} diff --git a/src/app/(routes)/ledgers/[id]/transactions/create/review/page.tsx b/src/app/(routes)/ledgers/[id]/transactions/create/review/page.tsx new file mode 100644 index 00000000..1e33d7c8 --- /dev/null +++ b/src/app/(routes)/ledgers/[id]/transactions/create/review/page.tsx @@ -0,0 +1,229 @@ +'use client' + +import { SendHorizonal } from 'lucide-react' +import { useTransactionForm } from '../provider' +import { Stepper } from '../stepper' +import { Separator } from '@/components/ui/separator' +import { PageFooter, PageFooterSection } from '@/components/page-footer' +import { Button } from '@/components/ui/button' +import { LoadingButton } from '@/components/ui/loading-button' +import { useIntl } from 'react-intl' +import { useConfirmDialog } from '@/components/confirmation-dialog/use-confirm-dialog' +import ConfirmationDialog from '@/components/confirmation-dialog' +import { useParams, useRouter } from 'next/navigation' +import { + TransactionReceipt, + TransactionReceiptDescription, + TransactionReceiptItem, + TransactionReceiptOperation, + TransactionReceiptSubjects, + TransactionReceiptTicket, + TransactionReceiptValue +} from '@/components/transactions/primitives/transaction-receipt' +import ArrowRightLeftCircle from '/public/svg/arrow-right-left-circle.svg' +import Image from 'next/image' +import { isNil } from 'lodash' +import { useCreateTransaction } from '@/client/transactions' +import { useOrganization } from '@/context/organization-provider/organization-provider-client' + +export default function CreateTransactionReviewPage() { + const intl = useIntl() + const router = useRouter() + + const { id } = useParams<{ id: string }>() + + const { currentOrganization } = useOrganization() + + const { mutate: createTransaction, isPending: createLoading } = + useCreateTransaction({ + organizationId: currentOrganization.id!, + ledgerId: id, + onSuccess: () => router.push('/transactions') + }) + + const { values, currentStep, handleBack } = useTransactionForm() + + const { handleDialogOpen: handleCancelOpen, dialogProps: cancelDialogProps } = + useConfirmDialog({ + onConfirm: () => router.push('/transactions') + }) + + const { handleDialogOpen: handleSubmitOpen, dialogProps: submitDialogProps } = + useConfirmDialog({ + onConfirm: () => createTransaction(values) + }) + + return ( + <> + + + + +
+
+ +
+ +
+ + + +

Manual

+ source.account)} + destinations={values.destination?.map((source) => source.account)} + /> + {values.description && ( + + {values.description} + + )} +
+ + + + {values.source?.map((source, index) => ( +

+ {source.account} +

+ ))} +
+ } + /> + + {values.destination?.map((destination, index) => ( +

+ {destination.account} +

+ ))} +
+ } + /> + + + {values.source?.map((source, index) => ( + + ))} + {values.destination?.map((destination, index) => ( + + ))} + + + + + + + + + + + + + + + } + iconPlacement="end" + loading={createLoading} + onClick={() => handleSubmitOpen('')} + > + {intl.formatMessage({ + id: 'transactions.create.button', + defaultMessage: 'Create Transaction' + })} + + + + + ) +} diff --git a/src/app/(routes)/transactions/create/page.tsx b/src/app/(routes)/transactions/create/page.tsx deleted file mode 100644 index 7bed5a89..00000000 --- a/src/app/(routes)/transactions/create/page.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export default function CreateTransactionPage() { - return ( -
-

Create Transactions

-
- ) -}