From 5437979dd35839cc7035d25cad541a86a53bc049 Mon Sep 17 00:00:00 2001 From: bagusajisaputroo Date: Sat, 5 Apr 2025 17:41:00 +0700 Subject: [PATCH] add new field (Transactiontype status) on transactiontype + remove console on addDialog conversion --- .../master/conversion/blocks/AddDialog.tsx | 2 +- .../transfertype/blocks/AddDialog.tsx | 362 ++++++++++----- .../transfertype/blocks/EditDialog.tsx | 437 ++++++++++++------ .../hooks/ManageTransferTypeContext.tsx | 11 + 4 files changed, 538 insertions(+), 274 deletions(-) diff --git a/src/pages/master/conversion/blocks/AddDialog.tsx b/src/pages/master/conversion/blocks/AddDialog.tsx index b9f0e60..5cca7f8 100644 --- a/src/pages/master/conversion/blocks/AddDialog.tsx +++ b/src/pages/master/conversion/blocks/AddDialog.tsx @@ -121,7 +121,7 @@ const AddDialog = () => { } doCreateConversion(e); - console.log(formField); + // console.log(formField); setAlert({ show: false, message: '' }); }; diff --git a/src/pages/transfer/transfertype/blocks/AddDialog.tsx b/src/pages/transfer/transfertype/blocks/AddDialog.tsx index a781c1d..5a3bfbf 100644 --- a/src/pages/transfer/transfertype/blocks/AddDialog.tsx +++ b/src/pages/transfer/transfertype/blocks/AddDialog.tsx @@ -1,5 +1,5 @@ import { apiConfig } from '@/config/api.config'; -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { useCallback, useEffect, useRef, useState } from 'react'; import { useManageTransferTypeContext } from '../hooks/useManageTransferTypeContext'; import { Alert, @@ -30,6 +30,15 @@ import { import { Button } from '@/components/ui/button'; import { toast } from 'sonner'; import { getAuth } from '@/auth'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList +} from '@/components/ui/command'; interface WalletProps { Wallet_id: string; @@ -48,6 +57,7 @@ const API_URL3_CUSTOMER = apiConfig.service_customer; const AddDialog = () => { const parentRef = useRef(null); + const [open, setOpen] = useState(false); const { GetData } = useCallApi(); const { showAddDialog, handleAddDialog, selectedTransferType } = useManageTransferTypeContext(); const [wallets, setWallets] = useState([]); @@ -70,37 +80,102 @@ const AddDialog = () => { maximum_amount: 0, max_transaction_per_day: 0, status: '', + type: '', status_approval: '', created_by: '', created_at: '' }; const [formField, setFormField] = useState(initialState); + const [isSubmitting, setIsSubmitting] = useState(false); const resetForm = () => { setFormField(initialState); }; - const [isSubmitting, setIsSubmitting] = useState(false); const parsedUser = getAuth()?.user; + // Updated validation function to make only certain fields required + const validateForm = () => { + const requiredFields = [ + 'name', + 'description', + 'wallet_origin', + 'wallet_destination', + 'wallet_fee_destination', + 'customer_fee_destination', + 'status', + 'status_approval' + ]; + + const missingFields = requiredFields.filter( + (field) => + formField[field as keyof typeof formField] === '' || + formField[field as keyof typeof formField] === null || + formField[field as keyof typeof formField] === undefined + ); + + if (missingFields.length > 0) { + setAlert({ + show: true, + message: `Please fill out all required fields: ${missingFields.join(', ')}` + }); + return false; + } + + setAlert({ show: false, message: '' }); + return true; + }; + const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); - // setIsSubmitting(true); - const payload = { - name: formField.name, - description: formField.description, - wallet_origin: formField.wallet_origin, - wallet_destination: formField.wallet_destination, - minimum_amount: formField.minimum_amount, - maximum_amount: formField.maximum_amount, - max_transaction_per_day: formField.max_transaction_per_day, - wallet_fee_destination: formField.wallet_fee_destination, - customer_fee_destination: formField.customer_fee_destination, - status_approval: formField.status_approval, - status: formField.status - }; + setIsSubmitting(true); + + if (!validateForm()) { + setIsSubmitting(false); + return; + } + + doCreateTransferType(formField) + .then((success) => { + if (success) { + handleAddDialog(false); + toast.success('Success Create Transfer Type'); + reload(); + resetForm(); + } + }) + .finally(() => { + setIsSubmitting(false); + }); }; + + const doCreateTransferType = useCallback( + async (data: typeof formField) => { + try { + const response = await PostData(`${API_URL}/transactiontype/create`, data); + + if (response?.status) { + setAlert({ show: false, message: '' }); + return true; + } else { + setAlert({ show: true, message: response?.message || 'Failed to create transfer type' }); + return false; + } + } catch (error) { + setAlert({ + show: true, + message: + error instanceof Error + ? error.message + : 'An error occurred while creating transfer type' + }); + return false; + } + }, + [PostData] + ); + useEffect(() => { const created_time = new Date(); const formattedTime = created_time.toISOString().slice(0, 19).replace('T', ' '); @@ -128,7 +203,6 @@ const AddDialog = () => { order_direction: sorting[0].desc ? 'DESC' : 'ASC' }); setCustomers(response?.data.list); - // console.log('CUSTOMER: ', response?.data.list); } catch (error) { console.error('Error fetching customer', error); } @@ -161,34 +235,6 @@ const AddDialog = () => { fetchWallets(); }, [showAddDialog]); - const doCreateTransferType = useCallback( - async (e: React.FormEvent) => { - e.preventDefault(); - for (const key in formField) { - if (formField[key as keyof typeof formField] === '') { - setAlert({ show: true, message: 'All fields must be filled out' }); - return; - } - } - - setAlert({ show: false, message: '' }); - - const response = await PostData(`${API_URL}/transactiontype/create`, formField); - - if (response?.status) { - setAlert({ show: false, message: '' }); - handleAddDialog(false); - toast.success('Success Create Transfer Type'); - reload(); - resetForm(); - } else { - setAlert({ show: true, message: response?.message || 'Failed to create transfer type' }); - } - handleAddDialog(false); - }, - [formField] - ); - return ( handleAddDialog(open)}> @@ -198,7 +244,7 @@ const AddDialog = () => {

- Addd Transaction Type + Add Transaction Type

@@ -220,7 +266,7 @@ const AddDialog = () => {

{alert.message}

)} -
+
@@ -228,15 +274,17 @@ const AddDialog = () => { Transfer Type Name * - - setFormField((prev) => ({ ...prev, name: target.value })) - } - /> +
+ + setFormField((prev) => ({ ...prev, name: target.value })) + } + /> +
@@ -246,15 +294,17 @@ const AddDialog = () => { Description * - - setFormField((prev) => ({ ...prev, description: target.value })) - } - /> +
+ + setFormField((prev) => ({ ...prev, description: target.value })) + } + /> +
@@ -263,20 +313,22 @@ const AddDialog = () => { - { - setFormField((prev) => ({ - ...prev, - minimum_amount: values.floatValue || 0 - })); - }} - placeholder="Enter Minimum Amount" - /> +
+ { + setFormField((prev) => ({ + ...prev, + minimum_amount: values.floatValue || 0 + })); + }} + placeholder="Enter Minimum Amount" + /> +
@@ -285,20 +337,22 @@ const AddDialog = () => { - { - setFormField((prev) => ({ - ...prev, - maximum_amount: values.floatValue || 0 - })); - }} - placeholder="Enter Maximum Amount" - /> +
+ { + setFormField((prev) => ({ + ...prev, + maximum_amount: values.floatValue || 0 + })); + }} + placeholder="Enter Maximum Amount" + /> +
@@ -306,24 +360,26 @@ const AddDialog = () => { - { - setFormField((prev) => ({ - ...prev, - max_transaction_per_day: values.floatValue || 0 - })); - }} - placeholder="Enter Max Transaction Per Day" - /> +
+ { + setFormField((prev) => ({ + ...prev, + max_transaction_per_day: values.floatValue || 0 + })); + }} + placeholder="Enter Max Transaction Per Day" + /> +
-
+
-
+
-
+
-
+
+
+ + + + + + + + { + e.currentTarget.scrollTop += e.deltaY; + }} + > + No Customer found. + + {customers.map((customer) => ( + { + setFormField({ + ...formField, + customer_fee_destination: customer.id + }); + setOpen(false); + }} + > + {customer.username} + + ))} + + + + + +
+
+
+
+
+ +
-
-
+
-
+
@@ -299,20 +380,22 @@ const EditDialog = () => { - { - setFormField((prev) => ({ - ...prev, - maximum_amount: values.floatValue || 0 - })); - }} - placeholder="Enter Maximum Amount" - /> +
+ { + setFormField((prev) => ({ + ...prev, + maximum_amount: values.floatValue || 0 + })); + }} + placeholder="Enter Maximum Amount" + /> +
@@ -320,24 +403,26 @@ const EditDialog = () => { - { - setFormField((prev) => ({ - ...prev, - max_transaction_per_day: values.floatValue || 0 - })); - }} - placeholder="Enter Max Transaction Per Day" - /> +
+ { + setFormField((prev) => ({ + ...prev, + max_transaction_per_day: values.floatValue || 0 + })); + }} + placeholder="Enter Max Transaction Per Day" + /> +
-
+
-
+
-
+
-
+
+
+ + + + + + + + { + e.currentTarget.scrollTop += e.deltaY; + }} + > + No Customer found. + + {customers.map((customer) => ( + { + setFormField({ + ...formField, + customer_fee_destination: customer.id + }); + setOpen(false); + }} + > + {customer.username} - {customer.msisdn} + + ))} + + + + + +
+
+
+ +
+
+
@@ -447,12 +589,11 @@ const EditDialog = () => {
-
+
-
{
- {/* Bagian Transaction Fee */} + + {/* Transaction Fee Section */} -
+
@@ -530,4 +671,4 @@ const EditDialog = () => { ); }; -export { EditDialog }; +export { EditDialog }; \ No newline at end of file diff --git a/src/pages/transfer/transfertype/hooks/ManageTransferTypeContext.tsx b/src/pages/transfer/transfertype/hooks/ManageTransferTypeContext.tsx index ef182c6..4d2b233 100644 --- a/src/pages/transfer/transfertype/hooks/ManageTransferTypeContext.tsx +++ b/src/pages/transfer/transfertype/hooks/ManageTransferTypeContext.tsx @@ -20,6 +20,7 @@ interface TransferType { walletOriginId: string; walletDestinationId: string; status: string; + type: string; } interface ContextProps { @@ -155,6 +156,16 @@ const ManageTransferTypeContextProvider = ({ children }: { children: React.React enableHiding: false, meta: { headerClassName: 'w-[250px]' } }, + { + accessorFn: (row) => row.type, + id: 'type', + header: ({ column }) => ( + + ), + enableSorting: true, + enableHiding: false, + meta: { headerClassName: 'w-[250px]' } + }, { accessorFn: (row) => (row.status === 'Y' ? 'Active' : 'Inactive'), id: 'status',