diff --git a/src/pages/master/conversion/ConversionMaster.tsx b/src/pages/master/conversion/ConversionMaster.tsx index 7e8725c..b33db82 100644 --- a/src/pages/master/conversion/ConversionMaster.tsx +++ b/src/pages/master/conversion/ConversionMaster.tsx @@ -1,6 +1,12 @@ import { Container, DataGridInner } from '@/components'; import { ManageConversionContextProvider } from './hooks/ManageConversionContext'; import { Breadcrumbs, Link } from '@mui/material'; +import AddDialog from './blocks/AddDialog'; +import EditDialog from './blocks/EditDialog'; +import { Delete } from 'lucide-react'; +import DeleteDialog from './blocks/DeleteDialog'; + +// import EditDialog from './blocks/EditDialog'; const ConversionMaster = () => { return ( @@ -24,6 +30,10 @@ const ConversionMaster = () => {
+ + + + ); diff --git a/src/pages/master/conversion/blocks/AddDialog.tsx b/src/pages/master/conversion/blocks/AddDialog.tsx index e69de29..b9f0e60 100644 --- a/src/pages/master/conversion/blocks/AddDialog.tsx +++ b/src/pages/master/conversion/blocks/AddDialog.tsx @@ -0,0 +1,287 @@ +import { apiConfig } from '@/config/api.config'; +import { Alert, useDataGrid } from '@/components'; +import { useCallApi } from '@/hooks'; +import { getAuth } from '@/auth'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; +import { toast } from 'sonner'; +import { + Dialog, + DialogBody, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle +} from '@/components/ui/dialog'; +import { Input } from '@/components/ui/input'; +import { Button } from '@/components/ui/button'; +import { NumericFormat } from 'react-number-format'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList +} from '@/components/ui/command'; +import { set } from 'date-fns'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue +} from '@/components/ui/select'; +import { useManageConversionContext } from '../hooks/useManageConversionContext'; +interface CurrencyProps { + ID: string; + name: string; +} + +const API_URL = apiConfig.service_wallet; + +const AddDialog = () => { + const parentRef = useRef(null); + const { showAddDialog, handleAddDialog, selectedConversion } = useManageConversionContext(); + const { reload } = useDataGrid(); + const { PostData, GetData } = useCallApi(); + const parsedUser = getAuth()?.user; + const [currencies, setCurrencies] = useState([]); + const [open, setOpen] = useState(false); + const [alert, setAlert] = useState({ + show: false, + message: '' + }); + const initialState = { + status: '', + id_currency_origin: '', + id_currency_destination: '', + buy: 0, + sell: 0, + created_by: '', + created_at: '' + }; + const [formField, setFormField] = useState(initialState); + const created_time = new Date(); + const formattedTime = created_time.toISOString().slice(0, 19).replace('T', ' '); + + const resetForm = () => { + setFormField(initialState); + setAlert({ show: false, message: '' }); + }; + + const doCreateConversion = useCallback( + async (e: React.FormEvent) => { + e.preventDefault(); + + const response = await PostData(`${API_URL}/dashboard/conversion`, formField); + + if (response?.status) { + resetForm(); + handleAddDialog(false); + toast.success('Success Create Conversion'); + reload(); + } else { + toast.error('Error Create Conversion'); + setAlert({ show: true, message: 'Failed to create Conversion. Please try again.' }); + } + }, + [formField] + ); + + const doFetchCurrency = async (sorting: any) => { + try { + sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting; + const response = await GetData(`${API_URL}/dashboard/currency/`, { + limit: 1000, + page: 1, + with_deleted: false, + order_field: sorting[0].id, + order_direction: sorting[0].desc == false ? 'ASC' : 'DESC' + }); + + setCurrencies(response?.data.list); + } catch (error) { + console.error('Error fetching currency', error); + } + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + + if ( + formField.id_currency_origin === '' || + formField.id_currency_destination === '' || + formField.buy === 0 || + formField.sell === 0 || + formField.status === '' + ) { + setAlert({ show: true, message: 'Please fill in all required fields.' }); + return; + } + + doCreateConversion(e); + console.log(formField); + setAlert({ show: false, message: '' }); + }; + + useEffect(() => { + if (showAddDialog) { + setFormField({ + ...formField, + created_by: parsedUser.username, + created_at: formattedTime + }); + } + }, [formattedTime]); + + useEffect(() => { + doFetchCurrency([{ id: 'name', desc: false }]); + }, []); + + useEffect(() => { + if (showAddDialog === false) { + resetForm(); + } + }, [showAddDialog]); + + return ( + handleAddDialog(open)}> + + + Conversion - Create + + + +
+ {alert.show && ( + +

{alert.message}

+
+ )} + +
+
+
+ + +
+
+ + +
+
+ + { + setFormField((prev) => ({ + ...prev, + buy: values.floatValue || 0 + })); + }} + placeholder="Enter Buy" + /> +
+
+ + { + setFormField((prev) => ({ + ...prev, + sell: values.floatValue || 0 + })); + }} + placeholder="Enter Sell" + /> +
+
+ + +
+ +
+ +
+
+ + +
+
+
+
+
+
+
+ ); +}; + +export default AddDialog; diff --git a/src/pages/master/conversion/blocks/DeleteDialog.tsx b/src/pages/master/conversion/blocks/DeleteDialog.tsx new file mode 100644 index 0000000..1c84e02 --- /dev/null +++ b/src/pages/master/conversion/blocks/DeleteDialog.tsx @@ -0,0 +1,79 @@ +import { Alert, useDataGrid } from '@/components'; +import { useManageConversionContext } from '../hooks/useManageConversionContext'; +import { useCallback, useState } from 'react'; +import { apiConfig } from '@/config/api.config'; +import { useCallApi } from '@/hooks'; +import { toast } from 'sonner'; +import { + Dialog, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle +} from '@/components/ui/dialog'; +import { Button } from '@/components/ui/button'; +import { DialogDescription } from '@radix-ui/react-dialog'; + +const API_URL = apiConfig.service_wallet; + +const DeleteDialog = () => { + const { showDeleteDialog, handleDeleteDialog, selectedConversion } = useManageConversionContext(); + const { reload } = useDataGrid(); + const { DeleteData } = useCallApi(); + const [alert, setAlert] = useState({ + show: false, + message: '' + }); + + const doDeleteConversion = useCallback(async () => { + if (!selectedConversion) { + toast.error('No Conversion selected'); + return; + } + console.log(selectedConversion); + const response = await DeleteData( + `${API_URL}/dashboard/conversion/${selectedConversion}`, + { id: selectedConversion } + ); + + if (response?.status) { + setAlert({ show: false, message: '' }); + handleDeleteDialog(false, null); + toast.success('Success Delete Conversion'); + reload(); + } else { + setAlert({ show: true, message: response?.message }); + toast.error('Failed Delete Conversion'); + } + }, [selectedConversion, DeleteData, handleDeleteDialog, reload]); + console.log(selectedConversion); + return ( + handleDeleteDialog(open, null)}> + + + + + +

Are you sure?

+ You will delete this data! +
+ {alert.show && ( + +

{alert.message}

+
+ )} +
+ + + + +
+
+ ); +}; + +export default DeleteDialog; diff --git a/src/pages/master/conversion/blocks/EditDialog.tsx b/src/pages/master/conversion/blocks/EditDialog.tsx new file mode 100644 index 0000000..05f4d68 --- /dev/null +++ b/src/pages/master/conversion/blocks/EditDialog.tsx @@ -0,0 +1,299 @@ +import { apiConfig } from '@/config/api.config'; +import { Alert, useDataGrid } from '@/components'; +import { useCallApi } from '@/hooks'; +import { getAuth } from '@/auth'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; +import { toast } from 'sonner'; +import { + Dialog, + DialogBody, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle +} from '@/components/ui/dialog'; +import { Input } from '@/components/ui/input'; +import { Button } from '@/components/ui/button'; +import { NumericFormat } from 'react-number-format'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList +} from '@/components/ui/command'; +import { set } from 'date-fns'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue +} from '@/components/ui/select'; +import { useManageConversionContext } from '../hooks/useManageConversionContext'; +interface CurrencyProps { + ID: string; + name: string; +} + +const API_URL = apiConfig.service_wallet; + +const EditDialog = () => { + const parentRef = useRef(null); + const { showEditDialog, handleEditDialog, selectedConversion } = useManageConversionContext(); + const { reload } = useDataGrid(); + const { PostData, GetData, PutData } = useCallApi(); + const parsedUser = getAuth()?.user; + const [currencies, setCurrencies] = useState([]); + const [open, setOpen] = useState(false); + const [alert, setAlert] = useState({ + show: false, + message: '' + }); + const initialState = { + status: '', + id_currency_origin: '', + id_currency_destination: '', + buy: 0, + sell: 0, + created_by: '', + created_at: '' + }; + const [formField, setFormField] = useState(initialState); + const updated_time = new Date(); + const formattedTime = updated_time.toISOString().slice(0, 19).replace('T', ' '); + + const resetForm = () => { + setFormField(initialState); + setAlert({ show: false, message: '' }); + }; + + const doUpdateConversion = useCallback( + async (e: React.FormEvent) => { + e.preventDefault(); + if(!showEditDialog) return; + const response = await PutData(`${API_URL}/dashboard/conversion/${selectedConversion}`,{ + ...formField + }); + + if (response?.status) { + resetForm(); + handleEditDialog(false, null); + toast.success('Success Update Conversion'); + reload(); + } else { + toast.error('Error Create Conversion'); + setAlert({ show: true, message: 'Failed to Update Conversion. Please try again.' }); + } + }, + [formField] + ); + + const doGetCurrency = async (sorting: any) => { + if (!showEditDialog)return; + try { + sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting; + const response = await GetData(`${API_URL}/dashboard/currency/`, { + limit: 1000, + page: 1, + with_deleted: false, + order_field: sorting[0].id, + order_direction: sorting[0].desc == false ? 'ASC' : 'DESC' + }); + + setCurrencies(response?.data.list); + } catch (error) { + console.error('Error fetching currency', error); + } + }; + + const doGetConversionById = useCallback(async (id: string) => { + const response = await GetData(`${API_URL}/dashboard/conversion/${id}`, { id }); + console.log('Transaction Type: ', response?.data); + if (response?.status) { + setFormField((prev) => ({ + ...prev, + status: response.data.status, + id_currency_origin: response.data.id_currency_origin, + id_currency_destination: response.data.id_currency_destination, + buy: response.data.buy, + sell: response.data.sell, + })); + } + // console.log('form fieldd Transaction Type: ', formField); + }, []); + + useEffect(() => { + if (selectedConversion) { + doGetConversionById(selectedConversion); + } + }, [selectedConversion]); + + + + + useEffect(() => { + if (showEditDialog) { + setFormField({ + ...formField, + created_by: parsedUser.username, + created_at: formattedTime + }); + } + }, [formattedTime]); + + useEffect(() => { + if (showEditDialog) { + doGetCurrency([{ id: 'name', desc: false }]); + } + }, [showEditDialog]); + + + useEffect(() => { + if (showEditDialog === false) { + resetForm(); + } + }, [showEditDialog]); + + return ( + handleEditDialog(open,null)}> + + + Conversion - Update + + + +
+ {alert.show && ( + +

{alert.message}

+
+ )} + +
+
+
+ + +
+
+ + +
+
+ + { + setFormField((prev) => ({ + ...prev, + buy: values.floatValue || 0 + })); + }} + placeholder="Enter Buy" + /> +
+
+ + { + setFormField((prev) => ({ + ...prev, + sell: values.floatValue || 0 + })); + }} + placeholder="Enter Sell" + /> +
+
+ + +
+ +
+ +
+
+ + +
+
+
+
+
+
+
+ ); +}; + +export default EditDialog; diff --git a/src/pages/master/conversion/blocks/ListToolbar.tsx b/src/pages/master/conversion/blocks/ListToolbar.tsx index 1cacece..f356e29 100644 --- a/src/pages/master/conversion/blocks/ListToolbar.tsx +++ b/src/pages/master/conversion/blocks/ListToolbar.tsx @@ -11,7 +11,7 @@ const ListToolbar = () => {
- */} {/* ); }, - meta: { - headerClassName: 'w-[100px]', - cellClassName: 'text-center' - } + meta: { headerClassName: 'w-[100px]', cellClassName: 'text-center' } } ], - [] + [handleEditDialog, handleDeleteDialog] ); - - const getConversionLists = async (page: number, limit: number, sorting: any, filter: any) => { - try { - sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting; - filter = filter.length == 0 ? {} : { any: filter[0].value?.toLowerCase() }; - const response = await GetData(`${API_URL_WALLET}/dashboard/conversion`, { - limit, - page: page + 1, - with_deleted: false, - order_field: sorting[0].id, - order_direction: sorting[0].desc == false ? 'ASC' : 'DESC', - filter: JSON.stringify(filter) - }); - console.log(response?.data); - setConversions(response?.data.list); - return { data: response?.data.list, totalCount: response?.data.total_count }; - } catch (error) { - console.error('Error fetching Conversion', error); - } + const doGetConversion = async ( + page: number, + limit: number, + sorting: any, + filter: any + ) => { + sorting = sorting.length == 0 ? [{ id: 'name', desc: true }] : sorting; + filter = filter.length == 0 ? {} : { any: filter[0].value?.toLowerCase() }; + console.log(sorting); + const response = await GetData(`${API_URL}/dashboard/conversion/`, { + limit: limit, + page: page + 1, + with_deleted: false, + order_field: sorting[0].id, + order_direction: sorting[0].desc ? 'ASC' : 'DESC', + filter: JSON.stringify(filter) + }); + console.log(response?.data); + return { data: response?.data.list, totalCount: response?.data.total_count }; }; return ( - - - } - layout={{ card: true }} - sorting={[{ id: 'id', desc: false }]} - serverSide={true} - onFetchData={({ pageIndex, pageSize, sorting, columnFilters }) => - getConversionLists(pageIndex, pageSize, sorting, columnFilters) - } +
+ - {children} - - + + +
+ } + sorting={[{ id: 'ID', desc: true }]} + serverSide={true} + onFetchData={({ pageIndex, pageSize, sorting, columnFilters }) => + doGetConversion(pageIndex, pageSize, sorting, columnFilters) + } + > + {children} + +
+ +
); }; export { ManageConversionContext, ManageConversionContextProvider }; -export type { ConversionProps }; +export type { Conversion };