diff --git a/src/config/api.config.ts b/src/config/api.config.ts index 81e8652..4025a2e 100644 --- a/src/config/api.config.ts +++ b/src/config/api.config.ts @@ -7,6 +7,7 @@ interface apiConfigProps { transaction: string; nationality: string; service_disbursement: string; + service_notification: string; } const API_URL = import.meta.env.VITE_APP_API_URL; @@ -20,6 +21,7 @@ const apiConfig: apiConfigProps = { service_wallet: `${API_URL}/w`, transaction: `${API_URL}/x`, service_disbursement: `${API_URL}/s`, + service_notification: `${API_URL}/n`, nationality: `https://tpay.shiblysolution.id/cms/api/mobile/list-country/ ` }; diff --git a/src/pages/disbursement/history-transaction/blocks/DetailTransaction.tsx b/src/pages/disbursement/history-transaction/blocks/DetailTransaction.tsx index c3ded68..5f5ff7b 100644 --- a/src/pages/disbursement/history-transaction/blocks/DetailTransaction.tsx +++ b/src/pages/disbursement/history-transaction/blocks/DetailTransaction.tsx @@ -61,7 +61,6 @@ const DetailTransaction = () => { useEffect(() => { const fetchTransactionDetails = async () => { - console.log(selectedTransactionId) if (selectedTransactionId) { try { const response = await GetData(`${API_URL}/transaction/history/${selectedTransactionId}`, { diff --git a/src/pages/disbursement/history-transaction/blocks/DetailTransactionLog.tsx b/src/pages/disbursement/history-transaction/blocks/DetailTransactionLog.tsx index b2a668f..3c24c1a 100644 --- a/src/pages/disbursement/history-transaction/blocks/DetailTransactionLog.tsx +++ b/src/pages/disbursement/history-transaction/blocks/DetailTransactionLog.tsx @@ -54,10 +54,6 @@ const TransactionLogViewer = () => { detailLogData } = useTransactionContext(); - console.log('detailLogData: ', detailLogData) - - - return ( diff --git a/src/pages/groups/Column.tsx b/src/pages/groups/Column.tsx index d796078..2f6fe7f 100644 --- a/src/pages/groups/Column.tsx +++ b/src/pages/groups/Column.tsx @@ -1,3 +1,4 @@ +import { KeenIcon } from '@/components'; import { ColumnDef } from '@tanstack/react-table'; export type Group = { @@ -8,7 +9,7 @@ export type Group = { description: string; }; -export const columns: ColumnDef[] = [ +export const getColumns = (handleUpdate: (data: any) => void): ColumnDef[] => [ { accessorKey: 'no', header: 'ID' @@ -30,8 +31,19 @@ export const columns: ColumnDef[] = [ accessorKey: 'description', header: 'Description' }, - // { - // id: 'actions', - // header: 'Actions' - // } + { + id: 'actions', + cell: ({ row }) => { + const dataMembers = row.original; + + return ( + + ); + } + } ]; diff --git a/src/pages/groups/ListToolbar.tsx b/src/pages/groups/ListToolbar.tsx new file mode 100644 index 0000000..793f4c9 --- /dev/null +++ b/src/pages/groups/ListToolbar.tsx @@ -0,0 +1,49 @@ +import { DefaultTooltip, KeenIcon, useDataGrid } from '@/components'; +import { Button } from '@/components/ui/button'; + +const ListToolBar = ({ createGroup }: { createGroup: () => void }) => { + const { table, reload } = useDataGrid(); + + return ( +
+
+
+
+ + {/* + + */} +
+
+ + + + +
+
+
+
+ ); +}; + +export { ListToolBar }; diff --git a/src/pages/groups/ManageGroups.tsx b/src/pages/groups/ManageGroups.tsx index 55ae1eb..3ba347d 100644 --- a/src/pages/groups/ManageGroups.tsx +++ b/src/pages/groups/ManageGroups.tsx @@ -1,5 +1,5 @@ import { DataTable } from '@/components/ui/DataTable'; -import { columns, Group } from './Column'; +import { getColumns, Group } from './Column'; import { apiConfig } from '@/config/api.config'; import axios, { AxiosResponse } from 'axios'; import { Helmet } from 'react-helmet'; @@ -24,6 +24,8 @@ import CloseIcon from '@mui/icons-material/Close'; import Divider from '@mui/material/Divider'; import ConfirmDialog from '@/components/confirm'; import { toast } from 'sonner'; +import { Container, DataGridProvider } from '@/components'; +import { ListToolBar } from './ListToolbar'; // import { DialogHeader } from '@/components/ui/dialog'; // import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; const BASE_URL = apiConfig.service_customer; @@ -89,9 +91,9 @@ const ManageGroups = () => { const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); - if (!formData.groupName) return toast.warning(`Group name can not be empty!`) - if (!formData.status) return toast.warning(`Status can not be empty!`) - if (!formData.description) return toast.warning(`Description can not be empty!`) + if (!formData.groupName) return toast.warning(`Group name can not be empty!`); + if (!formData.status) return toast.warning(`Status can not be empty!`); + if (!formData.description) return toast.warning(`Description can not be empty!`); setIsDialogOpen(false); setDialogOpen(true); }; @@ -134,7 +136,7 @@ const ManageGroups = () => { description: formData.description, created_at: new Date() }); - toast.success(`Success create group`) + toast.success(`Success create group`); } else if (dialogType === 'update') { await axios.put(`${BASE_URL}/groups/update/${formData.id}`, { name: formData.groupName, @@ -142,14 +144,14 @@ const ManageGroups = () => { description: formData.description, updated_at: new Date() }); - toast.success(`Success update group`) + toast.success(`Success update group`); } else if (dialogType === 'delete') { await axios.delete(`${BASE_URL}/groups/delete/${formData.id}/true`); - toast.success(`Success delete group`) + toast.success(`Success delete group`); } } catch (error: any) { console.log(error); - toast.error(error.message) + toast.error(error.message); } finally { await fetchGroups(); setDialogOpen(false); @@ -162,19 +164,19 @@ const ManageGroups = () => { TPAY | Manage Group - setDialogOpen(false)} - title="Confirm Action" - content={ - `Are you sure you want to ` + - (dialogType === 'create' ? 'create?' : dialogType === 'update' ? 'update?' : 'delete?') - } - onYes={handleYes} - onNo={() => setDialogOpen(false)} - /> -

Groups

-
+ + setDialogOpen(false)} + title="Confirm Action" + content={ + `Are you sure you want to ` + + (dialogType === 'create' ? 'create?' : dialogType === 'update' ? 'update?' : 'delete?') + } + onYes={handleYes} + onNo={() => setDialogOpen(false)} + /> +

Groups

Dashboard @@ -188,84 +190,101 @@ const ManageGroups = () => { Manage Groups -
-
- */} +
+ {/* -
+ /> */} + } + layout={{ card: true }} + sorting={[{ id: 'created_at', desc: true }]} + serverSide={false} + onRowSelectionChange={(selected, table: any) => { + const selectedRow = table.getSelectedRowModel().rows[0]; + if (selectedRow) handleUpdate(selectedRow.original); + }} + /> +
+ {/* */} - - -
- {dialogType==='create'?"Create New Group":"Update Group"} - - - -
- -
-
-
- - -
-
- - - - } - label="Yes" - /> - } - label="No" - /> - - -
-
- - -
- -
-
-
-
+ + +
+ + {dialogType === 'create' ? 'Create New Group' : 'Update Group'} + + + + +
+ +
+
+
+ + +
+
+ + + + } + label="Yes" + /> + } + label="No" + /> + + +
+
+ + +
+ +
+
+
+
+ ); }; diff --git a/src/pages/members/kyc-delete-member/blocks/DetailDialog.tsx b/src/pages/members/kyc-delete-member/blocks/DetailDialog.tsx index 7875949..016674c 100644 --- a/src/pages/members/kyc-delete-member/blocks/DetailDialog.tsx +++ b/src/pages/members/kyc-delete-member/blocks/DetailDialog.tsx @@ -1,9 +1,9 @@ import { - Dialog, - DialogBody, - DialogContent, - DialogHeader, - DialogTitle + Dialog, + DialogBody, + DialogContent, + DialogHeader, + DialogTitle } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; @@ -13,11 +13,11 @@ import axios from 'axios'; const API_URL = apiConfig.service_customer; const DetailDialog = () => { - const { showDetailDialog, setShowDetailDialog, detailKyc } = useManageKycDeletionContext(); - - return ( + const { showDetailDialog, setShowDetailDialog, detailKyc, handleApproveReject } = useManageKycDeletionContext(); + + return ( - + Customer Deletion Details @@ -38,9 +38,9 @@ const DetailDialog = () => {
- - -
+ + + ) : (
)} @@ -51,28 +51,28 @@ const DetailDialog = () => { export default DetailDialog; -function generateInput(formData:any, handleChange:any, label:string, name:string, type: string, required: boolean, disabled: boolean) { +function generateInput(formData: any, handleChange: any, label: string, name: string, type: string, required: boolean, disabled: boolean) { function generateDate(isoString: string) { - return isoString.slice(0, 10); // "2000-01-18" + return isoString.slice(0, 10); // "2000-01-18" } type Code = 'W' | 'Y' | 'N' | 'T' | 'P' | 'D' | 'L'; interface Reason { label: string; } - + const statusMap: Record = { - W: {label: 'Waiting Approval'}, - Y: {label: 'Approve'}, - N: {label: 'Reject'}, - T: {label: 'Tidak lagi menggunakan layanan'}, - P: {label: 'Privasi dan keamanan'}, - D: {label: 'Akun ganda'}, - L: {label: 'Lainnya'} + W: { label: 'Waiting Approval' }, + Y: { label: 'Approve' }, + N: { label: 'Reject' }, + T: { label: 'Tidak lagi menggunakan layanan' }, + P: { label: 'Privasi dan keamanan' }, + D: { label: 'Akun ganda' }, + L: { label: 'Lainnya' } }; if (name == 'reason_deletion' || name == 'status_approve') { const status = formData[name] as Code - const fixStatus = statusMap[status] ?? {label: formData[name]} + const fixStatus = statusMap[status] ?? { label: formData[name] } formData[name] = fixStatus.label } return ( @@ -80,15 +80,15 @@ function generateInput(formData:any, handleChange:any, label:string, name:string
- {required ? "*" : ""} + +
diff --git a/src/pages/members/kyc-delete-member/hooks/ManageKycDeletionContext.tsx b/src/pages/members/kyc-delete-member/hooks/ManageKycDeletionContext.tsx index bf5e46f..c0742fd 100644 --- a/src/pages/members/kyc-delete-member/hooks/ManageKycDeletionContext.tsx +++ b/src/pages/members/kyc-delete-member/hooks/ManageKycDeletionContext.tsx @@ -1,5 +1,6 @@ import { DataGridColumnHeader, DataGridProvider, KeenIcon } from '@/components'; import { Toaster } from '@/components/ui/sonner'; +import { toast } from 'sonner'; import { apiConfig } from '@/config/api.config'; import { ColumnDef } from '@tanstack/react-table'; import { createContext, useCallback, useMemo, useState } from 'react'; @@ -36,6 +37,7 @@ interface ContextProps { selectedIdCustomer: string | null; detailKyc: any | null; setDetailKyc: React.Dispatch>; + handleApproveReject: (customerDeletionId: string, status_approve: string) => {}; } const initialProps: ContextProps = { @@ -48,6 +50,7 @@ const initialProps: ContextProps = { setShowDetailDialog: () => { }, detailKyc: async () => {}, setDetailKyc: () => { }, + handleApproveReject: () => ({customerDeletionId: '0', status_approve: 'Y'}), }; const ManageKycDeletionContext = createContext(initialProps); @@ -83,13 +86,15 @@ export const renderStatusBadge = (statusRaw: string | null | undefined) => { ); }; +// const { reload } = useDataGrid(); + const ManageKycDeletionContextProvider = ({ children }: { children: React.ReactNode }) => { const [showDetailDialog, setShowDetailDialog] = useState(false); const [showAddDialog, setShowAddDialog] = useState(false); const [selectedIdCustomer, setSelectedIdCustomer] = useState(null); const [detailKyc, setDetailKyc] = useState(); const [manageKyc, setManageKyc] = useState([]); - const { GetData } = useCallApi(); + const { GetData, PostData } = useCallApi(); const getKycDeletionList = async (page: number, limit: number, sorting: any, filter: any) => { try { @@ -130,12 +135,11 @@ const ManageKycDeletionContextProvider = ({ children }: { children: React.ReactN }; const handleDetailDialog = useCallback(async (show: boolean, selected_id_customer: string | null) => { - setSelectedIdCustomer(show ? selected_id_customer : null); - let detailCustomer = await GetData(`${API_URL}/customer_deletion/detail/${selected_id_customer}`, {}) - setDetailKyc(detailCustomer?.data) - console.log('detailCustomer: ',detailCustomer) - console.log('detailCustomer2: ',detailCustomer?.data) - console.log('detailKyc: ', detailKyc) + if (show == true) { + setSelectedIdCustomer(show ? selected_id_customer : null); + let detailCustomer = await GetData(`${API_URL}/customer_deletion/detail/${selected_id_customer}`, {}) + setDetailKyc(detailCustomer?.data) + } setShowDetailDialog(show); }, []); @@ -143,6 +147,26 @@ const ManageKycDeletionContextProvider = ({ children }: { children: React.ReactN setShowAddDialog(show); }, []); + const handleApproveReject = useCallback(async (customerDeletionId: string, status_approve: string) => { + console.log(customerDeletionId, status_approve) + try { + let approveReject = await PostData(`${API_URL}/customer_deletion/update_status/${customerDeletionId}`, { + status_approve + }) + + if (approveReject?.status == true) { + toast.success('Success update status approval') + handleDetailDialog(false, null) + } else { + toast.warning(`${approveReject?.message}`) + handleDetailDialog(false, null) + } + } catch (error) { + toast.warning('Failed to approve/reject') + handleDetailDialog(false, null) + } + }, []) + const columns = useMemo[]>( () => [ { @@ -242,7 +266,8 @@ const ManageKycDeletionContextProvider = ({ children }: { children: React.ReactN selectedIdCustomer, setShowDetailDialog, setDetailKyc, - detailKyc + detailKyc, + handleApproveReject, }} > diff --git a/src/pages/members/kyc/Columns.tsx b/src/pages/members/kyc/Columns.tsx index 541ac16..55d3d28 100644 --- a/src/pages/members/kyc/Columns.tsx +++ b/src/pages/members/kyc/Columns.tsx @@ -1,3 +1,4 @@ +import { DataGridColumnHeader, KeenIcon } from '@/components'; import { Button } from '@/components/ui/button'; import { DropdownMenu, @@ -18,7 +19,7 @@ export type Members = { created_at: Date; }; -export const columns: ColumnDef[] = [ +export const getColumns = (handleUpdate: (data: any) => void): ColumnDef[] => [ { accessorKey: 'no', header: ({ column }) => { @@ -31,6 +32,14 @@ export const columns: ColumnDef[] = [ ); + }, + cell: ({ row, table }) => { + const pageIndex = table.getState().pagination.pageIndex; + const pageSize = table.getState().pagination.pageSize; + const rowIndex = row.index; + + const number = pageIndex * pageSize + rowIndex + 1; + return number; } }, { @@ -136,61 +145,117 @@ export const columns: ColumnDef[] = [ id: 'actions', cell: ({ row }) => { const dataMembers = row.original; + return ( - - + ); } } ]; -export const initialMember = { - id: "", - fullname: "", - email: "", - username: "", - msisdn: "", - password: "", - pin: "", - try_pin: "", - mother_fullname: "", - agent_name: "", - bank_name: "", - bank_account: "", - ibank_number: "", - address: "", - longitude: "", - latitude: "", - nationality: "", - photouser: "", - photomerchant: "", - file_selfie: "", - file_document_id: "", - file_document_id_selfie: "", - file_commercial_license: "", - identity_type: "", - identity_number: "", - license_number: "", - date_birth: "", - gender: "", - status: "N", - isneedapproval: "", - isapproved: "", - approveddate: "", - approvedby: "", - created_by: "", - created_at: "", - updated_by: "", - updated_at: "", - deleted_by: "", - deleted_at: "", - group: "", - point_tier: "", - language: "", - municipio: "", - posto_adms: "", - suco: "", - aldeia: "", - profession: "", - description: "" -} +export type MembersProps = { + id: string; + fullname: string; + email: string; + username: string; + msisdn: string; + password: string; + pin: string; + try_pin: string; + mother_fullname: string; + agent_name: string; + bank_name: string; + bank_account: string; + ibank_number: string; + address: string; + longitude: string; + latitude: string; + nationality: string; + photouser: string; + photomerchant: string; + file_selfie: string; + file_document_id: string; + file_document_id_selfie: string; + file_commercial_license: string; + identity_type: string; + identity_number: string; + license_number: string; + date_birth: string; + gender: string; + status: string; + isneedapproval: string; + isapproved: string; + approveddate: string; + approvedby: string; + created_by: string; + created_at: string; + updated_by: string; + updated_at: string; + deleted_by: string; + deleted_at: string; + group: string; + point_tier: string; + language: string; + municipio: string; + posto_adms: string; + suco: string; + aldeia: string; + profession: string; + description: string; +}; + +export const initialMember: MembersProps = { + id: '', + fullname: '', + email: '', + username: '', + msisdn: '', + password: '', + pin: '', + try_pin: '', + mother_fullname: '', + agent_name: '', + bank_name: '', + bank_account: '', + ibank_number: '', + address: '', + longitude: '', + latitude: '', + nationality: '', + photouser: '', + photomerchant: '', + file_selfie: '', + file_document_id: '', + file_document_id_selfie: '', + file_commercial_license: '', + identity_type: '', + identity_number: '', + license_number: '', + date_birth: '', + gender: '', + status: 'N', + isneedapproval: '', + isapproved: '', + approveddate: '', + approvedby: '', + created_by: '', + created_at: '', + updated_by: '', + updated_at: '', + deleted_by: '', + deleted_at: '', + group: '', + point_tier: '', + language: '', + municipio: '', + posto_adms: '', + suco: '', + aldeia: '', + profession: '', + description: '' +}; diff --git a/src/pages/members/kyc/Kyc.tsx b/src/pages/members/kyc/Kyc.tsx index 3245347..969db5e 100644 --- a/src/pages/members/kyc/Kyc.tsx +++ b/src/pages/members/kyc/Kyc.tsx @@ -1,9 +1,9 @@ -import { DataGridInner, TDataGridProps } from '@/components'; +import { Container, DataGridInner, DataGridProvider, TDataGridProps } from '@/components'; import { DataTable } from '@/components/ui/DataTable'; import { Table } from '@tanstack/react-table'; import React, { createContext, useContext, useState, useEffect } from 'react'; import { ManageKycContextProvider } from './hooks'; -import { columns, initialMember } from './Columns'; +import { getColumns, initialMember } from './Columns'; import { useAuthContext } from '@/auth'; import { LoaderTransparant } from '@/components'; import { apiConfig } from '@/config/api.config'; @@ -16,25 +16,7 @@ const BASE_URL_MASTER_DATA = apiConfig.service_master_data; import DetailMember from '../manage-members/blocks/DetailMember'; import { Breadcrumbs, Link } from '@mui/material'; import { Helmet } from 'react-helmet'; - -export interface IDataGridContextProps { - props: TDataGridProps; - table: Table; - totalRows: number; - loading: (state: boolean) => void; - reload: () => void; - children?: React.ReactNode; -} - -const DataGridContext = createContext | undefined>(undefined); - -export const useDataGrid = () => { - const context = useContext(DataGridContext); - if (!context) { - throw new Error('useDataGrid must be used within a DataGridProvider'); - } - return context; -}; +import { ListToolBar } from './blocks/ListToolBar'; const Kyc = () => { const [loading, setLoading] = useState(false); @@ -58,8 +40,8 @@ const Kyc = () => { limit: 10, page: 1, with_deleted: false, - order_field: 'fullname', - order_direction: 'ASC', + order_field: 'created_at', + order_direction: 'DESC', type: 'kyc' } }); @@ -72,14 +54,14 @@ const Kyc = () => { setMembers(resMembers); let getProfession: any = await axios.get(`${BASE_URL_MASTER_DATA}/profession/list`, { params: { - limit: 50, - page: 1, - with_deleted: false, - order_field: 'name', - order_direction: 'ASC', + limit: 50, + page: 1, + with_deleted: false, + order_field: 'name', + order_direction: 'ASC' } }); - setProfession(getProfession.data.data.list) + setProfession(getProfession.data.data.list); } catch (error: any) { toast.error(error.message); console.log(error); @@ -103,8 +85,12 @@ const Kyc = () => { setDialogOpen(true); } + const resetForm = () => { + setMember(initialMember); + }; + const handleYes = async () => { - setLoading(true) + setLoading(true); const userLogin: any = await getUser(); const updateData: any = member; const customerId = member.id; @@ -135,7 +121,6 @@ const Kyc = () => { delete updateData.suco_name; delete updateData.aldeia_id; delete updateData.aldeia_name; - delete updateData.group_id; delete updateData.group_name; delete updateData.group_description; delete updateData.group_status; @@ -152,99 +137,123 @@ const Kyc = () => { if (updateData[property]) form.append(property, updateData[property]); } if (dialogType === 'reject') { - if (destinationGroup === "Premium") await axios.post(`${BASE_URL}/customer/reject`, { customerid: customerId, description: updateData.approval_description_premium }); - if (destinationGroup === "Agent") await axios.post(`${BASE_URL}/customer/reject`, { customerid: customerId, description: updateData.approval_description_agent }); + if (destinationGroup === 'Premium') + await axios.post(`${BASE_URL}/customer/reject`, { + customerid: customerId, + description: updateData.approval_description_premium + }); + if (destinationGroup === 'Agent') + await axios.post(`${BASE_URL}/customer/reject`, { + customerid: customerId, + description: updateData.approval_description_agent + }); } if (dialogType === 'update') { await axios.put(`${BASE_URL}/customer/update/${customerId}`, form); - if (updateData.isneedapproval == 1&&destinationGroup === "Premium") await axios.post(`${BASE_URL}/customer/approve`, { customerid: customerId, description: updateData.approval_description_premium}); - if (updateData.isneedapproval == 1&&destinationGroup === "Agent") await axios.post(`${BASE_URL}/customer/approve`, { customerid: customerId, description: updateData.approval_description_agent}); + if (updateData.isneedapproval == 1 && destinationGroup === 'Premium') + await axios.post(`${BASE_URL}/customer/approve`, { + customerid: customerId, + description: updateData.approval_description_premium + }); + if (updateData.isneedapproval == 1 && destinationGroup === 'Agent') + await axios.post(`${BASE_URL}/customer/approve`, { + customerid: customerId, + description: updateData.approval_description_agent + }); } - await fetchCustomers(); setDialogOpen(false); setIsDialogOpen(false); toast.success(`Success Update & ${dialogType} Kyc Member`); } catch (error: any) { + if (error?.response?.data?.error) error.message = error?.response?.data?.error; setDialogOpen(false); setIsDialogOpen(false); toast.error(error.message); } finally { - setLoading(false) + await fetchCustomers(); + setLoading(false); } }; function setShowAddDialog(el: any) { - setIsDialogOpen(el) + setIsDialogOpen(el); } if (loading) return ; + useEffect(() => { + if (!isDialogOpen) resetForm(); + }, [isDialogOpen]); + return ( <> TPAY | KYC -
-
- setDialogOpen(false)} - title="Confirm Action" - content={`Are you sure you want to ${dialogType}?`} - onYes={handleYes} - onNo={() => setDialogOpen(false)} + + setDialogOpen(false)} + title="Confirm Action" + content={`Are you sure you want to ${dialogType}?`} + onYes={handleYes} + onNo={() => setDialogOpen(false)} + /> + {member.id ? ( + // + - { member.id ? ( - // - - ): ""} -

Manage Member KYC

-
- - - Dashboard - + ) : ( + '' + )} +

KYC Upgrade Members

+ + + Dashboard + - - Members - - - - Manage Member KYC - - -
-
-
- -
-
+ + Members + + + KYC Upgrade Members + + + {/*
*/} +
+ } + layout={{ card: true }} + sorting={[{ id: 'created_at', desc: true }]} + serverSide={false} + onRowSelectionChange={(selected, table: any) => { + const selectedRow = table.getSelectedRowModel().rows[0]; + if (selectedRow) handleUpdate(selectedRow.original); + }} + >
-
+ {/*
*/} + ); }; diff --git a/src/pages/members/kyc/blocks/AddDialog.tsx b/src/pages/members/kyc/blocks/AddDialog.tsx deleted file mode 100644 index 68b4d58..0000000 --- a/src/pages/members/kyc/blocks/AddDialog.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { Dialog } from '@/components/ui/dialog'; -import { useRef } from 'react'; -import { useKycContext } from '../hooks'; -import { useDataGrid } from '@/components'; - -const AddDialog = () => { - const parentRef = useRef(null); - const { showAddDialog, handleAddDialog } = useKycContext(); - const { reload } = useDataGrid(); - - return ; -}; - -export default AddDialog; diff --git a/src/pages/members/kyc/blocks/ListToolBar.tsx b/src/pages/members/kyc/blocks/ListToolBar.tsx index 8d99350..180e68b 100644 --- a/src/pages/members/kyc/blocks/ListToolBar.tsx +++ b/src/pages/members/kyc/blocks/ListToolBar.tsx @@ -4,7 +4,6 @@ import { useKycContext } from '../hooks'; const ListToolBar = () => { const { table, reload } = useDataGrid(); - const { handleDetailDialog, handleAddDialog } = useKycContext(); return (
diff --git a/src/pages/members/manage-members/Columns.tsx b/src/pages/members/manage-members/Columns.tsx index 6c83c0b..6039aba 100644 --- a/src/pages/members/manage-members/Columns.tsx +++ b/src/pages/members/manage-members/Columns.tsx @@ -1,3 +1,4 @@ +import { KeenIcon } from '@/components'; import { Button } from '@/components/ui/button'; import { DropdownMenu, @@ -18,7 +19,7 @@ export type Members = { created_at: Date; }; -export const columns: ColumnDef[] = [ +export const getColumns = (handleUpdate: (data: any) => void): ColumnDef[] => [ { accessorKey: 'no', header: ({ column }) => { @@ -110,22 +111,12 @@ export const columns: ColumnDef[] = [ const dataMembers = row.original; return ( - - {/* - - */} - {/* - Actions - navigator.clipboard.writeText(dataMembers.id.toString())} - > - Copy account ID - - */} - + ); } } @@ -180,5 +171,6 @@ export const initialMember = { aldeia: '', profession: '', approval_description_premium: '', - approval_description_agent: '' + approval_description_agent: '', + group_id: '' }; diff --git a/src/pages/members/manage-members/ManageMembers.tsx b/src/pages/members/manage-members/ManageMembers.tsx index 9710ce1..8d27979 100644 --- a/src/pages/members/manage-members/ManageMembers.tsx +++ b/src/pages/members/manage-members/ManageMembers.tsx @@ -1,18 +1,20 @@ import { DataTable } from '@/components/ui/DataTable'; import { apiConfig } from '@/config/api.config'; -import { columns, Members, initialMember } from './Columns'; +import { getColumns, Members, initialMember } from './Columns'; import { useState, useEffect } from 'react'; import axios from 'axios'; // import CustomerDialog from './CustomerDetailModal'; import DetailMember from './blocks/DetailMember'; import ConfirmDialog from '@/components/confirm'; import { useAuthContext } from '@/auth'; -import { LoaderTransparant } from '@/components'; +import { Container, DataGridInner, LoaderTransparant } from '@/components'; +import { DataGridProvider } from '@/components'; import { toast } from 'sonner'; import { Breadcrumbs, Link } from '@mui/material'; const BASE_URL_MASTER_DATA = apiConfig.service_master_data; const BASE_URL = apiConfig.service_customer; import { Helmet } from 'react-helmet'; +import ListToolbar from './blocks/ListToolBar'; const ManageMembers = () => { const [loading, setLoading] = useState(false); const [members, setMembers] = useState([]); @@ -23,8 +25,8 @@ const ManageMembers = () => { const [dialogOpen, setDialogOpen] = useState(false); const [dialogType, setDialogType] = useState(''); const closeDialog = () => { - setIsDialogOpen(false) - setMember(initialMember) + setIsDialogOpen(false); + setMember(initialMember); }; const { getUser } = useAuthContext(); @@ -50,7 +52,7 @@ const ManageMembers = () => { el.no = temp++; if (el.date_birth) { const d = new Date(el.date_birth); - el.date_birth = d.toLocaleString("sv-SE"); + el.date_birth = d.toLocaleString('sv-SE'); } el.name = el.fullname; return el; @@ -58,14 +60,14 @@ const ManageMembers = () => { setMembers(resMembers); let getProfession: any = await axios.get(`${BASE_URL_MASTER_DATA}/profession/list`, { params: { - limit: 50, - page: 1, - with_deleted: false, - order_field: 'name', - order_direction: 'ASC', + limit: 50, + page: 1, + with_deleted: false, + order_field: 'name', + order_direction: 'ASC' } }); - setProfession(getProfession.data.data.list) + setProfession(getProfession.data.data.list); } catch (error: any) { toast.error(error.message); console.log(error); @@ -74,14 +76,14 @@ const ManageMembers = () => { const handleUpdate = (data: any) => { setDialogType('update'); - setSelectedMember(data.id) + setSelectedMember(data.id); setMember(data); setIsDialogOpen(true); }; function createMember() { setDialogType('create'); - setSelectedMember('') + setSelectedMember(''); setMember(initialMember); setIsDialogOpen(true); } @@ -92,7 +94,7 @@ const ManageMembers = () => { } const handleYes = async () => { - setLoading(true) + setLoading(true); const userLogin: any = await getUser(); const updateData: any = member; updateData.updated_by = userLogin.data ? userLogin.data.id : ''; @@ -120,7 +122,6 @@ const ManageMembers = () => { delete updateData.suco_name; delete updateData.aldeia_id; delete updateData.aldeia_name; - delete updateData.group_id; delete updateData.group_name; delete updateData.group_description; delete updateData.group_status; @@ -136,7 +137,7 @@ const ManageMembers = () => { for (const property in updateData) { if (updateData[property]) form.append(property, updateData[property]); } - + if (dialogType === 'update') { await axios.put(`${BASE_URL}/customer/update/${selectedMember}`, form, { headers: { @@ -146,8 +147,8 @@ const ManageMembers = () => { toast.success('Success Edit Member'); } if (dialogType === 'create') { - const createMember:any = member - createMember.pin = "admin" + const createMember: any = member; + createMember.pin = 'admin'; delete createMember.password; delete createMember.try_pin; delete createMember.license_number; @@ -163,7 +164,7 @@ const ManageMembers = () => { delete createMember.approval_description_premium; delete createMember.approval_description_agent; delete createMember.language; - await axios.post(`${BASE_URL}/customers/create`, member) + await axios.post(`${BASE_URL}/customers/create`, member); toast.success('Success Create Member. PIN sent to email'); } } catch (error: any) { @@ -172,12 +173,12 @@ const ManageMembers = () => { setDialogOpen(false); closeDialog(); await fetchCustomers(); - setLoading(false) + setLoading(false); } }; function setShowAddDialog(el: any) { - setIsDialogOpen(el) + setIsDialogOpen(el); } if (loading) return ; @@ -187,56 +188,59 @@ const ManageMembers = () => { TPAY | Manage Members -
-
- setDialogOpen(false)} - title="Confirm Action" - content={`Are you sure you want to ${dialogType}?`} - onYes={handleYes} - onNo={() => setDialogOpen(false)} + + setDialogOpen(false)} + title="Confirm Action" + content={`Are you sure you want to ${dialogType}?`} + onYes={handleYes} + onNo={() => setDialogOpen(false)} + /> + {member.id !== '' || dialogType === 'create' ? ( + - { (member.id!=='' || dialogType==='create') ? ( - - ): ""} -

Manage Members

-
- - - Dashboard - - - Members - + ) : ( + '' + )} +

Manage Members

+ + + Dashboard + + + Members + - - Manage Members - - -
-
-
- -
-
+ + Manage Members + + + {/*
*/} +
+ } + onRowSelectionChange={(selected, table: any) => { + const selectedRow = table.getSelectedRowModel().rows[0]; + if (selectedRow) handleUpdate(selectedRow.original); + }} + >
-
+ {/*
*/} + ); }; diff --git a/src/pages/members/manage-members/blocks/AdmAccess.tsx b/src/pages/members/manage-members/blocks/AdmAccess.tsx index 0c4ceec..bf735c3 100644 --- a/src/pages/members/manage-members/blocks/AdmAccess.tsx +++ b/src/pages/members/manage-members/blocks/AdmAccess.tsx @@ -21,33 +21,33 @@ import ConfirmDialog from '@/components/confirm'; const BASE_URL_CUSTOMER = apiConfig.service_customer; // ACCESS ADM -export default function AdmAccess({page,formData,handleClose,fetchCustomers,viewOnly,setViewOnly}: any) { +export default function AdmAccess({page,groups,formData,handleClose,fetchCustomers,viewOnly,setViewOnly}: any) { const [dialogOpen, setDialogOpen] = useState(false); const [dialogType, setDialogType] = useState(''); const [changeGroup, setChangeGroup] = useState(''); const [changeGroupD, setChangeGroupD] = useState(false); - const [groups, setGroups] = useState([]); + // const [groups, setGroups] = useState([]); useEffect(() => { - fetchGroups(); + // fetchGroups(); }, []); - const fetchGroups = async () => { - try { - let getGroups = await axios.get(`${BASE_URL_CUSTOMER}/groups/list`, { - params: { - limit: 50, - page: 1, - with_deleted: false, - order_field: 'name', - order_direction: 'ASC' - } - }); - setGroups(getGroups.data.data.list); - } catch (error: any) { - toast.error(error.message); - } - }; + // const fetchGroups = async () => { + // try { + // let getGroups = await axios.get(`${BASE_URL_CUSTOMER}/groups/list`, { + // params: { + // limit: 50, + // page: 1, + // with_deleted: false, + // order_field: 'name', + // order_direction: 'ASC' + // } + // }); + // setGroups(getGroups.data.data.list); + // } catch (error: any) { + // toast.error(error.message); + // } + // }; const handleYes = async () => { try { @@ -119,6 +119,7 @@ export default function AdmAccess({page,formData,handleClose,fetchCustomers,view function btnConfirmDialog(status: boolean) { setDialogOpen(status); } + if (!formData.id) return ''; if (page !== 'kyc') { return ( diff --git a/src/pages/members/manage-members/blocks/DetailMember.tsx b/src/pages/members/manage-members/blocks/DetailMember.tsx index 85035ad..9852562 100644 --- a/src/pages/members/manage-members/blocks/DetailMember.tsx +++ b/src/pages/members/manage-members/blocks/DetailMember.tsx @@ -24,6 +24,7 @@ import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; const BASE_URL_MASTER_DATA = apiConfig.service_master_data; const URL_NATIONALITY = apiConfig.nationality; +const BASE_URL_CUSTOMER = apiConfig.service_customer; import { initialMember } from "../Columns"; import AdmAccess from './AdmAccess'; import CustomerWallet from './CustomerWallet'; @@ -38,10 +39,8 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa const [aldeias, setAldeias] = useState([]); const [postoAdm, setPostoAdm] = useState([]); const [sucos, setSucos] = useState([]); + const [groups, setGroups] = useState([]); const [genders] = useState([ { name: 'Male',id: 'M' }, { name: 'Female',id: 'F' }]) - const [status] = useState([ - { name: 'Active',id: 'Y' }, { name: 'Inactive',id: 'N' }, { name: 'Suspend PIN',id: 'P' }, { name: 'Suspend OTP',id: 'O' } - ]) const [banks] = useState([ { name: 'BNCTL',id: 'BNCTL' }, { name: 'BRI',id: 'BRI' }, { name: 'BNU',id: 'BNU' }, { name: 'Mandiri',id: 'Mandiri' } ]) @@ -53,7 +52,7 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa useEffect(() => { setFormData(initialData || {}); - // fetchMasterData() + fetchMasterData() }, [initialData]); const handleChange = async (e: any) => { @@ -66,13 +65,13 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa setNationality(getNationality.data.data) setFormData({ ...formData, [name]: value }); } else { + if (name === 'municipio_id' || name === 'posto_adms_id' || name === 'suco_id') await getMasterAfter(name, value); setFormData({ ...formData, [name]: value }); - if (name === 'municipio' || name === 'posto_adms' || name === 'suco') await getMasterAfter(name, value); } }; async function getMasterAfter(name: string, id: any) { - if (name === 'municipio') { + if (name === 'municipio_id') { let getMunicipiosPosto = await axios.get(`${BASE_URL_MASTER_DATA}/municipios/postoadms/${id}`, { params: { limit: 50, @@ -84,7 +83,7 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa }); setPostoAdm(getMunicipiosPosto.data.data) } - if (name === 'posto_adms') { + if (name === 'posto_adms_id') { let getPostoSuco = await axios.get(`${BASE_URL_MASTER_DATA}/postoadms/sucos/${id}`, { params: { limit: 50, @@ -96,7 +95,7 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa }); setSucos(getPostoSuco.data.data) } - if (name === 'suco') { + if (name === 'suco_id') { let getSucoAldeias = await axios.get(`${BASE_URL_MASTER_DATA}/sucos/aldeias/${id}`, { params: { limit: 50, @@ -121,9 +120,20 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa async function fetchMasterData() { try { + let getGroups = await axios.get(`${BASE_URL_CUSTOMER}/groups/list`, { + params: { + limit: 50, + page: 1, + with_deleted: false, + order_field: 'name', + order_direction: 'ASC' + } + }); + setGroups(getGroups.data.data.list); + let getMunicipios = await axios.get(`${BASE_URL_MASTER_DATA}/municipios/list`, { params: { - limit: 50, + limit: 70, page: 1, with_deleted: false, order_field: 'name', @@ -131,38 +141,13 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa } }); setMunicipios(getMunicipios.data.data.list) - let getPostoAdms = await axios.get(`${BASE_URL_MASTER_DATA}/postoadms/list`, { - params: { - limit: 50, - page: 1, - with_deleted: false, - order_field: 'name', - order_direction: 'ASC', - } - }); - setPostoAdm(getPostoAdms.data.data.list) - let getSucos = await axios.get(`${BASE_URL_MASTER_DATA}/sucos/list`, { - params: { - limit: 50, - page: 1, - with_deleted: false, - order_field: 'name', - order_direction: 'ASC', - } - }); - setSucos(getSucos.data.data.list) - let getAldeias = await axios.get(`${BASE_URL_MASTER_DATA}/aldeias/list`, { - params: { - limit: 50, - page: 1, - with_deleted: false, - order_field: 'name', - order_direction: 'ASC', - } - }); - setAldeias(getAldeias.data.data.list) - } catch (error) { + if (formData.municipio_id) await handleChange({target: { name: "municipio_id",value: formData.municipio_id }}); + if (formData.posto_adms_id) await handleChange({target: { name: "posto_adms_id",value: formData.posto_adms_id }}); + if (formData.suco_id) await handleChange({target: { name: "suco_id",value: formData.suco_id }}); + if (formData.aldeia_id) await handleChange({target: { name: "aldeia_id",value: formData.aldeia_id }}); + } catch (error:any) { console.log(error); + toast.error(error.message) } } @@ -213,20 +198,21 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa
- {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Group', 'group_name', 'text', true, true): ''} + {(formData.id || dialogType === "create") ? generateList(formData, handleChange, groups, 'group_id', 'Group', true, dialogType === "update"||false): ''} + {/* {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Group', 'group_name', 'text', true, true): ''} */} {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Username', 'username', 'text', true, dialogType==='create'?false:true): ''} {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Full Name', 'fullname', 'text', true, viewOnly): ''} {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'Photo', 'photouser'): ''} - {(formData.id || dialogType === "create") ? generateList(formData, handleChange, genders, 'gender', 'Gender', null, true): ''} + {(formData.id || dialogType === "create") ? generateList(formData, handleChange, genders, 'gender', 'Gender', true, false): ''} {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Date of Birth', 'date_birth', 'date', true, viewOnly): ''} - {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Phone Number', 'msisdn', 'text', true, viewOnly): ''} + {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Phone Number', 'msisdn', 'text', true, dialogType === "update"||false): ''} {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Email', 'email', 'text', true, viewOnly): ''} {/* {generateList(formData, handleChange, status, 'status', 'Status', null, true)} */} - {(formData.id || dialogType === "create") ? generateList(formData, handleChange, profession, 'profession', 'Profession', null, false): ''} - {(formData.id || dialogType === "create") ? generateList(formData, handleChange, municipios, 'municipio', 'Municipio', null, false): ''} - {(formData.id || dialogType === "create") ? generateList(formData, handleChange, postoAdm, 'posto_adms', 'Posto', 'posto_adms_id', false): ''} - {(formData.id || dialogType === "create") ? generateList(formData, handleChange, sucos, 'suco', 'Suco', 'sucos_id', false): ''} - {(formData.id || dialogType === "create") ? generateList(formData, handleChange, aldeias, 'aldeia', 'Aldeia', null, false): ''} + {(formData.id || dialogType === "create") ? generateList(formData, handleChange, profession, 'profession', 'Profession', false, false): ''} + {(formData.id || dialogType === "create") ? generateList(formData, handleChange, municipios, 'municipio_id', 'Municipio', false, false): ''} + {(formData.id || dialogType === "create") ? generateList(formData, handleChange, postoAdm, 'posto_adms_id', 'Posto', false, false): ''} + {(formData.id || dialogType === "create") ? generateList(formData, handleChange, sucos, 'suco_id', 'Suco', false, false): ''} + {(formData.id || dialogType === "create") ? generateList(formData, handleChange, aldeias, 'aldeia_id', 'Aldeia', false, false): ''} {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Nationality', 'nationality', 'text', true, viewOnly): ''}
@@ -257,7 +243,7 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Document & Selfie', 'file_document_id_selfie'): ''} {(formData.id || dialogType === "create") ? generateImage(formData, handleChange, 'File Commercial License', 'file_commercial_license'): ''} - {(formData.id || dialogType === "create") ? generateList(formData, handleChange, banks, 'bank_name', 'Bank Name', null, false): ''} + {(formData.id || dialogType === "create") ? generateList(formData, handleChange, banks, 'bank_name', 'Bank Name', false, false): ''} {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'Bank Account', 'bank_account', 'text', false, viewOnly): ''} {(formData.id || dialogType === "create") ? generateInput(formData, handleChange, 'iBank Number', 'ibank_number', 'text', false, viewOnly): ''} @@ -265,7 +251,7 @@ const DetailMember = ({ showAddDialog, setShowAddDialog, handleSubmit, initialDa {(formData.id&&(!page||formData.destinationGroup === "Agent")) ? generateInput(formData, handleChange, 'Approval Agent Description', 'approval_description_agent', 'text', false, viewOnly): ''} {(formData.id && page!=='kyc') ? ( - + ): ""} {(formData.id && page!=='kyc') ? ( @@ -323,14 +309,14 @@ function generateInput(formData:any, handleChange:any, label:string, name:string } // ON DEV (DI SELECT MASI HILANG) -function generateList(formData:any, handleChange: any, list:any, name:string, label: string, difId: any, required: boolean) { +function generateList(formData:any, handleChange: any, list:any, name:string, label: string, required: boolean, disabled: boolean) { return ( <>
- (handleChange({ target : { name, value: e }}))}> diff --git a/src/pages/members/manage-members/blocks/ListToolBar.tsx b/src/pages/members/manage-members/blocks/ListToolBar.tsx new file mode 100644 index 0000000..77742b8 --- /dev/null +++ b/src/pages/members/manage-members/blocks/ListToolBar.tsx @@ -0,0 +1,53 @@ +import { DefaultTooltip, KeenIcon, useDataGrid } from '@/components'; +import { Button } from '@/components/ui/button'; +import { useState } from 'react'; + +const ListToolbar = ({ createMember }: { createMember: () => void }) => { + const { table, reload } = useDataGrid(); + const [ usernameFilter, setUsernameFilter] = useState(''); + const [emailFilter, setEmailFilter] = useState(''); + + const handleUsernameChange = (e: React.ChangeEvent) => { + setUsernameFilter(e.target.value); + table.getColumn('username')?.setFilterValue(e.target.value); + }; + + const handleEmailChange = (e: React.ChangeEvent) => { + setEmailFilter(e.target.value); + table.getColumn('email')?.setFilterValue(e.target.value); + }; + + return ( +
+
+
+
+ +
+
+ + + + +
+
+
+
+ ); +}; + +export default ListToolbar; diff --git a/src/pages/notification/blocks/AddDialog.tsx b/src/pages/notification/blocks/AddDialog.tsx index 9daebf8..a857439 100644 --- a/src/pages/notification/blocks/AddDialog.tsx +++ b/src/pages/notification/blocks/AddDialog.tsx @@ -1,6 +1,6 @@ import { apiConfig } from '@/config/api.config'; -import { useRef, useState } from 'react'; -import { Alert, KeenIcon, useDataGrid } from '@/components'; +import { useRef, useState, useCallback, useEffect } from 'react'; +import { Alert, useDataGrid } from '@/components'; import { useCallApi } from '@/hooks'; import { Dialog, @@ -10,134 +10,322 @@ import { DialogHeader, DialogTitle } from '@/components/ui/dialog'; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList +} from '@/components/ui/command'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { toast } from 'sonner'; import { Input } from '@/components/ui/input'; +import { Textarea } from '@/components/ui/textarea'; import { Button } from '@/components/ui/button'; import { useManageNotificationContext } from '../hooks/useManageNotificationContext'; +import { doSaveLogActivity } from '@/actions/GlobalActions'; +import { CustomerProps } from '@/pages/master/provider/blocks/AddDialog'; +import { ChevronDown } from 'lucide-react'; -const API_URL = apiConfig.service_dashboard; +const API_URL_CUSTOMER = apiConfig.service_customer; +const API_URL_NOTIFICATION = apiConfig.service_notification; const AddDialog = () => { const parentRef = useRef(null); - const { - handleAddDialog, - handleEditDialog, - showAddDialog, - showEditDialog, - selectedNotification, - notifications - } = useManageNotificationContext(); - + const { handleAddDialog, showAddDialog } = useManageNotificationContext(); const { reload } = useDataGrid(); - const { PostData, PutData } = useCallApi(); - const [alert, setAlert] = useState({ - show: false, - message: '' - }); + const { GetData, PostData } = useCallApi(); + const [alert, setAlert] = useState({ show: false, message: '' }); const initialState = { - name: '', - destination_module: '' + customers: [], + type: '', + via: '', + subject: '', + content: '' }; const [formField, setFormField] = useState(initialState); + const [open, setOpen] = useState(false); + const [customers, setCustomers] = useState([]); const resetForm = () => { setFormField(initialState); + setAlert({ show: false, message: '' }); }; - const [isSubmitting, setIsSubmitting] = useState(false); + + const handleChange = (e: React.ChangeEvent) => { + setFormField({ ...formField, [e.target.name]: e.target.value }); + }; + + const doCreateNotification = async (e: React.FormEvent) => { + e.preventDefault(); + const response = await PostData(`${API_URL_NOTIFICATION}/send`, formField); + console.log('API Response :', response); + + if (response?.status) { + handleAddDialog(false); + resetForm(); + reload(); + toast.success('Notification Send Successfully!'); + const createActivity = { + module: 'Manage Notification', + description: `Send New Notification => ${formField.via}`, + action: 'C' + }; + doSaveLogActivity(createActivity); + } else { + toast.error('Failed to create notification'); + setAlert({ show: true, message: 'Failed to create notification. Please Try Again.' }); + } + }; + + // const getCustomerList = async (sorting: any) => { + // try { + // sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting; + // const response = await GetData(`${API_URL_CUSTOMER}/customer/list`, { + // limit: 100, + // page: 1, + // with_deleted: false, + // order_field: sorting[0].id, + // order_direction: sorting[0].desc == false ? 'ASC' : 'DESC' + // }); + + // setCustomers(response?.data.list); + // } catch (error) { + // console.error('Error fetching customer', error); + // } + // }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); - if (formField.name === '' || formField.destination_module === '') { - setAlert({ show: true, message: 'Please fill in all required fields.' }); + if ( + formField.type.trim() === '' || + formField.via.trim() === '' || + formField.subject.trim() === '' || + formField.content.trim() === '' + ) { + setAlert({ show: true, message: 'Please fill all required fields.' }); return; } - console.log(formField); + + doCreateNotification(e); + // console.log(formField); setAlert({ show: false, message: '' }); }; - const handleReset = () => { - setFormField(initialState); - }; + // useEffect(() => { + // getCustomerList([{ id: 'id', desc: false }]); + // }, []); + + useEffect(() => { + if (showAddDialog === false) { + resetForm(); + } + }, [showAddDialog]); return ( - handleAddDialog(open)}> - - - - -
-
-

- Create Notification -

-
-
-
{ - handleAddDialog(false); - resetForm(); - }} - > - -
-
+ + + + Notification - Create + - -
+ +
{alert.show && ( - - {alert.message} + +

{alert.message}

)} - -
-
-
- - - setFormField((prev) => ({ ...prev, name: target.value })) - } - /> -
-
-
-
- - - setFormField((prev) => ({ ...prev, destination_module: target.value })) - } + {/*
+
+ +
+
-
- -
- - + All Users + +
- -
+
*/} + + {/*
+
+ + + + + + + + + { + e.currentTarget.scrollTop += e.deltaY; + }} + > + No Customer found. + + {customers.map((customer) => ( + { + setFormField({ + ...formField, + customers: customer.id + }); + setOpen(false); + }} + > + {customer.username} + + ))} + + + + + +
+
*/} + +
+
+ +
+ {['info', 'promo'].map((type) => ( + + ))} +
+
+
+ +
+
+ +
+ + + +
+
+
+ +
+
+ + +
+
+ +
+
+ +