diff --git a/src/pages/master/currency/CurrencyMaster.tsx b/src/pages/master/currency/CurrencyMaster.tsx index be439cd..17772d7 100644 --- a/src/pages/master/currency/CurrencyMaster.tsx +++ b/src/pages/master/currency/CurrencyMaster.tsx @@ -5,39 +5,43 @@ import { Delete } from 'lucide-react'; import AddDialog from './blocks/AddDialog'; import DeleteDialog from './blocks/DeleteDialog'; import EditDialog from './blocks/EditDialog'; - -// import EditDialog from './blocks/EditDialog'; +import { Helmet } from 'react-helmet'; const CurrencyMaster = () => { return ( - - -

Currency

- - - Dashboard - + <> + + TPAY | Manage Currency + + + +

Currency

+ + + Dashboard + - - Master Data - + + Master Data + - - Manage Currency - - + + Manage Currency + +
-
- -
+
+ +
- - - - {/* + + + + {/* */} -
-
+ + + ); }; diff --git a/src/pages/master/reward/Reward.tsx b/src/pages/master/reward/Reward.tsx deleted file mode 100644 index 32e8691..0000000 --- a/src/pages/master/reward/Reward.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import AddDialog from './blocks/AddDialog'; -import EditDialog from './blocks/EditDialog'; -import DeleteDialog from './blocks/DeleteDialog'; -import { ManageRewardContextProvider } from './hooks/ManageRewardContext'; -import { Container, DataGridInner } from '@/components'; -import { Breadcrumbs, Link } from '@mui/material'; - -const RewardMaster = () => { - return ( - - -

Manage Reward

- - - Dashboard - - - - Master Data - - - - Manage Reward - - -
- -
- - - -
-
- ); -}; - -export default RewardMaster; diff --git a/src/pages/master/reward/RewardMaster.tsx b/src/pages/master/reward/RewardMaster.tsx new file mode 100644 index 0000000..f9b1ddd --- /dev/null +++ b/src/pages/master/reward/RewardMaster.tsx @@ -0,0 +1,43 @@ +import AddDialog from './blocks/AddDialog'; +import EditDialog from './blocks/EditDialog'; +import DeleteDialog from './blocks/DeleteDialog'; +import { ManageRewardContextProvider } from './hooks/ManageRewardContext'; +import { Container, DataGridInner } from '@/components'; +import { Breadcrumbs, Link } from '@mui/material'; +import { Helmet } from 'react-helmet'; + +const RewardMaster = () => { + return ( + <> + + TPAY | Manage Reward + + + +

Reward

+ + + Dashboard + + + + Master Data + + + + Manage Reward + + +
+ +
+ + + +
+
+ + ); +}; + +export default RewardMaster; diff --git a/src/pages/settings/user/log-activity/LogActivityPage.tsx b/src/pages/settings/user/log-activity/LogActivityPage.tsx index c9a9525..0859c61 100644 --- a/src/pages/settings/user/log-activity/LogActivityPage.tsx +++ b/src/pages/settings/user/log-activity/LogActivityPage.tsx @@ -1,33 +1,39 @@ import { Container, DataGridInner } from '@/components'; import { LogActivityContextProvider } from './hooks'; import { Breadcrumbs, Link } from '@mui/material'; +import { Helmet } from 'react-helmet'; export default function LogActivityPage() { return ( - - -

Log Activity

- - - Dashboard - + <> + + TPAY | Log Activity + + + +

Log Activity

+ + + Dashboard + - - Settings - + + Settings + - - User Management - + + User Management + - - Log Activity - - -
- -
-
-
+ + Log Activity + +
+
+ +
+
+
+ ); } diff --git a/src/pages/settings/user/manage-user/ManageUserPage.tsx b/src/pages/settings/user/manage-user/ManageUserPage.tsx index 5f318b0..17a7077 100644 --- a/src/pages/settings/user/manage-user/ManageUserPage.tsx +++ b/src/pages/settings/user/manage-user/ManageUserPage.tsx @@ -4,36 +4,42 @@ import { ManageUserContextProvider } from './hooks'; import { AddDialog } from './blocks/AddDialog'; import { DeleteDialog } from './blocks/DeleteDialog'; import { Breadcrumbs, Link } from '@mui/material'; +import { Helmet } from 'react-helmet'; export default function ManageUserPage() { return ( - - -

Manage User

- - - Dashboard - + <> + + TPAY | Manage User + + + +

Manage User

+ + + Dashboard + - - Settings - + + Settings + - - User Management - + + User Management + - - Manage User - - -
- -
- - - -
-
+ + Manage User + +
+
+ +
+ + + +
+
+ ); } diff --git a/src/pages/settings/user/manage-user/blocks/AddDialog.tsx b/src/pages/settings/user/manage-user/blocks/AddDialog.tsx index ac69750..2a56044 100644 --- a/src/pages/settings/user/manage-user/blocks/AddDialog.tsx +++ b/src/pages/settings/user/manage-user/blocks/AddDialog.tsx @@ -25,6 +25,13 @@ import { useCallApi } from '@/hooks'; import { doSaveLogActivity } from '@/actions/GlobalActions'; import clsx from 'clsx'; +interface RoleListProps { + id: string; + name: string; + roles: string; + status: string; +} + interface CreateUserParams { email: string; username: string; @@ -40,9 +47,10 @@ type PasswordType = 'password' | 'retype_password'; const AddDialog = () => { const parentRef = useRef(null); - const { showAddDialog, handleAddDialog, roles } = useUserContext(); + const { showAddDialog, handleAddDialog } = useUserContext(); const { reload } = useDataGrid(); - const { PostData, PutData } = useCallApi(); + const { PostData, GetData } = useCallApi(); + const [roles, setRoles] = useState([]); const [alert, setAlert] = useState({ show: false, message: '' @@ -57,10 +65,6 @@ const AddDialog = () => { status: '' }; const [formField, setFormField] = useState(initialState); - const resetForm = () => { - setFormField(initialState); - setAlert({ show: false, message: '' }); - }; const [showPassword, setShowPassword] = useState({ password: false, retype_password: false @@ -97,6 +101,87 @@ const AddDialog = () => { }; }; + const resetForm = () => { + setFormField(initialState); + setAlert({ show: false, message: '' }); + }; + + /* actions */ + const doCreateUser = useCallback( + async (e: React.FormEvent) => { + e.preventDefault(); + + const response = await PostData(`${API_URL}/user/create`, formField); + + if (response?.status) { + handleAddDialog(false); + resetForm(); + reload(); + const createActivity = { + module: 'Manage User', + description: `Create New User => ${formField.username}`, + action: 'C' + }; + + doSaveLogActivity(createActivity); + toast.success('Success Create User'); + } else { + toast.error('Failed to create user'); + setAlert({ show: true, message: 'Failed to create user. Please try again.' }); + } + }, + [formField] + ); + + const fetchRoles = useCallback(async () => { + const params = { + limit: 100, + page: 1, + with_deleted: false, + order_field: 'name', + order_direction: 'ASC', + filter: JSON.stringify({ + status: 'Y' + }) + }; + const response = await GetData(`${API_URL}/user_role/list`, params); + // console.log('ini data:', response); + if (response?.status) { + const roleList = response.data?.list || []; + setRoles(roleList); + } else { + setRoles(() => []); + } + // console.log('ini data user_role:', response?.data); + }, []); + + useEffect(() => { + fetchRoles(); + }, [fetchRoles]); + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + + console.log('Form data before submit:', formField); + + if ( + formField.email.trim() === '' || + formField.username.trim() === '' || + formField.password.trim() === '' || + formField.retype_password.trim() === '' || + formField.name.trim() === '' || + formField.id_role.trim() === '' || + formField.status.trim() === '' + ) { + setAlert({ show: true, message: 'Please fill name field.' }); + return; + } + + doCreateUser(e); + // console.log(formField); + setAlert({ show: false, message: '' }); + }; + useEffect(() => { const validation = validatePassword(formField.password, formField.retype_password); setMessagePassword(validation.isValid); @@ -111,38 +196,6 @@ const AddDialog = () => { } }, [showAddDialog]); - /* actions */ - const doCreateUser = useCallback( - async (e: React.FormEvent) => { - e.preventDefault(); - - const response = await PostData(`${API_URL}/user/create`, { - ...formField, - id_role: undefined - }); - if (response?.status) { - const responseUserAddRole = await PutData( - `${API_URL}/user/add_role/${response?.message?.id}/${formField.id_role}`, - {} - ); - resetForm(); - handleAddDialog(false); - toast.success('Success Create User'); - reload(); - const createActivity = { - module: 'Manage User', - description: `Create New User => ${formField.username}`, - action: 'C' - }; - - doSaveLogActivity(createActivity); - } else { - setAlert((prev) => ({ ...prev, show: true, message: response?.message })); - } - }, - [formField] - ); - const togglePassword = useCallback((event: MouseEvent, key: string) => { event.preventDefault(); setShowPassword((prev) => ({ ...prev, [key]: !prev[key as PasswordType] })); @@ -177,7 +230,7 @@ const AddDialog = () => {

{alert.message}

)} -
+
@@ -231,7 +284,10 @@ const AddDialog = () => {
setFormField((prev) => ({ ...prev, id_role }))} + onValueChange={(id_role) => { + // console.log('Role changed to:', id_role); + setFormField((prev) => ({ ...prev, id_role })); + }} > diff --git a/src/pages/settings/user/manage-user/hooks/ManageUserContext.tsx b/src/pages/settings/user/manage-user/hooks/ManageUserContext.tsx index de16f67..1c390b3 100644 --- a/src/pages/settings/user/manage-user/hooks/ManageUserContext.tsx +++ b/src/pages/settings/user/manage-user/hooks/ManageUserContext.tsx @@ -17,7 +17,6 @@ interface ContextProps { showDeleteDialog: boolean; handleDeleteDialog: (show: boolean, selected_user: string | null) => void; selectedUser: string | null; - roles: RoleListProps[]; } interface SelectedUser { @@ -30,12 +29,6 @@ interface SelectedUser { check_new_password: string; } -interface RoleListProps { - id: string; - name: string; - status: string; -} - const initialProps: ContextProps = { showSearchDialog: false, handleSearchDialog: (show: boolean) => {}, @@ -45,8 +38,7 @@ const initialProps: ContextProps = { handleAddDialog: () => {}, showDeleteDialog: false, handleDeleteDialog: () => {}, - selectedUser: null, - roles: [] + selectedUser: null }; const ManageUserContext = createContext(initialProps); @@ -60,7 +52,6 @@ const ManageUserContextProvider = ({ children }: { children: React.ReactNode }) const [showAddDialog, setShowAddDialog] = useState(false); const [showDeleteDialog, setShowDeleteDialog] = useState(false); const [selectedUser, setSelectedUser] = useState(null); - const [roles, setRoles] = useState([]); const { GetData } = useCallApi(); /* action */ @@ -193,39 +184,16 @@ const ManageUserContextProvider = ({ children }: { children: React.ReactNode }) const response = await GetData(`${API_URL}/user/list`, { limit: limit, page: page + 1, - with_deleted: true, + with_deleted: false, order_field: sorting[0].id, order_direction: sorting[0].desc == false ? 'ASC' : 'DESC', filter: JSON.stringify(filter) }); - console.log('response api:', response); + // console.log('response api:', response); return { data: response?.data.list, totalCount: response?.data.total_count }; }; - const fetchRoles = useCallback(async () => { - const params = { - limit: 100, - page: 1, - with_deleted: false, - order_field: 'name', - order_direction: 'ASC', - filter: JSON.stringify({ - status: 'Y' - }) - }; - const response = await GetData(`${API_URL}/user_role/list`, params); - if (response?.status) { - setRoles(() => [...response.data.list]); - } else { - setRoles(() => []); - } - }, []); - - useEffect(() => { - fetchRoles(); - }, [fetchRoles]); - return (