import { ActionIcon, Button, Flex, Input, Loader, LoadingOverlay, Modal, Overlay, Table, Tabs, TextInput, useMantineColorScheme } from "@mantine/core"; import { IconMathMax, IconPlus, IconTableMinus, IconTablePlus } from "@tabler/icons-react"; import { FuelExpenseDto, FuelExpenseDtoHeaders, FuelLimitDto, FuelLimitDtoHeaders } from "../dto/fuel/fuel.dto"; import useSWR from "swr"; import { fetcher } from "../http/axiosInstanceNest"; import { useEffect, useState } from "react"; import { useDisclosure } from "@mantine/hooks"; import { DateInput, DatePicker } from '@mantine/dates' import { SubmitHandler, useForm } from "react-hook-form"; import { AgGridReact } from "ag-grid-react"; import { AllCommunityModule, ColDef, ModuleRegistry } from 'ag-grid-community' ModuleRegistry.registerModules([AllCommunityModule]) type FieldType = 'text' | 'number' | 'select' | 'date' interface IPostInclude { field: string field_type: FieldType } interface ITableSchema { label: string value: string get: string post: string headers: { [key: string]: string } post_include: IPostInclude[] icon: JSX.Element } export default function FuelPage() { const tables: ITableSchema[] = [ { label: 'Расходы', value: 'expenses', get: '/fuel/expenses', post: '/fuel/expenses', headers: FuelExpenseDtoHeaders, post_include: [ { field: 'id_boiler', field_type: 'text' }, { field: 'id_fuel', field_type: 'text' }, { field: 'date', field_type: 'date' }, { field: 'value', field_type: 'text' } ], icon: }, { label: 'Лимиты', value: 'limits', get: '/fuel/limits', post: '/fuel/limits', headers: FuelLimitDtoHeaders, post_include: [ { field: 'id_boiler', field_type: 'text' }, { field: 'id_fuel', field_type: 'text' }, { field: 'month', field_type: 'number' }, { field: 'year', field_type: 'number' }, { field: 'value', field_type: 'text' } ], icon: , } ] const [currentTab, setCurrentTab] = useState(tables[0]) const { data, isLoading } = useSWR(currentTab.get, () => fetcher(currentTab.get), { revalidateOnFocus: false }) const [openedCreateModal, { open: openCreateModal, close: closeCreateModal }] = useDisclosure(false) const { colorScheme } = useMantineColorScheme() useEffect(() => { if (colorScheme === 'dark') { document.body.dataset.agThemeMode = 'dark' } else { document.body.dataset.agThemeMode = 'light' } }, [colorScheme]) return ( <> setCurrentTab(tables.find(table => table.value === tab) || tables[0])}> {tables.map((table, index) => ( {table.label} ))} {tables.map((table, index) => ( {isLoading ? : <> ({ ...obj, [key]: 'test' }), {}), Object.keys(table.headers).reduce((obj, key) => ({ ...obj, [key]: 'test' }), {}) ]} columnDefs={Object.keys(table.headers).map((header) => ({ field: header })) as ColDef[]} defaultColDef={{ flex: 1, }} /> } ))} ) } const ModalCreate = ({ openedCreateModal, closeCreateModal, currentTab }: { openedCreateModal: boolean closeCreateModal: () => void currentTab: ITableSchema }) => { const { register, handleSubmit, reset, watch, formState: { errors, isSubmitting, dirtyFields, isValid } } = useForm({ mode: 'onChange', }) const onSubmit: SubmitHandler = async (values: any) => { console.log('Values to submit:', values) } return ( {currentTab.post_include.map((header, index) => { switch (header.field_type) { case 'date': return ( ) case 'text': return ( ) default: return ( ) } })} ) }