This commit is contained in:
fro1991
2025-02-01 23:51:53 +07:00
parent d216a5bb8c
commit 76d65df562
19 changed files with 56 additions and 70 deletions

View File

@ -2,5 +2,6 @@ VITE_APP_NAME=tpay-dashboard-tl
VITE_APP_VERSION=1=9.1.1 VITE_APP_VERSION=1=9.1.1
GENERATE_SOURCEMAP=false GENERATE_SOURCEMAP=false
VITE_APP_API_URL=https://tpay.shiblysolution.id/api # VITE_APP_API_URL=https://tpay.shiblysolution.id/api
VITE_APP_API_URL=http://127.0.0.1:4003/api
VITE_ENV=development VITE_ENV=development

View File

@ -30,7 +30,7 @@ const getCurrentTimeJakarta = () => {
export async function doSaveLogActivity(payload: SaveLogsParams): Promise<ActionResponseTypes> { export async function doSaveLogActivity(payload: SaveLogsParams): Promise<ActionResponseTypes> {
try { try {
const token = JSON.parse(localStorage.getItem('brillian-bri-tl-auth-v1=9.1.1') || '{}'); const token = JSON.parse(localStorage.getItem(`${import.meta.env.VITE_APP_NAME}-auth-v${import.meta.env.VITE_APP_VERSION}`) || '{}');
const dtParams = { const dtParams = {
...payload, ...payload,

View File

@ -5,7 +5,7 @@ const API_URL = apiConfig.service_dashboard;
export async function doGetNavbarMenu(): Promise<ActionMenuReponseTypes> { export async function doGetNavbarMenu(): Promise<ActionMenuReponseTypes> {
try { try {
const storedToken = localStorage.getItem('brillian-bri-tl-auth-v1=9.1.1'); const storedToken = localStorage.getItem(`${import.meta.env.VITE_APP_NAME}-auth-v${import.meta.env.VITE_APP_VERSION}`);
const token = storedToken ? JSON.parse(storedToken) : null; const token = storedToken ? JSON.parse(storedToken) : null;
if (!token) { if (!token) {

View File

@ -5,7 +5,7 @@ interface apiConfigProps {
const API_URL = import.meta.env.VITE_APP_API_URL; const API_URL = import.meta.env.VITE_APP_API_URL;
const apiConfig: apiConfigProps = { const apiConfig: apiConfigProps = {
service_dashboard: `${API_URL}/d`, service_dashboard: `${API_URL}${import.meta.env.VITE_ENV != 'development' ? '/d' : ""}`,
service_master_data: `${API_URL}/m`, service_master_data: `${API_URL}/m`,
}; };

View File

@ -47,7 +47,7 @@ const ListToolBar = () => {
if (date?.from && date?.to) { if (date?.from && date?.to) {
filters.push({ filters.push({
id: 'user_activity.created_at', id: 'UserActivities.createdAt',
value: { value: {
from: `${date.from.toISOString().split('T')[0]} 00:00:00`, from: `${date.from.toISOString().split('T')[0]} 00:00:00`,
to: `${date.to.toISOString().split('T')[0]} 23:59:59` to: `${date.to.toISOString().split('T')[0]} 23:59:59`

View File

@ -43,12 +43,12 @@ const LogActivityContextProvider = ({ children }: { children: React.ReactNode })
const columns = useMemo<ColumnDef<any>[]>( const columns = useMemo<ColumnDef<any>[]>(
() => [ () => [
{ {
accessorFn: (row) => row.created_at, accessorFn: (row) => row.createdAt,
id: 'created_at', id: 'createdAt',
header: ({ column }) => <DataGridColumnHeader title="Timestamp" column={column} />, header: ({ column }) => <DataGridColumnHeader title="Timestamp" column={column} />,
enableSorting: true, enableSorting: true,
enableHiding: false, enableHiding: false,
cell: ({ row }) => moment(row.original.created_at).format('YYYY-MM-DD HH:mm:ss') cell: ({ row }) => moment(row.original.createdAt).format('YYYY-MM-DD HH:mm:ss')
}, },
{ {
accessorFn: (row) => row.user.username, accessorFn: (row) => row.user.username,
@ -116,11 +116,15 @@ const LogActivityContextProvider = ({ children }: { children: React.ReactNode })
all_user = auth.role_name === 'Super Admin'; all_user = auth.role_name === 'Super Admin';
} }
const user = localStorage.getItem('brillian-bri-tl-auth-v1=9.1.1'); console.log('filter :', filter);
const user = localStorage.getItem(
`${import.meta.env.VITE_APP_NAME}-auth-v${import.meta.env.VITE_APP_VERSION}`
);
const parsedUser = user ? JSON.parse(user) : null; const parsedUser = user ? JSON.parse(user) : null;
const desc = sorting.length > 0 ? sorting[0].desc : false; const desc = sorting.length > 0 ? sorting[0].desc : false;
sorting = [{ id: 'user_activity.created_at', desc }]; sorting = [{ id: 'UserActivities.createdAt', desc }];
let dataFilter: any = {}; let dataFilter: any = {};
@ -128,17 +132,17 @@ const LogActivityContextProvider = ({ children }: { children: React.ReactNode })
filter.forEach((f: any) => { filter.forEach((f: any) => {
if (f.id === 'username') { if (f.id === 'username') {
dataFilter['username'] = { like: f.value }; dataFilter['username'] = { like: f.value };
} else if (f.id === 'user_activity.created_at') { } else if (f.id === 'UserActivities.createdAt') {
dataFilter['user_activity.created_at'] = f.value; dataFilter['UserActivities.createdAt'] = f.value;
} }
}); });
} }
if (!dataFilter['user_activity.created_at']) { if (!dataFilter['UserActivities.createdAt']) {
const defaultFrom = date?.from || new Date(new Date().setMonth(new Date().getMonth() - 1)); const defaultFrom = date?.from || new Date(new Date().setMonth(new Date().getMonth() - 1));
const defaultTo = date?.to || new Date(); const defaultTo = date?.to || new Date();
dataFilter['user_activity.created_at'] = { dataFilter['UserActivities.createdAt'] = {
from: `${format(defaultFrom, 'yyyy-MM-dd')} 00:00:00`, from: `${format(defaultFrom, 'yyyy-MM-dd')} 00:00:00`,
to: `${format(defaultTo, 'yyyy-MM-dd')} 23:59:59` to: `${format(defaultTo, 'yyyy-MM-dd')} 23:59:59`
}; };
@ -151,7 +155,7 @@ const LogActivityContextProvider = ({ children }: { children: React.ReactNode })
order_field: sorting[0].id, order_field: sorting[0].id,
order_direction: sorting[0].desc === false ? 'ASC' : 'DESC', order_direction: sorting[0].desc === false ? 'ASC' : 'DESC',
filter: JSON.stringify(dataFilter), filter: JSON.stringify(dataFilter),
all_user: all_user all_user
}); });
return { data: response?.data.list, totalCount: response?.data.total_count }; return { data: response?.data.list, totalCount: response?.data.total_count };
@ -160,39 +164,36 @@ const LogActivityContextProvider = ({ children }: { children: React.ReactNode })
); );
const doExportData = async (sorting: any, filter: any) => { const doExportData = async (sorting: any, filter: any) => {
const AUTH_LOCAL_STORAGE_KEY = `${import.meta.env.VITE_APP_NAME}-auth-v${import.meta.env.VITE_APP_VERSION}`; const user = localStorage.getItem(
`${import.meta.env.VITE_APP_NAME}-auth-v${import.meta.env.VITE_APP_VERSION}`
);
const user = localStorage.getItem(AUTH_LOCAL_STORAGE_KEY);
const parsedUser = user ? JSON.parse(user) : null; const parsedUser = user ? JSON.parse(user) : null;
sorting = sorting.length === 0 ? [{ id: 'user_activity.created_at', desc: false }] : sorting; sorting = sorting.length === 0 ? [{ id: 'UserActivities.createdAt', desc: false }] : sorting;
filter = filter && filter.length > 0 ? filter : []; filter = filter && filter.length > 0 ? filter : [];
const auth = getAuth();
let all_user = false;
if (auth) {
all_user = auth.role_name === 'Super Admin';
}
let dataFilter: any = {}; let dataFilter: any = {};
if (filter && filter.length > 0) { if (filter && filter.length > 0) {
filter.forEach((f: any) => { filter.forEach((f: any) => {
if (f.id === 'username') { if (f.id === 'username') {
dataFilter['username'] = { like: f.value }; dataFilter['username'] = { like: f.value };
} else if (f.id === 'user_activity.created_at') { } else if (f.id === 'UserActivities.createdAt') {
dataFilter['user_activity.created_at'] = f.value; dataFilter['UserActivities.createdAt'] = f.value;
} }
}); });
} }
if (!dataFilter['user_activity.created_at']) { if (!dataFilter['UserActivities.createdAt']) {
const defaultFrom = new Date(new Date().setMonth(new Date().getMonth() - 1)); const defaultFrom = new Date(new Date().setMonth(new Date().getMonth() - 1));
const defaultTo = new Date(); const defaultTo = new Date();
dataFilter['user_activity.created_at'] = { dataFilter['UserActivities.createdAt'] = {
from: `${format(defaultFrom, 'yyyy-MM-dd')} 00:00:00`, from: `${format(defaultFrom, 'yyyy-MM-dd')} 00:00:00`,
to: `${format(defaultTo, 'yyyy-MM-dd')} 23:59:59` to: `${format(defaultTo, 'yyyy-MM-dd')} 23:59:59`
}; };
} }
let order = 'user_activity.created_at'; let order = 'UserActivities.createdAt';
let param = { let param = {
all_user: false, all_user: false,
// order_field: sorting[0].id, // order_field: sorting[0].id,
@ -208,8 +209,8 @@ const LogActivityContextProvider = ({ children }: { children: React.ReactNode })
GetExportData(url, param, 'user_activity_export_'); GetExportData(url, param, 'user_activity_export_');
const createActivity = { const createActivity = {
module: 'Update Pengajuan Kredit', module: 'Log Activity',
description: `Export Pengajuan Kredit => Log Activity`, description: `Export => Log Activity`,
action: 'E' action: 'E'
}; };
doSaveLogActivity(createActivity); doSaveLogActivity(createActivity);
@ -230,7 +231,7 @@ const LogActivityContextProvider = ({ children }: { children: React.ReactNode })
pagination={{ size: 10 }} pagination={{ size: 10 }}
toolbar={<ListToolBar />} toolbar={<ListToolBar />}
layout={{ card: true }} layout={{ card: true }}
sorting={[{ id: 'UserActivity.created_at', desc: true }]} sorting={[{ id: 'UserActivity.createdAt', desc: true }]}
serverSide={true} serverSide={true}
onFetchData={({ pageIndex, pageSize, sorting, columnFilters }) => onFetchData={({ pageIndex, pageSize, sorting, columnFilters }) =>
doGetListData(pageIndex, pageSize, sorting, columnFilters) doGetListData(pageIndex, pageSize, sorting, columnFilters)

View File

@ -86,8 +86,7 @@ const AddDialog = () => {
const response = await PostData(`${API_URL}/user_role/create`, { const response = await PostData(`${API_URL}/user_role/create`, {
name: formField.name, name: formField.name,
roles: selectMenus, roles: selectMenus,
status: 'Y', status: 'Y'
application: 'ukln'
}); });
if (response?.status) { if (response?.status) {
@ -97,7 +96,7 @@ const AddDialog = () => {
reload(); reload();
const createActivity = { const createActivity = {
module: 'Manage Position', module: 'Manage Position',
description: `Create New User => ${formField.name}`, description: `Create New Position => ${formField.name}`,
action: 'C' action: 'C'
}; };

View File

@ -1,12 +1,12 @@
import { Container, DataGridInner } from '@/components'; import { Container, DataGridInner } from '@/components';
import { EditDialog } from './blocks'; import { EditDialog } from './blocks';
import { ConfigUserContextProvider } from './hooks'; import { ManageUserContextProvider } from './hooks';
import { AddDialog } from './blocks/AddDialog'; import { AddDialog } from './blocks/AddDialog';
import { DeleteDialog } from './blocks/DeleteDialog'; import { DeleteDialog } from './blocks/DeleteDialog';
export default function ConfigUserPage() { export default function ConfigUserPage() {
return ( return (
<ConfigUserContextProvider> <ManageUserContextProvider>
<Container> <Container>
<div className="grid gap-5 lg:gap-7.5"> <div className="grid gap-5 lg:gap-7.5">
<DataGridInner /> <DataGridInner />
@ -15,6 +15,6 @@ export default function ConfigUserPage() {
<AddDialog /> <AddDialog />
<DeleteDialog /> <DeleteDialog />
</Container> </Container>
</ConfigUserContextProvider> </ManageUserContextProvider>
); );
} }

View File

@ -50,22 +50,9 @@ const EditDialog = () => {
e.preventDefault(); e.preventDefault();
const response = await PutData(`${API_URL}/user/update/${selectedUser}`, { const response = await PutData(`${API_URL}/user/update/${selectedUser}`, {
...formField, ...formField,
id_role: undefined,
id_role_old: undefined id_role_old: undefined
}); });
if (response?.status) { if (response?.status) {
if (formField.id_role_old != '') {
const responseUserDeleteRole = await PutData(
`${API_URL}/user/delete_role/${selectedUser}/${formField.id_role_old}`,
{}
);
}
const responseUserAddRole = await PutData(
`${API_URL}/user/add_role/${selectedUser}/${formField.id_role}`,
{}
);
setAlert((prev) => ({ ...prev, show: false, message: '' }));
handleEditDialog(false, null); handleEditDialog(false, null);
toast.success('Success Update User'); toast.success('Success Update User');
reload(); reload();
@ -86,15 +73,15 @@ const EditDialog = () => {
const doFetchUserData = useCallback(async (id: string) => { const doFetchUserData = useCallback(async (id: string) => {
const response = await GetData(`${API_URL}/user/detail/${id}`, { id }); const response = await GetData(`${API_URL}/user/detail/${id}`, { id });
if (response?.status) { if (response?.status) {
let id_role = response.data.roles; let id_role = response.data.role.id || '';
setFormField((prev) => ({ setFormField((prev) => ({
...prev, ...prev,
name: response.data.name, name: response.data.name,
username: response.data.username, username: response.data.username,
email: response.data.email, email: response.data.email,
id_role: id_role.length != 0 ? id_role[0].id : '', id_role: id_role,
id_role_old: id_role.length != 0 ? id_role[0].id : '', id_role_old: id_role,
status: response.data.status status: response.data.status
})); }));
} else { } else {

View File

@ -45,11 +45,11 @@ const initialProps: ContextProps = {
roles: [] roles: []
}; };
const ConfigUserContext = createContext<ContextProps>(initialProps); const ManageUserContext = createContext<ContextProps>(initialProps);
const API_URL = apiConfig.service_dashboard; const API_URL = apiConfig.service_dashboard;
const ConfigUserContextProvider = ({ children }: { children: React.ReactNode }) => { const ManageUserContextProvider = ({ children }: { children: React.ReactNode }) => {
/* state */ /* state */
const [showEditDialog, setShowEditDialog] = useState(false); const [showEditDialog, setShowEditDialog] = useState(false);
const [showAddDialog, setShowAddDialog] = useState(false); const [showAddDialog, setShowAddDialog] = useState(false);
@ -104,18 +104,16 @@ const ConfigUserContextProvider = ({ children }: { children: React.ReactNode })
} }
}, },
{ {
accessorFn: (row) => row.role_name, accessorFn: (row) => row.role.name,
id: 'role_name', id: 'role_name',
header: ({ column }) => <DataGridColumnHeader title="Role Name" column={column} />, header: ({ column }) => <DataGridColumnHeader title="Role Name" column={column} />,
enableSorting: false, enableSorting: false,
enableHiding: false, enableHiding: false,
cell: (data: any) => { cell: (data: any) => {
const { roles } = data.row.original; const { role } = data.row.original;
console.log('role :', role);
let html = <p className="text-danger italic">Unassigned</p>; let html = <p className="text-danger italic">Unassigned</p>;
for (let _role of roles) { if (role && role.name) html = role.name;
html = _role.name;
}
return html; return html;
}, },
meta: { meta: {
@ -214,7 +212,7 @@ const ConfigUserContextProvider = ({ children }: { children: React.ReactNode })
}, [fetchRoles]); }, [fetchRoles]);
return ( return (
<ConfigUserContext.Provider <ManageUserContext.Provider
value={{ value={{
showEditDialog, showEditDialog,
handleEditDialog, handleEditDialog,
@ -241,9 +239,9 @@ const ConfigUserContextProvider = ({ children }: { children: React.ReactNode })
> >
{children} {children}
</DataGridProvider> </DataGridProvider>
</ConfigUserContext.Provider> </ManageUserContext.Provider>
); );
}; };
export { ConfigUserContextProvider, ConfigUserContext }; export { ManageUserContextProvider, ManageUserContext };
export type { SelectedUser }; export type { SelectedUser };

View File

@ -0,0 +1,2 @@
export * from './ManageUserContext';
export * from './useManageUserContext';

View File

@ -1,8 +1,8 @@
import { useContext } from 'react'; import { useContext } from 'react';
import { ConfigUserContext } from './ConfigUserContext'; import { ManageUserContext } from './ManageUserContext';
const useUserContext = () => { const useUserContext = () => {
const context = useContext(ConfigUserContext); const context = useContext(ManageUserContext);
if (!context) throw new Error('useUserContext must be used within AuthProvider'); if (!context) throw new Error('useUserContext must be used within AuthProvider');

View File

@ -1,2 +0,0 @@
export * from './ConfigUserContext';
export * from './useUserContext';

View File

@ -7,7 +7,7 @@ import { Demo2Layout } from '@/layouts/demo2';
import { ErrorsRouting } from '@/errors'; import { ErrorsRouting } from '@/errors';
import DashboardHomePage from '@/pages/dashboards/home/DashboardHomePage'; import DashboardHomePage from '@/pages/dashboards/home/DashboardHomePage';
import ConfigUserPage from '@/pages/settings/user/user/ConfigUserPage'; import ManageUserPage from '@/pages/settings/user/manage-user/ManageUserPage';
import LogActivityPage from '@/pages/settings/user/log-activity/LogActivityPage'; import LogActivityPage from '@/pages/settings/user/log-activity/LogActivityPage';
import ManagePositionPage from '@/pages/settings/user/manage-position/ManagePositionPage'; import ManagePositionPage from '@/pages/settings/user/manage-position/ManagePositionPage';
@ -20,7 +20,7 @@ const AppRoutingSetup = (): ReactElement => {
<Route path="/" element={<DashboardHomePage />} /> <Route path="/" element={<DashboardHomePage />} />
<Route path="/account/home/user-profile" element={<AccountUserProfilePage />} /> <Route path="/account/home/user-profile" element={<AccountUserProfilePage />} />
<Route path="/settings/user-management/manage-user" element={<ConfigUserPage />} /> <Route path="/settings/user-management/manage-user" element={<ManageUserPage />} />
<Route path="/settings/user-management/log-activity" element={<LogActivityPage />} /> <Route path="/settings/user-management/log-activity" element={<LogActivityPage />} />
<Route <Route
path="/settings/user-management/manage-position" path="/settings/user-management/manage-position"