fix all eslint errors
This commit is contained in:
@@ -1,33 +1,18 @@
|
||||
import { ProductForm } from "@/components/Products/Form";
|
||||
import ShipmentForm from "@/components/Shipments/Form";
|
||||
import { t } from "@/config/i18n";
|
||||
import { createContract, getForm } from "@/services/api";
|
||||
import { useCreateContract, useGetForm } from "@/services/api";
|
||||
import { type Product } from "@/services/resources/products";
|
||||
import { Accordion, Button, Group, List, Loader, Overlay, Stack, Text, TextInput, Title } from "@mantine/core";
|
||||
import { useForm } from "@mantine/form";
|
||||
import { IconMail, IconPhone, IconUser } from "@tabler/icons-react";
|
||||
import { useCallback, useMemo, useRef } from "react";
|
||||
import { useParams } from "react-router";
|
||||
|
||||
export function computePrices(values: [string, any][], products: Product[], nbShipment?: number) {
|
||||
return values.reduce((prev, [key, value]) => {
|
||||
const keyArray = key.split("-");
|
||||
const productId = Number(keyArray[keyArray.length - 1]);
|
||||
const product = products.find((product) => product.id === productId);
|
||||
if (!product) {
|
||||
return prev + 0;
|
||||
}
|
||||
const isRecurent = key.includes("recurrent") && nbShipment;
|
||||
const productPrice = Number(product.price || product.price_kg);
|
||||
const productQuantityUnit = product.unit === "2" ? 1 : 1000;
|
||||
const productQuantity = Number(product.price ? value : value / productQuantityUnit);
|
||||
return(prev + productPrice * productQuantity * (isRecurent ? nbShipment : 1));
|
||||
}, 0);
|
||||
}
|
||||
import { computePrices } from "./price";
|
||||
|
||||
export function Contract() {
|
||||
const { id } = useParams();
|
||||
const { data: form } = getForm(Number(id), {enabled: !!id});
|
||||
const { data: form } = useGetForm(Number(id), {enabled: !!id});
|
||||
const inputForm = useForm<Record<string, number | string>>({
|
||||
initialValues: {
|
||||
firstname: "",
|
||||
@@ -43,7 +28,7 @@ export function Contract() {
|
||||
}
|
||||
});
|
||||
|
||||
const createContractMutation = createContract();
|
||||
const createContractMutation = useCreateContract();
|
||||
|
||||
const productsRecurent = useMemo(() => {
|
||||
return form?.productor?.products.filter((el) => el.type === "2")
|
||||
@@ -65,14 +50,16 @@ export function Contract() {
|
||||
return computePrices(values, allProducts, form?.shipments.length);
|
||||
}, [inputForm, allProducts, form?.shipments]);
|
||||
|
||||
const inputRefs: Record<string, React.RefObject<HTMLInputElement | null>> = {
|
||||
firstname: useRef<HTMLInputElement>(null),
|
||||
lastname: useRef<HTMLInputElement>(null),
|
||||
email: useRef<HTMLInputElement>(null),
|
||||
phone: useRef<HTMLInputElement>(null)
|
||||
}
|
||||
const inputRefs = useRef<Record<string, HTMLInputElement | null>>({
|
||||
firstname: null,
|
||||
lastname: null,
|
||||
email: null,
|
||||
phone: null
|
||||
});
|
||||
|
||||
const isShipmentsMinimumValue = useCallback(() => {
|
||||
if (!form)
|
||||
return false;
|
||||
const shipmentErrors = form.shipments
|
||||
.map((shipment) => {
|
||||
const total = computePrices(
|
||||
@@ -86,9 +73,11 @@ export function Contract() {
|
||||
})
|
||||
.filter(Boolean);
|
||||
return shipmentErrors.length === 0;
|
||||
}, [form]);
|
||||
}, [form, inputForm]);
|
||||
|
||||
const withDefaultValues = useCallback((values: Record<string, number | string>) => {
|
||||
if (!productsRecurent || !form)
|
||||
return {};
|
||||
const result = {...values};
|
||||
|
||||
productsRecurent.forEach((product: Product) => {
|
||||
@@ -111,7 +100,10 @@ export function Contract() {
|
||||
}, [productsRecurent, form]);
|
||||
|
||||
const handleSubmit = useCallback(async () => {
|
||||
const errors = inputForm.validate();
|
||||
const errors = inputForm.validate();
|
||||
if (!form) {
|
||||
return;
|
||||
}
|
||||
if (inputForm.isValid() && isShipmentsMinimumValue()) {
|
||||
const contract = {
|
||||
form_id: form.id,
|
||||
@@ -120,13 +112,13 @@ export function Contract() {
|
||||
await createContractMutation.mutateAsync(contract);
|
||||
} else {
|
||||
const firstErrorField = Object.keys(errors.errors)[0];
|
||||
const ref = inputRefs[firstErrorField];
|
||||
ref?.current?.scrollIntoView({behavior: "smooth", block: "center"});
|
||||
const ref = inputRefs.current[firstErrorField];
|
||||
ref?.scrollIntoView({behavior: "smooth", block: "center"});
|
||||
}
|
||||
}, [inputForm, inputRefs, isShipmentsMinimumValue, form]);
|
||||
}, [inputForm, inputRefs, isShipmentsMinimumValue, form, createContractMutation, withDefaultValues]);
|
||||
|
||||
|
||||
if (!form)
|
||||
if (!form || !shipments || !productsRecurent)
|
||||
return (
|
||||
<Group
|
||||
align="center"
|
||||
@@ -155,7 +147,7 @@ export function Contract() {
|
||||
required
|
||||
leftSection={<IconUser/>}
|
||||
{...inputForm.getInputProps('firstname')}
|
||||
ref={inputRefs.firstname}
|
||||
ref={(el) => {inputRefs.current.firstname = el}}
|
||||
/>
|
||||
<TextInput
|
||||
label={t("lastname", {capfirst: true})}
|
||||
@@ -165,7 +157,7 @@ export function Contract() {
|
||||
required
|
||||
leftSection={<IconUser/>}
|
||||
{...inputForm.getInputProps('lastname')}
|
||||
ref={inputRefs.lastname}
|
||||
ref={(el) => {inputRefs.current.lastname = el}}
|
||||
/>
|
||||
</Group>
|
||||
<Group grow>
|
||||
@@ -177,7 +169,7 @@ export function Contract() {
|
||||
required
|
||||
leftSection={<IconMail/>}
|
||||
{...inputForm.getInputProps('email')}
|
||||
ref={inputRefs.email}
|
||||
ref={(el) => {inputRefs.current.email = el}}
|
||||
/>
|
||||
<TextInput
|
||||
label={t("phone", {capfirst: true})}
|
||||
@@ -187,7 +179,7 @@ export function Contract() {
|
||||
required
|
||||
leftSection={<IconPhone/>}
|
||||
{...inputForm.getInputProps('phone')}
|
||||
ref={inputRefs.phone}
|
||||
ref={(el) => {inputRefs.current.phone = el}}
|
||||
/>
|
||||
</Group>
|
||||
<Title order={3}>{t('shipments', {capfirst: true})}</Title>
|
||||
|
||||
17
frontend/src/pages/Contract/price.ts
Normal file
17
frontend/src/pages/Contract/price.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import type { Product } from "@/services/resources/products";
|
||||
|
||||
export function computePrices(values: [string, string | number][], products: Product[], nbShipment?: number) {
|
||||
return values.reduce((prev, [key, value]) => {
|
||||
const keyArray = key.split("-");
|
||||
const productId = Number(keyArray[keyArray.length - 1]);
|
||||
const product = products.find((product) => product.id === productId);
|
||||
if (!product) {
|
||||
return prev + 0;
|
||||
}
|
||||
const isRecurent = key.includes("recurrent") && nbShipment;
|
||||
const productPrice = Number(product.price || product.price_kg);
|
||||
const productQuantityUnit = product.unit === "2" ? 1 : 1000;
|
||||
const productQuantity = Number(product.price ? Number(value) : Number(value) / productQuantityUnit);
|
||||
return(prev + productPrice * productQuantity * (isRecurent ? nbShipment : 1));
|
||||
}, 0);
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Stack, Loader, Title, Group, ActionIcon, Tooltip, Table, ScrollArea } from "@mantine/core";
|
||||
import { createForm, editForm, getForm, getForms } from "@/services/api";
|
||||
import { useCreateForm, useEditForm, useGetForm, useGetForms } from "@/services/api";
|
||||
import { t } from "@/config/i18n";
|
||||
import { useLocation, useNavigate, useSearchParams } from "react-router";
|
||||
import { IconPlus } from "@tabler/icons-react";
|
||||
@@ -24,14 +24,14 @@ export function Forms() {
|
||||
return null
|
||||
}, [location, isEdit])
|
||||
|
||||
const closeModal = () => {
|
||||
const closeModal = useCallback(() => {
|
||||
navigate(`/dashboard/forms${searchParams ? `?${searchParams.toString()}` : ""}`);
|
||||
};
|
||||
}, [navigate, searchParams]);
|
||||
|
||||
const { isPending, data } = getForms(searchParams);
|
||||
const { data: currentForm } = getForm(Number(editId), { enabled: !!editId });
|
||||
const { isPending, data } = useGetForms(searchParams);
|
||||
const { data: currentForm } = useGetForm(Number(editId), { enabled: !!editId });
|
||||
|
||||
const { data: allForms } = getForms();
|
||||
const { data: allForms } = useGetForms();
|
||||
|
||||
const seasons = useMemo(() => {
|
||||
return allForms?.map((form: Form) => (form.season))
|
||||
@@ -43,8 +43,8 @@ export function Forms() {
|
||||
.filter((productor, index, array) => array.indexOf(productor) === index)
|
||||
}, [allForms])
|
||||
|
||||
const createFormMutation = createForm();
|
||||
const editFormMutation = editForm();
|
||||
const createFormMutation = useCreateForm();
|
||||
const editFormMutation = useEditForm();
|
||||
|
||||
const handleCreateForm = useCallback(async (form: FormInputs) => {
|
||||
if (!form.start || !form.end)
|
||||
@@ -91,7 +91,7 @@ export function Forms() {
|
||||
|
||||
return params;
|
||||
});
|
||||
}, [searchParams, setSearchParams])
|
||||
}, [setSearchParams])
|
||||
|
||||
|
||||
if (!data || isPending)
|
||||
@@ -121,6 +121,7 @@ export function Forms() {
|
||||
</ActionIcon>
|
||||
</Tooltip>
|
||||
<FormModal
|
||||
key={`${currentForm?.id}_create`}
|
||||
opened={isCreate}
|
||||
onClose={closeModal}
|
||||
handleSubmit={handleCreateForm}
|
||||
@@ -133,6 +134,7 @@ export function Forms() {
|
||||
onFilterChange={onFilterChange}
|
||||
/>
|
||||
<FormModal
|
||||
key={`${currentForm?.id}_edit`}
|
||||
opened={isEdit}
|
||||
onClose={closeModal}
|
||||
currentForm={currentForm}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { Flex, Text } from "@mantine/core";
|
||||
import { getForms } from "@/services/api";
|
||||
import { useGetForms } from "@/services/api";
|
||||
import { FormCard } from "@/components/Forms/Card";
|
||||
import type { Form } from "@/services/resources/forms";
|
||||
import { t } from "@/config/i18n";
|
||||
|
||||
export function Home() {
|
||||
const { data: allForms } = getForms();
|
||||
const { data: allForms } = useGetForms();
|
||||
|
||||
return (
|
||||
<Flex gap="md" wrap="wrap" justify="center">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { ActionIcon, Group, Loader, ScrollArea, Stack, Table, Title, Tooltip } from "@mantine/core";
|
||||
import { t } from "@/config/i18n";
|
||||
import { createProductor, editProductor, getProductor, getProductors } from "@/services/api";
|
||||
import { useCreateProductor, useEditProductor, useGetProductor, useGetProductors } from "@/services/api";
|
||||
import { IconPlus } from "@tabler/icons-react";
|
||||
import ProductorRow from "@/components/Productors/Row";
|
||||
import { useLocation, useNavigate, useSearchParams } from "react-router";
|
||||
@@ -24,13 +24,13 @@ export default function Productors() {
|
||||
return null
|
||||
}, [location, isEdit])
|
||||
|
||||
const closeModal = () => {
|
||||
const closeModal = useCallback(() => {
|
||||
navigate(`/dashboard/productors${searchParams ? `?${searchParams.toString()}` : ""}`);
|
||||
};
|
||||
}, [navigate, searchParams]);
|
||||
|
||||
const { data: productors, isPending } = getProductors(searchParams);
|
||||
const { data: currentProductor } = getProductor(Number(editId), { enabled: !!editId });
|
||||
const { data: allProductors } = getProductors();
|
||||
const { data: productors, isPending } = useGetProductors(searchParams);
|
||||
const { data: currentProductor } = useGetProductor(Number(editId), { enabled: !!editId });
|
||||
const { data: allProductors } = useGetProductors();
|
||||
|
||||
const names = useMemo(() => {
|
||||
return allProductors?.map((productor: Productor) => (productor.name))
|
||||
@@ -42,8 +42,8 @@ export default function Productors() {
|
||||
.filter((productor, index, array) => array.indexOf(productor) === index)
|
||||
}, [allProductors])
|
||||
|
||||
const createProductorMutation = createProductor();
|
||||
const editProductorMutation = editProductor();
|
||||
const createProductorMutation = useCreateProductor();
|
||||
const editProductorMutation = useEditProductor();
|
||||
|
||||
const handleCreateProductor = useCallback(async (productor: ProductorInputs) => {
|
||||
await createProductorMutation.mutateAsync({
|
||||
@@ -72,7 +72,7 @@ export default function Productors() {
|
||||
});
|
||||
return params;
|
||||
});
|
||||
}, [searchParams, setSearchParams])
|
||||
}, [setSearchParams])
|
||||
|
||||
if (!productors || isPending)
|
||||
return (
|
||||
@@ -101,11 +101,13 @@ export default function Productors() {
|
||||
</ActionIcon>
|
||||
</Tooltip>
|
||||
<ProductorModal
|
||||
key={`${currentProductor?.id}_create`}
|
||||
opened={isCreate}
|
||||
onClose={closeModal}
|
||||
handleSubmit={handleCreateProductor}
|
||||
/>
|
||||
<ProductorModal
|
||||
key={`${currentProductor?.id}_edit`}
|
||||
opened={isEdit}
|
||||
onClose={closeModal}
|
||||
currentProductor={currentProductor}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { ActionIcon, Group, Loader, ScrollArea, Stack, Table, Title, Tooltip } from "@mantine/core";
|
||||
import { t } from "@/config/i18n";
|
||||
import { createProduct, editProduct, getProduct, getProducts } from "@/services/api";
|
||||
import { useCreateProduct, useEditProduct, useGetProduct, useGetProducts } from "@/services/api";
|
||||
import { IconPlus } from "@tabler/icons-react";
|
||||
import ProductRow from "@/components/Products/Row";
|
||||
import { useLocation, useNavigate, useSearchParams } from "react-router";
|
||||
@@ -24,13 +24,13 @@ export default function Products() {
|
||||
return null
|
||||
}, [location, isEdit])
|
||||
|
||||
const closeModal = () => {
|
||||
const closeModal = useCallback(() => {
|
||||
navigate(`/dashboard/products${searchParams ? `?${searchParams.toString()}` : ""}`);
|
||||
};
|
||||
}, [navigate, searchParams]);
|
||||
|
||||
const { data: products, isPending } = getProducts(searchParams);
|
||||
const { data: currentProduct } = getProduct(Number(editId), { enabled: !!editId });
|
||||
const { data: allProducts } = getProducts();
|
||||
const { data: products, isPending } = useGetProducts(searchParams);
|
||||
const { data: currentProduct } = useGetProduct(Number(editId), { enabled: !!editId });
|
||||
const { data: allProducts } = useGetProducts();
|
||||
|
||||
const names = useMemo(() => {
|
||||
return allProducts?.map((product: Product) => (product.name))
|
||||
@@ -42,8 +42,8 @@ export default function Products() {
|
||||
.filter((productor, index, array) => array.indexOf(productor) === index)
|
||||
}, [allProducts])
|
||||
|
||||
const createProductMutation = createProduct();
|
||||
const editProductMutation = editProduct();
|
||||
const createProductMutation = useCreateProduct();
|
||||
const editProductMutation = useEditProduct();
|
||||
|
||||
const handleCreateProduct = useCallback(async (product: ProductInputs) => {
|
||||
await createProductMutation.mutateAsync(productCreateFromProductInputs(product));
|
||||
@@ -70,7 +70,7 @@ export default function Products() {
|
||||
});
|
||||
return params;
|
||||
});
|
||||
}, [searchParams, setSearchParams])
|
||||
}, [setSearchParams])
|
||||
|
||||
if (!products || isPending)
|
||||
return (
|
||||
@@ -99,6 +99,7 @@ export default function Products() {
|
||||
</ActionIcon>
|
||||
</Tooltip>
|
||||
<ProductModal
|
||||
key={`${currentProduct?.id}_create`}
|
||||
opened={isCreate}
|
||||
onClose={closeModal}
|
||||
handleSubmit={handleCreateProduct}
|
||||
@@ -111,6 +112,7 @@ export default function Products() {
|
||||
onFilterChange={onFilterChange}
|
||||
/>
|
||||
<ProductModal
|
||||
key={`${currentProduct?.id}_edit`}
|
||||
opened={isEdit}
|
||||
onClose={closeModal}
|
||||
currentProduct={currentProduct}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { ActionIcon, Group, Loader, ScrollArea, Stack, Table, Title, Tooltip } from "@mantine/core";
|
||||
import { t } from "@/config/i18n";
|
||||
import { createShipment, editShipment, getShipment, getShipments } from "@/services/api";
|
||||
import { useCreateShipment, useEditShipment, useGetShipment, useGetShipments } from "@/services/api";
|
||||
import { IconPlus } from "@tabler/icons-react";
|
||||
import ShipmentRow from "@/components/Shipments/Row";
|
||||
import { useLocation, useNavigate, useSearchParams } from "react-router";
|
||||
@@ -24,13 +24,13 @@ export default function Shipments() {
|
||||
return null
|
||||
}, [location, isEdit])
|
||||
|
||||
const closeModal = () => {
|
||||
const closeModal = useCallback(() => {
|
||||
navigate(`/dashboard/shipments${searchParams ? `?${searchParams.toString()}` : ""}`);
|
||||
};
|
||||
}, [navigate, searchParams]);
|
||||
|
||||
const { data: shipments, isPending } = getShipments(searchParams);
|
||||
const { data: currentShipment } = getShipment(Number(editId), { enabled: !!editId });
|
||||
const { data: allShipments } = getShipments();
|
||||
const { data: shipments, isPending } = useGetShipments(searchParams);
|
||||
const { data: currentShipment } = useGetShipment(Number(editId), { enabled: !!editId });
|
||||
const { data: allShipments } = useGetShipments();
|
||||
|
||||
const names = useMemo(() => {
|
||||
return allShipments?.map((shipment: Shipment) => (shipment.name))
|
||||
@@ -42,8 +42,8 @@ export default function Shipments() {
|
||||
.filter((season, index, array) => array.indexOf(season) === index)
|
||||
}, [allShipments])
|
||||
|
||||
const createShipmentMutation = createShipment();
|
||||
const editShipmentMutation = editShipment();
|
||||
const createShipmentMutation = useCreateShipment();
|
||||
const editShipmentMutation = useEditShipment();
|
||||
|
||||
const handleCreateShipment = useCallback(async (shipment: ShipmentInputs) => {
|
||||
await createShipmentMutation.mutateAsync(shipmentCreateFromShipmentInputs(shipment));
|
||||
@@ -70,7 +70,7 @@ export default function Shipments() {
|
||||
});
|
||||
return params;
|
||||
});
|
||||
}, [searchParams, setSearchParams])
|
||||
}, [setSearchParams])
|
||||
|
||||
if (!shipments || isPending)
|
||||
return (
|
||||
@@ -99,11 +99,13 @@ export default function Shipments() {
|
||||
</ActionIcon>
|
||||
</Tooltip>
|
||||
<ShipmentModal
|
||||
key={`${currentShipment?.id}_create`}
|
||||
opened={isCreate}
|
||||
onClose={closeModal}
|
||||
handleSubmit={handleCreateShipment}
|
||||
/>
|
||||
<ShipmentModal
|
||||
key={`${currentShipment?.id}_edit`}
|
||||
opened={isEdit}
|
||||
onClose={closeModal}
|
||||
currentShipment={currentShipment}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { ActionIcon, Group, Loader, ScrollArea, Stack, Table, Title, Tooltip } from "@mantine/core";
|
||||
import { t } from "@/config/i18n";
|
||||
import { createUser, editUser, getUser, getUsers } from "@/services/api";
|
||||
import { useCreateUser, useEditUser, useGetUser, useGetUsers } from "@/services/api";
|
||||
import { IconPlus } from "@tabler/icons-react";
|
||||
import UserRow from "@/components/Users/Row";
|
||||
import { useLocation, useNavigate, useSearchParams } from "react-router";
|
||||
@@ -24,22 +24,22 @@ export default function Users() {
|
||||
return null
|
||||
}, [location, isEdit])
|
||||
|
||||
const closeModal = () => {
|
||||
const closeModal = useCallback(() => {
|
||||
navigate(`/dashboard/users${searchParams ? `?${searchParams.toString()}` : ""}`);
|
||||
};
|
||||
}, [navigate, searchParams]);
|
||||
|
||||
const {data: users, isPending} = getUsers(searchParams);
|
||||
const { data: currentUser } = getUser(Number(editId), { enabled: !!editId });
|
||||
const {data: users, isPending} = useGetUsers(searchParams);
|
||||
const { data: currentUser } = useGetUser(Number(editId), { enabled: !!editId });
|
||||
|
||||
const {data: allUsers } = getUsers();
|
||||
const {data: allUsers } = useGetUsers();
|
||||
|
||||
const names = useMemo(() => {
|
||||
return allUsers?.map((user: User) => (user.name))
|
||||
.filter((season, index, array) => array.indexOf(season) === index)
|
||||
}, [allUsers])
|
||||
|
||||
const createUserMutation = createUser();
|
||||
const editUserMutation = editUser();
|
||||
const createUserMutation = useCreateUser();
|
||||
const editUserMutation = useEditUser();
|
||||
|
||||
const handleCreateUser = useCallback(async (user: UserInputs) => {
|
||||
await createUserMutation.mutateAsync(user);
|
||||
@@ -66,7 +66,7 @@ export default function Users() {
|
||||
});
|
||||
return params;
|
||||
});
|
||||
}, [searchParams, setSearchParams])
|
||||
}, [setSearchParams])
|
||||
|
||||
if (!users || isPending)
|
||||
return (
|
||||
@@ -95,11 +95,13 @@ export default function Users() {
|
||||
</ActionIcon>
|
||||
</Tooltip>
|
||||
<UserModal
|
||||
key={`${currentUser?.id}_create`}
|
||||
opened={isCreate}
|
||||
onClose={closeModal}
|
||||
handleSubmit={handleCreateUser}
|
||||
/>
|
||||
<UserModal
|
||||
key={`${currentUser?.id}_edit`}
|
||||
opened={isEdit}
|
||||
onClose={closeModal}
|
||||
currentUser={currentUser}
|
||||
|
||||
Reference in New Issue
Block a user