Presupuestador_web/client/src/app/quotes/components/QuotePricesResume.tsx

105 lines
4.5 KiB
TypeScript
Raw Normal View History

2024-07-19 15:22:13 +00:00
import { FormPercentageField } from "@/components";
2024-07-18 18:26:44 +00:00
import { useLocalization } from "@/lib/hooks";
2024-07-19 15:22:13 +00:00
import { Card, CardContent, CardDescription, CardTitle, Separator } from "@/ui";
import { CurrencyData } from "@shared/contexts";
2024-07-19 15:22:13 +00:00
import { t } from "i18next";
import { useMemo } from "react";
2024-07-18 16:41:46 +00:00
import { useFormContext } from "react-hook-form";
export const QuotePricesResume = () => {
2024-07-19 15:22:13 +00:00
const { watch, register, formState } = useFormContext();
2024-07-19 15:59:50 +00:00
const { formatNumber } = useLocalization();
2024-07-18 16:41:46 +00:00
const currency_code = watch("currency_code");
2024-07-19 15:02:19 +00:00
const subtotal_price = formatNumber(watch("subtotal_price"));
2024-07-19 15:59:50 +00:00
const discount_price = formatNumber(watch("discount_price"));
const tax_price = formatNumber(watch("tax_price"));
2024-07-19 15:02:19 +00:00
const total_price = formatNumber(watch("total_price"));
2024-07-18 16:41:46 +00:00
const currency_symbol = useMemo(() => {
const currencyOrError = CurrencyData.createFromCode(currency_code);
return currencyOrError.isSuccess ? currencyOrError.object.symbol : "";
}, [currency_code]);
2024-07-18 16:41:46 +00:00
return (
2024-08-29 11:59:12 +00:00
<Card className='w-full bg-muted'>
2024-07-18 16:41:46 +00:00
<CardContent className='flex flex-row items-end gap-2 p-4 border-t'>
<div className='grid flex-1 h-16 grid-cols-1 auto-rows-max'>
2024-08-29 11:59:12 +00:00
<div className='grid gap-1 font-semibold text-right text-muted-foreground'>
<CardDescription className='text-sm'>
{t("quotes.form_fields.subtotal_price.label")}
</CardDescription>
2024-08-29 11:59:12 +00:00
<CardTitle className='flex items-baseline justify-end text-2xl tabular-nums'>
2024-07-18 18:26:44 +00:00
{subtotal_price}
<span className='ml-1 text-lg tracking-normal'>{currency_symbol}</span>
2024-07-18 16:41:46 +00:00
</CardTitle>
</div>
</div>
<Separator orientation='vertical' className='w-px h-16 mx-2' />
2024-07-19 15:22:13 +00:00
<div className='grid flex-1 h-16 grid-cols-2 gap-6 auto-rows-max'>
2024-07-18 16:41:46 +00:00
<div className='grid gap-1 font-medium text-muted-foreground'>
2024-07-19 15:22:13 +00:00
<CardDescription className='text-sm'>
{t("quotes.form_fields.discount.label")}
</CardDescription>
<FormPercentageField
scale={2}
disabled={formState.disabled}
placeholder={t("quotes.form_fields.discount.placeholder")}
{...register("discount", {
required: false,
})}
/>
2024-07-18 16:41:46 +00:00
</div>
<div className='grid gap-1 font-semibold text-muted-foreground'>
2024-08-29 11:59:12 +00:00
<CardDescription className='text-sm text-right'>
{t("quotes.form_fields.discount_price.label")}
</CardDescription>
2024-08-29 11:59:12 +00:00
<CardTitle className='flex items-baseline justify-end text-2xl tabular-nums'>
2024-07-19 15:22:13 +00:00
{discount_price}
<span className='ml-1 text-lg tracking-normal'>{currency_symbol}</span>
2024-07-18 16:41:46 +00:00
</CardTitle>
</div>
</div>
<Separator orientation='vertical' className='w-px h-16 mx-2' />
2024-07-19 15:22:13 +00:00
<div className='grid flex-1 h-16 grid-cols-2 gap-6 auto-rows-max'>
2024-07-18 16:41:46 +00:00
<div className='grid gap-1 font-medium text-muted-foreground'>
2024-07-19 15:22:13 +00:00
<CardDescription className='text-sm'>
{t("quotes.form_fields.tax.label")}
</CardDescription>
<FormPercentageField
scale={2}
disabled={formState.disabled}
placeholder={t("quotes.form_fields.tax.placeholder")}
{...register("tax", {
required: false,
})}
/>
2024-07-18 16:41:46 +00:00
</div>
<div className='grid gap-1 font-semibold text-muted-foreground'>
2024-08-29 11:59:12 +00:00
<CardDescription className='text-sm text-right'>
{t("quotes.form_fields.tax_price.label")}
</CardDescription>
2024-08-29 11:59:12 +00:00
<CardTitle className='flex items-baseline justify-end gap-1 text-2xl tabular-nums'>
2024-07-19 15:22:13 +00:00
{tax_price}
<span className='text-base font-medium tracking-normal'>{currency_symbol}</span>
2024-07-18 16:41:46 +00:00
</CardTitle>
</div>
</div>{" "}
<Separator orientation='vertical' className='w-px h-16 mx-2' />
<div className='grid flex-1 h-16 grid-cols-1 auto-rows-max'>
<div className='grid gap-0'>
2024-08-29 11:59:12 +00:00
<CardDescription className='text-sm font-semibold text-right text-foreground'>
{t("quotes.form_fields.total_price.label")}
</CardDescription>
2024-08-29 11:59:12 +00:00
<CardTitle className='flex items-baseline justify-end gap-1 text-3xl tabular-nums'>
2024-07-18 18:26:44 +00:00
{total_price}
<span className='ml-1 text-lg tracking-normal'>{currency_symbol}</span>
2024-07-18 16:41:46 +00:00
</CardTitle>
</div>
</div>
</CardContent>
</Card>
);
};