diff --git a/src/app/api/admin/master/bank/route.ts b/src/app/api/admin/master/bank/route.ts new file mode 100644 index 00000000..609a6bc4 --- /dev/null +++ b/src/app/api/admin/master/bank/route.ts @@ -0,0 +1,32 @@ +import { NextResponse } from "next/server"; +import { prisma } from "@/lib"; + +export { GET }; + +async function GET(request: Request) { + try { + const data = await prisma.masterBank.findMany({ + orderBy: { + createdAt: "desc", + }, + }); + + return NextResponse.json( + { success: true, message: "Berhasil mendapatkan data", data: data }, + { status: 200 } + ); + } catch (error) { + console.error( + "Error Get Master Bank >>", + error || (error as Error).message + ); + return NextResponse.json( + { + success: false, + message: "API Error Get Master Bank ", + reason: (error as Error).message, + }, + { status: 500 } + ); + } +} diff --git a/src/app/api/admin/master/bidang-bisnis/route.ts b/src/app/api/admin/master/bidang-bisnis/route.ts new file mode 100644 index 00000000..c2802e52 --- /dev/null +++ b/src/app/api/admin/master/bidang-bisnis/route.ts @@ -0,0 +1,32 @@ +import { NextResponse } from "next/server"; +import { prisma } from "@/lib"; + +export { GET }; + +async function GET(request: Request) { + try { + const data = await prisma.masterBidangBisnis.findMany({ + orderBy: { + createdAt: "desc", + }, + }); + + return NextResponse.json( + { success: true, message: "Berhasil mendapatkan data", data: data }, + { status: 200 } + ); + } catch (error) { + console.error( + "Error Get Master Bidang Bisnis >>", + error || (error as Error).message + ); + return NextResponse.json( + { + success: false, + message: "API Error Get Master Bidang Bisnis ", + reason: (error as Error).message, + }, + { status: 500 } + ); + } +} diff --git a/src/app/dev/admin/app-information/main/page.tsx b/src/app/dev/admin/app-information/main/page.tsx index b163150f..ae28eee7 100644 --- a/src/app/dev/admin/app-information/main/page.tsx +++ b/src/app/dev/admin/app-information/main/page.tsx @@ -1,18 +1,9 @@ -import { adminAppInformation_funGetBidangBisnis } from "@/app_modules/admin/app_info/fun"; -import adminAppInformation_getMasterBank from "@/app_modules/admin/app_info/fun/master/get_list_bank"; -import adminAppInformation_getNomorAdmin from "@/app_modules/admin/app_info/fun/master/get_nomor_admin"; import { AdminAppInformation_UiMain } from "@/app_modules/admin/app_info/ui"; export default async function Page() { - const listBank = await adminAppInformation_getMasterBank(); - const dataBidangBisnis = await adminAppInformation_funGetBidangBisnis() - return ( <> - + ); } diff --git a/src/app/dev/admin/user-access/page.tsx b/src/app/dev/admin/user-access/page.tsx index 60722730..bbba6357 100644 --- a/src/app/dev/admin/user-access/page.tsx +++ b/src/app/dev/admin/user-access/page.tsx @@ -1,8 +1,6 @@ import { AdminUserAccess_View } from "@/app_modules/admin/user-access"; export default async function Page() { - // const listUser = await adminUserAccess_getListUser({ page: 1 }); - return ( <> diff --git a/src/app_modules/admin/_components_v3/comp_simple_grid_breakpoint.tsx b/src/app_modules/admin/_components_v3/comp_simple_grid_breakpoint.tsx index 16645ab7..976a97de 100644 --- a/src/app_modules/admin/_components_v3/comp_simple_grid_breakpoint.tsx +++ b/src/app_modules/admin/_components_v3/comp_simple_grid_breakpoint.tsx @@ -2,19 +2,25 @@ import { SimpleGrid } from "@mantine/core"; export function Admin_V3_ComponentBreakpoint({ children, - cols + cols, + sm, + md, + lg, }: { children: React.ReactNode; cols?: number; + sm?: number; + md?: number; + lg?: number; }) { return ( <> } - radius={"xl"} - onClick={() => { - onEventListener({ - isCreate: true, - isUpdate: false, - }); - }} - > - Tambah - - } + // component={ + // + // } /> ); diff --git a/src/app_modules/admin/app_info/lib/api_fetch_master.ts b/src/app_modules/admin/app_info/lib/api_fetch_master.ts new file mode 100644 index 00000000..a82dbb7c --- /dev/null +++ b/src/app_modules/admin/app_info/lib/api_fetch_master.ts @@ -0,0 +1,71 @@ +export { + apiGetMasterAdminBank, + apiGetMasterAdminBidangBisnis, +}; + +const apiGetMasterAdminBank = async () => { + try { + // Fetch token from cookie + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) { + console.error("No token found"); + return null; + } + + const response = await fetch(`/api/admin/master/bank`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + Authorization: `Bearer ${token}`, + }, + }); + + // Check if the response is OK + if (!response.ok) { + const errorData = await response.json().catch(() => null); + console.error("Failed to get master admin bank", response.statusText, errorData); + throw new Error(errorData?.message || "Failed to get master admin bank"); + } + + // Return the JSON response + return await response.json(); + } catch (error) { + console.error("Error get master admin bank", error); + throw error; // Re-throw the error to handle it in the calling function + } +}; + +const apiGetMasterAdminBidangBisnis = async () => { + try { + // Fetch token from cookie + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) { + console.error("No token found"); + return null; + } + + const response = await fetch(`/api/admin/master/bidang-bisnis`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + Authorization: `Bearer ${token}`, + }, + }); + + // Check if the response is OK + if (!response.ok) { + const errorData = await response.json().catch(() => null); + console.error("Failed to get master admin bidang bisnis", response.statusText, errorData); + throw new Error(errorData?.message || "Failed to get master admin bidang bisnis"); + } + + // Return the JSON response + return await response.json(); + } catch (error) { + console.error("Error get master admin bidang bisnis", error); + throw error; // Re-throw the error to handle it in the calling function + } +}; + \ No newline at end of file diff --git a/src/app_modules/admin/app_info/lib/global_state.ts b/src/app_modules/admin/app_info/lib/global_state.ts index 26c4e460..d646f931 100644 --- a/src/app_modules/admin/app_info/lib/global_state.ts +++ b/src/app_modules/admin/app_info/lib/global_state.ts @@ -1,9 +1,7 @@ +import { atom } from "jotai"; import { atomWithStorage } from "jotai/utils"; /** * @param index | 0 - 3 | 1: Whatsapp, 2: Bank, 3: Bidang Bisnis */ -export const gs_app_information_menu = atomWithStorage( - "gs_app_information_menu", - "1" -); +export const gs_app_information_menu = atomWithStorage("gs_app_informations_menu","2"); diff --git a/src/app_modules/admin/app_info/ui/ui_main.tsx b/src/app_modules/admin/app_info/ui/ui_main.tsx index 9a6a2759..0875fe35 100644 --- a/src/app_modules/admin/app_info/ui/ui_main.tsx +++ b/src/app_modules/admin/app_info/ui/ui_main.tsx @@ -1,29 +1,25 @@ "use client"; +import { + AccentColor, + AdminColor, +} from "@/app_modules/_global/color/color_pallet"; import { Button, Group, Stack } from "@mantine/core"; import { useAtom } from "jotai"; import ComponentAdminGlobal_HeaderTamplate from "../../_admin_global/header_tamplate"; import { gs_app_information_menu } from "../lib"; import { AdminAppInformation_ViewInfoBank, - AdminAppInformation_ViewInformasiWhatApps, AdminAppInformation_ViewKategoriPortofolio, } from "../view"; -import { AccentColor, AdminColor, MainColor } from "@/app_modules/_global/color/color_pallet"; -export default function AdminAppInformation_UiMain({ - listBank, - dataBidangBisnis, -}: { - listBank: any[]; - dataBidangBisnis: any[]; -}) { +export default function AdminAppInformation_UiMain() { const [selectPage, setSelectPage] = useAtom(gs_app_information_menu); const listPage = [ - { - id: "1", - name: "Whatsapp", - }, + // { + // id: "1", + // name: "Whatsapp", + // }, { id: "2", name: "Informasi Bank", @@ -58,18 +54,12 @@ export default function AdminAppInformation_UiMain({ ))} - {selectPage === "1" && ( + {/* {selectPage === "1" && ( - )} + )} */} - {selectPage === "2" && ( - - )} - {selectPage === "3" && ( - - )} + {selectPage === "2" && } + {selectPage === "3" && } ); diff --git a/src/app_modules/admin/app_info/view/view_info_bank.tsx b/src/app_modules/admin/app_info/view/view_info_bank.tsx index 98e1491b..5397cd02 100644 --- a/src/app_modules/admin/app_info/view/view_info_bank.tsx +++ b/src/app_modules/admin/app_info/view/view_info_bank.tsx @@ -1,13 +1,16 @@ "use client"; +import { AccentColor } from "@/app_modules/_global/color"; +import { + AdminColor, + MainColor, +} from "@/app_modules/_global/color/color_pallet"; import { MODEL_MASTER_BANK } from "@/app_modules/investasi/_lib/interface"; import { - ActionIcon, + Box, Button, Center, - Grid, Group, - Modal, Paper, ScrollArea, Stack, @@ -16,29 +19,30 @@ import { Text, TextInput, Title, - Tooltip, } from "@mantine/core"; import { IconEdit } from "@tabler/icons-react"; import _ from "lodash"; import { useState } from "react"; +import { Admin_ComponentModal } from "../../_admin_global/_component/comp_admin_modal"; import { ComponentAdminGlobal_NotifikasiBerhasil } from "../../_admin_global/admin_notifikasi/notifikasi_berhasil"; import { ComponentAdminGlobal_NotifikasiGagal } from "../../_admin_global/admin_notifikasi/notifikasi_gagal"; +import { Admin_V3_ComponentBreakpoint } from "../../_components_v3/comp_simple_grid_breakpoint"; import { AdminAppInformation_ComponentTitlePageBank } from "../component"; import adminAppInformation_createBank from "../fun/create/fun_create_new_bank"; import adminAppInformation_getMasterBank from "../fun/master/get_list_bank"; import adminAppInformation_updateStatusBankById from "../fun/update/fun_udpate_status_bank"; import adminAppInformation_updateDataBankById from "../fun/update/fun_update_data_bank"; -import { AccentColor } from "@/app_modules/_global/color"; -import { AdminColor } from "@/app_modules/_global/color/color_pallet"; +import { useShallowEffect } from "@mantine/hooks"; -export default function AdminAppInformation_ViewInfoBank({ - listBank, -}: { - listBank: MODEL_MASTER_BANK[]; -}) { - const [data, setData] = useState(listBank); - const [isCreate, setIsCreate] = useState(false); +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; +import { apiGetMasterAdminBank } from "../lib/api_fetch_master"; + +export default function AdminAppInformation_ViewInfoBank() { + const [data, setData] = useState(null); + const [isCreate, setIsCreate] = useState(true); const [isLoadingCreate, setLoadingCreate] = useState(false); + const [isLoadingUpdate, setLoadingUpdate] = useState(false); + const [isLoadingActivation, setLoadingActivation] = useState(false); const [newData, setNewData] = useState({ namaBank: "", @@ -60,35 +64,70 @@ export default function AdminAppInformation_ViewInfoBank({ active: "", }); + useShallowEffect(() => { + handleLoadData(); + }, []); + + async function handleLoadData() { + try { + const response = await apiGetMasterAdminBank(); + + if (response && response.success) { + setData(response.data); + } else { + setData([]); + } + } catch (error) { + console.log("Error load data", error); + setData([]); + } + } + async function onCreate() { - const create = await adminAppInformation_createBank({ data: newData }); - if (create.status === 200) { - try { + try { + setLoadingCreate(true); + const create = await adminAppInformation_createBank({ data: newData }); + + if (create.status === 200) { + setNewData({ + namaBank: "", + namaAkun: "", + norek: "", + }); + const loadData = await adminAppInformation_getMasterBank(); setData(loadData); - } catch (error) { - console.log(error); - } finally { - setLoadingCreate(true); ComponentAdminGlobal_NotifikasiBerhasil(create.message); + } else { + ComponentAdminGlobal_NotifikasiGagal(create.message); } - } else { - ComponentAdminGlobal_NotifikasiGagal(create.message); + } catch (error) { + console.log(error); + } finally { + setLoadingCreate(false); } - setIsCreate(false); } async function onUpdate() { - const updt = await adminAppInformation_updateDataBankById({ - data: updateData as any, - }); - if (updt.status === 200) { - const loadData = await adminAppInformation_getMasterBank(); - setData(loadData); - ComponentAdminGlobal_NotifikasiBerhasil(updt.message); - setIsUpdate(false); - } else { - ComponentAdminGlobal_NotifikasiGagal(updt.message); + try { + setLoadingUpdate(true); + const updt = await adminAppInformation_updateDataBankById({ + data: updateData as any, + }); + if (updt.status === 200) { + const loadData = await adminAppInformation_getMasterBank(); + setData(loadData); + setIsUpdate(false); + setIsCreate(true); + + ComponentAdminGlobal_NotifikasiBerhasil(updt.message); + } else { + ComponentAdminGlobal_NotifikasiGagal(updt.message); + } + } catch (error) { + console.log("Error update data bank", error); + } finally { + setLoadingUpdate(false); } } @@ -104,36 +143,71 @@ export default function AdminAppInformation_ViewInfoBank({ isActive: value, }; - const updt = await adminAppInformation_updateStatusBankById({ - data: data as any, - }); + try { + setLoadingActivation(true); + const updt = await adminAppInformation_updateStatusBankById({ + data: data as any, + }); - if (updt.status === 200) { - const loadData = await adminAppInformation_getMasterBank(); - setData(loadData); - ComponentAdminGlobal_NotifikasiBerhasil(updt.message); - setIsActivation(false); - } else { - ComponentAdminGlobal_NotifikasiGagal(updt.message); + if (updt.status === 200) { + const loadData = await adminAppInformation_getMasterBank(); + setData(loadData); + ComponentAdminGlobal_NotifikasiBerhasil(updt.message); + setIsActivation(false); + } else { + ComponentAdminGlobal_NotifikasiGagal(updt.message); + } + } catch (error) { + console.log("Error update status bank", error); + } finally { + setLoadingActivation(false); } } - const rowTable = _.isEmpty(data) ? ( - -
- Tidak ada data -
- - ) : ( - data.map((e, i) => ( + const rowTable = () => { + if (!Array.isArray(data) || data.length === 0) { + return ( + + +
+ Tidak ada data +
+ + + ); + } + + return data.map((e, i) => ( -
- {e?.namaBank} -
+ + + {/* + + + + */} + -
+ -
- - -
- {e?.namaAkun} -
- - -
- {e?.norek} -
+ - - { - setIsUpdate(true); - setIsCreate(false); - setUpdateData({ - id: e?.id, - namaBank: e?.namaBank, - namaAkun: e?.namaAkun, - norek: e?.norek, - }); - }} - > - - - - - + + {e?.namaBank} + + + + + + {e?.namaAkun} + + + + + {e?.norek} + - )) - ); + )); + }; return ( <> - - { - setIsCreate(val.isCreate); - setIsUpdate(val.isUpdate); - }} - /> - + { + setIsCreate(val.isCreate); + setIsUpdate(val.isUpdate); + }} + /> - - - - - - - - - - - - - - - {rowTable} -
-
Bank
-
-
Status
-
-
Nama Rekening
-
-
Nomor Rekening
-
-
Aksi
-
-
-
-
- - - {isCreate ? ( + +
+ {isCreate && (
- Tambah Daftar Bank + + Tambah Daftar Bank +
{ @@ -259,9 +284,11 @@ export default function AdminAppInformation_ViewInfoBank({ { @@ -274,9 +301,11 @@ export default function AdminAppInformation_ViewInfoBank({ - + */}
+
+ + + {!data ? ( + + ) : ( + + + + + + + + + + + + + {rowTable()} +
+
Aksi
+
+ Status + + + Bank + + + Nama Rekening + + Nomor Rekening +
+
+
+ )} +
{/* Activasi bank */} - setIsActivation(false)} > - + <Title order={5} c={MainColor.white}> Anda ingin{" "} {updateStatus.active ? ( <Text span inherit> @@ -425,6 +492,8 @@ export default function AdminAppInformation_ViewInfoBank({ Batal </Button> <Button + loading={isLoadingActivation} + loaderPosition="center" color="green" radius={"xl"} onClick={() => { @@ -438,7 +507,7 @@ export default function AdminAppInformation_ViewInfoBank({ </Button> </Group> </Stack> - </Modal> + </Admin_ComponentModal> </Stack> </> ); diff --git a/src/app_modules/admin/app_info/view/view_info_whatsapp.tsx b/src/app_modules/admin/app_info/view/view_info_whatsapp.tsx index 893b2a7c..2fc09824 100644 --- a/src/app_modules/admin/app_info/view/view_info_whatsapp.tsx +++ b/src/app_modules/admin/app_info/view/view_info_whatsapp.tsx @@ -14,6 +14,7 @@ import { Grid, Group, Paper, + SimpleGrid, Stack, TextInput, Title, @@ -25,6 +26,7 @@ import { useState } from "react"; import { ComponentAdminGlobal_NotifikasiBerhasil } from "../../_admin_global/admin_notifikasi/notifikasi_berhasil"; import { ComponentAdminGlobal_NotifikasiGagal } from "../../_admin_global/admin_notifikasi/notifikasi_gagal"; import adminAppInformation_funUpdateNomorAdmin from "../fun/update/fun_update_nomor"; +import { Admin_V3_ComponentBreakpoint } from "../../_components_v3/comp_simple_grid_breakpoint"; export default function AdminAppInformation_ViewInformasiWhatApps() { const [dataNomor, setDataNomor] = useState<any | null>(null); @@ -89,90 +91,84 @@ export default function AdminAppInformation_ViewInformasiWhatApps() { </Group> </Stack> - <Grid> - <Grid.Col span={4}> - {!dataNomor ? ( - <CustomSkeleton height={100} width={300} /> - ) : ( - <Paper bg={AdminColor.softBlue} p={"md"}> - <Stack> - <Paper - c={AdminColor.white} - bg={AccentColor.darkblue} - p={"xl"} - > - <Group position="apart"> - <Title order={2}>{`+${dataNomor?.nomor}`} - - { - toggle(); - setUpdateNomor(dataNomor?.nomor); - }} - > - - - - - - - - - } - value={updateNomor} - label={ - - Nomor Aktif Admin - - } - onChange={(val) => { - setUpdateNomor(val.currentTarget.value); + {!dataNomor ? ( + + ) : ( + + + + + + + { + toggle(); + setUpdateNomor(dataNomor?.nomor); }} - /> - - - - - - - - - )} -
-
+ color={opened ? "gray" : AdminColor.white} + /> + + + {`+${dataNomor?.nomor}`} + + + + + + } + value={updateNomor} + label={ + + Nomor Aktif Admin + + } + onChange={(val) => { + setUpdateNomor(val.currentTarget.value); + }} + /> + + + + + + +
+ + + )} ); diff --git a/src/app_modules/admin/app_info/view/view_kategori_portofolio.tsx b/src/app_modules/admin/app_info/view/view_kategori_portofolio.tsx index b9222ac0..f6dabe92 100644 --- a/src/app_modules/admin/app_info/view/view_kategori_portofolio.tsx +++ b/src/app_modules/admin/app_info/view/view_kategori_portofolio.tsx @@ -1,68 +1,90 @@ +import { + AdminColor, + MainColor, +} from "@/app_modules/_global/color/color_pallet"; import { MODEL_DEFAULT_MASTER_OLD } from "@/app_modules/model_global/interface"; import { - ActionIcon, - Button, - Center, - Grid, - Group, - Modal, - Paper, - ScrollArea, - Stack, - Switch, - Table, - Text, - TextInput, - Title, - Tooltip, + Box, + Button, + Center, + Group, + Paper, + ScrollArea, + Stack, + Switch, + Table, + Text, + TextInput, + Title, } from "@mantine/core"; -import { IconCirclePlus, IconEdit } from "@tabler/icons-react"; +import { IconEdit } from "@tabler/icons-react"; import { useState } from "react"; import { ComponentAdminGlobal_TitlePage } from "../../_admin_global/_component"; +import { Admin_ComponentModal } from "../../_admin_global/_component/comp_admin_modal"; import { ComponentAdminGlobal_NotifikasiBerhasil } from "../../_admin_global/admin_notifikasi/notifikasi_berhasil"; import { ComponentAdminGlobal_NotifikasiGagal } from "../../_admin_global/admin_notifikasi/notifikasi_gagal"; +import { Admin_V3_ComponentBreakpoint } from "../../_components_v3/comp_simple_grid_breakpoint"; import { - adminAppInformation_funCreateBidangBisnis, - adminAppInformation_funGetBidangBisnis, - adminAppInformation_funUpdateBidangBisnis, + adminAppInformation_funCreateBidangBisnis, + adminAppInformation_funGetBidangBisnis, + adminAppInformation_funUpdateBidangBisnis, } from "../fun"; -import { AdminColor } from "@/app_modules/_global/color/color_pallet"; +import { useShallowEffect } from "@mantine/hooks"; +import { apiGetMasterAdminBidangBisnis } from "../lib/api_fetch_master"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; -export function AdminAppInformation_ViewKategoriPortofolio({ - dataBidangBisnis, -}: { - dataBidangBisnis: MODEL_DEFAULT_MASTER_OLD[]; -}) { - const [data, setData] = useState(dataBidangBisnis); +export function AdminAppInformation_ViewKategoriPortofolio() { + const [data, setData] = useState(null); + + useShallowEffect(() => { + handleLoadData(); + }, []); + + async function handleLoadData() { + try { + const response = await apiGetMasterAdminBidangBisnis(); + + if (response && response.success) { + setData(response.data); + } else { + setData([]); + } + } catch (error) { + console.log("Error load data", error); + setData([]); + } + } // Create const [isLoadingCreate, setLoadingCreate] = useState(false); - const [isCreate, setIsCreate] = useState(false); + const [isCreate, setIsCreate] = useState(true); const [newData, setNewData] = useState(""); async function onCreate() { - const create = await adminAppInformation_funCreateBidangBisnis({ - name: newData, - }); + try { + const create = await adminAppInformation_funCreateBidangBisnis({ + name: newData, + }); - if (create.status === 201) { - try { + if (create.status === 201) { setLoadingCreate(true); const loadData = await adminAppInformation_funGetBidangBisnis(); setData(loadData); - } catch (error) { - console.log(error); - } finally { setNewData(""); - setLoadingCreate(false); ComponentAdminGlobal_NotifikasiBerhasil(create.message); + } else { + ComponentAdminGlobal_NotifikasiGagal(create.message); } - } else { - ComponentAdminGlobal_NotifikasiGagal(create.message); + } catch (error) { + console.log(error); + ComponentAdminGlobal_NotifikasiGagal("Gagal menambah bidang bisnis"); + } finally { + setLoadingCreate(false); } } // Update Data const [isLoadingUpdate, setLoadingUpdate] = useState(false); + const [isUpdate, setIsUpdate] = useState(false); const [updateData, setUpdateData] = useState({ id: "", @@ -70,22 +92,25 @@ export function AdminAppInformation_ViewKategoriPortofolio({ }); async function onUpdate() { - const updt = await adminAppInformation_funUpdateBidangBisnis({ - data: updateData as any, - }); - if (updt?.status === 200) { - try { - setLoadingUpdate(true); + try { + setLoadingUpdate(true); + const updt = await adminAppInformation_funUpdateBidangBisnis({ + data: updateData as any, + }); + if (updt?.status === 200) { const loadData = await adminAppInformation_funGetBidangBisnis(); setData(loadData); - } catch (error) { - console.log(error); - } finally { - setLoadingUpdate(false); + ComponentAdminGlobal_NotifikasiBerhasil(updt.message); + } else { + ComponentAdminGlobal_NotifikasiGagal(updt?.message as any); } - } else { - ComponentAdminGlobal_NotifikasiGagal(updt?.message as any); + } catch (error) { + console.log(error); + } finally { + setIsUpdate(false); + setIsCreate(true); + setLoadingUpdate(false); } } @@ -95,6 +120,7 @@ export function AdminAppInformation_ViewKategoriPortofolio({ id: "", active: null, }); + const [isLoadingActivation, setLoadingActivation] = useState(false); async function onUpdateActivation({ id, @@ -103,56 +129,60 @@ export function AdminAppInformation_ViewKategoriPortofolio({ id: string; active: boolean; }) { - const updt = await adminAppInformation_funUpdateBidangBisnis({ - data: { id: id, active: active }, - }); + try { + setLoadingActivation(true); + const updt = await adminAppInformation_funUpdateBidangBisnis({ + data: { id: id, active: active }, + }); - if (updt?.status === 200) { - try { - setLoadingUpdate(true); + if (updt?.status === 200) { const loadData = await adminAppInformation_funGetBidangBisnis(); setData(loadData); - } catch (error) { - console.log(error); - } finally { setOpenModal(false); - setLoadingUpdate(false); + setLoadingActivation(false); ComponentAdminGlobal_NotifikasiBerhasil(updt?.message); + } else { + ComponentAdminGlobal_NotifikasiGagal(updt?.message as any); } - } else { - ComponentAdminGlobal_NotifikasiGagal(updt?.message as any); + } catch (error) { + console.log(error); + ComponentAdminGlobal_NotifikasiGagal("Gagal mengupdate status"); } } - // Row Table - const rowTable = data.map((e, i) => ( - - -
- {e?.name} -
- - -
- { - setOpenModal(true); - setUpdateStatus({ - id: e?.id, - active: val.currentTarget.checked as any, - }); - }} - /> -
- - - - - { + if (!Array.isArray(data) || data.length === 0) { + return ( + + +
+ Tidak ada data +
+ + + ); + } + return data.map((e, i) => ( + + + + + {/* { @@ -167,68 +197,66 @@ export function AdminAppInformation_ViewKategoriPortofolio({ - - - - - )); +
*/} +
+ + + +
+ { + setOpenModal(true); + setUpdateStatus({ + id: e?.id, + active: val.currentTarget.checked as any, + }); + }} + /> +
+ + + + + {e?.name} + + + + )); + }; return ( <> } - onClick={() => { - setIsCreate(true); - setIsUpdate(false); - }} - > - Tambah - - } + // component={ + // + // } /> - - - - - - - - - - - - - {rowTable} -
-
Kategori
-
-
Status
-
-
Aksi
-
-
-
-
- - + +
{/* Form Create */} {isCreate ? (
- Tambah Bidang Bisnis + + Tambah Bidang Bisnis +
- + */}
+ + {!data ? ( + + ) : ( + + + + + + + + + + + {rowTable()} +
+
Status
+
+
Aksi
+
+ Kategori +
+
+
+ )} +
{/* Activasi bank */} - setOpenModal(false)} > - + <Title order={5} c={MainColor.white}> Anda ingin{" "} {updateStatus.active ? ( <Text span inherit> @@ -339,6 +401,8 @@ export function AdminAppInformation_ViewKategoriPortofolio({ Batal </Button> <Button + loading={isLoadingActivation} + loaderPosition="center" color="green" radius={"xl"} onClick={() => { @@ -352,7 +416,7 @@ export function AdminAppInformation_ViewKategoriPortofolio({ </Button> </Group> </Stack> - </Modal> + </Admin_ComponentModal> </> ); } diff --git a/src/app_modules/admin/user-access/view/index.tsx b/src/app_modules/admin/user-access/view/index.tsx index c2439d22..85028017 100644 --- a/src/app_modules/admin/user-access/view/index.tsx +++ b/src/app_modules/admin/user-access/view/index.tsx @@ -19,7 +19,7 @@ import { TextInput, Title, Text, - Box + Box, } from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; import { IconSearch } from "@tabler/icons-react"; @@ -30,7 +30,7 @@ import adminUserAccess_funEditAccess from "../fun/edit/fun_edit_access"; import { Admin_V3_ComponentPaginationBreakpoint } from "../../_components_v3/comp_pagination_breakpoint"; export default function AdminUserAccess_View() { - const [data, setData] = useState<MODEL_USER[]>([]); + const [data, setData] = useState<MODEL_USER[] | null>(null); const [nPage, setNPage] = useState(1); const [isActivePage, setActivePage] = useState(1); const [isSearch, setSearch] = useState(""); @@ -124,51 +124,65 @@ export default function AdminUserAccess_View() { } } - const tableBody = data.map((e, i) => ( - <tr key={e.id}> - <td> - <Box w={200}> - <Text c={AdminColor.white}>{e.username}</Text> - </Box> - </td> - <td> - <Box w={200}> - <Text c={AdminColor.white}>+{e.nomor}</Text> - </Box> - </td> - <td> - {e.active === false ? ( - <Center> - <Button - loaderPosition="center" - loading={isLoadingAccess && userId === e.id} - radius={"xl"} - color="Green" - onClick={() => { - onAccess(e.id, e.nomor); - }} - > - Grand Access - </Button> - </Center> - ) : ( - <Center> - <Button - loaderPosition="center" - loading={isLoadingDelete && userId === e.id} - radius={"xl"} - color="red" - onClick={() => { - onDelete(e.id); - }} - > - Delete Access - </Button> - </Center> - )} - </td> - </tr> - )); + const tableBody = () => { + if (!Array.isArray(data) || data.length === 0) { + return ( + <tr> + <td colSpan={12}> + <Center> + <Text color={"gray"}>Tidak ada data</Text> + </Center> + </td> + </tr> + ); + } + + return data.map((e, i) => ( + <tr key={e.id}> + <td> + <Box w={200}> + <Text c={AdminColor.white}>{e.username}</Text> + </Box> + </td> + <td> + <Box w={200}> + <Text c={AdminColor.white}>+{e.nomor}</Text> + </Box> + </td> + <td> + {e.active === false ? ( + <Center> + <Button + loaderPosition="center" + loading={isLoadingAccess && userId === e.id} + radius={"xl"} + color="Green" + onClick={() => { + onAccess(e.id, e.nomor); + }} + > + Grand Access + </Button> + </Center> + ) : ( + <Center> + <Button + loaderPosition="center" + loading={isLoadingDelete && userId === e.id} + radius={"xl"} + color="red" + onClick={() => { + onDelete(e.id); + }} + > + Delete Access + </Button> + </Center> + )} + </td> + </tr> + )); + }; return ( <> @@ -191,7 +205,7 @@ export default function AdminUserAccess_View() { /> </Group> - {!data.length ? ( + {!data ? ( <CustomSkeleton height={"80vh"} width="100%" /> ) : ( <Paper p={"md"} bg={AdminColor.softBlue} h={"80vh"}> @@ -210,7 +224,7 @@ export default function AdminUserAccess_View() { </th> </tr> </thead> - <tbody>{tableBody}</tbody> + <tbody>{tableBody()}</tbody> </Table> </ScrollArea> <Admin_V3_ComponentPaginationBreakpoint diff --git a/src/app_modules/forum/component/api_fetch_forum.ts b/src/app_modules/forum/component/api_fetch_forum.ts index 53cd61a2..d1a7a2c6 100644 --- a/src/app_modules/forum/component/api_fetch_forum.ts +++ b/src/app_modules/forum/component/api_fetch_forum.ts @@ -34,7 +34,7 @@ const apiGetAllForum = async ({ // Check if the response is OK if (!response.ok) { const errorData = await response.json().catch(() => null); - console.error("Failed to get all forum:", response.statusText, errorData); + console.error("Failed to get all forum", response.statusText, errorData); throw new Error(errorData?.message || "Failed to get all forum"); }