From edd13ffe0f6fb98cc04827969b31131194db9c5b Mon Sep 17 00:00:00 2001 From: Bagasbanuna02 Date: Thu, 13 Jun 2024 16:48:42 +0800 Subject: [PATCH 01/17] Notifikasi Forum # feat - Notif jika ada postingan baru ## No issue --- prisma/schema.prisma | 6 +- src/app/dev/forum/main/page.tsx | 5 +- .../component/beranda/beranda_button_more.tsx | 45 ++- .../forum/component/beranda/beranda_card.tsx | 6 +- .../forum/component/card_loader.tsx | 25 ++ .../component/main_component/card_header.tsx | 146 ++++++++ .../main_component/card_more_button.tsx | 350 ++++++++++++++++++ .../component/main_component/card_view.tsx | 97 +++++ src/app_modules/forum/create/index.tsx | 23 +- src/app_modules/forum/forumku/index.tsx | 25 +- .../forum/fun/create/fun_create.tsx | 4 +- .../forum/fun/get/new_get_all_posting.ts | 75 ++++ .../forum/fun/get/v2_get_all_posting.ts | 48 +++ src/app_modules/forum/main/beranda.tsx | 157 +++++++- src/app_modules/forum/model/interface.tsx | 2 +- 15 files changed, 943 insertions(+), 71 deletions(-) create mode 100644 src/app_modules/forum/component/card_loader.tsx create mode 100644 src/app_modules/forum/component/main_component/card_header.tsx create mode 100644 src/app_modules/forum/component/main_component/card_more_button.tsx create mode 100644 src/app_modules/forum/component/main_component/card_view.tsx create mode 100644 src/app_modules/forum/fun/get/new_get_all_posting.ts create mode 100644 src/app_modules/forum/fun/get/v2_get_all_posting.ts diff --git a/prisma/schema.prisma b/prisma/schema.prisma index fdd7eddc..940bc0e7 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -865,8 +865,8 @@ model Notifikasi { Role MasterUserRole? @relation(fields: [userRoleId], references: [id]) userRoleId String - User User @relation("UserNotifikasi", fields: [userId], references: [id], map: "NotifikasiUser") + User User @relation("UserNotifikasi", fields: [userId], references: [id], map: "NotifikasiUser") userId String - Admin User @relation("AdminNotifikasi", fields: [adminId], references: [id], map: "NotifikasiAdmin") - adminId String + Admin User? @relation("AdminNotifikasi", fields: [adminId], references: [id], map: "NotifikasiAdmin") + adminId String? } diff --git a/src/app/dev/forum/main/page.tsx b/src/app/dev/forum/main/page.tsx index c0b887a9..c712b95d 100644 --- a/src/app/dev/forum/main/page.tsx +++ b/src/app/dev/forum/main/page.tsx @@ -1,11 +1,14 @@ import { Forum_Beranda } from "@/app_modules/forum"; import { forum_getListAllPosting } from "@/app_modules/forum/fun/get/get_list_all_posting"; +import { forum_new_getAllPosting } from "@/app_modules/forum/fun/get/new_get_all_posting"; +import forum_v2_getAllPosting from "@/app_modules/forum/fun/get/v2_get_all_posting"; import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token"; export default async function Page() { - const listForum = await forum_getListAllPosting(); + const listForum = await forum_v2_getAllPosting({}); const userLoginId = await user_getOneUserId(); + return ( <> { if (res.status === 200) { - ComponentGlobal_NotifikasiBerhasil(`Postingan Terhapus`, 2000); + // ComponentGlobal_NotifikasiBerhasil(`Postingan Terhapus`, 2000); setLoading(true); const listForum = await forum_getListAllPosting(); setData(listForum); + return null; } else { - ComponentGlobal_NotifikasiGagal(res.message); + // ComponentGlobal_NotifikasiGagal(res.message); + return null; } }); } @@ -273,19 +275,34 @@ function ButtonStatus({ async function onTutupForum() { setOpenStatus(false); - await forum_funEditStatusPostingById(postingId as any, 2).then( - async (res) => { - if (res.status === 200) { - await forum_getListAllPosting().then((val) => { - setData(val as any); - ComponentGlobal_NotifikasiBerhasil(`Forum Ditutup`, 2000); - setLoading(true); - }); - } else { - ComponentGlobal_NotifikasiGagal(res.message); - } - } + const upateStatusClose = await forum_funEditStatusPostingById( + postingId as any, + 2 ); + if (upateStatusClose.status === 200) { + const loadData = await forum_getListAllPosting(); + // ComponentGlobal_NotifikasiBerhasil(`Forum Ditutup`, 2000); + setData(loadData); + setLoading(true); + return null; + } else { + // ComponentGlobal_NotifikasiGagal(upateStatusClose.message); + return null; + } + + // await forum_funEditStatusPostingById(postingId as any, 2).then( + // async (res) => { + // if (res.status === 200) { + // await forum_getListAllPosting().then((val) => { + // setData(val as any); + // ComponentGlobal_NotifikasiBerhasil(`Forum Ditutup`, 2000); + // setLoading(true); + // }); + // } else { + // ComponentGlobal_NotifikasiGagal(res.message); + // } + // } + // ); } async function onBukaForum() { diff --git a/src/app_modules/forum/component/beranda/beranda_card.tsx b/src/app_modules/forum/component/beranda/beranda_card.tsx index 5f732089..d0c4d57d 100644 --- a/src/app_modules/forum/component/beranda/beranda_card.tsx +++ b/src/app_modules/forum/component/beranda/beranda_card.tsx @@ -37,9 +37,6 @@ export default function ComponentForum_BerandaCardView({ {data.map((e, i) => ( - {/*
{JSON.stringify(e.Author.id, null, 2)}
-
{JSON.stringify(userLoginId, null, 2)}
*/} -
+ { - // console.log("halaman forum"); setLoadingDetail(true); router.push(RouterForum.main_detail + e.id); }} @@ -65,6 +62,7 @@ export default function ComponentForum_BerandaCardView({
+ diff --git a/src/app_modules/forum/component/card_loader.tsx b/src/app_modules/forum/component/card_loader.tsx new file mode 100644 index 00000000..e3660996 --- /dev/null +++ b/src/app_modules/forum/component/card_loader.tsx @@ -0,0 +1,25 @@ +"use client"; + +import { Overlay, Center, Loader } from "@mantine/core"; + +export default function ComponentForum_CardLoadingOverlay({ + size, + variant, +}: { + size?: number; + variant?: any; +}) { + return ( + <> + +
+ +
+
+ + ); +} diff --git a/src/app_modules/forum/component/main_component/card_header.tsx b/src/app_modules/forum/component/main_component/card_header.tsx new file mode 100644 index 00000000..92487d9c --- /dev/null +++ b/src/app_modules/forum/component/main_component/card_header.tsx @@ -0,0 +1,146 @@ +"use client"; + +import loading from "@/app/dev/home/loading"; +import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; +import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; +import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; +import { + Stack, + Loader, + Avatar, + Badge, + Group, + Divider, + Grid, + Text, +} from "@mantine/core"; +import { IconCircle } from "@tabler/icons-react"; +import ComponentForum_BerandaButtonMore from "../beranda/beranda_button_more"; +import { MODEL_USER } from "@/app_modules/home/model/interface"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; +import { MODEL_FORUM_POSTING } from "../../model/interface"; +import ComponentForum_V2_CardMoreButton from "./card_more_button"; + +export default function ComponentForum_V2_HeaderCard({ + data, + isMoreButton, + userLoginId, + onLoadData, +}: { + data: MODEL_FORUM_POSTING; + isMoreButton: boolean; + userLoginId: string; + onLoadData: (val: any) => void +}) { + const router = useRouter(); + const [isLoading, setIsLoading] = useState(false); + + return ( + <> + + + { + if (data.Author.id) { + setIsLoading(true); + router.push(RouterForum.forumku + data.Author.id); + } else { + ComponentGlobal_NotifikasiPeringatan("Id tidak ditemukan"); + } + }} + > + {isLoading ? ( + + ) : ( + + )} + + + + + + + + {data.Author.username + ? data.Author.username + : "Nama author "} + + + + + + + + {(data.ForumMaster_StatusPosting.id as any) === 1 + ? "Open" + : "Close"} + + + + + + + + + + {data.createdAt + ? data.createdAt.toLocaleDateString(["id-ID"], { + day: "numeric", + month: "short", + }) + : new Date().toLocaleDateString(["id-ID"], { + day: "numeric", + month: "short", + })} + + + + + + {isMoreButton ? ( + + + + + ) : ( + "" + )} + + + + {/* {isPembatas ? : ""} */} + + + ); +} diff --git a/src/app_modules/forum/component/main_component/card_more_button.tsx b/src/app_modules/forum/component/main_component/card_more_button.tsx new file mode 100644 index 00000000..c082b7c6 --- /dev/null +++ b/src/app_modules/forum/component/main_component/card_more_button.tsx @@ -0,0 +1,350 @@ +"use client"; + +import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; +import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; +import { + ActionIcon, + Button, + Drawer, + Grid, + Group, + Loader, + Modal, + Stack, + Text, + Title, +} from "@mantine/core"; +import { useDisclosure } from "@mantine/hooks"; +import { + IconDots, + IconEdit, + IconFlag3, + IconSquareCheck, + IconSquareRoundedX, + IconTrash, +} from "@tabler/icons-react"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; + +import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; +import { forum_funDeletePostingById } from "../../fun/delete/fun_delete_posting_by_id"; +import { forum_funEditStatusPostingById } from "../../fun/edit/fun_edit_status_posting_by_id"; +import { forum_getListAllPosting } from "../../fun/get/get_list_all_posting"; +import { forum_new_getAllPosting } from "../../fun/get/new_get_all_posting"; +import forum_v2_getAllPosting from "../../fun/get/v2_get_all_posting"; + +export default function ComponentForum_V2_CardMoreButton({ + authorId, + postingId, + statusId, + userLoginId, + onLoadData, +}: { + authorId: any; + postingId?: any; + statusId?: any; + userLoginId: any; + onLoadData: (val: any) => void; +}) { + const router = useRouter(); + + // modal & drawer + const [opened, { open, close }] = useDisclosure(false); + const [openDel, setOpenDel] = useState(false); + const [openStatusClose, setOpenStatusClose] = useState(false); + + // loading + const [loadingEdit, setLoadingEdit] = useState(false); + const [loadingReport, setLoadingReport] = useState(false); + + // if (loadingEdit) return ; + + return ( + <> + + + {userLoginId != authorId ? ( + "" + ) : ( + + { + close(); + setOpenStatusClose(true); + }} + > + + {statusId === 1 ? ( + + ) : ( + + )} + + + {statusId === 1 ? ( + Tutup forum + ) : ( + Buka forum + )} + + + + { + close(); + setOpenDel(true); + }} + > + + + + + Hapus + + + + { + setLoadingEdit(true); + router.push(RouterForum.edit_posting + postingId); + }} + > + + + + + + Edit posting{" "} + {loadingEdit ? : ""} + + + + + )} + + {userLoginId == authorId ? ( + "" + ) : ( + { + setLoadingReport(true); + router.push(RouterForum.report_posting + postingId); + }} + > + + + + + + + Laporkan posting + {" "} + {loadingReport ? : ""} + + + + )} + + + + + + { + setOpenDel(false); + }} + centered + withCloseButton={false} + > + + + + setOpenStatusClose(false)} + centered + withCloseButton={false} + > + + + + open()}> + + + + ); +} + +function ButtonDelete({ + postingId, + setOpenDel, + onLoadData, +}: { + postingId?: string; + setOpenDel: any; + onLoadData: (val: any) => void; +}) { + const [loading, setLoading] = useState(false); + + async function onDelete() { + setOpenDel(false); + await forum_funDeletePostingById(postingId as any).then(async (res) => { + if (res.status === 200) { + // ComponentGlobal_NotifikasiBerhasil(`Postingan Terhapus`, 2000); + setLoading(true); + const loadData = await forum_new_getAllPosting({ page: 1 }); + onLoadData(loadData); + return null; + } else { + // ComponentGlobal_NotifikasiGagal(res.message); + return null; + } + }); + } + return ( + <> + + Yakin menghapus posting ini ? + + + + + + + ); +} + +function ButtonStatus({ + postingId, + setOpenStatus, + statusId, + onLoadData, + userLoginId, + authorId, +}: { + postingId?: string; + setOpenStatus: any; + statusId?: any; + onLoadData: (val: any) => void; + userLoginId: string; + authorId: string; +}) { + const [loading, setLoading] = useState(false); + + async function onTutupForum() { + setOpenStatus(false); + + const upateStatusClose = await forum_funEditStatusPostingById( + postingId as any, + 2 + ); + if (upateStatusClose.status === 200) { + ComponentGlobal_NotifikasiBerhasil(`Forum Ditutup`, 2000); + + const loadData = await forum_v2_getAllPosting({}) + onLoadData(loadData); + setLoading(true); + + } else { + ComponentGlobal_NotifikasiGagal(upateStatusClose.message); + + } + + } + + async function onBukaForum() { + setOpenStatus(false); + + await forum_funEditStatusPostingById(postingId as any, 1).then( + async (res) => { + if (res.status === 200) { + const loadData = await forum_v2_getAllPosting({}); + onLoadData(loadData); + + ComponentGlobal_NotifikasiBerhasil(`Forum Dibuka`, 2000); + setLoading(true); + + } else { + ComponentGlobal_NotifikasiGagal(res.message); + } + } + ); + } + + return ( + <> + + {statusId === 1 ? ( + Yakin menutup forum ini ? + ) : ( + Yakin membuka forum ini ? + )} + + + + {statusId === 1 ? ( + + ) : ( + + )} + + + + ); +} diff --git a/src/app_modules/forum/component/main_component/card_view.tsx b/src/app_modules/forum/component/main_component/card_view.tsx new file mode 100644 index 00000000..334efac6 --- /dev/null +++ b/src/app_modules/forum/component/main_component/card_view.tsx @@ -0,0 +1,97 @@ +"use client"; + +import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; +import { Stack, Card, Group, ActionIcon, Divider, Text } from "@mantine/core"; +import { IconMessageCircle, IconMessageCircleX } from "@tabler/icons-react"; +import { useRouter } from "next/navigation"; +import ComponentForum_BerandaAuthorNameOnHeader from "../beranda/beranda_author_header"; +import ComponentForum_V2_HeaderCard from "./card_header"; +import { MODEL_FORUM_POSTING } from "../../model/interface"; +import { useState } from "react"; +import ComponentGlobal_CardLoadingOverlay from "@/app_modules/component_global/loading_card"; +import ComponentForum_CardLoadingOverlay from "../card_loader"; + +export default function ComponentForum_V2_MainCardView({ + data, + userLoginId, + onLoadData, +}: { + data: MODEL_FORUM_POSTING[]; + userLoginId: string; + onLoadData: (val: any) => void; +}) { + const router = useRouter(); + const [loadingKomen, setLoadingKomen] = useState(false); + const [loadingDetail, setLoadingDetail] = useState(false); + + const [postingId, setPostingId] = useState(""); + + return ( + <> + + {data.map((e, i) => ( + + + + {/* */} + + + { + router.push(RouterForum.main_detail + e.id) + }} + > + +
+ + + + + + + { + setPostingId(e?.id), + (e?.ForumMaster_StatusPosting.id as any) === 1 + ? (router.push(RouterForum.komentar + e?.id), + setLoadingKomen(true)) + : router.push(RouterForum.main_detail + e?.id); + }} + > + {(e?.ForumMaster_StatusPosting?.id as any) === 1 ? ( + + ) : ( + + )} + + + {/* */} + + {e?.Forum_Komentar.length} + + + + + + ))} + + + ); +} diff --git a/src/app_modules/forum/create/index.tsx b/src/app_modules/forum/create/index.tsx index 4906734d..71f3a3d3 100644 --- a/src/app_modules/forum/create/index.tsx +++ b/src/app_modules/forum/create/index.tsx @@ -35,6 +35,8 @@ const ReactQuill = dynamic( { ssr: false } ); +import mqtt_client from "@/util/mqtt_client"; + export default function Forum_Create() { const [value, setValue] = useState(""); const [totalLength, setTotalLength] = useState(0); @@ -74,7 +76,6 @@ export default function Forum_Create() { - {/*
 {JSON.stringify(value, null, 2)}
*/} ); } @@ -88,15 +89,17 @@ function ButtonAction({ value }: { value: string }) { return null; } - await forum_funCreate(value).then((res) => { - if (res.status === 201) { - setLoading(true); - ComponentGlobal_NotifikasiBerhasil(res.message); - setTimeout(() => router.back(), 1000); - } else { - ComponentGlobal_NotifikasiGagal(res.message); - } - }); + const create = await forum_funCreate(value); + if (create.status === 201) { + setLoading(true); + ComponentGlobal_NotifikasiBerhasil(create.message); + setTimeout(() => router.back(), 1000); + + mqtt_client.publish("Forum_user_to_user", JSON.stringify({isNewPost: true, count: 1 })); + + } else { + ComponentGlobal_NotifikasiGagal(create.message); + } } return ( <> diff --git a/src/app_modules/forum/forumku/index.tsx b/src/app_modules/forum/forumku/index.tsx index 35af2a7a..e246717e 100644 --- a/src/app_modules/forum/forumku/index.tsx +++ b/src/app_modules/forum/forumku/index.tsx @@ -1,36 +1,28 @@ "use client"; +import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; -import ComponentGlobal_AuthorNameOnHeader from "@/app_modules/component_global/author_name_on_header"; +import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; import { MODEL_USER } from "@/app_modules/home/model/interface"; import { ActionIcon, Affix, Avatar, Button, - Card, Center, Divider, Grid, - Group, Stack, Text, rem, } from "@mantine/core"; -import { - IconCircleFilled, - IconMessageCircle, - IconPencilPlus, -} from "@tabler/icons-react"; -import { useRouter } from "next/navigation"; -import ComponentForum_PostingAuthorNameOnHeader from "../component/header/posting_author_header_name"; -import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; -import { useState } from "react"; -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; -import { MODEL_FORUM_POSTING } from "../model/interface"; -import ComponentForum_MainCardView from "../component/main_card_view"; import { useWindowScroll } from "@mantine/hooks"; +import { IconCircleFilled, IconPencilPlus } from "@tabler/icons-react"; import _ from "lodash"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; +import ComponentForum_MainCardView from "../component/main_card_view"; +import { MODEL_FORUM_POSTING } from "../model/interface"; export default function Forum_Forumku({ auhtorSelectedData, @@ -185,9 +177,6 @@ function ForumPosting({ if (loadingKomen) return ; return ( <> - - - (listForum); + // const [nPage, setNPage] = useState(listForum.nPage); + // const [activePage, setActivePage] = useState(1); + const [isSearch, setIsSearch] = useState(""); - if (loadingDetail) return ; - if (loadingKomen) return ; + const [loadingCreate, setLoadingCreate] = useState(false); + + // + const [isNewPost, setIsNewPost] = useState(false); + const [countNewPost, setCountNewPost] = useState(0); + + // useShallowEffect(() => { + // onLoadAllData({ + // onLoad(val) { + // setData(val.data); + // setNPage(val.nPage); + // }, + // }); + // }, [setData, setNPage]); + + // async function onLoadAllData({ onLoad }: { onLoad: (val: any) => void }) { + // const loadData = await forum_new_getAllPosting({ page: 1 }); + // onLoad(loadData); + // } + + useShallowEffect(() => { + mqtt_client.subscribe("Forum_user_to_user"); + + mqtt_client.on("message", (topic: any, message: any) => { + const data = JSON.parse(message.toString()); + // console.log(data); + setIsNewPost(data.isNewPost); + const tambah = countNewPost + data.count; + setCountNewPost(tambah); + }); + }, [countNewPost]); async function onSearch(text: string) { - await forum_funSearchListPosting(text).then((res: any) => { - setData(res); - }); + setIsSearch(text); + const search = await forum_v2_getAllPosting({search: text}); + setData(search as any); + // setNPage(search.nPage); + // setActivePage(1); } + // async function onClickPage(nextpage: number) { + // setActivePage(nextpage); + // const next = await forum_new_getAllPosting({ + // page: nextpage, + // search: isSearch, + // }); + // scrollTo({ y: 0 }); + // setData(next.data as any); + // setNPage(next.nPage); + // } + + return ( <> + {isNewPost && ( + + setData(val)} + onSetNewPost={(val) => { + setIsNewPost(val); + }} + onSetCountNewPosting={(val) => { + setCountNewPost(val); + }} + /> + + )} + {/*
{JSON.stringify(listForum, null, 2)}
*/} - Forum tidak ditemukan - - - Coba masukan kata yang bebeda + Tidak ada data ) : ( - { + setData(val); + // setNPage(val.nPage); + }} /> )} + + {/*
+ { + onClickPage(val); + }} + styles={(theme) => ({ + control: { + borderRadius: "100%", + + }, + })} + /> +
*/} + + ); +} + +function ButtonUpdateBeranda({ + countNewPost, + onSetData, + onSetNewPost, + onSetCountNewPosting, +}: { + countNewPost: number; + onSetData: (val: any) => void; + onSetNewPost: (val: any) => void; + onSetCountNewPosting: (val: any) => void; +}) { + const [scroll, scrollTo] = useWindowScroll(); + const [isLoading, setIsLoading] = useState(false); + + async function onLoadData() { + setIsLoading(true); + const loadData = await forum_getListAllPosting(); + if (loadData) { + onSetData(loadData); + onSetNewPost(false); + setIsLoading(false); + onSetCountNewPosting(0); + } + } + + return ( + <> +
+ +
); } diff --git a/src/app_modules/forum/model/interface.tsx b/src/app_modules/forum/model/interface.tsx index 530d7d67..fc543f10 100644 --- a/src/app_modules/forum/model/interface.tsx +++ b/src/app_modules/forum/model/interface.tsx @@ -9,7 +9,7 @@ export interface MODEL_FORUM_POSTING { diskusi: string; authorId: string; Author: MODEL_USER; - _count: number; + _count: number Forum_Komentar: MODEL_FORUM_KOMENTAR[]; Forum_ReportPosting: MODEL_FORUM_MASTER_REPORT[]; ForumMaster_StatusPosting: MODEL_FORUM_MASTER_STATUS; From d904042dfbd8794b69dd9179bb693c7db2a9da4c Mon Sep 17 00:00:00 2001 From: Bagasbanuna02 Date: Thu, 20 Jun 2024 21:52:14 +0800 Subject: [PATCH 02/17] Notifiaksi Forum # feat - Notifikasi user to user - Realtime user to user ## No issuee --- package.json | 2 +- prisma/schema.prisma | 5 +- .../0fbd6251-c6a4-4552-82be-f630f04b838c.jpg | Bin 0 -> 13740 bytes .../6ca7d19c-6d7b-49fb-acd6-44e5f1b09d7b.jpg | Bin 0 -> 18295 bytes src/app/dev/forum/detail/[id]/page.tsx | 9 +- src/app/dev/forum/main/page.tsx | 11 +- .../dev/forum/report/posting/[id]/page.tsx | 5 + .../admin/job/child/publish/index.tsx | 4 +- .../admin/job/child/reject/index.tsx | 2 +- .../admin/job/child/review/index.tsx | 5 +- .../detail_component/detail_header.tsx | 466 ++++++++++++++++++ .../component/main_component/card_header.tsx | 16 +- .../main_component/card_more_button.tsx | 164 ++++-- .../component/main_component/card_view.tsx | 123 +++-- src/app_modules/forum/create/index.tsx | 2 +- src/app_modules/forum/detail/index.tsx | 261 ++++++---- .../forum/fun/get/get_one_posting_by_id.ts | 5 +- .../forum/fun/get/new_get_all_posting.ts | 32 +- src/app_modules/forum/komentar/index.tsx | 3 +- src/app_modules/forum/main/beranda.tsx | 164 +++--- src/app_modules/forum/model/interface.tsx | 3 +- .../forum/report/posting/index.tsx | 52 +- .../forum/report/posting/lainnya.tsx | 10 +- src/app_modules/home/layout.tsx | 3 + src/app_modules/job/create/view.tsx | 10 +- src/app_modules/job/detail/draft/view.tsx | 2 +- src/app_modules/job/detail/review/view.tsx | 2 +- ...te_notif.tsx => create_notif_to_admin.tsx} | 0 .../fun/create/create_notif_to_user.tsx | 24 + src/app_modules/notifikasi/main/index.tsx | 56 ++- src/app_modules/zCoba/index.tsx | 176 +++---- yarn.lock | 8 +- 32 files changed, 1182 insertions(+), 443 deletions(-) create mode 100644 public/job/0fbd6251-c6a4-4552-82be-f630f04b838c.jpg create mode 100644 public/job/6ca7d19c-6d7b-49fb-acd6-44e5f1b09d7b.jpg create mode 100644 src/app_modules/forum/component/detail_component/detail_header.tsx rename src/app_modules/notifikasi/fun/create/{create_notif.tsx => create_notif_to_admin.tsx} (100%) create mode 100644 src/app_modules/notifikasi/fun/create/create_notif_to_user.tsx diff --git a/package.json b/package.json index 40418346..53ba7399 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "mqtt": "^5.5.0", "next": "^13.5.4-canary.8", "next-dev": "^1.1.9", - "next-scroll-loader": "^1.0.5", + "next-scroll-loader": "^1.0.9", "postcss": "8.4.27", "react": "18.2.0", "react-countdown": "^2.3.5", diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 940bc0e7..baa94cd0 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -865,8 +865,9 @@ model Notifikasi { Role MasterUserRole? @relation(fields: [userRoleId], references: [id]) userRoleId String - User User @relation("UserNotifikasi", fields: [userId], references: [id], map: "NotifikasiUser") - userId String + User User? @relation("UserNotifikasi", fields: [userId], references: [id], map: "NotifikasiUser") + userId String? Admin User? @relation("AdminNotifikasi", fields: [adminId], references: [id], map: "NotifikasiAdmin") adminId String? + } diff --git a/public/job/0fbd6251-c6a4-4552-82be-f630f04b838c.jpg b/public/job/0fbd6251-c6a4-4552-82be-f630f04b838c.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4204a23ed30278b5527350a16b25b8bbcd3d54e2 GIT binary patch literal 13740 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 diff --git a/src/app/dev/forum/main/page.tsx b/src/app/dev/forum/main/page.tsx index c712b95d..c10d567a 100644 --- a/src/app/dev/forum/main/page.tsx +++ b/src/app/dev/forum/main/page.tsx @@ -1,20 +1,17 @@ - import { Forum_Beranda } from "@/app_modules/forum"; -import { forum_getListAllPosting } from "@/app_modules/forum/fun/get/get_list_all_posting"; import { forum_new_getAllPosting } from "@/app_modules/forum/fun/get/new_get_all_posting"; import forum_v2_getAllPosting from "@/app_modules/forum/fun/get/v2_get_all_posting"; import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token"; export default async function Page() { - const listForum = await forum_v2_getAllPosting({}); + const listForum = await forum_new_getAllPosting({ page: 1 }); const userLoginId = await user_getOneUserId(); + // console.log(JSON.stringify(listForum, null, 2)); + return ( <> - + ); } diff --git a/src/app/dev/forum/report/posting/[id]/page.tsx b/src/app/dev/forum/report/posting/[id]/page.tsx index 2275c4ea..aa172433 100644 --- a/src/app/dev/forum/report/posting/[id]/page.tsx +++ b/src/app/dev/forum/report/posting/[id]/page.tsx @@ -1,15 +1,20 @@ import { Forum_ReportPosting } from "@/app_modules/forum"; +import { forum_getOnePostingById } from "@/app_modules/forum/fun/get/get_one_posting_by_id"; import { forum_getMasterKategoriReport } from "@/app_modules/forum/fun/master/get_master_kategori_report"; +import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token"; export default async function Page({ params }: { params: { id: string } }) { let postingId = params.id; const listReport = await forum_getMasterKategoriReport(); + const userLoginId = await user_getOneUserId() + const dataPosting = await forum_getOnePostingById(postingId) return ( <> ); diff --git a/src/app_modules/admin/job/child/publish/index.tsx b/src/app_modules/admin/job/child/publish/index.tsx index 57e97917..dcd0e6fe 100644 --- a/src/app_modules/admin/job/child/publish/index.tsx +++ b/src/app_modules/admin/job/child/publish/index.tsx @@ -114,7 +114,7 @@ function TableStatus({ dataPublish }: { dataPublish: any }) { Lihat ) : ( -
+
Tidak ada poster @@ -176,7 +176,7 @@ function TableStatus({ dataPublish }: { dataPublish: any }) { verticalSpacing={"md"} horizontalSpacing={"md"} p={"md"} - w={1500} + w={"100%"} h={"100%"} striped highlightOnHover diff --git a/src/app_modules/admin/job/child/reject/index.tsx b/src/app_modules/admin/job/child/reject/index.tsx index c18e3829..f3a8b497 100644 --- a/src/app_modules/admin/job/child/reject/index.tsx +++ b/src/app_modules/admin/job/child/reject/index.tsx @@ -249,7 +249,7 @@ function TableStatus({ listReject }: { listReject: any }) { verticalSpacing={"md"} horizontalSpacing={"md"} p={"md"} - w={1500} + w={"100%"} h={"100%"} striped highlightOnHover diff --git a/src/app_modules/admin/job/child/review/index.tsx b/src/app_modules/admin/job/child/review/index.tsx index e3805437..75b4145a 100644 --- a/src/app_modules/admin/job/child/review/index.tsx +++ b/src/app_modules/admin/job/child/review/index.tsx @@ -278,7 +278,7 @@ function TableStatus({ listReview }: { listReview: any }) { verticalSpacing={"md"} horizontalSpacing={"md"} p={"md"} - w={1500} + w={"100%"} h={"100%"} striped highlightOnHover @@ -375,6 +375,7 @@ async function onReject({ if (reject.status === 200) { const loadData = await adminJob_getListReview({ page: 1 }); onLoadData(loadData); + ComponentGlobal_NotifikasiBerhasil(reject.message); const dataNotif = { @@ -393,7 +394,7 @@ async function onReject({ if (notif.status === 201) { mqtt_client.publish( "USER", - JSON.stringify({ userId: reject?.data?.authorId, count: 1 }) + JSON.stringify({ userId: dataNotif.userId, count: 1 }) ); } } else { diff --git a/src/app_modules/forum/component/detail_component/detail_header.tsx b/src/app_modules/forum/component/detail_component/detail_header.tsx new file mode 100644 index 00000000..63ec8d26 --- /dev/null +++ b/src/app_modules/forum/component/detail_component/detail_header.tsx @@ -0,0 +1,466 @@ +"use client"; + +import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; +import { + Stack, + Grid, + Avatar, + Divider, + Text, + Group, + ThemeIcon, + ActionIcon, + Badge, + Button, + Drawer, + Loader, + Modal, + Title, +} from "@mantine/core"; +import { useRouter } from "next/navigation"; +import moment from "moment"; +import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; +import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; +import { + IconCircleFilled, + IconDots, + IconEdit, + IconFlag3, + IconMessageCircle, + IconSquareCheck, + IconSquareRoundedX, + IconTrash, +} from "@tabler/icons-react"; +import { IconCircle } from "@tabler/icons-react"; +import ComponentForum_PostingButtonMore from "../more_button/posting_button_more"; +import ComponentForum_DetailMoreButton from "../more_button/detail_more_button"; +import { MODEL_FORUM_POSTING } from "../../model/interface"; +import { useDisclosure } from "@mantine/hooks"; +import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; +import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; +import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; +import { useState } from "react"; +import { forum_funDeletePostingById } from "../../fun/delete/fun_delete_posting_by_id"; +import { forum_funEditStatusPostingById } from "../../fun/edit/fun_edit_status_posting_by_id"; +import { forum_getOnePostingById } from "../../fun/get/get_one_posting_by_id"; +import mqtt_client from "@/util/mqtt_client"; + +export default function ComponentForum_DetailHeader({ + data, + userLoginId, + onLoadData, +}: { + data?: MODEL_FORUM_POSTING; + userLoginId: string; + onLoadData: (val: any) => void; +}) { + const router = useRouter(); + + return ( + <> + + + { + if (data?.Author?.id) { + router.push(RouterForum.forumku + data?.Author?.id); + } else { + ComponentGlobal_NotifikasiPeringatan("Id tidak ditemukan"); + } + }} + > + + + + + + + {data?.Author.username ? data?.Author.username : "Nama author "} + + + + {(data?.ForumMaster_StatusPosting.id as any) === 1 + ? "Open" + : "Close"} + + + + + + + { + onLoadData(val); + }} + /> + + + {/* {isPembatas ? : ""} */} + + + ); +} + +function ComponentForum_DetailButtonMore_V2({ + authorId, + postingId, + statusId, + userLoginId, + onLoadData, +}: { + authorId: any; + postingId?: any; + statusId: any; + userLoginId: any; + onLoadData: (val: any) => void; +}) { + const router = useRouter(); + const [opened, { open, close }] = useDisclosure(false); + const [openDel, setOpenDel] = useState(false); + const [openStatusClose, setOpenStatusClose] = useState(false); + + // loading + const [loadingEdit, setLoadingEdit] = useState(false); + const [loadingReport, setLoadingReport] = useState(false); + + // if (loadingEdit) return ; + + return ( + <> + + + {userLoginId != authorId ? ( + "" + ) : ( + + { + close(); + setOpenStatusClose(true); + }} + > + + {statusId === 1 ? ( + + ) : ( + + )} + + + {statusId === 1 ? ( + Tutup forum + ) : ( + Buka forum + )} + + + + { + close(); + setOpenDel(true); + }} + > + + + + + Hapus + + + + { + setLoadingEdit(true); + router.push(RouterForum.edit_posting + postingId); + }} + > + + + + + + Edit posting{" "} + {loadingEdit ? : ""} + + + + + )} + + {userLoginId == authorId ? ( + "" + ) : ( + { + setLoadingReport(true); + router.push(RouterForum.report_posting + postingId); + }} + > + + + + + + + Laporkan posting + {" "} + {loadingReport ? : ""} + + + + )} + + + + + + { + setOpenDel(false); + }} + centered + withCloseButton={false} + > + + + + setOpenStatusClose(false)} + centered + withCloseButton={false} + > + { + onLoadData(val); + }} + /> + + + open()}> + + + + ); +} + +function ButtonDelete({ + postingId, + setOpenDel, +}: { + postingId?: string; + setOpenDel: any; +}) { + const router = useRouter(); + const [loading, setLoading] = useState(false); + + if (loading) return ; + + async function onDelete() { + setOpenDel(false); + await forum_funDeletePostingById(postingId as any).then((res) => { + if (res.status === 200) { + ComponentGlobal_NotifikasiBerhasil(`Postingan Terhapus`, 2000); + setLoading(true); + router.back(); + + // mqtt_client.publish( + // "Forum_detail_hapus_data", + // JSON.stringify({ + // id: postingId, + // }) + // ); + } else { + ComponentGlobal_NotifikasiGagal(res.message); + } + }); + } + return ( + <> + + Yakin menghapus posting ini ? + + + + + + + ); +} + +function ButtonStatus({ + postingId, + setOpenStatus, + statusId, + onLoadData, +}: { + postingId?: string; + setOpenStatus: any; + statusId?: any; + onLoadData: (val: any) => void; +}) { + const [loading, setLoading] = useState(false); + + async function onTutupForum() { + setOpenStatus(false); + + const closeForum = await forum_funEditStatusPostingById( + postingId as any, + 2 + ); + if (closeForum.status === 200) { + ComponentGlobal_NotifikasiBerhasil(`Forum Ditutup`, 2000); + setLoading(true); + + const loadData = await forum_getOnePostingById(postingId as any); + onLoadData(loadData); + + if (loadData) { + const updateData = { + ...loadData, + ForumMaster_StatusPosting: { + id: 2, + status: "Close", + }, + }; + + mqtt_client.publish( + "Forum_detail_ganti_status", + JSON.stringify({ + id: postingId, + data: updateData.ForumMaster_StatusPosting, + }) + ); + } + } else { + ComponentGlobal_NotifikasiGagal(closeForum.message); + } + } + + async function onBukaForum() { + setOpenStatus(false); + + const openForum = await forum_funEditStatusPostingById(postingId as any, 1); + if (openForum.status === 200) { + ComponentGlobal_NotifikasiBerhasil(`Forum Dibuka`, 2000); + setLoading(true); + + const loadData = await forum_getOnePostingById(postingId as any); + onLoadData(loadData); + + if (loadData) { + const updateData = { + ...loadData, + ForumMaster_StatusPosting: { + id: 1, + status: "Open", + }, + }; + + mqtt_client.publish( + "Forum_detail_ganti_status", + JSON.stringify({ + id: postingId, + data: updateData.ForumMaster_StatusPosting, + }) + ); + } + } else { + ComponentGlobal_NotifikasiGagal(openForum.message); + } + } + + return ( + <> + + {statusId === 1 ? ( + Yakin menutup forum ini ? + ) : ( + Yakin membuka forum ini ? + )} + + + + {statusId === 1 ? ( + + ) : ( + + )} + + + + ); +} diff --git a/src/app_modules/forum/component/main_component/card_header.tsx b/src/app_modules/forum/component/main_component/card_header.tsx index 92487d9c..23683649 100644 --- a/src/app_modules/forum/component/main_component/card_header.tsx +++ b/src/app_modules/forum/component/main_component/card_header.tsx @@ -27,11 +27,13 @@ export default function ComponentForum_V2_HeaderCard({ isMoreButton, userLoginId, onLoadData, + allData, }: { data: MODEL_FORUM_POSTING; isMoreButton: boolean; userLoginId: string; - onLoadData: (val: any) => void + onLoadData: (val: any) => void; + allData: any[]; }) { const router = useRouter(); const [isLoading, setIsLoading] = useState(false); @@ -91,11 +93,7 @@ export default function ComponentForum_V2_HeaderCard({ : "red" } > - - {(data.ForumMaster_StatusPosting.id as any) === 1 - ? "Open" - : "Close"} - + {data?.ForumMaster_StatusPosting.status} @@ -104,8 +102,8 @@ export default function ComponentForum_V2_HeaderCard({ - {data.createdAt - ? data.createdAt.toLocaleDateString(["id-ID"], { + {data.createdAt !== undefined && data?.createdAt + ? new Date(data?.createdAt).toLocaleDateString(["id-ID"], { day: "numeric", month: "short", }) @@ -130,8 +128,8 @@ export default function ComponentForum_V2_HeaderCard({ statusId={data?.ForumMaster_StatusPosting.id} userLoginId={userLoginId} onLoadData={onLoadData} + allData={allData} /> - ) : ( "" diff --git a/src/app_modules/forum/component/main_component/card_more_button.tsx b/src/app_modules/forum/component/main_component/card_more_button.tsx index c082b7c6..d5aee877 100644 --- a/src/app_modules/forum/component/main_component/card_more_button.tsx +++ b/src/app_modules/forum/component/main_component/card_more_button.tsx @@ -29,9 +29,11 @@ import { useState } from "react"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { forum_funDeletePostingById } from "../../fun/delete/fun_delete_posting_by_id"; import { forum_funEditStatusPostingById } from "../../fun/edit/fun_edit_status_posting_by_id"; -import { forum_getListAllPosting } from "../../fun/get/get_list_all_posting"; -import { forum_new_getAllPosting } from "../../fun/get/new_get_all_posting"; import forum_v2_getAllPosting from "../../fun/get/v2_get_all_posting"; +import { forum_new_getAllPosting } from "../../fun/get/new_get_all_posting"; +import _ from "lodash"; +import { MODEL_FORUM_POSTING } from "../../model/interface"; +import mqtt_client from "@/util/mqtt_client"; export default function ComponentForum_V2_CardMoreButton({ authorId, @@ -39,12 +41,14 @@ export default function ComponentForum_V2_CardMoreButton({ statusId, userLoginId, onLoadData, + allData, }: { authorId: any; postingId?: any; statusId?: any; userLoginId: any; onLoadData: (val: any) => void; + allData: any[]; }) { const router = useRouter(); @@ -170,8 +174,12 @@ export default function ComponentForum_V2_CardMoreButton({ { + onLoadData(val); + }} + allData={allData} /> + {/*
{JSON.stringify(allData, null, 2)}
*/} { + onLoadData(val); + }} userLoginId={userLoginId} authorId={authorId} + allData={allData} /> @@ -201,10 +212,12 @@ function ButtonDelete({ postingId, setOpenDel, onLoadData, + allData, }: { postingId?: string; setOpenDel: any; onLoadData: (val: any) => void; + allData: MODEL_FORUM_POSTING[]; }) { const [loading, setLoading] = useState(false); @@ -212,14 +225,23 @@ function ButtonDelete({ setOpenDel(false); await forum_funDeletePostingById(postingId as any).then(async (res) => { if (res.status === 200) { - // ComponentGlobal_NotifikasiBerhasil(`Postingan Terhapus`, 2000); + ComponentGlobal_NotifikasiBerhasil(`Postingan Terhapus`, 2000); setLoading(true); - const loadData = await forum_new_getAllPosting({ page: 1 }); - onLoadData(loadData); - return null; + + const cloneData = _.clone(allData); + const hapusData = cloneData.filter((e) => e.id !== postingId); + + onLoadData(hapusData); + + mqtt_client.publish( + "Forum_hapus_data", + JSON.stringify({ + data: hapusData, + }) + ); + } else { - // ComponentGlobal_NotifikasiGagal(res.message); - return null; + ComponentGlobal_NotifikasiGagal(res.message); } }); } @@ -255,6 +277,7 @@ function ButtonStatus({ onLoadData, userLoginId, authorId, + allData, }: { postingId?: string; setOpenStatus: any; @@ -262,6 +285,7 @@ function ButtonStatus({ onLoadData: (val: any) => void; userLoginId: string; authorId: string; + allData: MODEL_FORUM_POSTING[]; }) { const [loading, setLoading] = useState(false); @@ -274,35 +298,117 @@ function ButtonStatus({ ); if (upateStatusClose.status === 200) { ComponentGlobal_NotifikasiBerhasil(`Forum Ditutup`, 2000); - - const loadData = await forum_v2_getAllPosting({}) - onLoadData(loadData); setLoading(true); + const cloneData = _.clone(allData); + const loadData = cloneData.map( + (e) => ( + e.id === postingId, + { + ...e, + ForumMaster_StatusPosting: { + id: e.id === postingId ? 2 : e.ForumMaster_StatusPosting.id, + status: + e.id === postingId + ? "Close" + : e.ForumMaster_StatusPosting.status, + }, + } + ) + ); + onLoadData(loadData); + + // + mqtt_client.publish( + "Forum_ganti_status", + JSON.stringify({ + id: postingId, + data: loadData, + }) + ); + + const findData = cloneData.find((val) => val.id === postingId); + const updateDetail = { + ...findData, + ForumMaster_StatusPosting: { + id: 2, + status: "Close", + }, + }; + + console.log(updateDetail); + + mqtt_client.publish( + "Forum_detail_ganti_status", + JSON.stringify({ + id: postingId, + data: updateDetail.ForumMaster_StatusPosting, + }) + ); } else { - ComponentGlobal_NotifikasiGagal(upateStatusClose.message); - + ComponentGlobal_NotifikasiGagal(upateStatusClose.message); } - } async function onBukaForum() { setOpenStatus(false); - await forum_funEditStatusPostingById(postingId as any, 1).then( - async (res) => { - if (res.status === 200) { - const loadData = await forum_v2_getAllPosting({}); - onLoadData(loadData); - - ComponentGlobal_NotifikasiBerhasil(`Forum Dibuka`, 2000); - setLoading(true); - - } else { - ComponentGlobal_NotifikasiGagal(res.message); - } - } + const updateStatusOpen = await forum_funEditStatusPostingById( + postingId as any, + 1 ); + if (updateStatusOpen.status === 200) { + ComponentGlobal_NotifikasiBerhasil(`Forum Dibuka`, 2000); + setLoading(true); + + const cloneData = _.clone(allData); + const loadData = cloneData.map( + (e) => ( + e.id === postingId, + { + ...e, + ForumMaster_StatusPosting: { + id: e.id === postingId ? 1 : e.ForumMaster_StatusPosting.id, + status: + e.id === postingId + ? "Open" + : e.ForumMaster_StatusPosting.status, + }, + } + ) + ); + + mqtt_client.publish( + "Forum_ganti_status", + JSON.stringify({ + id: postingId, + data: loadData, + }) + ); + + onLoadData(loadData); + + const findData = cloneData.find((val) => val.id === postingId); + const updateDetail = { + ...findData, + ForumMaster_StatusPosting: { + id: 1, + status: "Open", + }, + }; + + console.log(updateDetail.ForumMaster_StatusPosting); + + mqtt_client.publish( + "Forum_detail_ganti_status", + JSON.stringify({ + id: postingId, + data: updateDetail.ForumMaster_StatusPosting, + }) + ); + } else { + ComponentGlobal_NotifikasiGagal(updateStatusOpen.message); + } } return ( diff --git a/src/app_modules/forum/component/main_component/card_view.tsx b/src/app_modules/forum/component/main_component/card_view.tsx index 334efac6..109801b0 100644 --- a/src/app_modules/forum/component/main_component/card_view.tsx +++ b/src/app_modules/forum/component/main_component/card_view.tsx @@ -1,24 +1,23 @@ "use client"; import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; -import { Stack, Card, Group, ActionIcon, Divider, Text } from "@mantine/core"; +import { ActionIcon, Card, Divider, Group, Stack, Text } from "@mantine/core"; import { IconMessageCircle, IconMessageCircleX } from "@tabler/icons-react"; import { useRouter } from "next/navigation"; -import ComponentForum_BerandaAuthorNameOnHeader from "../beranda/beranda_author_header"; -import ComponentForum_V2_HeaderCard from "./card_header"; -import { MODEL_FORUM_POSTING } from "../../model/interface"; import { useState } from "react"; -import ComponentGlobal_CardLoadingOverlay from "@/app_modules/component_global/loading_card"; -import ComponentForum_CardLoadingOverlay from "../card_loader"; +import { MODEL_FORUM_POSTING } from "../../model/interface"; +import ComponentForum_V2_HeaderCard from "./card_header"; export default function ComponentForum_V2_MainCardView({ data, userLoginId, onLoadData, + allData, }: { - data: MODEL_FORUM_POSTING[]; + data: MODEL_FORUM_POSTING; userLoginId: string; onLoadData: (val: any) => void; + allData: any[]; }) { const router = useRouter(); const [loadingKomen, setLoadingKomen] = useState(false); @@ -28,70 +27,60 @@ export default function ComponentForum_V2_MainCardView({ return ( <> - - {data.map((e, i) => ( - - - - {/* */} - + {/*
{JSON.stringify(data, null,2)}
*/} + + + + - { - router.push(RouterForum.main_detail + e.id) - }} - > - -
- - + { + router.push(RouterForum.main_detail + data?.id); + }} + > + +
+ + - - - - { - setPostingId(e?.id), - (e?.ForumMaster_StatusPosting.id as any) === 1 - ? (router.push(RouterForum.komentar + e?.id), - setLoadingKomen(true)) - : router.push(RouterForum.main_detail + e?.id); - }} - > - {(e?.ForumMaster_StatusPosting?.id as any) === 1 ? ( - - ) : ( - - )} - + + + + { + // setPostingId(data?.id), + // (data?.ForumMaster_StatusPosting.id as any) === 1 + // ? (router.push(RouterForum.komentar + data?.id), + // setLoadingKomen(true)) + // : router.push(RouterForum.main_detail + data?.id); + // }} + > + {(data?.ForumMaster_StatusPosting?.id as any) === 1 ? ( + + ) : ( + + )} + - {/* */} + {/* */} - {e?.Forum_Komentar.length} - - - - - - ))} - + {data?.Forum_Komentar.length} + + + + + ); } diff --git a/src/app_modules/forum/create/index.tsx b/src/app_modules/forum/create/index.tsx index 71f3a3d3..c3022f64 100644 --- a/src/app_modules/forum/create/index.tsx +++ b/src/app_modules/forum/create/index.tsx @@ -95,7 +95,7 @@ function ButtonAction({ value }: { value: string }) { ComponentGlobal_NotifikasiBerhasil(create.message); setTimeout(() => router.back(), 1000); - mqtt_client.publish("Forum_user_to_user", JSON.stringify({isNewPost: true, count: 1 })); + mqtt_client.publish("Forum_create_new", JSON.stringify({isNewPost: true, count: 1 })); } else { ComponentGlobal_NotifikasiGagal(create.message); diff --git a/src/app_modules/forum/detail/index.tsx b/src/app_modules/forum/detail/index.tsx index bfdec053..7fa23b11 100644 --- a/src/app_modules/forum/detail/index.tsx +++ b/src/app_modules/forum/detail/index.tsx @@ -14,7 +14,7 @@ import { Stack, Text, } from "@mantine/core"; -import { IconMessageCircle } from "@tabler/icons-react"; +import { IconMessageCircle, IconMessageCircleX } from "@tabler/icons-react"; import ComponentForum_PostingAuthorNameOnHeader from "../component/header/posting_author_header_name"; import ComponentForum_DetailOnHeaderAuthorName from "../component/header/detail_author_header_name"; import { useRouter } from "next/navigation"; @@ -36,32 +36,78 @@ const ReactQuill = dynamic( import "react-quill/dist/quill.bubble.css"; import { forum_getKomentarById } from "../fun/get/get_komentar_by_id"; import ComponentGlobal_InputCountDown from "@/app_modules/component_global/input_countdown"; +import ComponentForum_DetailHeader from "../component/detail_component/detail_header"; +import { useShallowEffect } from "@mantine/hooks"; +import mqtt_client from "@/util/mqtt_client"; +import { MODEL_NOTIFIKASI } from "@/app_modules/notifikasi/model/interface"; +import notifikasiToUser_funCreate from "@/app_modules/notifikasi/fun/create/create_notif_to_user"; export default function Forum_Detail({ dataPosting, listKomentar, - totalKomentar, userLoginId, }: { dataPosting: MODEL_FORUM_POSTING; listKomentar: MODEL_FORUM_KOMENTAR[]; - totalKomentar: number; userLoginId: string; }) { + const [data, setData] = useState(dataPosting); const [komentar, setKomentar] = useState(listKomentar); + // useShallowEffect(() => { + // onLoadKomentar({ + // onLoad(val) { + // setKomentar(val); + // }, + // }); + // }, [setKomentar]); + + // async function onLoadKomentar({ onLoad }: { onLoad: (val: any) => void }) { + // const loadKomentar = await forum_getKomentarById(data.id); + // onLoad(loadKomentar); + // } + + useShallowEffect(() => { + mqtt_client.subscribe("Forum_detail_ganti_status"); + + mqtt_client.on("message", (topic: any, message: any) => { + const newData = JSON.parse(message.toString()); + if (newData.id === data.id) { + const cloneData = _.clone(data); + + // console.log(newData.data); + const updateData = { + ...cloneData, + ForumMaster_StatusPosting: { + id: newData.data.id, + status: newData.data.status, + }, + }; + + setData(updateData as any); + } + }); + }, [data]); + return ( <> { + setData(val); + }} /> - {(dataPosting?.ForumMaster_StatusPosting?.id as any) === 1 ? ( + {(data?.ForumMaster_StatusPosting?.id as any) === 1 ? ( { + setKomentar(val); + }} + data={data} + userLoginId={userLoginId} /> ) : ( "" @@ -69,7 +115,7 @@ export default function Forum_Detail({ @@ -78,66 +124,65 @@ export default function Forum_Detail({ } function ForumView({ - dataPosting, + data, totalKomentar, userLoginId, + onLoadData, }: { - dataPosting: MODEL_FORUM_POSTING; + data: MODEL_FORUM_POSTING; totalKomentar: number; userLoginId: string; + onLoadData: (val: any) => void; }) { return ( <> + {/*
{JSON.stringify(data, null, 2)}
*/} + + {/* HEADER */} - {/*
{JSON.stringify(dataPosting, null, 2)}
*/} - { + onLoadData(val); + }} />
+ + {/* CONTENT */} - {dataPosting?.diskusi ? ( -
+ {data?.diskusi ? ( +
) : ( "" )} + + {/* FOOTER */} - {/* { - router.push(RouterForum.komentar + dataPosting.id); - }} - > - */} - + {(data?.ForumMaster_StatusPosting?.id as any) === 1 ? ( + + ) : ( + + )} {totalKomentar} - {new Date(dataPosting?.createdAt).toLocaleTimeString()} + {new Date(data?.createdAt).toLocaleTimeString()} {/* {new Intl.RelativeTimeFormat("id", {style: "short"}).format(-1,"day")} */} - {dataPosting?.createdAt - ? dataPosting?.createdAt.toLocaleDateString(["id-ID"], { + {data?.createdAt + ? new Date(data?.createdAt).toLocaleDateString(["id-ID"], { dateStyle: "medium", }) : new Date().toLocaleDateString(["id-ID"], { @@ -156,10 +201,14 @@ function ForumView({ function CreateKomentar({ postingId, - setKomentar, + onSetKomentar, + data, + userLoginId, }: { postingId: string; - setKomentar: any; + onSetKomentar: (val: any) => void; + data: MODEL_FORUM_POSTING; + userLoginId: string; }) { const router = useRouter(); const [value, setValue] = useState(""); @@ -171,20 +220,41 @@ function CreateKomentar({ return null; } - await forum_funCreateKomentar(postingId, value).then(async (res) => { - if (res.status === 201) { - await forum_getKomentarById(postingId).then((val) => { - setKomentar(val); - // setLoading(true); - setValue(""); - setIsEmpty(true); - ComponentGlobal_NotifikasiBerhasil(res.message, 2000); + const createComment = await forum_funCreateKomentar(postingId, value); + if (createComment.status === 201) { + const loadKomentar = await forum_getKomentarById(data.id); + onSetKomentar(loadKomentar); + + setValue(""); + setIsEmpty(true); + ComponentGlobal_NotifikasiBerhasil(createComment.message, 2000); + + if (userLoginId !== data.Author.id) { + const dataNotif = { + appId: data.id, + userId: data.authorId, + pesan: value, + kategoriApp: "FORUM", + title: "Komentar baru", + }; + + const createNotifikasi = await notifikasiToUser_funCreate({ + data: dataNotif as any, }); - // router.replace(RouterForum.main_detail + postingId, { scroll: false }); - } else { - ComponentGlobal_NotifikasiGagal(res.message); + + if (createNotifikasi.status === 201) { + mqtt_client.publish( + "USER", + JSON.stringify({ + userId: dataNotif.userId, + count: 1, + }) + ); + } } - }); + } else { + ComponentGlobal_NotifikasiGagal(createComment.message); + } } return ( @@ -200,13 +270,12 @@ function CreateKomentar({ }} /> - + + - -
) : ( - listKomentar.map((e, i) => ( - - - - - - - - {e.komentar ? ( - -
- - ) : ( - "" - )} - - - - - - - - - - )) + +
+ + {" "} + Komentar + +
+ {listKomentar.map((e, i) => ( + + + + + + + + {e.komentar ? ( + +
+ + ) : ( + "" + )} + + + + + + + + + + ))} + )} diff --git a/src/app_modules/forum/fun/get/get_one_posting_by_id.ts b/src/app_modules/forum/fun/get/get_one_posting_by_id.ts index b71a649d..c8af1e02 100644 --- a/src/app_modules/forum/fun/get/get_one_posting_by_id.ts +++ b/src/app_modules/forum/fun/get/get_one_posting_by_id.ts @@ -20,13 +20,14 @@ export async function forum_getOnePostingById(postingId: string) { Profile: true, }, }, + _count: { select: { Forum_Komentar: true, }, }, - ForumMaster_StatusPosting: true - + ForumMaster_StatusPosting: true, + forumMaster_StatusPostingId: true, }, }); diff --git a/src/app_modules/forum/fun/get/new_get_all_posting.ts b/src/app_modules/forum/fun/get/new_get_all_posting.ts index 247a4e63..c95d6ac1 100644 --- a/src/app_modules/forum/fun/get/new_get_all_posting.ts +++ b/src/app_modules/forum/fun/get/new_get_all_posting.ts @@ -1,18 +1,16 @@ "use server"; -import _, { ceil } from "lodash"; import prisma from "@/app/lib/prisma"; -import { forum_countOneTotalKomentarById } from "../count/count_one_total_komentar_by_id"; -import { forum_countTotalKomenById } from "../count/count_total_komentar_by_id"; +import { ceil } from "lodash"; export async function forum_new_getAllPosting({ page, search, }: { - page: number; + page: any; search?: string; }) { - const takeData = 10; + const takeData = 5; const skipData = page * takeData - takeData; const getData = await prisma.forum_Posting.findMany({ @@ -51,25 +49,15 @@ export async function forum_new_getAllPosting({ isActive: true, }, }, - ForumMaster_StatusPosting: true, - }, - }); - - const nCount = await prisma.forum_Posting.count({ - where: { - isActive: true, - diskusi: { - mode: "insensitive", - contains: search, + ForumMaster_StatusPosting: { + select: { + id: true, + status: true, + }, }, + forumMaster_StatusPostingId: true, }, }); - const allData = { - data: getData, - nPage: ceil(nCount / takeData), - }; - - - return allData; + return getData; } diff --git a/src/app_modules/forum/komentar/index.tsx b/src/app_modules/forum/komentar/index.tsx index 2230b751..532e7233 100644 --- a/src/app_modules/forum/komentar/index.tsx +++ b/src/app_modules/forum/komentar/index.tsx @@ -66,7 +66,8 @@ export default function Forum_Komentar({ - + {dataPosting?.ForumMaster_StatusPosting?.id === "1" ? : "" } + ); diff --git a/src/app_modules/forum/main/beranda.tsx b/src/app_modules/forum/main/beranda.tsx index 7d3a1d7e..d9b4c950 100644 --- a/src/app_modules/forum/main/beranda.tsx +++ b/src/app_modules/forum/main/beranda.tsx @@ -18,6 +18,7 @@ import { Center, Button, Pagination, + Loader, } from "@mantine/core"; import { useShallowEffect, useTimeout, useWindowScroll } from "@mantine/hooks"; import { @@ -43,6 +44,7 @@ import mqtt_client from "@/util/mqtt_client"; import ComponentForum_V2_MainCardView from "../component/main_component/card_view"; import { forum_new_getAllPosting } from "../fun/get/new_get_all_posting"; import forum_v2_getAllPosting from "../fun/get/v2_get_all_posting"; +import { ScrollOnly } from "next-scroll-loader"; export default function Forum_Beranda({ listForum, @@ -55,62 +57,87 @@ export default function Forum_Beranda({ const [scroll, scrollTo] = useWindowScroll(); const [data, setData] = useState(listForum); - // const [nPage, setNPage] = useState(listForum.nPage); - // const [activePage, setActivePage] = useState(1); + const [activePage, setActivePage] = useState(1); const [isSearch, setIsSearch] = useState(""); const [loadingCreate, setLoadingCreate] = useState(false); - // + // const [isNewPost, setIsNewPost] = useState(false); const [countNewPost, setCountNewPost] = useState(0); - // useShallowEffect(() => { - // onLoadAllData({ - // onLoad(val) { - // setData(val.data); - // setNPage(val.nPage); - // }, - // }); - // }, [setData, setNPage]); + useShallowEffect(() => { + onLoadAllData({ + onLoad(val) { + setData(val); + }, + }); + }, [setData]); - // async function onLoadAllData({ onLoad }: { onLoad: (val: any) => void }) { - // const loadData = await forum_new_getAllPosting({ page: 1 }); - // onLoad(loadData); - // } + async function onLoadAllData({ onLoad }: { onLoad: (val: any) => void }) { + const loadData = await forum_new_getAllPosting({ page: 1 }); + onLoad(loadData); + } useShallowEffect(() => { - mqtt_client.subscribe("Forum_user_to_user"); + mqtt_client.subscribe("Forum_create_new"); + mqtt_client.subscribe("Forum_ganti_status"); + mqtt_client.subscribe("Forum_hapus_data"); + mqtt_client.subscribe("Forum_detail_ganti_status"); mqtt_client.on("message", (topic: any, message: any) => { - const data = JSON.parse(message.toString()); - // console.log(data); - setIsNewPost(data.isNewPost); - const tambah = countNewPost + data.count; - setCountNewPost(tambah); + // console.log(topic); + const cloneData = _.clone(data); + + if (topic === "Forum_create_new") { + const newData = JSON.parse(message.toString()); + setIsNewPost(newData.isNewPost); + const tambah = countNewPost + newData.count; + setCountNewPost(tambah); + } + + if (topic === "Forum_hapus_data") { + const newData = JSON.parse(message.toString()); + setData(newData.data); + } + + if (topic === "Forum_ganti_status") { + const newData = JSON.parse(message.toString()); + setData(newData.data); + } + + if (topic === "Forum_detail_ganti_status") { + const newData = JSON.parse(message.toString()); + + const updateOneData = cloneData.map((val) => ({ + ...val, + ForumMaster_StatusPosting: { + id: + val.id === newData.id + ? newData.data.id + : val.ForumMaster_StatusPosting.id, + status: + val.id === newData.id + ? newData.data.status + : val.ForumMaster_StatusPosting.status, + }, + })); + + setData(updateOneData as any); + } }); - }, [countNewPost]); + }, [countNewPost, data]); async function onSearch(text: string) { setIsSearch(text); - const search = await forum_v2_getAllPosting({search: text}); - setData(search as any); - // setNPage(search.nPage); - // setActivePage(1); + const loadSearch = await forum_new_getAllPosting({ + page: activePage, + search: text, + }); + setData(loadSearch as any); + setActivePage(1); } - // async function onClickPage(nextpage: number) { - // setActivePage(nextpage); - // const next = await forum_new_getAllPosting({ - // page: nextpage, - // search: isSearch, - // }); - // scrollTo({ y: 0 }); - // setData(next.data as any); - // setNPage(next.nPage); - // } - - return ( <> {isNewPost && ( @@ -118,7 +145,7 @@ export default function Forum_Beranda({ setData(val)} - onSetNewPost={(val) => { + onSetIsNewPost={(val) => { setIsNewPost(val); }} onSetCountNewPosting={(val) => { @@ -168,32 +195,38 @@ export default function Forum_Beranda({ ) : ( // --- Main component --- // - ( +
+ +
+ )} data={data} - userLoginId={userLoginId} - onLoadData={(val) => { - setData(val); - // setNPage(val.nPage); + setData={setData} + moreData={async () => { + const loadData = await forum_new_getAllPosting({ + page: activePage + 1, + search: isSearch, + }); + setActivePage((val) => val + 1); + + return loadData; }} - /> + > + {(item) => ( + { + setData(val); + }} + allData={data} + /> + )} + )} - - {/*
- { - onClickPage(val); - }} - styles={(theme) => ({ - control: { - borderRadius: "100%", - - }, - })} - /> -
*/} ); } @@ -201,12 +234,12 @@ export default function Forum_Beranda({ function ButtonUpdateBeranda({ countNewPost, onSetData, - onSetNewPost, + onSetIsNewPost, onSetCountNewPosting, }: { countNewPost: number; onSetData: (val: any) => void; - onSetNewPost: (val: any) => void; + onSetIsNewPost: (val: any) => void; onSetCountNewPosting: (val: any) => void; }) { const [scroll, scrollTo] = useWindowScroll(); @@ -214,10 +247,11 @@ function ButtonUpdateBeranda({ async function onLoadData() { setIsLoading(true); - const loadData = await forum_getListAllPosting(); + const loadData = await forum_new_getAllPosting({ page: 1 }); + if (loadData) { onSetData(loadData); - onSetNewPost(false); + onSetIsNewPost(false); setIsLoading(false); onSetCountNewPosting(0); } diff --git a/src/app_modules/forum/model/interface.tsx b/src/app_modules/forum/model/interface.tsx index fc543f10..014c0139 100644 --- a/src/app_modules/forum/model/interface.tsx +++ b/src/app_modules/forum/model/interface.tsx @@ -9,10 +9,11 @@ export interface MODEL_FORUM_POSTING { diskusi: string; authorId: string; Author: MODEL_USER; - _count: number + _count: number; Forum_Komentar: MODEL_FORUM_KOMENTAR[]; Forum_ReportPosting: MODEL_FORUM_MASTER_REPORT[]; ForumMaster_StatusPosting: MODEL_FORUM_MASTER_STATUS; + forumMaster_StatusPostingId: number } export interface MODEL_FORUM_KOMENTAR { diff --git a/src/app_modules/forum/report/posting/index.tsx b/src/app_modules/forum/report/posting/index.tsx index 03c6fcf6..0b599f0d 100644 --- a/src/app_modules/forum/report/posting/index.tsx +++ b/src/app_modules/forum/report/posting/index.tsx @@ -8,13 +8,18 @@ import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_glob import { useRouter } from "next/navigation"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; +import mqtt_client from "@/util/mqtt_client"; +import adminNotifikasi_funCreateToUser from "@/app_modules/admin/notifikasi/fun/create/fun_create_notif_user"; +import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif_to_admin"; export default function Forum_ReportPosting({ postingId, listReport, + userLoginId, }: { postingId: string; listReport: MODEL_FORUM_MASTER_REPORT[]; + userLoginId: string; }) { const [reportValue, setReportValue] = useState("Kebencian"); @@ -34,7 +39,11 @@ export default function Forum_ReportPosting({ ))} - + ); @@ -43,36 +52,55 @@ export default function Forum_ReportPosting({ function ButtonAction({ value, postingId, + userLoginId, }: { value: string; postingId: string; + userLoginId: string; }) { const router = useRouter(); const [loading, setLoading] = useState(false); async function onReport() { - await forum_funCreateReportPosting(postingId, value).then((res) => { - if (res.status === 201) { - ComponentGlobal_NotifikasiBerhasil(res.message, 2000); - setLoading(true); - router.back(); - } else { - ComponentGlobal_NotifikasiGagal(res.message); - } - }); + const report = await forum_funCreateReportPosting(postingId, value); + if (report.status === 201) { + ComponentGlobal_NotifikasiBerhasil(report.message, 2000); + setLoading(true); + router.back(); + + // const dataNotif = { + // appId: postingId, + // pesan: value, + // kategoriApp: "FORUM", + // title: "Report Posting", + // userId: userLoginId, + // }; + + // const notif = await notifikasiToAdmin_funCreate({ + // data: dataNotif as any, + // }); + + // if (notif.status === 201) { + // mqtt_client.publish("ADMIN", JSON.stringify({ count: 1 })); + // } + } else { + ComponentGlobal_NotifikasiGagal(report.message); + } } return ( <> - diff --git a/src/app_modules/home/layout.tsx b/src/app_modules/home/layout.tsx index 63079c15..090698df 100644 --- a/src/app_modules/home/layout.tsx +++ b/src/app_modules/home/layout.tsx @@ -56,9 +56,12 @@ export default function HomeLayout({ useShallowEffect(() => { mqtt_client.subscribe("USER"); + // mqtt_client.subscribe("Notifikasi_forum_create_komentar"); mqtt_client.on("message", (topic: any, message: any) => { + console.log(topic); const data = JSON.parse(message.toString()); + if (data.userId === dataUser.id) { setCountNotif(countNotif + data.count); } diff --git a/src/app_modules/job/create/view.tsx b/src/app_modules/job/create/view.tsx index 68b6eca4..5684f001 100644 --- a/src/app_modules/job/create/view.tsx +++ b/src/app_modules/job/create/view.tsx @@ -36,7 +36,7 @@ import { defaultDeskripsi, defaultSyarat } from "../component/default_value"; import ComponentJob_NotedBox from "../component/detail/noted_box"; import { MODEL_JOB } from "../model/interface"; import { Job_funCreate } from "../fun/create/fun_create"; -import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif"; +import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif_to_admin"; import { RouterJob } from "@/app/lib/router_hipmi/router_job"; import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; @@ -229,7 +229,7 @@ function ButtonAction({ value, file }: { value: MODEL_JOB; file: FormData }) { const create = await Job_funCreate(value as any, gambar); if (create.status === 201) { - const dataNotif : any = { + const dataNotif: any = { appId: create.data?.id as any, kategoriApp: "JOB", status: create.data?.MasterStatus?.name as any, @@ -237,8 +237,10 @@ function ButtonAction({ value, file }: { value: MODEL_JOB; file: FormData }) { pesan: create.data?.title as any, title: "Job baru", }; - const notif = await notifikasiToAdmin_funCreate({ data: dataNotif as any }); - console.log(notif) + const notif = await notifikasiToAdmin_funCreate({ + data: dataNotif as any, + }); + // console.log(notif); if (notif.status === 201) { mqtt_client.publish( diff --git a/src/app_modules/job/detail/draft/view.tsx b/src/app_modules/job/detail/draft/view.tsx index f9082be1..cd647f9a 100644 --- a/src/app_modules/job/detail/draft/view.tsx +++ b/src/app_modules/job/detail/draft/view.tsx @@ -15,7 +15,7 @@ import { Job_funDeleteById } from "../../fun/delete/fun_delete_by_id"; import ComponentJob_NotedBox from "../../component/detail/noted_box"; import { MODEL_JOB } from "../../model/interface"; import mqtt_client from "@/util/mqtt_client"; -import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif"; +import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif_to_admin"; export default function Job_DetailDraft({ dataJob }: { dataJob: MODEL_JOB }) { return ( diff --git a/src/app_modules/job/detail/review/view.tsx b/src/app_modules/job/detail/review/view.tsx index 7d4857d1..d10c680c 100644 --- a/src/app_modules/job/detail/review/view.tsx +++ b/src/app_modules/job/detail/review/view.tsx @@ -10,7 +10,7 @@ import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_glob import { MODEL_JOB } from "../../model/interface"; import { Job_funEditStatusByStatusId } from "../../fun/edit/fun_edit_status_by_status_id"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; -import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif"; +import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif_to_admin"; import mqtt_client from "@/util/mqtt_client"; export default function Job_DetailReview({ dataJob }: { dataJob: MODEL_JOB }) { diff --git a/src/app_modules/notifikasi/fun/create/create_notif.tsx b/src/app_modules/notifikasi/fun/create/create_notif_to_admin.tsx similarity index 100% rename from src/app_modules/notifikasi/fun/create/create_notif.tsx rename to src/app_modules/notifikasi/fun/create/create_notif_to_admin.tsx diff --git a/src/app_modules/notifikasi/fun/create/create_notif_to_user.tsx b/src/app_modules/notifikasi/fun/create/create_notif_to_user.tsx new file mode 100644 index 00000000..e6f5ce65 --- /dev/null +++ b/src/app_modules/notifikasi/fun/create/create_notif_to_user.tsx @@ -0,0 +1,24 @@ +"use server"; + +import prisma from "@/app/lib/prisma"; +import { MODEL_NOTIFIKASI } from "../../model/interface"; + +export default async function notifikasiToUser_funCreate({ + data, +}: { + data: MODEL_NOTIFIKASI; +}) { + const created = await prisma.notifikasi.create({ + data: { + userId: data.userId, + appId: data.appId, + status: data.status, + title: data.title, + pesan: data.pesan, + kategoriApp: data.kategoriApp, + userRoleId: "1", + }, + }); + if (!created) return { status: 400, message: "Gagal mengirim notifikasi" }; + return { status: 201, message: "Berhasil mengirim notifikasi" }; +} diff --git a/src/app_modules/notifikasi/main/index.tsx b/src/app_modules/notifikasi/main/index.tsx index 9a9f64d2..2a8ad163 100644 --- a/src/app_modules/notifikasi/main/index.tsx +++ b/src/app_modules/notifikasi/main/index.tsx @@ -26,6 +26,9 @@ import { useAtom } from "jotai"; import { gs_job_hot_menu, gs_job_status } from "@/app_modules/job/global_state"; import _ from "lodash"; import ComponentGlobal_IsEmptyData from "@/app_modules/component_global/is_empty_data"; +import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; +import notifikasi_getByUserId from "../fun/get/get_notifiaksi_by_id"; +import { useShallowEffect } from "@mantine/hooks"; export default function Notifikasi_MainView({ listNotifikasi, @@ -51,6 +54,19 @@ function MainView({ listNotifikasi }: { listNotifikasi: MODEL_NOTIFIKASI[] }) { const [jobMenuId, setJobMenuId] = useAtom(gs_job_hot_menu); const [jobStatus, setJobStatus] = useAtom(gs_job_status); + useShallowEffect(() => { + onLoadData({ + onLoad(val) { + setData(val); + }, + }); + }, []); + + async function onLoadData({ onLoad }: { onLoad: (val: any) => void }) { + const loadData = await notifikasi_getByUserId(); + onLoad(loadData); + } + if (_.isEmpty(data)) { return ; } @@ -74,7 +90,6 @@ function MainView({ listNotifikasi }: { listNotifikasi: MODEL_NOTIFIKASI[] }) { borderColor: "gray", borderStyle: "solid", borderWidth: "0.5px", - }} onClick={async () => { e?.kategoriApp === "JOB" && @@ -87,12 +102,19 @@ function MainView({ listNotifikasi }: { listNotifikasi: MODEL_NOTIFIKASI[] }) { }, }); - const cek = await notifikasi_funUpdateIsReadById({ + e?.kategoriApp === "FORUM" && + redirectDetailForumPage({ + appId: e.appId, + router: router, + }); + + const updateIsRead = await notifikasi_funUpdateIsReadById({ notifId: e?.id, }); - if (cek.status === 200) return null; + if (updateIsRead.status === 200) return null; }} > + {/*
{JSON.stringify(e, null, 2)}
*/} @@ -105,13 +127,22 @@ function MainView({ listNotifikasi }: { listNotifikasi: MODEL_NOTIFIKASI[] }) { - + {e?.title} - - {e?.pesan} - + {e.kategoriApp === "FORUM" ? ( +
+ ) : ( + // + // + + {e?.pesan} + + )} @@ -179,3 +210,14 @@ function redirectJobPage({ router.push(path); } + +function redirectDetailForumPage({ + appId, + router, +}: { + appId: string; + router: AppRouterInstance; +}) { + const path = RouterForum.main_detail + appId; + router.push(path); +} diff --git a/src/app_modules/zCoba/index.tsx b/src/app_modules/zCoba/index.tsx index 33a4709f..ae664453 100644 --- a/src/app_modules/zCoba/index.tsx +++ b/src/app_modules/zCoba/index.tsx @@ -2,6 +2,7 @@ import { Box, + Button, Center, Group, LoadingOverlay, @@ -18,120 +19,83 @@ import useInfiniteScroll, { import { createItems, loadMore } from "./utils"; import { v4 as uuidv4 } from "uuid"; import { useShallowEffect } from "@mantine/hooks"; +import { ScrollOnly } from "next-scroll-loader"; +import _ from "lodash"; + +const newData = Array(20) + .fill(0) + .map((e, i) => i + 1); + +const data2 = [ + { + id: 1, + name: "bagas", + age: 28, + }, + { + id: 2, + name: "lukman", + age: 25, + }, + { + id: 3, + name: "marcel", + age: 23, + }, +]; export default function Coba_TestLoading() { - const [data, setData] = useState([]); - const [isLoading, setIsLoading] = useState(false); + // const [data, setData] = useState(newData); + // const [isLoading, setIsLoading] = useState(false); - const next = async (direction: ScrollDirection) => { - try { - setIsLoading(true); - const newData = await loadMore(); + // return ( + // <> + // { + // const newData = Array.from( + // { length: 50 }, + // (_, i) => i + data.length + 1 + // ); + // await new Promise((resolve) => setTimeout(resolve, 2000)); + // return newData; + // }} + // > + // {(item) =>
{item}
} + //
+ // + // ); - setData((prev) => - direction === "up" ? [...newData, ...prev] : [...prev, ...newData] - ); - } finally { - setIsLoading(false); - } - }; - - const ref = useInfiniteScroll({ - next, - rowCount: data.length, - hasMore: { up: true }, - }); - - useShallowEffect(() => { - const d = createItems(); - setData([...d]); - }, []); - - // const next = async (direction: ScrollDirection) => { - // setIsLoading(true); - // const ar = Array.from({ length: 100 }).map((v, i) => "baru" + i); - // const d = direction === "up" ? [...ar, ...obrolan] : []; - // console.log(d); - // setObrolan(d); - // await new Promise((r) => setTimeout(r, 100)); - // setIsLoading(false); - // }; - - // const ref = useInfiniteScroll({ - // next, - // rowCount: obrolan.length, - // hasMore: { up: true }, - // }); - - useShallowEffect(() => { - // const a = Array.from({ length: 100 }).map((x) => "apa"); - // setObrolan(a); - // mqtt_client.subscribe(roomId); - // mqtt_client.on("message", (data: any, msg: any) => { - // onList(setObrolan); - // }); - }, []); + const [data, setData] = useState(data2); return ( <> - -
- {isLoading &&
Loading...
} - - {data.map((item, index) => ( - - {item} - - ))} - -
+ + + + + +
{JSON.stringify(data, null, 2)}
); } - -// export default function ComponentCobaCoba_LoadingPage() { -// const listhHuruf = [ -// { -// huruf: "H", -// }, -// { -// huruf: "I", -// }, -// { -// huruf: "P", -// }, -// { -// huruf: "M", -// }, -// { -// huruf: "I", -// }, -// ]; -// const customLOader = ( -//
-// -// {listhHuruf.map((e, i) => ( -//
-// -// -// {e.huruf} -// -//
-// ))} -//
-//
-// ); - -// return ( -// <> -// -// -// ); -// } diff --git a/yarn.lock b/yarn.lock index 681f31ba..64605bc4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3718,10 +3718,10 @@ next-dev@^1.1.9: readdirp "^3.6.0" yargs "^17.7.2" -next-scroll-loader@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/next-scroll-loader/-/next-scroll-loader-1.0.5.tgz#e25aaed2c3e5c60bf6d2fa89a387b62483b2ffd0" - integrity sha512-j2/yQkjtCZttnpZcKMyLbIylBsGsutFD4Net0cdk3lYOWN7FmPRUlpK0JrZP+KGnq6pyuXh6OxCxY9HJ8BWGZQ== +next-scroll-loader@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/next-scroll-loader/-/next-scroll-loader-1.0.9.tgz#5d33260c086fbce9061ab5281694355395e91d4f" + integrity sha512-TezMxzzgJ1XP7rk+dFbAgIpWtvTPUx1KnE8o19Rr/rxT5WnHZ67HBzP9KXAM1t4MAao+HT9OwG1KDSCi0GL8lg== dependencies: react "^18.3.1" react-dom "^18.3.1" From 73c92f97a1258e1713976d7ad574b26b36c4b100 Mon Sep 17 00:00:00 2001 From: Bagasbanuna02 Date: Fri, 21 Jun 2024 10:08:39 +0800 Subject: [PATCH 03/17] UI Login # feat : # fix - Tampilan depan ## No issue --- src/app_modules/auth/login/view.tsx | 100 ++++++++++-------- src/app_modules/auth/splash/view.tsx | 18 ++-- .../component_global/color/color_pallet.ts | 12 +++ 3 files changed, 73 insertions(+), 57 deletions(-) create mode 100644 src/app_modules/component_global/color/color_pallet.ts diff --git a/src/app_modules/auth/login/view.tsx b/src/app_modules/auth/login/view.tsx index a8dfc89f..6f08325d 100644 --- a/src/app_modules/auth/login/view.tsx +++ b/src/app_modules/auth/login/view.tsx @@ -24,6 +24,11 @@ import { RouterAuth } from "@/app/lib/router_hipmi/router_auth"; import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; import { PhoneInput } from "react-international-phone"; import "react-international-phone/style.css"; +import { + AccentColor, + MainColor, +} from "@/app_modules/component_global/color/color_pallet"; +import ComponentGlobal_ErrorInput from "@/app_modules/component_global/error_input"; export default function Login() { const router = useRouter(); @@ -31,15 +36,13 @@ export default function Login() { const focusTrapRef = useFocusTrap(); const [phone, setPhone] = useState(""); const [loading, setLoading] = useState(false); + const [isError, setError] = useState(false); async function onLogin() { - // if (nomor.length < 10) - // return ComponentGlobal_NotifikasiPeringatan("Nomor minimal 10 digit"); - // if (nomor.length > 13) - // return ComponentGlobal_NotifikasiPeringatan("Nomor maximal 13 digit"); - const nomorHp = phone.substring(1); - // console.log(nomorHp) + console.log(nomorHp); + + if (nomorHp.length <= 4) return setError(true); await auth_funLogin(nomorHp).then((res) => { if (res.status === 200) { @@ -79,47 +82,54 @@ export default function Login() { return ( <> - -
- -
- logo -
- - Selamat Datang di HIPMI App - - Silahkan masukan nomor telepon anda untuk masuk ! - - + + + + WELCOME TO + + HIPMI APPS + - { - setPhone(val); - }} - /> + +
+ Nomor telepon +
+ { + setPhone(val); + }} + /> - -
-
+ {isError ? ( + + ) : ( + "" + )} + + +
); diff --git a/src/app_modules/auth/splash/view.tsx b/src/app_modules/auth/splash/view.tsx index 80df56af..b7ae6b7a 100644 --- a/src/app_modules/auth/splash/view.tsx +++ b/src/app_modules/auth/splash/view.tsx @@ -1,23 +1,17 @@ "use client"; +import { MainColor } from "@/app_modules/component_global/color/color_pallet"; import { - AspectRatio, - Box, Center, - Flex, Image, Paper, - Stack, - Text, - Title, + Stack } from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; import { useRouter } from "next/navigation"; -import { useState } from "react"; export default function SplashScreen({ data }: { data: any }) { const router = useRouter(); - const [val, setVal] = useState(false); useShallowEffect(() => { if (!data) { @@ -32,16 +26,16 @@ export default function SplashScreen({ data }: { data: any }) { }, []); return ( <> -
+
{/* Welcome to */} - +
diff --git a/src/app_modules/component_global/color/color_pallet.ts b/src/app_modules/component_global/color/color_pallet.ts new file mode 100644 index 00000000..9ce5fab0 --- /dev/null +++ b/src/app_modules/component_global/color/color_pallet.ts @@ -0,0 +1,12 @@ +export const MainColor = { + black: "#202020", + darkblue: "#001D3D", + yellow: "#FFC300", +}; + +export const AccentColor = { + blackgray: "#333533", + darkblue: "#002E59", + blue: "#00447D", + yellow: "#FFD60A", +}; From 1a157846c1c4e3ebbd0e94377835769c4e808c64 Mon Sep 17 00:00:00 2001 From: Bagasbanuna02 Date: Mon, 24 Jun 2024 23:07:54 +0800 Subject: [PATCH 04/17] Fix tampilan admin dan notifikasi to admin # fix - Notifikasi report posting _ Realtime notifikasi ## Issuee: Cooming soon saat report komentar langsung menuju tablenya --- .../forum/child/report-komentar/page.tsx | 9 - .../admin/forum/child/report-posting/page.tsx | 9 - .../semua-komentar => detail}/[id]/page.tsx | 10 +- .../forum/hasil-report/komentar/[id]/page.tsx | 13 - .../sub-detail/report-komentar/[id]/page.tsx | 16 + .../report-posting}/[id]/page.tsx | 10 +- .../publish => sub-menu/posting}/page.tsx | 4 +- .../forum/sub-menu/report-posting/page.tsx | 12 + src/app/dev/admin/main/dashboard/page.tsx | 4 + src/app/dev/auth/validasi/[id]/layout.tsx | 16 - src/app/dev/forum/main/page.tsx | 1 - .../lib/router_admin/router_admin_forum.ts | 21 +- src/app_modules/admin/app_info/main/index.tsx | 36 +- .../admin/app_info/main/info_bank.tsx | 49 ++- .../admin/app_info/main/info_whatsapp.tsx | 21 +- .../admin_notifikasi/notifikasi_berhasil.tsx | 2 +- .../admin_notifikasi/notifikasi_gagal.tsx | 2 +- .../notifikasi_peringatan.tsx | 2 +- .../admin/component_global/back_button.tsx | 2 +- .../admin/component_global/is_empty_data.tsx | 19 + .../component_global/loading_admin_page.tsx | 7 +- .../admin/donasi/detail/detail_reject.tsx | 4 +- .../admin/donasi/detail/detail_review.tsx | 20 +- .../donasi/detail/publish/detail_publish.tsx | 12 +- .../donasi/detail/publish/pencairan_dana.tsx | 14 +- .../donasi/sub-detail/bukti_transfer.tsx | 4 +- .../sub-detail/bukti_transfer_pencairan.tsx | 4 +- .../admin/donasi/sub_menu/table_kategori.tsx | 16 +- .../admin/forum/child/publish/index.tsx | 288 -------------- .../forum/child/report_komentar/index.tsx | 11 - .../forum/child/report_posting/index.tsx | 11 - .../forum/children/semua_komentar/index.tsx | 291 -------------- .../admin/forum/component/button_delete.tsx | 84 +++++ .../forum/component/detail_one_posting.tsx | 73 ++++ .../admin/forum/detail/detail_posting.tsx | 316 ++++++++++++++++ .../fun/count/fun_count_komentar_by_id.ts | 19 + .../fun/delete/fun_delete_komentar_by_id.ts | 1 - .../forum/fun/get/get_all_report_posting.tsx | 95 +++++ .../forum/fun/get/get_list_komentar_by_id.ts | 41 +- .../admin/forum/fun/get/get_list_publish.tsx | 41 +- .../fun/get/get_list_report_komentar_by_id.ts | 32 +- .../fun/get/get_list_report_posting_by_id.ts | 32 +- .../forum/fun/get/get_one_posting_by_id.ts | 12 +- src/app_modules/admin/forum/index.tsx | 18 +- .../forum/main/{index.tsx => dashboard.tsx} | 6 +- .../hasil_report_komentar.tsx} | 158 +++++--- .../hasil_report_posting.tsx} | 165 +++++--- .../admin/forum/sub_menu/table_posting.tsx | 357 ++++++++++++++++++ .../forum/sub_menu/table_report_posting.tsx | 279 ++++++++++++++ .../admin/job/detail/detail_poster.tsx | 4 +- src/app_modules/admin/layout.tsx | 52 +-- src/app_modules/admin/list_page.tsx | 12 +- .../admin/notifikasi/route_setting/forum.ts | 22 ++ .../admin/notifikasi/route_setting/job.ts | 35 ++ src/app_modules/auth/index.ts | 2 - src/app_modules/auth/login/view.tsx | 2 +- src/app_modules/auth/register/view.tsx | 69 +++- src/app_modules/auth/validasi/layout.tsx | 34 -- src/app_modules/auth/validasi/view.tsx | 149 +++----- .../main_component/card_more_button.tsx | 6 +- .../fun/create/fun_create_report_posting.ts | 18 +- .../forum/fun/get/get_one_kategori_by_id.ts | 17 + .../forum/fun/get/v2_get_all_posting.ts | 48 --- src/app_modules/forum/main/beranda.tsx | 62 ++- src/app_modules/forum/model/interface.tsx | 5 +- .../forum/report/posting/index.tsx | 58 +-- 66 files changed, 2040 insertions(+), 1224 deletions(-) delete mode 100644 src/app/dev/admin/forum/child/report-komentar/page.tsx delete mode 100644 src/app/dev/admin/forum/child/report-posting/page.tsx rename src/app/dev/admin/forum/{children/semua-komentar => detail}/[id]/page.tsx (64%) delete mode 100644 src/app/dev/admin/forum/hasil-report/komentar/[id]/page.tsx create mode 100644 src/app/dev/admin/forum/sub-detail/report-komentar/[id]/page.tsx rename src/app/dev/admin/forum/{hasil-report/posting => sub-detail/report-posting}/[id]/page.tsx (55%) rename src/app/dev/admin/forum/{child/publish => sub-menu/posting}/page.tsx (65%) create mode 100644 src/app/dev/admin/forum/sub-menu/report-posting/page.tsx delete mode 100644 src/app/dev/auth/validasi/[id]/layout.tsx create mode 100644 src/app_modules/admin/component_global/is_empty_data.tsx delete mode 100644 src/app_modules/admin/forum/child/publish/index.tsx delete mode 100644 src/app_modules/admin/forum/child/report_komentar/index.tsx delete mode 100644 src/app_modules/admin/forum/child/report_posting/index.tsx delete mode 100644 src/app_modules/admin/forum/children/semua_komentar/index.tsx create mode 100644 src/app_modules/admin/forum/component/button_delete.tsx create mode 100644 src/app_modules/admin/forum/component/detail_one_posting.tsx create mode 100644 src/app_modules/admin/forum/detail/detail_posting.tsx create mode 100644 src/app_modules/admin/forum/fun/count/fun_count_komentar_by_id.ts create mode 100644 src/app_modules/admin/forum/fun/get/get_all_report_posting.tsx rename src/app_modules/admin/forum/main/{index.tsx => dashboard.tsx} (94%) rename src/app_modules/admin/forum/{hasil_report/komentar/index.tsx => sub_detail/hasil_report_komentar.tsx} (55%) rename src/app_modules/admin/forum/{hasil_report/posting/index.tsx => sub_detail/hasil_report_posting.tsx} (54%) create mode 100644 src/app_modules/admin/forum/sub_menu/table_posting.tsx create mode 100644 src/app_modules/admin/forum/sub_menu/table_report_posting.tsx create mode 100644 src/app_modules/admin/notifikasi/route_setting/forum.ts create mode 100644 src/app_modules/admin/notifikasi/route_setting/job.ts delete mode 100644 src/app_modules/auth/validasi/layout.tsx create mode 100644 src/app_modules/forum/fun/get/get_one_kategori_by_id.ts delete mode 100644 src/app_modules/forum/fun/get/v2_get_all_posting.ts diff --git a/src/app/dev/admin/forum/child/report-komentar/page.tsx b/src/app/dev/admin/forum/child/report-komentar/page.tsx deleted file mode 100644 index cf8566da..00000000 --- a/src/app/dev/admin/forum/child/report-komentar/page.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { AdminForum_TableReportKomentar } from "@/app_modules/admin/forum"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/admin/forum/child/report-posting/page.tsx b/src/app/dev/admin/forum/child/report-posting/page.tsx deleted file mode 100644 index 2235353a..00000000 --- a/src/app/dev/admin/forum/child/report-posting/page.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { AdminForum_TableReportPosting } from "@/app_modules/admin/forum"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/admin/forum/children/semua-komentar/[id]/page.tsx b/src/app/dev/admin/forum/detail/[id]/page.tsx similarity index 64% rename from src/app/dev/admin/forum/children/semua-komentar/[id]/page.tsx rename to src/app/dev/admin/forum/detail/[id]/page.tsx index 663ee0e9..69063651 100644 --- a/src/app/dev/admin/forum/children/semua-komentar/[id]/page.tsx +++ b/src/app/dev/admin/forum/detail/[id]/page.tsx @@ -1,17 +1,25 @@ import { AdminForum_LihatSemuaKomentar } from "@/app_modules/admin/forum"; +import adminForum_countKomentarByPostingId from "@/app_modules/admin/forum/fun/count/fun_count_komentar_by_id"; import { adminForum_getListKomentarById } from "@/app_modules/admin/forum/fun/get/get_list_komentar_by_id"; import { adminForum_getOnePostingById } from "@/app_modules/admin/forum/fun/get/get_one_posting_by_id"; export default async function Page({ params }: { params: { id: string } }) { let postingId = params.id; - const listKomentar = await adminForum_getListKomentarById(postingId); + + const listKomentar = await adminForum_getListKomentarById({ + postingId: postingId, + page: 1, + }); const dataPosting = await adminForum_getOnePostingById(postingId); + const countKomentar = await adminForum_countKomentarByPostingId({postingId: postingId}) + return ( <> ); diff --git a/src/app/dev/admin/forum/hasil-report/komentar/[id]/page.tsx b/src/app/dev/admin/forum/hasil-report/komentar/[id]/page.tsx deleted file mode 100644 index 9b9dbfe8..00000000 --- a/src/app/dev/admin/forum/hasil-report/komentar/[id]/page.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { AdminForum_HasilReportKomentar } from "@/app_modules/admin/forum" -import { adminForum_getListReportKomentarbyId } from "@/app_modules/admin/forum/fun/get/get_list_report_komentar_by_id"; - -export default async function Page({params}: {params: {id: string}}) { - let komentarId = params.id - const listReport = await adminForum_getListReportKomentarbyId(komentarId) - - return ( - <> - - - ); -} \ No newline at end of file diff --git a/src/app/dev/admin/forum/sub-detail/report-komentar/[id]/page.tsx b/src/app/dev/admin/forum/sub-detail/report-komentar/[id]/page.tsx new file mode 100644 index 00000000..32d1107c --- /dev/null +++ b/src/app/dev/admin/forum/sub-detail/report-komentar/[id]/page.tsx @@ -0,0 +1,16 @@ +import { AdminForum_HasilReportKomentar } from "@/app_modules/admin/forum"; +import { adminForum_getListReportKomentarbyId } from "@/app_modules/admin/forum/fun/get/get_list_report_komentar_by_id"; + +export default async function Page({ params }: { params: { id: string } }) { + let komentarId = params.id; + const listReport = await adminForum_getListReportKomentarbyId({komentarId: komentarId, page: 1}); + + return ( + <> + + + ); +} diff --git a/src/app/dev/admin/forum/hasil-report/posting/[id]/page.tsx b/src/app/dev/admin/forum/sub-detail/report-posting/[id]/page.tsx similarity index 55% rename from src/app/dev/admin/forum/hasil-report/posting/[id]/page.tsx rename to src/app/dev/admin/forum/sub-detail/report-posting/[id]/page.tsx index a8f5eee0..a40c7fed 100644 --- a/src/app/dev/admin/forum/hasil-report/posting/[id]/page.tsx +++ b/src/app/dev/admin/forum/sub-detail/report-posting/[id]/page.tsx @@ -1,14 +1,20 @@ import { AdminForum_HasilReportPosting } from "@/app_modules/admin/forum"; import { adminForum_getListReportPostingById } from "@/app_modules/admin/forum/fun/get/get_list_report_posting_by_id"; +import { adminForum_getOnePostingById } from "@/app_modules/admin/forum/fun/get/get_one_posting_by_id"; export default async function Page({ params }: { params: { id: string } }) { let postingId = params.id; - const listReport = await adminForum_getListReportPostingById(postingId); + const listReport = await adminForum_getListReportPostingById({ + postingId: postingId, + page: 1, + }); + + const dataPosting = await adminForum_getOnePostingById(postingId); return ( <> diff --git a/src/app/dev/admin/forum/child/publish/page.tsx b/src/app/dev/admin/forum/sub-menu/posting/page.tsx similarity index 65% rename from src/app/dev/admin/forum/child/publish/page.tsx rename to src/app/dev/admin/forum/sub-menu/posting/page.tsx index f98121f7..c6457777 100644 --- a/src/app/dev/admin/forum/child/publish/page.tsx +++ b/src/app/dev/admin/forum/sub-menu/posting/page.tsx @@ -1,8 +1,8 @@ import { AdminForum_TablePublish } from "@/app_modules/admin/forum"; -import { adminForum_getListPublish } from "@/app_modules/admin/forum/fun/get/get_list_publish"; +import { adminForum_getListPosting } from "@/app_modules/admin/forum/fun/get/get_list_publish"; export default async function Page() { - const listPublish = await adminForum_getListPublish(); + const listPublish = await adminForum_getListPosting({page: 1}); return ( <> diff --git a/src/app/dev/admin/forum/sub-menu/report-posting/page.tsx b/src/app/dev/admin/forum/sub-menu/report-posting/page.tsx new file mode 100644 index 00000000..9d2e6dfb --- /dev/null +++ b/src/app/dev/admin/forum/sub-menu/report-posting/page.tsx @@ -0,0 +1,12 @@ +import { AdminForum_TableReportPosting } from "@/app_modules/admin/forum"; +import adminForum_funGetAllReportPosting from "@/app_modules/admin/forum/fun/get/get_all_report_posting"; + +export default async function Page() { + const listData = await adminForum_funGetAllReportPosting({ page: 1 }); + + return ( + <> + + + ); +} diff --git a/src/app/dev/admin/main/dashboard/page.tsx b/src/app/dev/admin/main/dashboard/page.tsx index ee00cc55..e046e03a 100644 --- a/src/app/dev/admin/main/dashboard/page.tsx +++ b/src/app/dev/admin/main/dashboard/page.tsx @@ -6,5 +6,9 @@ export default async function Page() { const countUser = await AdminMainDashboard_CountUser(); const countPorto = await AdminMainDashboard_CountPOrtofolio(); + // await new Promise((a, b) => { + // setTimeout(a, 4000); + // }); + return ; } diff --git a/src/app/dev/auth/validasi/[id]/layout.tsx b/src/app/dev/auth/validasi/[id]/layout.tsx deleted file mode 100644 index af451bb8..00000000 --- a/src/app/dev/auth/validasi/[id]/layout.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { LayoutValidasi } from "@/app_modules/auth"; -import { ActionIcon, Button } from "@mantine/core"; -import Link from "next/link"; -import React from "react"; - -export default async function Layout({ - children, -}: { - children: React.ReactNode; -}) { - return ( - <> - {children} - - ); -} diff --git a/src/app/dev/forum/main/page.tsx b/src/app/dev/forum/main/page.tsx index c10d567a..f1caab55 100644 --- a/src/app/dev/forum/main/page.tsx +++ b/src/app/dev/forum/main/page.tsx @@ -1,6 +1,5 @@ import { Forum_Beranda } from "@/app_modules/forum"; import { forum_new_getAllPosting } from "@/app_modules/forum/fun/get/new_get_all_posting"; -import forum_v2_getAllPosting from "@/app_modules/forum/fun/get/v2_get_all_posting"; import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token"; export default async function Page() { diff --git a/src/app/lib/router_admin/router_admin_forum.ts b/src/app/lib/router_admin/router_admin_forum.ts index ddefb1fd..9b68b6f9 100644 --- a/src/app/lib/router_admin/router_admin_forum.ts +++ b/src/app/lib/router_admin/router_admin_forum.ts @@ -1,13 +1,16 @@ export const RouterAdminForum = { + // main main: "/dev/admin/forum/main", - publish: "/dev/admin/forum/child/publish", - report_komentar: "/dev/admin/forum/child/report-komentar", - report_posting: "/dev/admin/forum/child/report-posting", - //children - semua_komentar: "/dev/admin/forum/children/semua-komentar/", - - // report - hasil_report_posting: "/dev/admin/forum/hasil-report/posting/", - hasil_report_komentar: "/dev/admin/forum/hasil-report/komentar/" + // sub menu + table_posting: "/dev/admin/forum/sub-menu/posting", + table_report_posting: "/dev/admin/forum/sub-menu/report-posting", + + + // detail + detail_posting: "/dev/admin/forum/detail/", + + // sub detail + report_komentar: "/dev/admin/forum/sub-detail/report-komentar/", + report_posting: "/dev/admin/forum/sub-detail/report-posting/", }; diff --git a/src/app_modules/admin/app_info/main/index.tsx b/src/app_modules/admin/app_info/main/index.tsx index cce2f39c..7494c5c5 100644 --- a/src/app_modules/admin/app_info/main/index.tsx +++ b/src/app_modules/admin/app_info/main/index.tsx @@ -1,44 +1,12 @@ "use client"; import { - ActionIcon, - Button, - Center, - Grid, - Group, - Modal, - Paper, - ScrollArea, Space, - Stack, - Table, - Text, - TextInput, - Title, - Tooltip, + Stack } from "@mantine/core"; -import { list } from "postcss"; import ComponentAdminGlobal_HeaderTamplate from "../../component_global/header_tamplate"; -import { useState } from "react"; -import { - IconEdit, - IconEye, - IconEyeClosed, - IconEyeOff, - IconPhone, - IconPlus, - IconTrack, - IconTrash, -} from "@tabler/icons-react"; -import { ComponentGlobalAdmin_NotifikasiPeringatan } from "../../component_global/admin_notifikasi/notifikasi_peringatan"; -import adminAppInformation_funUpdateNomorAdmin from "../fun/update/fun_update_nomor"; -import { ComponentGlobalAdmin_NotifikasiBerhasil } from "../../component_global/admin_notifikasi/notifikasi_berhasil"; -import { ComponentGlobalAdmin_NotifikasiGagal } from "../../component_global/admin_notifikasi/notifikasi_gagal"; -import adminAppInformation_getNomorAdmin from "../fun/master/get_nomor_admin"; -import { MODEL_DATA_BANK } from "@/app_modules/investasi/model/model_investasi"; -import _ from "lodash"; -import InformasiWhatApps from "./info_whatsapp"; import InformasiBank from "./info_bank"; +import InformasiWhatApps from "./info_whatsapp"; export default function AdminAppInformation_MainView({ nomorAdmin, diff --git a/src/app_modules/admin/app_info/main/info_bank.tsx b/src/app_modules/admin/app_info/main/info_bank.tsx index 90e058d6..70d11f08 100644 --- a/src/app_modules/admin/app_info/main/info_bank.tsx +++ b/src/app_modules/admin/app_info/main/info_bank.tsx @@ -2,41 +2,34 @@ import { MODEL_DATA_BANK } from "@/app_modules/investasi/model/model_investasi"; import { - Center, - Stack, ActionIcon, - Tooltip, - Group, - Title, Button, + Center, + Grid, + Group, + Modal, Paper, ScrollArea, - Modal, - TextInput, - Text, - Table, - SimpleGrid, - Grid, + Stack, Switch, + Table, + Text, + TextInput, + Title, + Tooltip } from "@mantine/core"; import { - IconEye, - IconEyeOff, - IconEdit, - IconTrash, - IconPlus, IconCirclePlus, + IconEdit } from "@tabler/icons-react"; -import _, { fill } from "lodash"; +import _ from "lodash"; import { useState } from "react"; +import { ComponentAdminGlobal_NotifikasiBerhasil } from "../../component_global/admin_notifikasi/notifikasi_berhasil"; +import { ComponentAdminGlobal_NotifikasiGagal } from "../../component_global/admin_notifikasi/notifikasi_gagal"; import adminAppInformation_createBank from "../fun/create/fun_create_new_bank"; import adminAppInformation_getMasterBank from "../fun/master/get_list_bank"; -import { ComponentGlobalAdmin_NotifikasiBerhasil } from "../../component_global/admin_notifikasi/notifikasi_berhasil"; -import { ComponentGlobalAdmin_NotifikasiGagal } from "../../component_global/admin_notifikasi/notifikasi_gagal"; -import adminAppInformation_getOneBankById from "../fun/get/get_one_bank_by_id"; -import { useShallowEffect } from "@mantine/hooks"; -import adminAppInformation_updateDataBankById from "../fun/update/fun_update_data_bank"; import adminAppInformation_updateStatusBankById from "../fun/update/fun_udpate_status_bank"; +import adminAppInformation_updateDataBankById from "../fun/update/fun_update_data_bank"; export default function InformasiBank({ listBank, @@ -70,9 +63,9 @@ export default function InformasiBank({ if (create.status === 200) { const loadData = await adminAppInformation_getMasterBank(); setData(loadData); - ComponentGlobalAdmin_NotifikasiBerhasil(create.message); + ComponentAdminGlobal_NotifikasiBerhasil(create.message); } else { - ComponentGlobalAdmin_NotifikasiGagal(create.message); + ComponentAdminGlobal_NotifikasiGagal(create.message); } setIsCreate(false); } @@ -84,10 +77,10 @@ export default function InformasiBank({ if (updt.status === 200) { const loadData = await adminAppInformation_getMasterBank(); setData(loadData); - ComponentGlobalAdmin_NotifikasiBerhasil(updt.message); + ComponentAdminGlobal_NotifikasiBerhasil(updt.message); setIsUpdate(false); } else { - ComponentGlobalAdmin_NotifikasiGagal(updt.message); + ComponentAdminGlobal_NotifikasiGagal(updt.message); } } @@ -108,10 +101,10 @@ export default function InformasiBank({ if (updt.status === 200) { const loadData = await adminAppInformation_getMasterBank(); setData(loadData); - ComponentGlobalAdmin_NotifikasiBerhasil(updt.message); + ComponentAdminGlobal_NotifikasiBerhasil(updt.message); setIsActivation(false); } else { - ComponentGlobalAdmin_NotifikasiGagal(updt.message); + ComponentAdminGlobal_NotifikasiGagal(updt.message); } } diff --git a/src/app_modules/admin/app_info/main/info_whatsapp.tsx b/src/app_modules/admin/app_info/main/info_whatsapp.tsx index 31e35bfc..f181f1be 100644 --- a/src/app_modules/admin/app_info/main/info_whatsapp.tsx +++ b/src/app_modules/admin/app_info/main/info_whatsapp.tsx @@ -1,20 +1,19 @@ " use client"; import { - Stack, - Group, - Title, - Paper, ActionIcon, - TextInput, Button, - Box, - Tooltip, + Group, + Paper, + Stack, + TextInput, + Title, + Tooltip } from "@mantine/core"; import { IconEdit, IconPhone } from "@tabler/icons-react"; import { useState } from "react"; -import { ComponentGlobalAdmin_NotifikasiBerhasil } from "../../component_global/admin_notifikasi/notifikasi_berhasil"; -import { ComponentGlobalAdmin_NotifikasiGagal } from "../../component_global/admin_notifikasi/notifikasi_gagal"; +import { ComponentAdminGlobal_NotifikasiBerhasil } from "../../component_global/admin_notifikasi/notifikasi_berhasil"; +import { ComponentAdminGlobal_NotifikasiGagal } from "../../component_global/admin_notifikasi/notifikasi_gagal"; import adminAppInformation_getNomorAdmin from "../fun/master/get_nomor_admin"; import adminAppInformation_funUpdateNomorAdmin from "../fun/update/fun_update_nomor"; @@ -39,11 +38,11 @@ export default function InformasiWhatApps({ nomorAdmin }: { nomorAdmin: any }) { const loadDdata = await adminAppInformation_getNomorAdmin(); setDataNomor(loadDdata); if (loadDdata) { - ComponentGlobalAdmin_NotifikasiBerhasil(updt.message); + ComponentAdminGlobal_NotifikasiBerhasil(updt.message); return; } } else { - ComponentGlobalAdmin_NotifikasiGagal(updt.message); + ComponentAdminGlobal_NotifikasiGagal(updt.message); } } diff --git a/src/app_modules/admin/component_global/admin_notifikasi/notifikasi_berhasil.tsx b/src/app_modules/admin/component_global/admin_notifikasi/notifikasi_berhasil.tsx index 51ae73d3..bfbc9870 100644 --- a/src/app_modules/admin/component_global/admin_notifikasi/notifikasi_berhasil.tsx +++ b/src/app_modules/admin/component_global/admin_notifikasi/notifikasi_berhasil.tsx @@ -14,7 +14,7 @@ import { * @type number * @returns notifikasi berhasil warna hijau */ -export async function ComponentGlobalAdmin_NotifikasiBerhasil( +export async function ComponentAdminGlobal_NotifikasiBerhasil( text: string, durasi?: number ) { diff --git a/src/app_modules/admin/component_global/admin_notifikasi/notifikasi_gagal.tsx b/src/app_modules/admin/component_global/admin_notifikasi/notifikasi_gagal.tsx index c9f103f8..d48ce3fa 100644 --- a/src/app_modules/admin/component_global/admin_notifikasi/notifikasi_gagal.tsx +++ b/src/app_modules/admin/component_global/admin_notifikasi/notifikasi_gagal.tsx @@ -8,7 +8,7 @@ import { IconAlertTriangle } from "@tabler/icons-react"; * @type string * @returns notifikasi peringatan */ -export async function ComponentGlobalAdmin_NotifikasiGagal(text: string) { +export async function ComponentAdminGlobal_NotifikasiGagal(text: string) { return notifications.show({ message: (
diff --git a/src/app_modules/admin/component_global/admin_notifikasi/notifikasi_peringatan.tsx b/src/app_modules/admin/component_global/admin_notifikasi/notifikasi_peringatan.tsx index 399a671c..ec2ec9fc 100644 --- a/src/app_modules/admin/component_global/admin_notifikasi/notifikasi_peringatan.tsx +++ b/src/app_modules/admin/component_global/admin_notifikasi/notifikasi_peringatan.tsx @@ -8,7 +8,7 @@ import { IconAlertTriangle } from "@tabler/icons-react"; * @type string * @returns notifikasi peringatan */ -export async function ComponentGlobalAdmin_NotifikasiPeringatan( +export async function ComponentAdminGlobal_NotifikasiPeringatan( text: string, durasi?: number ) { diff --git a/src/app_modules/admin/component_global/back_button.tsx b/src/app_modules/admin/component_global/back_button.tsx index 15abe3ba..b2b550fe 100644 --- a/src/app_modules/admin/component_global/back_button.tsx +++ b/src/app_modules/admin/component_global/back_button.tsx @@ -5,7 +5,7 @@ import { IconChevronLeft } from "@tabler/icons-react"; import { useRouter } from "next/navigation"; import { useState } from "react"; -export default function ComponentGlobalAdmin_BackButton({path}:{path?:string}) { +export default function ComponentAdminGlobal_BackButton({path}:{path?:string}) { const router = useRouter(); const [isLoading, setLoading] = useState(false); diff --git a/src/app_modules/admin/component_global/is_empty_data.tsx b/src/app_modules/admin/component_global/is_empty_data.tsx new file mode 100644 index 00000000..01c4d382 --- /dev/null +++ b/src/app_modules/admin/component_global/is_empty_data.tsx @@ -0,0 +1,19 @@ +"use client"; + +import { Center, Text } from "@mantine/core"; + +export default function ComponentAdminGlobal_IsEmptyData({ + text, + marginTop, +}: { + text?: string; + marginTop?: number; +}) { + return ( + <> +
+ {text ? text : "Tidak Ada Data"} +
+ + ); +} diff --git a/src/app_modules/admin/component_global/loading_admin_page.tsx b/src/app_modules/admin/component_global/loading_admin_page.tsx index 6febf957..317f4ad0 100644 --- a/src/app_modules/admin/component_global/loading_admin_page.tsx +++ b/src/app_modules/admin/component_global/loading_admin_page.tsx @@ -28,7 +28,7 @@ export default function ComponentAdminGlobal_LoadingPage() { }, ]; const customLOader = ( -
+
{listhHuruf.map((e, i) => (
@@ -44,7 +44,10 @@ export default function ComponentAdminGlobal_LoadingPage() { return ( <> - + {/* */} + + {customLOader} + ); } diff --git a/src/app_modules/admin/donasi/detail/detail_reject.tsx b/src/app_modules/admin/donasi/detail/detail_reject.tsx index 7fcca317..5bcbc9e9 100644 --- a/src/app_modules/admin/donasi/detail/detail_reject.tsx +++ b/src/app_modules/admin/donasi/detail/detail_reject.tsx @@ -25,7 +25,7 @@ import { NotifBerhasil } from "@/app_modules/donasi/component/notifikasi/notif_b import { NotifGagal } from "@/app_modules/donasi/component/notifikasi/notif_gagal"; import { AdminDonasi_getOneById } from "../fun/get/get_one_by_id"; import ComponentGlobal_InputCountDown from "@/app_modules/component_global/input_countdown"; -import ComponentGlobalAdmin_BackButton from "../../component_global/back_button"; +import ComponentAdminGlobal_BackButton from "../../component_global/back_button"; import ComponentAdminDonasi_TampilanDetailDonasi from "../component/tampilan_detail_donasi"; import ComponentAdminDonasi_CeritaPenggalangDana from "../component/tampilan_detail_cerita"; @@ -94,7 +94,7 @@ function ButtonOnHeader({ <> - + diff --git a/src/app_modules/admin/donasi/detail/detail_review.tsx b/src/app_modules/admin/donasi/detail/detail_review.tsx index c74a052d..2bb19fc0 100644 --- a/src/app_modules/admin/donasi/detail/detail_review.tsx +++ b/src/app_modules/admin/donasi/detail/detail_review.tsx @@ -25,14 +25,14 @@ import { import { useDisclosure } from "@mantine/hooks"; import { useRouter } from "next/navigation"; import { useState } from "react"; -import { ComponentGlobalAdmin_NotifikasiBerhasil } from "../../component_global/admin_notifikasi/notifikasi_berhasil"; -import { ComponentGlobalAdmin_NotifikasiGagal } from "../../component_global/admin_notifikasi/notifikasi_gagal"; -import { ComponentGlobalAdmin_NotifikasiPeringatan } from "../../component_global/admin_notifikasi/notifikasi_peringatan"; +import { ComponentAdminGlobal_NotifikasiBerhasil } from "../../component_global/admin_notifikasi/notifikasi_berhasil"; +import { ComponentAdminGlobal_NotifikasiGagal } from "../../component_global/admin_notifikasi/notifikasi_gagal"; +import { ComponentAdminGlobal_NotifikasiPeringatan } from "../../component_global/admin_notifikasi/notifikasi_peringatan"; import ComponentAdminDonasi_TombolKembali from "../component/tombol_kembali"; import { AdminDonasi_getOneById } from "../fun/get/get_one_by_id"; import { AdminDonasi_funUpdateStatusPublish } from "../fun/update/fun_status_publish"; import { AdminDonasi_funUpdateStatusReject } from "../fun/update/fun_status_reject"; -import ComponentGlobalAdmin_BackButton from "../../component_global/back_button"; +import ComponentAdminGlobal_BackButton from "../../component_global/back_button"; import ComponentAdminDonasi_TampilanDetailDonasi from "../component/tampilan_detail_donasi"; import ComponentAdminDonasi_CeritaPenggalangDana from "../component/tampilan_detail_cerita"; @@ -85,12 +85,12 @@ function ButtonOnHeader({ if (res.status === 200) { const newData = await AdminDonasi_getOneById(donasi?.id); setData(newData); - ComponentGlobalAdmin_NotifikasiBerhasil( + ComponentAdminGlobal_NotifikasiBerhasil( "Berhasil Mengubah Status Donasi" ); setLoadingPublish(true); } else { - ComponentGlobalAdmin_NotifikasiPeringatan( + ComponentAdminGlobal_NotifikasiPeringatan( "Gagal Mengubah Status Donasi" ); } @@ -100,7 +100,7 @@ function ButtonOnHeader({ async function onReject() { if (catatan === "") - return ComponentGlobalAdmin_NotifikasiPeringatan( + return ComponentAdminGlobal_NotifikasiPeringatan( "Lengkapi Alasan Penolakan" ); @@ -110,10 +110,10 @@ function ButtonOnHeader({ const newData = await AdminDonasi_getOneById(donasi?.id); setData(newData); close(); - ComponentGlobalAdmin_NotifikasiBerhasil(res.message); + ComponentAdminGlobal_NotifikasiBerhasil(res.message); setLoadingReject(true); } else { - ComponentGlobalAdmin_NotifikasiGagal(res.message); + ComponentAdminGlobal_NotifikasiGagal(res.message); } } ); @@ -122,7 +122,7 @@ function ButtonOnHeader({ return ( <> - + {donasi.donasiMaster_StatusDonasiId === "2" ? ( - - - ); -} - -function ButtonDeletePosting({ postingId }: { postingId: string }) { - const [opened, { open, close }] = useDisclosure(false); - const [loadingDel, setLoadingDel] = useState(false); - const [loadingDel2, setLoadingDel2] = useState(false); - - async function onDelete() { - await adminForum_funDeletePostingById(postingId).then((res) => { - if (res.status === 200) { - setLoadingDel2(false); - setLoadingDel(false); - close(); - ComponentGlobal_NotifikasiBerhasil(res.message); - } else { - ComponentGlobal_NotifikasiGagal(res.message); - } - }); - } - return ( - <> - - - Anda yakin menghapus posting ini - - - - - - - - - ); -} diff --git a/src/app_modules/admin/forum/child/report_komentar/index.tsx b/src/app_modules/admin/forum/child/report_komentar/index.tsx deleted file mode 100644 index 714ec270..00000000 --- a/src/app_modules/admin/forum/child/report_komentar/index.tsx +++ /dev/null @@ -1,11 +0,0 @@ -"use client"; - -import { Stack } from "@mantine/core"; - -export default function AdminForum_TableReportKomentar() { - return ( - <> - ini rep komen - - ); -} diff --git a/src/app_modules/admin/forum/child/report_posting/index.tsx b/src/app_modules/admin/forum/child/report_posting/index.tsx deleted file mode 100644 index d9a9c9f1..00000000 --- a/src/app_modules/admin/forum/child/report_posting/index.tsx +++ /dev/null @@ -1,11 +0,0 @@ -"use client"; - -import { Stack } from "@mantine/core"; - -export default function AdminForum_TableReportPosting() { - return ( - <> - ini rep pos - - ); -} diff --git a/src/app_modules/admin/forum/children/semua_komentar/index.tsx b/src/app_modules/admin/forum/children/semua_komentar/index.tsx deleted file mode 100644 index c01e13f7..00000000 --- a/src/app_modules/admin/forum/children/semua_komentar/index.tsx +++ /dev/null @@ -1,291 +0,0 @@ -"use client"; - -import { RouterAdminForum } from "@/app/lib/router_admin/router_admin_forum"; -import ComponentAdminGlobal_HeaderTamplate from "@/app_modules/admin/component_global/header_tamplate"; -import ComponentAdminDonasi_TombolKembali from "@/app_modules/admin/donasi/component/tombol_kembali"; -import { - MODEL_FORUM_KOMENTAR, - MODEL_FORUM_POSTING, -} from "@/app_modules/forum/model/interface"; -import { - Badge, - Box, - Button, - Center, - Grid, - Group, - Modal, - Paper, - ScrollArea, - Spoiler, - Stack, - Table, - Text, - Title, -} from "@mantine/core"; -import { IconTrash } from "@tabler/icons-react"; -import { IconFlag3 } from "@tabler/icons-react"; -import _ from "lodash"; -import { useRouter } from "next/navigation"; -import { useState } from "react"; -import { adminForum_funDeleteKomentarById } from "../../fun/delete/fun_delete_komentar_by_id"; -import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; -import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; -import { useDisclosure } from "@mantine/hooks"; - -export default function AdminForum_LihatSemuaKomentar({ - listKomentar, - dataPosting, -}: { - listKomentar: MODEL_FORUM_KOMENTAR[]; - dataPosting: MODEL_FORUM_POSTING; -}) { - return ( - <> - {/*
{JSON.stringify(listKomentar, null, 2)}
*/} - - - - - - - - ); -} - -function DataPosting({ dataPosting }: { dataPosting: MODEL_FORUM_POSTING }) { - return ( - <> - - - - - POSTING - - - - - - - Author : - - - - {dataPosting?.Author?.Profile?.name} - - - - - - -
- - - - - - - - - ); -} - -function TableKomentar({ - listKomentar, -}: { - listKomentar: MODEL_FORUM_KOMENTAR[]; -}) { - const router = useRouter(); - // const [data, setData] = useState(listKomentar); - - const TableRows = listKomentar?.map((e, i) => ( - - -
- {e?.Author?.Profile?.name} -
- - -
- -
- -
- - -
- - {new Intl.DateTimeFormat(["id-ID"], { dateStyle: "medium" }).format( - e.createdAt - )} - -
- - -
- = 3 ? "red" : "black"} - fw={"bold"} - fz={"lg"} - > - {e?.Forum_ReportKomentar.length} - -
- - - - - - - - - - )); - - return ( - <> - - - - KOMENTAR - - - - - - - - - - - - - - {TableRows} -
-
Author
-
-
Komentar
-
-
Tanggal Komentar
-
-
Total Report Komentar
-
-
Aksi
-
-
- -
- {_.isEmpty(TableRows) ? ( -
- Tidak Ada Data -
- ) : ( - "" - )} -
-
- - ); -} - -function ButtonDeleteKomentar({ komentarId }: { komentarId: string }) { - const router = useRouter(); - const [opened, { open, close }] = useDisclosure(false); - const [loadindDel, setLoadingDel] = useState(false); - const [loadingDel2, setLoadingDel2] = useState(false); - - async function onDelete() { - await adminForum_funDeleteKomentarById(komentarId).then((res) => { - if (res.status === 200) { - setLoadingDel(false); - setLoadingDel2(false); - ComponentGlobal_NotifikasiBerhasil(res.message); - close(); - } else { - ComponentGlobal_NotifikasiGagal(res.message); - } - }); - } - return ( - <> - - - Anda yakin menghapus komentar ini ? - - - - - - - - - - ); -} diff --git a/src/app_modules/admin/forum/component/button_delete.tsx b/src/app_modules/admin/forum/component/button_delete.tsx new file mode 100644 index 00000000..4ca4280f --- /dev/null +++ b/src/app_modules/admin/forum/component/button_delete.tsx @@ -0,0 +1,84 @@ +"use client"; + +import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; +import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; +import { Modal, Stack, Title, Group, Button } from "@mantine/core"; +import { useDisclosure } from "@mantine/hooks"; +import { IconTrash } from "@tabler/icons-react"; +import { useState } from "react"; +import { adminForum_funDeletePostingById } from "../fun/delete/fun_delete_posting_by_id"; + +export default function ComponentAdminForum_ButtonDeletePosting({ + postingId, + onSuccesDelete, +}: { + postingId: string; + onSuccesDelete: (val: any) => void; +}) { + const [opened, { open, close }] = useDisclosure(false); + const [loadingDel2, setLoadingDel2] = useState(false); + + async function onDelete() { + await adminForum_funDeletePostingById(postingId).then((res) => { + if (res.status === 200) { + setLoadingDel2(false); + close(); + ComponentGlobal_NotifikasiBerhasil(res.message); + onSuccesDelete(true); + } else { + ComponentGlobal_NotifikasiGagal(res.message); + } + }); + } + return ( + <> + + + Anda yakin menghapus posting ini + + + + + + + + + ); +} diff --git a/src/app_modules/admin/forum/component/detail_one_posting.tsx b/src/app_modules/admin/forum/component/detail_one_posting.tsx new file mode 100644 index 00000000..74fe370f --- /dev/null +++ b/src/app_modules/admin/forum/component/detail_one_posting.tsx @@ -0,0 +1,73 @@ +"use client"; + +import { MODEL_FORUM_POSTING } from "@/app_modules/forum/model/interface"; +import { + Badge, + Box, + Divider, + Group, + Paper, + Spoiler, + Stack, + Text, + Title, +} from "@mantine/core"; + +export default function ComponentAdminForum_ViewOneDetailPosting({ + dataPosting, +}: { + dataPosting: MODEL_FORUM_POSTING; +}) { + return ( + <> + + + + Detail Posting + + + + + + + + + Username:{" "} + + {dataPosting?.Author?.username} + + + + + {dataPosting?.ForumMaster_StatusPosting?.status} + + + + + + + +
+ + + + + + + ); +} diff --git a/src/app_modules/admin/forum/detail/detail_posting.tsx b/src/app_modules/admin/forum/detail/detail_posting.tsx new file mode 100644 index 00000000..8cc6c918 --- /dev/null +++ b/src/app_modules/admin/forum/detail/detail_posting.tsx @@ -0,0 +1,316 @@ +"use client"; + +import { RouterAdminForum } from "@/app/lib/router_admin/router_admin_forum"; +import ComponentAdminGlobal_HeaderTamplate from "@/app_modules/admin/component_global/header_tamplate"; +import ComponentAdminDonasi_TombolKembali from "@/app_modules/admin/donasi/component/tombol_kembali"; +import { + MODEL_FORUM_KOMENTAR, + MODEL_FORUM_POSTING, +} from "@/app_modules/forum/model/interface"; +import { + Badge, + Box, + Button, + Center, + Grid, + Group, + Modal, + Pagination, + Paper, + ScrollArea, + Spoiler, + Stack, + Table, + Text, + TextInput, + Title, +} from "@mantine/core"; +import { IconSearch, IconTrash } from "@tabler/icons-react"; +import { IconFlag3 } from "@tabler/icons-react"; +import _ from "lodash"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; +import { adminForum_funDeleteKomentarById } from "../fun/delete/fun_delete_komentar_by_id"; +import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; +import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; +import { useDisclosure } from "@mantine/hooks"; +import ComponentAdminGlobal_IsEmptyData from "../../component_global/is_empty_data"; +import { adminForum_getListKomentarById } from "../fun/get/get_list_komentar_by_id"; +import ComponentAdminGlobal_BackButton from "../../component_global/back_button"; +import ComponentAdminForum_ViewOneDetailPosting from "../component/detail_one_posting"; + +export default function AdminForum_DetailPosting({ + listKomentar, + dataPosting, + countKomentar, +}: { + listKomentar: any; + dataPosting: MODEL_FORUM_POSTING; + countKomentar: number; +}) { + return ( + <> + {/*
{JSON.stringify(listKomentar, null, 2)}
*/} + + + + + + + + ); +} + + + +function TableKomentar({ + listKomentar, + postingId, + countKomentar, +}: { + listKomentar: any; + postingId: string; + countKomentar: number; +}) { + const router = useRouter(); + const [data, setData] = useState(listKomentar.data); + const [nPage, setNPage] = useState(listKomentar.nPage); + const [activePage, setActivePage] = useState(1); + const [isSearch, setSearch] = useState(""); + const [isLoadingReport, setLoadingReport] = useState(false); + const [idData, setIdData] = useState(""); + + async function onSearch(s: string) { + setSearch(s); + setActivePage(1); + const loadData = await adminForum_getListKomentarById({ + postingId: postingId, + page: 1, + search: s, + }); + setData(loadData.data as any); + setNPage(loadData.nPage); + } + + async function onPageClick(p: any) { + setActivePage(p); + const loadData = await adminForum_getListKomentarById({ + postingId: postingId, + search: isSearch, + page: p, + }); + setData(loadData.data as any); + setNPage(loadData.nPage); + } + + const rowTable = data?.map((e, i) => ( + + +
+ {e?.Author?.username} +
+ + + + +
+ + + + +
+ + {new Intl.DateTimeFormat(["id-ID"], { dateStyle: "medium" }).format( + e.createdAt + )} + +
+ + +
+ = 3 ? "red" : "black"} + fw={"bold"} + fz={"lg"} + > + {e?.Forum_ReportKomentar.length} + +
+ + + + + + + + + )); + + return ( + <> + + + + + Komentar + + + {`(${countKomentar})`} + + + } + radius={"xl"} + placeholder="Cari komentar" + onChange={(val) => { + onSearch(val.currentTarget.value); + }} + /> + + + {_.isEmpty(data) ? ( + + ) : ( + + + + + + + + + + + + + {rowTable} +
+
Username
+
+
Komentar
+
+
Tgl Komentar
+
+
Total Report
+
+
Aksi
+
+
+
+ { + onPageClick(val); + }} + /> +
+
+ )} +
+ + ); +} + +function ButtonDeleteKomentar({ komentarId }: { komentarId: string }) { + const router = useRouter(); + const [opened, { open, close }] = useDisclosure(false); + const [loadindDel, setLoadingDel] = useState(false); + const [loadingDel2, setLoadingDel2] = useState(false); + + async function onDelete() { + await adminForum_funDeleteKomentarById(komentarId).then((res) => { + if (res.status === 200) { + setLoadingDel(false); + setLoadingDel2(false); + ComponentGlobal_NotifikasiBerhasil(res.message); + close(); + } else { + ComponentGlobal_NotifikasiGagal(res.message); + } + }); + } + return ( + <> + + + Anda yakin menghapus komentar ini ? + + + + + + + + + + ); +} diff --git a/src/app_modules/admin/forum/fun/count/fun_count_komentar_by_id.ts b/src/app_modules/admin/forum/fun/count/fun_count_komentar_by_id.ts new file mode 100644 index 00000000..2ee508d9 --- /dev/null +++ b/src/app_modules/admin/forum/fun/count/fun_count_komentar_by_id.ts @@ -0,0 +1,19 @@ +"use server"; + +import prisma from "@/app/lib/prisma"; + +export default async function adminForum_countKomentarByPostingId({ + postingId, +}: { + postingId: string; +}) { + const count = await prisma.forum_Komentar.count({ + where: { + isActive: true, + forum_PostingId: postingId, + }, + }); + + + return count; +} diff --git a/src/app_modules/admin/forum/fun/delete/fun_delete_komentar_by_id.ts b/src/app_modules/admin/forum/fun/delete/fun_delete_komentar_by_id.ts index 796be1cf..6a99d4a3 100644 --- a/src/app_modules/admin/forum/fun/delete/fun_delete_komentar_by_id.ts +++ b/src/app_modules/admin/forum/fun/delete/fun_delete_komentar_by_id.ts @@ -14,6 +14,5 @@ export async function adminForum_funDeleteKomentarById(komentarId: string) { }); if (!delTemporary) return { status: 400, message: "Gagal Dihapus" }; - revalidatePath("/dev/admin/forum/children/semua-komentar"); return { status: 200, message: "Berhasil Dihapus" }; } diff --git a/src/app_modules/admin/forum/fun/get/get_all_report_posting.tsx b/src/app_modules/admin/forum/fun/get/get_all_report_posting.tsx new file mode 100644 index 00000000..2cd5332c --- /dev/null +++ b/src/app_modules/admin/forum/fun/get/get_all_report_posting.tsx @@ -0,0 +1,95 @@ +"use server"; + +import prisma from "@/app/lib/prisma"; +import { ceil } from "lodash"; + +export default async function adminForum_funGetAllReportPosting({ + page, + search, +}: { + page: number; + search?: string; +}) { + + const takeData = 10 + const skipData = page * takeData - takeData + + const data = await prisma.forum_ReportPosting.findMany({ + take: takeData, + skip: skipData, + orderBy: { + createdAt: "desc", + }, + where: { + Forum_Posting: { + isActive: true, + diskusi: { + contains: search, + mode: "insensitive" + } + }, + + }, + select: { + id: true, + isActive: true, + createdAt: true, + deskripsi: true, + forumMaster_KategoriReportId: true, + ForumMaster_KategoriReport: { + select: { + id: true, + title: true, + deskripsi: true, + }, + }, + + forum_PostingId: true, + Forum_Posting: { + select: { + id: true, + diskusi: true, + ForumMaster_StatusPosting: { + select: { + id: true, + status: true, + } + }, + Author: { + select: { + id: true, + username: true + } + } + }, + }, + userId: true, + User: { + select: { + id: true, + username: true, + }, + }, + }, + }); + + + const nCount = await prisma.forum_ReportPosting.count({ + where: { + Forum_Posting: { + isActive: true, + diskusi: { + contains: search, + mode: "insensitive", + }, + }, + }, + }); + + const allData = { + data: data, + nPage: ceil(nCount / takeData), + }; + + return allData; +} diff --git a/src/app_modules/admin/forum/fun/get/get_list_komentar_by_id.ts b/src/app_modules/admin/forum/fun/get/get_list_komentar_by_id.ts index d2a76ad7..b1e126c8 100644 --- a/src/app_modules/admin/forum/fun/get/get_list_komentar_by_id.ts +++ b/src/app_modules/admin/forum/fun/get/get_list_komentar_by_id.ts @@ -1,15 +1,33 @@ "use server"; import prisma from "@/app/lib/prisma"; +import { ceil } from "lodash"; + +export async function adminForum_getListKomentarById({ + postingId, + page, + search, +}: { + postingId: string; + page: number; + search?: string; +}) { + const takeData = 10; + const skipData = page * takeData - takeData; -export async function adminForum_getListKomentarById(postingId: string) { const data = await prisma.forum_Komentar.findMany({ + take: takeData, + skip: skipData, orderBy: { createdAt: "desc", }, where: { forum_PostingId: postingId, isActive: true, + komentar: { + contains: search, + mode: "insensitive", + }, }, select: { id: true, @@ -20,6 +38,7 @@ export async function adminForum_getListKomentarById(postingId: string) { Author: { select: { id: true, + username: true, Profile: { select: { name: true, @@ -28,9 +47,25 @@ export async function adminForum_getListKomentarById(postingId: string) { }, }, }, - Forum_ReportKomentar: true + Forum_ReportKomentar: true, }, }); - return data; + const nCount = await prisma.forum_Komentar.count({ + where: { + forum_PostingId: postingId, + isActive: true, + komentar: { + contains: search, + mode: "insensitive", + }, + }, + }); + + const allData = { + data: data, + nPage: ceil(nCount / takeData), + }; + + return allData; } diff --git a/src/app_modules/admin/forum/fun/get/get_list_publish.tsx b/src/app_modules/admin/forum/fun/get/get_list_publish.tsx index 028019d2..8a6838e8 100644 --- a/src/app_modules/admin/forum/fun/get/get_list_publish.tsx +++ b/src/app_modules/admin/forum/fun/get/get_list_publish.tsx @@ -1,14 +1,30 @@ "use server"; import prisma from "@/app/lib/prisma"; +import { ceil } from "lodash"; + +export async function adminForum_getListPosting({ + page, + search, +}: { + page: number; + search?: string; +}) { + const takeData = 10; + const skipData = page * takeData - takeData; -export async function adminForum_getListPublish() { const data = await prisma.forum_Posting.findMany({ + take: takeData, + skip: skipData, orderBy: { createdAt: "desc", }, where: { isActive: true, + diskusi: { + contains: search, + mode: "insensitive", + }, }, select: { id: true, @@ -25,12 +41,27 @@ export async function adminForum_getListPublish() { Forum_ReportPosting: true, Forum_Komentar: { where: { - isActive: true - } + isActive: true, + }, }, - ForumMaster_StatusPosting: true + ForumMaster_StatusPosting: true, }, }); - return data; + const nCount = await prisma.forum_Posting.count({ + where: { + isActive: true, + diskusi: { + contains: search, + mode: "insensitive", + }, + }, + }); + + const allData = { + data: data, + nPage: ceil(nCount / takeData), + }; + + return allData; } diff --git a/src/app_modules/admin/forum/fun/get/get_list_report_komentar_by_id.ts b/src/app_modules/admin/forum/fun/get/get_list_report_komentar_by_id.ts index 8f479e14..004c560f 100644 --- a/src/app_modules/admin/forum/fun/get/get_list_report_komentar_by_id.ts +++ b/src/app_modules/admin/forum/fun/get/get_list_report_komentar_by_id.ts @@ -1,9 +1,26 @@ "use server"; import prisma from "@/app/lib/prisma"; +import { ceil } from "lodash"; + +export async function adminForum_getListReportKomentarbyId({ + komentarId, + page, + search, +}: { + komentarId: string; + page: number; + search?: string; +}) { + const takeData = 10; + const skipData = page * takeData - takeData; -export async function adminForum_getListReportKomentarbyId(komentarId: string) { const data = await prisma.forum_ReportKomentar.findMany({ + take: takeData, + skip: skipData, + orderBy: { + createdAt: "desc" + }, where: { forum_KomentarId: komentarId, }, @@ -26,5 +43,16 @@ export async function adminForum_getListReportKomentarbyId(komentarId: string) { }, }); - return data; + const nCount = await prisma.forum_ReportKomentar.count({ + where: { + forum_KomentarId: komentarId, + }, + }); + + const allData = { + data: data, + nPage: ceil(nCount / takeData) + } + + return allData; } diff --git a/src/app_modules/admin/forum/fun/get/get_list_report_posting_by_id.ts b/src/app_modules/admin/forum/fun/get/get_list_report_posting_by_id.ts index 033515a5..03a26f4a 100644 --- a/src/app_modules/admin/forum/fun/get/get_list_report_posting_by_id.ts +++ b/src/app_modules/admin/forum/fun/get/get_list_report_posting_by_id.ts @@ -1,9 +1,24 @@ "use server"; import prisma from "@/app/lib/prisma"; +import { ceil } from "lodash"; + +export async function adminForum_getListReportPostingById({ + postingId, + page, +}: { + postingId: string; + page: number; +}) { + const takeData = 10; + const skipData = page * takeData - takeData; -export async function adminForum_getListReportPostingById(postingId: string) { const data = await prisma.forum_ReportPosting.findMany({ + take: takeData, + skip: skipData, + orderBy: { + createdAt: "desc", + }, where: { forum_PostingId: postingId, }, @@ -13,6 +28,8 @@ export async function adminForum_getListReportPostingById(postingId: string) { createdAt: true, User: { select: { + id: true, + username: true, Profile: { select: { name: true, @@ -30,5 +47,16 @@ export async function adminForum_getListReportPostingById(postingId: string) { }, }); - return data; + const nCount = await prisma.forum_ReportPosting.count({ + where: { + forum_PostingId: postingId, + }, + }); + + const allData = { + data: data, + nPage: ceil(nCount / takeData), + }; + + return allData; } diff --git a/src/app_modules/admin/forum/fun/get/get_one_posting_by_id.ts b/src/app_modules/admin/forum/fun/get/get_one_posting_by_id.ts index 234f9f21..2170f4f5 100644 --- a/src/app_modules/admin/forum/fun/get/get_one_posting_by_id.ts +++ b/src/app_modules/admin/forum/fun/get/get_one_posting_by_id.ts @@ -10,11 +10,19 @@ export async function adminForum_getOnePostingById(postingId: string) { select: { id: true, diskusi: true, + ForumMaster_StatusPosting: { + select: { + id: true, + status: true, + }, + }, Author: { select: { + id: true, + username: true, Profile: { select: { - name: true + name: true, }, }, }, @@ -22,7 +30,7 @@ export async function adminForum_getOnePostingById(postingId: string) { }, }); -// console.log(data); + // console.log(data); return data; } diff --git a/src/app_modules/admin/forum/index.tsx b/src/app_modules/admin/forum/index.tsx index 595b747a..199053be 100644 --- a/src/app_modules/admin/forum/index.tsx +++ b/src/app_modules/admin/forum/index.tsx @@ -1,17 +1,15 @@ -import AdminForum_Main from "./main"; -import AdminForum_TablePublish from "./child/publish"; -import AdminForum_TableReportKomentar from "./child/report_komentar"; -import AdminForum_TableReportPosting from "./child/report_posting"; -import AdminForum_LihatSemuaKomentar from "./children/semua_komentar"; -import AdminForum_HasilReportPosting from "./hasil_report/posting"; -import AdminForum_HasilReportKomentar from "./hasil_report/komentar"; +import AdminForum_Main from "./main/dashboard"; +import AdminForum_TablePosting from "./sub_menu/table_posting"; +import AdminForum_TableReportPosting from "./sub_menu/table_report_posting"; +import AdminForum_DetailPosting from "./detail/detail_posting"; +import AdminForum_HasilReportPosting from "./sub_detail/hasil_report_posting"; +import AdminForum_HasilReportKomentar from "./sub_detail/hasil_report_komentar"; export { AdminForum_Main, - AdminForum_TablePublish, - AdminForum_TableReportKomentar, + AdminForum_TablePosting as AdminForum_TablePublish, AdminForum_TableReportPosting, - AdminForum_LihatSemuaKomentar, + AdminForum_DetailPosting as AdminForum_LihatSemuaKomentar, AdminForum_HasilReportPosting, AdminForum_HasilReportKomentar, }; diff --git a/src/app_modules/admin/forum/main/index.tsx b/src/app_modules/admin/forum/main/dashboard.tsx similarity index 94% rename from src/app_modules/admin/forum/main/index.tsx rename to src/app_modules/admin/forum/main/dashboard.tsx index d17fc5c5..989cadc4 100644 --- a/src/app_modules/admin/forum/main/index.tsx +++ b/src/app_modules/admin/forum/main/dashboard.tsx @@ -23,7 +23,7 @@ export default function AdminForum_Main({ countLaporanKomentar={countLaporanKomentar} /> - {/* */} + {/* */} ); } @@ -46,13 +46,13 @@ function ForumMain({ }, { id: 2, - name: "Laporan Posting", + name: "Report Posting", jumlah: countLaporanPosting, color: "orange", }, { id: 3, - name: "Laporan Komentar", + name: "Report Komentar", jumlah: countLaporanKomentar, color: "red", }, diff --git a/src/app_modules/admin/forum/hasil_report/komentar/index.tsx b/src/app_modules/admin/forum/sub_detail/hasil_report_komentar.tsx similarity index 55% rename from src/app_modules/admin/forum/hasil_report/komentar/index.tsx rename to src/app_modules/admin/forum/sub_detail/hasil_report_komentar.tsx index e9b9156c..7ec2e6b9 100644 --- a/src/app_modules/admin/forum/hasil_report/komentar/index.tsx +++ b/src/app_modules/admin/forum/sub_detail/hasil_report_komentar.tsx @@ -16,37 +16,48 @@ import { Center, Group, Modal, + Pagination, + Paper, ScrollArea, Spoiler, Stack, Table, Text, + TextInput, Title, } from "@mantine/core"; -import { IconMessageCircle, IconFlag3, IconTrash } from "@tabler/icons-react"; +import { + IconMessageCircle, + IconFlag3, + IconTrash, + IconSearch, +} from "@tabler/icons-react"; import _ from "lodash"; import { useRouter } from "next/navigation"; import { useState } from "react"; -import { adminForum_funDeletePostingById } from "../../fun/delete/fun_delete_posting_by_id"; -import { adminForum_funDeleteKomentarById } from "../../fun/delete/fun_delete_komentar_by_id"; -import { useDisclosure } from "@mantine/hooks"; +import { adminForum_funDeletePostingById } from "../fun/delete/fun_delete_posting_by_id"; +import { adminForum_funDeleteKomentarById } from "../fun/delete/fun_delete_komentar_by_id"; +import { useDisclosure, useShallowEffect } from "@mantine/hooks"; +import ComponentAdminGlobal_IsEmptyData from "../../component_global/is_empty_data"; +import { adminForum_getListReportKomentarbyId } from "../fun/get/get_list_report_komentar_by_id"; +import ComponentAdminGlobal_BackButton from "../../component_global/back_button"; export default function AdminForum_HasilReportKomentar({ komentarId, listReport, }: { komentarId: string; - listReport: any[]; + listReport: any; }) { return ( <> - + - + {/*
{JSON.stringify(listReport, null, 2)}
*/}
@@ -56,13 +67,11 @@ export default function AdminForum_HasilReportKomentar({ function ButtonDeleteKomentar({ komentarId }: { komentarId: string }) { const router = useRouter(); const [opened, { open, close }] = useDisclosure(false); - const [loadindDel, setLoadingDel] = useState(false); const [loadingDel2, setLoadingDel2] = useState(false); async function onDelete() { await adminForum_funDeleteKomentarById(komentarId).then((res) => { if (res.status === 200) { - setLoadingDel(false); setLoadingDel2(false); close(); router.back(); @@ -82,7 +91,6 @@ function ButtonDeleteKomentar({ komentarId }: { komentarId: string }) { radius={"xl"} onClick={() => { close(); - setLoadingDel(false); }} > Batal @@ -104,14 +112,12 @@ function ButtonDeleteKomentar({ komentarId }: { komentarId: string }) { + + + ); +} + +// function ButtonDeletePosting({ postingId }: { postingId: string }) { +// const [opened, { open, close }] = useDisclosure(false); +// const [loadingDel, setLoadingDel] = useState(false); +// const [loadingDel2, setLoadingDel2] = useState(false); + +// async function onDelete() { +// await adminForum_funDeletePostingById(postingId).then((res) => { +// if (res.status === 200) { +// setLoadingDel2(false); +// setLoadingDel(false); +// close(); +// ComponentGlobal_NotifikasiBerhasil(res.message); +// } else { +// ComponentGlobal_NotifikasiGagal(res.message); +// } +// }); +// } +// return ( +// <> +// +// +// Anda yakin menghapus posting ini +// +// +// +// +// +// +// +// +// ); +// } diff --git a/src/app_modules/admin/forum/sub_menu/table_report_posting.tsx b/src/app_modules/admin/forum/sub_menu/table_report_posting.tsx new file mode 100644 index 00000000..481dc1d7 --- /dev/null +++ b/src/app_modules/admin/forum/sub_menu/table_report_posting.tsx @@ -0,0 +1,279 @@ +"use client"; + +import { RouterAdminForum } from "@/app/lib/router_admin/router_admin_forum"; +import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; +import ComponentAdminGlobal_HeaderTamplate from "@/app_modules/admin/component_global/header_tamplate"; +import { + MODEL_FORUM_POSTING, + MODEL_FORUM_REPORT, +} from "@/app_modules/forum/model/interface"; +import { + Badge, + Box, + Button, + Center, + Group, + Modal, + Pagination, + Paper, + ScrollArea, + Spoiler, + Stack, + Table, + Text, + TextInput, + Title, +} from "@mantine/core"; +import { IconMessageCircle, IconSearch } from "@tabler/icons-react"; +import { IconFlag3 } from "@tabler/icons-react"; +import { IconEyeCheck, IconTrash } from "@tabler/icons-react"; +import _, { isEmpty } from "lodash"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; +import { adminForum_funDeletePostingById } from "../fun/delete/fun_delete_posting_by_id"; +import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; +import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; +import { useDisclosure } from "@mantine/hooks"; +import { adminForum_getListPosting } from "../fun/get/get_list_publish"; +import adminJob_getListPublish from "@/app_modules/admin/job/fun/get/get_list_publish"; +import ComponentAdminForum_ButtonDeletePosting from "../component/button_delete"; +import adminForum_funGetAllReportPosting from "../fun/get/get_all_report_posting"; +import ComponentAdminGlobal_IsEmptyData from "../../component_global/is_empty_data"; + +export default function AdminForum_TableReportPosting({ + listData, +}: { + listData: any; +}) { + return ( + <> + + + + {/*
{JSON.stringify(listPublish, null, 2)}
*/} +
+ + ); +} + +function TableView({ listData }: { listData: any }) { + const router = useRouter(); + const [data, setData] = useState(listData.data); + const [nPage, setNPage] = useState(listData.nPage); + const [activePage, setActivePage] = useState(1); + const [isSearch, setSearch] = useState(""); + + async function onSearch(s: string) { + setSearch(s); + setActivePage(1); + const loadData = await adminForum_funGetAllReportPosting({ + page: 1, + search: s, + }); + setData(loadData.data as any); + setNPage(loadData.nPage); + } + + async function onPageClick(p: any) { + setActivePage(p); + const loadData = await adminForum_funGetAllReportPosting({ + search: isSearch, + page: p, + }); + setData(loadData.data as any); + setNPage(loadData.nPage); + } + + async function onLoadData() { + const loadData = await adminForum_funGetAllReportPosting({ + page: 1, + }); + setData(loadData.data as any); + setNPage(loadData.nPage); + } + + const TableRows = data?.map((e, i) => ( + + +
+ {e?.User.username} +
+ + +
+ {e?.forumMaster_KategoriReportId === null ? ( + Lainnya + ) : ( + {e?.ForumMaster_KategoriReport.title} + )} +
+ + + +
+ {e?.Forum_Posting.Author.username} +
+ + + + + +
+ + + + + +
+ + {e?.Forum_Posting.ForumMaster_StatusPosting?.status} + +
+ + + +
+ + {new Intl.DateTimeFormat(["id-ID"], { dateStyle: "medium" }).format( + e.createdAt + )} + +
+ + + + + {/* */} + + { + if (val) { + onLoadData(); + } + }} + /> + + + + )); + + return ( + <> + + + + Report Posting + + } + radius={"xl"} + placeholder="Cari postingan" + onChange={(val) => { + // console.log(val.currentTarget.value) + onSearch(val.currentTarget.value); + }} + /> + + + {isEmpty(data) ? ( + + ) : ( + + + + + + + + + + + + + + + + {TableRows} +
+
Pelapor
+
+
Jenis Laporan
+
+
Author
+
+ Postingan + +
Status Posting
+
+
Tanggal Report
+
+
Aksi
+
+
+
+ { + onPageClick(val); + }} + /> +
+
+ )} +
+ + ); +} + +function ButtonLihatReportLainnya({ postingId }: { postingId: string }) { + const router = useRouter(); + const [loading, setLoading] = useState(false); + return ( + <> + + + ); +} diff --git a/src/app_modules/admin/job/detail/detail_poster.tsx b/src/app_modules/admin/job/detail/detail_poster.tsx index a3757528..49b9dfa9 100644 --- a/src/app_modules/admin/job/detail/detail_poster.tsx +++ b/src/app_modules/admin/job/detail/detail_poster.tsx @@ -2,7 +2,7 @@ import { RouterJob } from "@/app/lib/router_hipmi/router_job"; import { Center, Image, Stack } from "@mantine/core"; -import ComponentGlobalAdmin_BackButton from "../../component_global/back_button"; +import ComponentAdminGlobal_BackButton from "../../component_global/back_button"; export default function AdminJob_DetailPoster({ imageId, @@ -12,7 +12,7 @@ export default function AdminJob_DetailPoster({ return ( <> - +
Foto { e?.kategoriApp === "JOB" && - findRouterJob({ + adminNotifikasi_findRouterJob({ data: e, router: router, - onChangeNavbar2: (val: any) => { + onChangeNavbar: (val: any) => { onChangeNavbar(val); }, - onToggleNavbar2: onToggleNavbar, + onToggleNavbar: onToggleNavbar, + }); + + e?.kategoriApp === "FORUM" && + adminNotifikasi_findRouterForum({ + data: e, + router: router, + onChangeNavbar(val) { + onChangeNavbar(val); + }, + onToggleNavbar(val) { + onToggleNavbar(val); + }, }); const updateIsRead = await adminNotifikasi_funUpdateIsReadById({ @@ -480,35 +494,3 @@ function DrawerNotifikasi({ ); } - -async function findRouterJob({ - data, - router, - onChangeNavbar2, - onToggleNavbar2, -}: { - data: MODEL_NOTIFIKASI; - router: AppRouterInstance; - onChangeNavbar2: (val: any) => void; - onToggleNavbar2: (val: any) => void; -}) { - const routeName = "/dev/admin/job/child/"; - - if (data.status === "Review") { - router.push(routeName + _.lowerCase(data.status)); - onChangeNavbar2({ - id: 6, - childId: 63, - }); - } - - if (data.status === "Draft") { - router.push(routeName + "review"); - onChangeNavbar2({ - id: 6, - childId: 63, - }); - } - - onToggleNavbar2(true); -} diff --git a/src/app_modules/admin/list_page.tsx b/src/app_modules/admin/list_page.tsx index 583b3244..ae9806ee 100644 --- a/src/app_modules/admin/list_page.tsx +++ b/src/app_modules/admin/list_page.tsx @@ -229,13 +229,13 @@ export const listAdminPage = [ { id: 72, name: "Table Posting", - path: RouterAdminForum.publish, + path: RouterAdminForum.table_posting, + }, + { + id: 73, + name: "Report Posting", + path: RouterAdminForum.table_report_posting, }, - // { - // id: 73, - // name: "Laporan Posting", - // path: RouterAdminForum.report_posting, - // }, // { // id: 74, // name: "Laporan Komentar", diff --git a/src/app_modules/admin/notifikasi/route_setting/forum.ts b/src/app_modules/admin/notifikasi/route_setting/forum.ts new file mode 100644 index 00000000..279c5dc4 --- /dev/null +++ b/src/app_modules/admin/notifikasi/route_setting/forum.ts @@ -0,0 +1,22 @@ +import { RouterAdminForum } from "@/app/lib/router_admin/router_admin_forum"; +import { MODEL_NOTIFIKASI } from "@/app_modules/notifikasi/model/interface"; +import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime"; + +export default async function adminNotifikasi_findRouterForum({ + data, + router, + onChangeNavbar, + onToggleNavbar, +}: { + data: MODEL_NOTIFIKASI; + router: AppRouterInstance; + onChangeNavbar: (val: any) => void; + onToggleNavbar: (val: any) => void; +}) { + const routeName = RouterAdminForum.table_report_posting; + router.push(routeName); + onChangeNavbar({ + id: 7, + childId: 73, + }); +} diff --git a/src/app_modules/admin/notifikasi/route_setting/job.ts b/src/app_modules/admin/notifikasi/route_setting/job.ts new file mode 100644 index 00000000..badc572e --- /dev/null +++ b/src/app_modules/admin/notifikasi/route_setting/job.ts @@ -0,0 +1,35 @@ +import { MODEL_NOTIFIKASI } from "@/app_modules/notifikasi/model/interface"; +import _ from "lodash"; +import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime"; + +export default async function adminNotifikasi_findRouterJob({ + data, + router, + onChangeNavbar, + onToggleNavbar, +}: { + data: MODEL_NOTIFIKASI; + router: AppRouterInstance; + onChangeNavbar: (val: any) => void; + onToggleNavbar: (val: any) => void; +}) { + const routeName = "/dev/admin/job/child/"; + + if (data.status === "Review") { + router.push(routeName + _.lowerCase(data.status)); + onChangeNavbar({ + id: 6, + childId: 63, + }); + } + + if (data.status === "Draft") { + router.push(routeName + "review"); + onChangeNavbar({ + id: 6, + childId: 63, + }); + } + + onToggleNavbar(true); +} diff --git a/src/app_modules/auth/index.ts b/src/app_modules/auth/index.ts index 97d3dd97..599f9aaa 100644 --- a/src/app_modules/auth/index.ts +++ b/src/app_modules/auth/index.ts @@ -1,7 +1,6 @@ import SplashScreen from "./splash/view"; import Login from "./login/view"; import Validasi from "./validasi/view"; -import LayoutValidasi from "./validasi/layout"; import Register from "./register/view"; import User_Logout from "./logout/view"; @@ -11,5 +10,4 @@ export { Validasi, Register, User_Logout as Logout, - LayoutValidasi, }; diff --git a/src/app_modules/auth/login/view.tsx b/src/app_modules/auth/login/view.tsx index 6f08325d..8b8e87c0 100644 --- a/src/app_modules/auth/login/view.tsx +++ b/src/app_modules/auth/login/view.tsx @@ -40,7 +40,6 @@ export default function Login() { async function onLogin() { const nomorHp = phone.substring(1); - console.log(nomorHp); if (nomorHp.length <= 4) return setError(true); @@ -117,6 +116,7 @@ export default function Login() { + + + + + {/* - + */}
); diff --git a/src/app_modules/auth/validasi/layout.tsx b/src/app_modules/auth/validasi/layout.tsx deleted file mode 100644 index 9e611223..00000000 --- a/src/app_modules/auth/validasi/layout.tsx +++ /dev/null @@ -1,34 +0,0 @@ -"use client"; - -import { ActionIcon, Box, Stack } from "@mantine/core"; -import { IconChevronLeft } from "@tabler/icons-react"; -import { useRouter } from "next/navigation"; -import React from "react"; - -export default function LayoutValidasi({ - children, -}: { - children: React.ReactNode; -}) { - const router = useRouter(); - - return ( - - - router.back()}> - - - - {children} - - ); -} - diff --git a/src/app_modules/auth/validasi/view.tsx b/src/app_modules/auth/validasi/view.tsx index 083882f2..bb9c4f00 100644 --- a/src/app_modules/auth/validasi/view.tsx +++ b/src/app_modules/auth/validasi/view.tsx @@ -1,41 +1,32 @@ "use client"; -import { useAtom } from "jotai"; +import { RouterAdminDashboard } from "@/app/lib/router_hipmi/router_admin"; +import { RouterAuth } from "@/app/lib/router_hipmi/router_auth"; +import { RouterHome } from "@/app/lib/router_hipmi/router_home"; +import { + AccentColor, + MainColor, +} from "@/app_modules/component_global/color/color_pallet"; +import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; +import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; import { ActionIcon, + Box, Button, Center, - Flex, PinInput, Stack, Text, - Title, + Title } from "@mantine/core"; -import { gs_nomor, gs_otp } from "../state/state"; -import { Warna } from "@/app/lib/warna"; -import { useState } from "react"; -import { myConsole } from "@/app/fun/my_console"; -import { - IconChevronLeft, - IconCircleLetterH, - IconCloudLockOpen, -} from "@tabler/icons-react"; -import toast from "react-simple-toasts"; -import { ApiHipmi } from "@/app/lib/api"; -import { useRouter } from "next/navigation"; -import { funGetUserProfile } from "@/app_modules/fun_global/get_user_profile"; import { useFocusTrap } from "@mantine/hooks"; -import { NotifBerhasil } from "@/app_modules/donasi/component/notifikasi/notif_berhasil"; -import { NotifGagal } from "@/app_modules/donasi/component/notifikasi/notif_gagal"; -import { NotifPeringatan } from "@/app_modules/donasi/component/notifikasi/notif_peringatan"; -import Countdown from "react-countdown"; -import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; -import { auth_funValidasi } from "../fun/fun_validasi"; -import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; -import { RouterAuth } from "@/app/lib/router_hipmi/router_auth"; -import { RouterHome } from "@/app/lib/router_hipmi/router_home"; +import { + IconChevronLeft +} from "@tabler/icons-react"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; import { auth_funEditAktivasiKodeOtpById } from "../fun/fun_edit_aktivasi_kode_otp_by_id"; -import { RouterAdminDashboard } from "@/app/lib/router_hipmi/router_admin"; +import { auth_funValidasi } from "../fun/fun_validasi"; export default function Validasi({ dataOtp }: { dataOtp: any }) { const router = useRouter(); @@ -45,37 +36,6 @@ export default function Validasi({ dataOtp }: { dataOtp: any }) { const focusTrapRef = useFocusTrap(); const [loading, setLoading] = useState(false); - const onValid = async () => { - // MyConsole(inputCode) - const body = { - nomor: nomor, - otp: code, - }; - - if (!inputCode) return toast("Lengkapi Kode"); - if (body.otp != inputCode) return toast("Kode Salah"); - - // await fetch(ApiHipmi.validasi, { - // method: "POST", - // headers: { - // "Content-Type": "application/json", - // }, - // body: JSON.stringify(body), - // }) - // .then((res) => res.json()) - // .then((val) => { - // myConsole(val); - // if (val.status == 200) { - // setTimeout(() => router.push("/dev/home"), 2000); - // funGetUserProfile(val.data.id); - // NotifBerhasil("Berhasil Login"); - // } else { - // router.push("/dev/auth/register"); - // NotifPeringatan("Silahkan Registrasi"); - // } - // }); - }; - async function onVerifikasi() { if (!inputCode) return ComponentGlobal_NotifikasiPeringatan("Lengkapi Kode"); @@ -106,23 +66,32 @@ export default function Validasi({ dataOtp }: { dataOtp: any }) { return ( <> -
- -
- -
+ + + router.back()}> + + + - - - Verifikasi Kode OTP - - Silahkan masukan 4 digit kode otp yang dikirim ke{" "} - - +{nomor} - - - + + + Verifikasi Kode OTP + + + + Masukan 4 digit kode otp + + + Yang dikirim ke +{nomor} +
- - -
+
-
+
); } diff --git a/src/app_modules/forum/component/main_component/card_more_button.tsx b/src/app_modules/forum/component/main_component/card_more_button.tsx index d5aee877..bad37fe0 100644 --- a/src/app_modules/forum/component/main_component/card_more_button.tsx +++ b/src/app_modules/forum/component/main_component/card_more_button.tsx @@ -27,13 +27,11 @@ import { useRouter } from "next/navigation"; import { useState } from "react"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; +import mqtt_client from "@/util/mqtt_client"; +import _ from "lodash"; import { forum_funDeletePostingById } from "../../fun/delete/fun_delete_posting_by_id"; import { forum_funEditStatusPostingById } from "../../fun/edit/fun_edit_status_posting_by_id"; -import forum_v2_getAllPosting from "../../fun/get/v2_get_all_posting"; -import { forum_new_getAllPosting } from "../../fun/get/new_get_all_posting"; -import _ from "lodash"; import { MODEL_FORUM_POSTING } from "../../model/interface"; -import mqtt_client from "@/util/mqtt_client"; export default function ComponentForum_V2_CardMoreButton({ authorId, diff --git a/src/app_modules/forum/fun/create/fun_create_report_posting.ts b/src/app_modules/forum/fun/create/fun_create_report_posting.ts index bb058aee..7f93de05 100644 --- a/src/app_modules/forum/fun/create/fun_create_report_posting.ts +++ b/src/app_modules/forum/fun/create/fun_create_report_posting.ts @@ -4,22 +4,20 @@ import prisma from "@/app/lib/prisma"; import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token"; import { revalidatePath } from "next/cache"; -export async function forum_funCreateReportPosting( - postingId: string, - value: string, -) { +export async function forum_funCreateReportPosting({ + postingId, + kategoriId, +}: { + postingId: string; + kategoriId: number; +}) { const authorId = await user_getOneUserId(); - const cekId = await prisma.forumMaster_KategoriReport.findFirst({ - where: { - title: value, - }, - }); const createReport = await prisma.forum_ReportPosting.create({ data: { userId: authorId, forum_PostingId: postingId, - forumMaster_KategoriReportId: cekId?.id, + forumMaster_KategoriReportId: kategoriId, }, }); diff --git a/src/app_modules/forum/fun/get/get_one_kategori_by_id.ts b/src/app_modules/forum/fun/get/get_one_kategori_by_id.ts new file mode 100644 index 00000000..2acabf36 --- /dev/null +++ b/src/app_modules/forum/fun/get/get_one_kategori_by_id.ts @@ -0,0 +1,17 @@ +"use server"; + +import prisma from "@/app/lib/prisma"; + +export default async function forum_getOneKategoriById({ + kategoriId, +}: { + kategoriId: number; +}) { + const cekData = await prisma.forumMaster_KategoriReport.findFirst({ + where: { + id: kategoriId, + }, + }); + + return cekData +} diff --git a/src/app_modules/forum/fun/get/v2_get_all_posting.ts b/src/app_modules/forum/fun/get/v2_get_all_posting.ts deleted file mode 100644 index ca1acfce..00000000 --- a/src/app_modules/forum/fun/get/v2_get_all_posting.ts +++ /dev/null @@ -1,48 +0,0 @@ -"use server" - -import prisma from "@/app/lib/prisma"; - - -export default async function forum_v2_getAllPosting({search}: {search?: string}) { - const getData = await prisma.forum_Posting.findMany({ - // take: takeData, - // skip: skipData, - orderBy: { - createdAt: "desc", - }, - where: { - isActive: true, - diskusi: { - mode: "insensitive", - contains: search, - }, - }, - select: { - id: true, - diskusi: true, - createdAt: true, - isActive: true, - authorId: true, - Author: { - select: { - id: true, - username: true, - Profile: { - select: { - id: true, - imagesId: true, - }, - }, - }, - }, - Forum_Komentar: { - where: { - isActive: true, - }, - }, - ForumMaster_StatusPosting: true, - }, - }); - - return getData -} \ No newline at end of file diff --git a/src/app_modules/forum/main/beranda.tsx b/src/app_modules/forum/main/beranda.tsx index d9b4c950..b83e5f04 100644 --- a/src/app_modules/forum/main/beranda.tsx +++ b/src/app_modules/forum/main/beranda.tsx @@ -1,50 +1,30 @@ "use client"; import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; -import { RouterJob } from "@/app/lib/router_hipmi/router_job"; -import ComponentGlobal_AuthorNameOnHeader from "@/app_modules/component_global/author_name_on_header"; -import { - Affix, - rem, - ActionIcon, - Card, - CardSection, - Text, - Stack, - Divider, - Group, - Box, - TextInput, - Center, - Button, - Pagination, - Loader, -} from "@mantine/core"; -import { useShallowEffect, useTimeout, useWindowScroll } from "@mantine/hooks"; -import { - IconCirclePlus, - IconMessageCircle, - IconPencilPlus, - IconSearch, - IconSearchOff, -} from "@tabler/icons-react"; -import { useRouter } from "next/navigation"; -import ComponentForum_PostingAuthorNameOnHeader from "../component/header/posting_author_header_name"; -import { useState } from "react"; -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; -import { useAtom } from "jotai"; -import { gs_forum_loading_edit_posting } from "../global_state"; -import { MODEL_FORUM_POSTING } from "../model/interface"; -import ComponentForum_MainCardView from "../component/main_card_view"; -import { forum_getListAllPosting } from "../fun/get/get_list_all_posting"; -import { forum_funSearchListPosting } from "../fun/search/fun_search_list_posting"; -import _ from "lodash"; -import ComponentForum_BerandaCardView from "../component/beranda/beranda_card"; import mqtt_client from "@/util/mqtt_client"; +import { + ActionIcon, + Affix, + Button, + Center, + Loader, + Stack, + Text, + TextInput, + rem +} from "@mantine/core"; +import { useShallowEffect, useWindowScroll } from "@mantine/hooks"; +import { + IconPencilPlus, + IconSearchOff +} from "@tabler/icons-react"; +import _ from "lodash"; +import { ScrollOnly } from "next-scroll-loader"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; import ComponentForum_V2_MainCardView from "../component/main_component/card_view"; import { forum_new_getAllPosting } from "../fun/get/new_get_all_posting"; -import forum_v2_getAllPosting from "../fun/get/v2_get_all_posting"; -import { ScrollOnly } from "next-scroll-loader"; +import { MODEL_FORUM_POSTING } from "../model/interface"; export default function Forum_Beranda({ listForum, diff --git a/src/app_modules/forum/model/interface.tsx b/src/app_modules/forum/model/interface.tsx index 014c0139..b512259a 100644 --- a/src/app_modules/forum/model/interface.tsx +++ b/src/app_modules/forum/model/interface.tsx @@ -13,7 +13,7 @@ export interface MODEL_FORUM_POSTING { Forum_Komentar: MODEL_FORUM_KOMENTAR[]; Forum_ReportPosting: MODEL_FORUM_MASTER_REPORT[]; ForumMaster_StatusPosting: MODEL_FORUM_MASTER_STATUS; - forumMaster_StatusPostingId: number + forumMaster_StatusPostingId: number; } export interface MODEL_FORUM_KOMENTAR { @@ -53,5 +53,8 @@ export interface MODEL_FORUM_REPORT { deskripsi: string; ForumMaster_KategoriReport: MODEL_FORUM_MASTER_REPORT; forumMaster_KategoriReportId: string; + forum_PostingId: string; + Forum_Posting: MODEL_FORUM_POSTING; + userId: string; User: MODEL_USER; } diff --git a/src/app_modules/forum/report/posting/index.tsx b/src/app_modules/forum/report/posting/index.tsx index 0b599f0d..650f86b6 100644 --- a/src/app_modules/forum/report/posting/index.tsx +++ b/src/app_modules/forum/report/posting/index.tsx @@ -11,6 +11,8 @@ import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; import mqtt_client from "@/util/mqtt_client"; import adminNotifikasi_funCreateToUser from "@/app_modules/admin/notifikasi/fun/create/fun_create_notif_user"; import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif_to_admin"; +import forum_getOneKategoriById from "../../fun/get/get_one_kategori_by_id"; +import { toNumber } from "lodash"; export default function Forum_ReportPosting({ postingId, @@ -21,17 +23,22 @@ export default function Forum_ReportPosting({ listReport: MODEL_FORUM_MASTER_REPORT[]; userLoginId: string; }) { - const [reportValue, setReportValue] = useState("Kebencian"); + const [reportValue, setReportValue] = useState("1"); return ( <> - + { + setReportValue(val); + }} + > {listReport.map((e) => ( - + {e.title}} /> {e.deskripsi} @@ -40,7 +47,7 @@ export default function Forum_ReportPosting({ @@ -50,11 +57,11 @@ export default function Forum_ReportPosting({ } function ButtonAction({ - value, + kategoriId, postingId, userLoginId, }: { - value: string; + kategoriId: number; postingId: string; userLoginId: string; }) { @@ -62,27 +69,36 @@ function ButtonAction({ const [loading, setLoading] = useState(false); async function onReport() { - const report = await forum_funCreateReportPosting(postingId, value); + const report = await forum_funCreateReportPosting({ + postingId: postingId, + kategoriId: kategoriId, + }); if (report.status === 201) { + const getKategori = await forum_getOneKategoriById({ + kategoriId: toNumber(kategoriId), + }); + console.log(getKategori); + ComponentGlobal_NotifikasiBerhasil(report.message, 2000); setLoading(true); router.back(); - // const dataNotif = { - // appId: postingId, - // pesan: value, - // kategoriApp: "FORUM", - // title: "Report Posting", - // userId: userLoginId, - // }; + const dataNotif = { + appId: postingId, + pesan: getKategori?.deskripsi, + kategoriApp: "FORUM", + title: getKategori?.title, + userId: userLoginId, + status: "Report Posting", + }; - // const notif = await notifikasiToAdmin_funCreate({ - // data: dataNotif as any, - // }); + const createNotifikasi = await notifikasiToAdmin_funCreate({ + data: dataNotif as any, + }); - // if (notif.status === 201) { - // mqtt_client.publish("ADMIN", JSON.stringify({ count: 1 })); - // } + if (createNotifikasi.status === 201) { + mqtt_client.publish("ADMIN", JSON.stringify({ count: 1 })); + } } else { ComponentGlobal_NotifikasiGagal(report.message); } From 96fb9a8512bb94cdf82061d7545a20ea0924ac0b Mon Sep 17 00:00:00 2001 From: Bagasbanuna02 Date: Tue, 25 Jun 2024 15:47:49 +0800 Subject: [PATCH 05/17] Penerapan UI Home # style: - Tampilan home dan loading ## No issue --- public/aset/global/main_background.png | Bin 0 -> 190812 bytes src/app/dev/event/splash/page.tsx | 2 +- src/app/dev/home/loading.tsx | 2 +- src/app/dev/home/page.tsx | 18 +- src/app/zCoba/page.tsx | 7 + .../component_global/is_empty_data.tsx | 14 +- .../component_global/loading_page_v2.tsx | 87 ++++--- src/app_modules/home/layout.tsx | 212 +++++++++++++----- src/app_modules/home/view.tsx | 175 ++++++++++----- .../job/fun/get/get_two_for_home_view.ts | 28 +++ src/app_modules/zCoba/index.tsx | 23 ++ 11 files changed, 407 insertions(+), 161 deletions(-) create mode 100644 public/aset/global/main_background.png create mode 100644 src/app_modules/job/fun/get/get_two_for_home_view.ts diff --git a/public/aset/global/main_background.png b/public/aset/global/main_background.png new file mode 100644 index 0000000000000000000000000000000000000000..bc2282b70aac173dd410689102b5b92252df0bd8 GIT binary patch literal 190812 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

Ri>lMW4`n0t`AUWh`Tb#* zn4chV;Eox$O?p1lQf+FDGo-Cs*6d_^m!h`M3JuMXtaJ8c^k6!mKen5l58&5D<9X~F z6b47?bu{@}1_S4orv>4$S-Syy3!iZ;ULSn`@T0lCV8}AF#R~*inWkgI+M=7>T<#`~ zD@V#o!M0hcHf*x*H0-?av3l;2gCXi`rXrIWtp>+jNPjgMCv?n z=R)*Ye_U9jwXN)LKNSR8^Qv!ne${-9T=a#eV)r>Rb2d_dEa4OHKb76YY!6)fo%Ltz zpqI|nR(ouA+57UHL!a^5q9FwCeLop{(Cd}T%#LB1O@Cip`QUxyorJdDGBln&;AR?i z?U)&OE9usWOoeOM^%>+)j_6+}wju=p2;5vSSTknqzwJ|=O~x7y2mR75XxX5N$imq< z4oWj5);{QL3c4W=qrg*`)nFnx(2dvn5fo@G>r-yDw?6H88_3?t(kTlDMm`hMB_H<6EEXNvtUtaAxac}G!Tf64pKIpss+-{xW%B4xl-sUuvi-cxi z*|e&GI(`Nn>n6Z1*dyZJ$0qyp{ASjs5`O!c8!c<#ZsmvH^II$$%E#m3qjNtHOtg<| zi!eoa|DN6pghRFZmp(7T06drB?0Gk`)B7?I_NQwc-V`D~oZD5}ZD-OTkzl1pXAaxb zbwTA~5(hRzBTSeF064+T1w(b!YmsZ@VxlLm{m+AoChQyCFvm7+ zb70MU$I!=7CP6linw3x|`%|k+SJUHQ=rai?T#dFn*RZ@?+mu~b_ustI0ey~8g7jn! zzx$w5LG*uqKV{F)Q)`ZG`nqRW5mw`^vU!6+*RKd4KW^P5ZRb97Xi#2wZuL26bw7SK zJyz4TuVwLUy%+iUB=Ps_aa=5(mx_x-p_IrnfO!Bfk#Ne9ES?Et zg5(Ul=Z(KctitO^SY~7p0N~@?R50k`R-RLkHL@`{rmzW&F5C*>nzm}w?YWe8U~Q|_ z_05v>{7T+vI4lCp6t3K8nFlrVY`v;ad5$$XT9divBe=N{$0qIukr2v^6hLm)o4fEI zv7plrIg)6I`f)#K2A2A{8uq>q^!mPW_!yyFB+L<5u1=T9Nq{^^EVRn? z|Ie>)H)$f@_-w-@y<8RLk+%PTJz9BF7#Jv# zAhDpVR6v_%Zq9V&_vLJ6_uIs*K0kTZ#3I3hcPjxpe*G!T6V|R#d*!EOpOaZ{``JDw zE`7hq>Fm?SoCibCQXR@G0igNZTrhMayUVSWQ8ZjIWNrm4VD^y>tNRbrW#eVBc@3ML zb)(j{cFlap58bVIf00O7E*A9=2`yJU-BHuB?@0(v%clpa?aX#Gc-G%*0HDD3&+|*Z zNQ!zkTk&FY(;4Y@D!lGgQF(1WTlzfTOuTqIp zR+K1dC0pB~PQt0M?bQIlfp@|=qd`4P(^kpQXKKown0l!6hHZRi;r0tMy8cNtwA+(H z*lSy;TuPR?D!&QF7uvTvzpInvwK}c|*UC19&F2g=4rgX`-PLpN4h(?P>jw1Wb2F!H zbA#$wspFt`I&gOxp-?imK3F!Eeyx_D3F9Wrt7Pri8bT;hbN0xqVsVE|0svf#n+gV9 ze9Qd{&9_ag)|!VDaFcL@g5s6Q)wfRG4sJ0T$~4d<;1gv!HgQ?2c*|u`^6;Hh2dNFM zY^r<4isZ%|OY~V304UH=HYNO;dNqDMK4gFMK(I-(F+PI@()o7yUmko07p1Tr6uAB8 z_aqMxea7XR&Nq8IMY)k18rJuI`p1Gj8+>JDWlPHfY`$1BVnOCGo}J=)LOxpVX$App zCvrk*+-Bq6-$xfglu1wtnX&?*X<31=vahm8jqP3^#v@yxsJb0ZXKtQ?er^s!2VO^? zRnMu{sxA8N$ z)LEYT-jey}_NCdaN+ekCQupYBh-DJi`F5PI3g@Jz_3!||eQ;C3(2JT=ZCriBr@2}) zT{j-qw*A(X`OjdseBE-hvu=X7!u2KeZ8dLDsWpxXL4pLrLe0y5I(Qwj32I#Kdy&wu zG{9F0Uib^&khnUMk2X{Hg$g(x^Gt)Hn(9>Bdqkg4gWj~g%(~MD=b=RD zpQnj!r}-5HRN-!s z1UFgw_zIgVIa*lravem1(6QWC35rc^J?>r-8X)I>*wuQo{?IlyQIP-dDQap}GpPML zKd*kma5Hnj@h(d0Yv@NMN|tqbddOFPyY!)}vb8w7@Fp>RMyZPHdl=cwh7%tr`W?5x@Soq0mi0L&L%dwOtV$T{X3fL- zw$w2l77D_1|H?CG`6oz<;4pF6|LfrE=~|-a)VUE~S0vJ3rc-;~Ao`T;kl0GidD!|4 zpeq4dd{`tDpSR~qjt2d7#xYo+&hq1T?x$}f5&)o1+)Oa&q8VS8=auq{rV*M@1KVBb z$;cXmrQsthRcm&xG#_4yu)^koguZ2G(gAkno0pwPumI@0H>|BNy9P~7T@Jk~r#{2n zmt};(TAv95tW0dSFo&35Pme{viC$j;pY)#U`G3LyCIxW+`}<nZOP$uZh$3D`y9HZl>DDyg!iPCc` ztD^G4)g8vVEx2A4VwoLeRdsl=j?wSJ1(=Z|9lFPwasP+77T1fJ`cj59`?VZ zfLPPHCEiXQ-%D>P8ip!bmL}h}5(NMLc`@-(nh-s5y#xxP^_dQd?PA+zZo0CrWrIQQ z-An{4@5#@bV8yK0J={F)dQ6l_SbSlQjuyr=IM2=IIs6!B)UeK`zSl&hmdFGEs5`e2 z4AvkRPuk2H;iG^sbDKKU|#E3(6;(FU)hygQr~BXoM>?3@9*<#?dE4(gD~h# zfwpSZ2ZMd@hyqfrR8PCET{HjsCEcfZ@jgY%h0@hON&G8tAC$gEhvuX zXINnL>oI$Nd2PHPKNmUW{F?{6lkukHCZ!-w&O18J-SD#g_Sg&BK{o97EKvQZNC@@q z+VA>vYjZ%HgN?0W=YO`n)0dkx+_CqfAi4Tlx;BnfzLK9e3Mk*sD96z=^eW{@=bXPi zKcP6V+3alloYTZS_x7dg53u)OJy89Vf?r+{pvG^Y^E|T|M$gN31JXl=z{?wld&nr>(*=$1SZ?Ws$$Qd>qdOOO7Xfb3e>(z#3p8)_4aT~$VFZ=v| zWhJ`~^bZVcTYq;c%?GfC&R*PqvHeg_Ns&$H_r2Rl|K!YsnFVydN8+1>f=U>Ay?!w( zq0>pbH0j2_@vP+CJl<8vyo!h*Nu7b@Xyy3O!2I{eRBUVCR9p{K|H)^i&q4AN5PvyaMll zrR&U#^=ceGH{-1BW_|j&v|h64ytmBg>SM=;&SibIeg9V5+s!Idag6w7I$IoSmHQ z5G&uqq+W=hU_1Z-KaZ;m26wUF|9iD*cK?D|YYxigNQ(w#Oq@^oKI5~s$U3QmgA> z|LF6pJW1|JmuhIQGy8H8=W=vx1=>o9TJ3|6(fOc2b9E!9E}b)f*RK|E$}Tpxpw{QH zefa!Vn(V!+^g>85o*ML^$E&O^`cC#yd!CkWI1ZQ#*g3z~e(zp%4(_~k*H_ERFZ!$T8>=~d^YU%6JZc)wSEoCNNx zw-&wib_yj`D#xkLn9x3as!aCY?LyGK7l)@`V`mng0W)vNx7SB{U93c?Tb?YvJ7WQ; zQzqk@ zZ{6GLB!lMQieszJc`*6QEIiAXKC`QRe*MzGw@a{}F`*%S`^nz=tWS?}C)!yvv~aTx z-0y`3?o<0#+0cjGuINLOE0L8Ap5fl3?W?l4{d;wR^EnOQ@pU9v5ubwu%EQCZ_Vb}r zTF;~H5vG8D_Sg;+y=CP(=pVLW-S{DEdcE&Y_ztHun;a@mo7$x2oAxB9mn zS%yXV&imipndkgETjV#)rOzgO*G<#)kmMpkL)CmH;T+c+tv>#JnSOgF*PN#67X<44Yahmw zz4f^jxc_~AvEV-h{u0YNe^1Tdu;6z(&wBZDhV9_`k~(JPYQq!#MhoZG!1@LTRt^+! zeKWJOjv*U}7u^S3R`31xc0DLAi{bWD>)`u;wPy6M&ot1&h{~Ks!^1raYj4AQ{g6j%~iknc==P$gQC$VTwqg$)e>}(c`YGfWh9SOd+*1RlBLYteQZ+^q)b!Ae$ zJex2qCi)(0UJhj?F6-dFuYD&!{(t|ze0$l+t&qt3lLwXxFyo-egySza6}s+@WfC`5 zmXZgN{UdWS6g<9#K=MEkD`&5Gu$xe3LEB(k<8xS|KrTtjG=%e1StEUx&}bXVi&VCA zj*YH*c6#}W`8dxwIfv7hiOPO&;Z${@=^W3hT)#@VrQr%@qj zt4Po(n=rK=h0hZ3J^7`L4u-=Q=!|%6y5&8fK`Mky3VC0oxM~r z`t%@bFn&l=`Mdc8k(y+FbeWtn-(){CL|LEiPmZaBa8HVY{4h*yb;3GRyxYt2}p@!NusXS80 zYPUN#+guTXePvS$M=X`=<=>{RRgY22VP1z!W38__x7AY%=E8y9q|ky%5^cDD|qyh!NzY=Ztw1uwzP zNTpy3JWRA5SxpTqsfs>a;Iem|`Tg{m3#qBqL;r-@WSa{8`eq_aL0U23t>b4k@TN6!^XovbWT+dV%vBr4Ah-h*Xp$z(x| z%K2-BMr&oc4sACr0K86TU$)>5w$KkY;k)~8c$~RsY39cK>oXew0PdaZ35H6&ag+V3 z-L%j0jc-xI&l76euuVK4cLYp~M{fmN^?)rz)TZNC3t!OA=GZK2O9i_TD%Au;*enqZx1xK-d3N?@Er zO?n`p0#;=cJ~|)4vI~(o68e0X5=Ox;)Mm5f$5Gdufbw8lbC>huEw~wJ1^W`&3yE=XStMTDI5|d?zPmk%^U>)fb+PDU8cYf$g(0f&V`d6p! zhGtj=#@%QITPv%2U$*-G0~#D{R>RC?Ri2^&Z^3d@`$x^g*Dlx5g2H4na!zW8YS%Lt z)Xlud{%7{RL~}2)mEHIi^{)ydH!ZzqWiGnTNszP-*5B)EYuCP+U!ni%c9jkCayclb z&Fj7Bdlu-2{ss+OTn%hLe}t_KcKiA@!JOA5NF$-9zbQL%NEAvChKBX8?whW+V;vn3 zpkd)bJs8?%WE21Z&gUwEL90tu-|Z%^;8tz-6u{Kw^GM97mRSKzYL(u~c;srL)cfkT z&Q5V(Lf-~#^^Q)Z)poVX%lZ4g^l_uotN;7&bN0`#NvYx6)%CZt=X_Q6r_?ZqWBB*4 zhoW3f`)cAFLbc+2>Ek41zrt{=L+q#M&c3wB;4EZ^r9gfgx8hTEN-|)H;gX$TZ-*`?;+h?m{XQchl z%G=AFt@7Y~I{TVH4GSi^4r<6-wfxcsV8z2^y6gSvFyH)ni4O zp@09pm`!C|+pf}u-)e?_e*1DZqY1cezRdpp*AEBl#j_fQKI?Ls0dH*+3bHkILjezk z*?JufoO^qle<`RBD6sEGL&i3K(AQ_N?UDzi5(|fp<+A1QzU*!P`+PtDIGY5WUsrCCH3I;+XD%)ns?(i?(!fonYwk#8hn4SIg*F$IJm4CQhHfT=N+Bwb z*}EOh%oOHjMy2O8r!Je8zP95<$FPZomg_Ch@ubCu*cMjjgI53byUO@|<`A<9%lT_| zJI-B5i!%~2fAaubvqr*VjlTDvJewxBuuGKt97E#e>9ITs`Vd-ddC7zKONf}zuW_hX zD`aAn!B{uI%?<#d?p!Iuuzy;uCapHjyu|#V)+dvJuNF~P|E$#Dw=ThxxSP~ z{RyssI=cnI<*0Ajg#OWzqhMjE(ty=BI+K`dkTr&G3#&>Yaj2Eq*Xh(I;{Jr<1t*~1 z^3~yoQmK$uiWPurUcpC#t}qD9t@@^ff*Zu8YZcv1_a6HO z?EP!?eP-j*)4g@BD`3|-l;eAx*^9-j}D8Dk#4Nwpy>|N_o<&_CGO`K&y>QKV)sSysg8Hl^j`b!r{pH_X_#ma2U|GWKTN*O|_*5l)Y4@4abME`l3SRg9VaBRvNf7&Z^+L_l002Oo6Yq%SX|1t8*#{2A!8WR;?GrvYl{!HU}Mudg#3!1fhf*;U(0F&})X zTudlGaub@jhy?(ED{xW4U@juPZe{*LbIXy26&t{r95$|52b>4s54lKCSCH}J3esoxUk8l(o`Ng>jTTK@bmst>QL=(!|2U#g{T zp^`fcHu2k=HCI$Lz%Af_* zIIW=nvqRt1%cYqhDiI3XO55%;wz1Z$l#7>P_;=EkuEQO!s@J6&*U4Q9A34OC;iOTV&7=BJJ_LW zxSIYvwwkESi>parHnxOE0_WeqFSZI>s^ypMs+vk)-o8A2wh1Wga`o<;>}m24m1?qV8msO`$qq+yJq_`v=DUbzpX6GPFcs6-jBD$)vz#}~@k}M*A>RDJyRYCJ zj#hE03dvO-W~=c9M9UTq42_|0P4a;1w*y@t;sGG{Yp8Kg5pbjmc39ITE9m-;drFgOl1^q zGH9*k{-gIb%teAqqK;(~v=TqH{)yFHHUvuu1xFc`ZR}TL+tvWA`2?SxKHN0seg#(! zO8X|-_m9&mzK+>C*jUDk7Q5~4Q~N2DTLmN}Hy6s5R!f??M@0EC+~DIX~n(qpY} zA>T(@2pL;{RL__Bw6oSn6hh^B!<>Ul^mkdg)Wi5-=1KzTSv?Uy6 z_1)WzI(M6y?E{;B?1NAR&FXXLyuRguQgh3%&c;eZ($SH0tyGSb2an57uAb?J zTa*GEnR09W3G*AR&iXP4IUULEB;}uOcBt$91m;ac?QuVgf*`Y1%|Ey7MnmANKPG0o z+Oc^J_gF){pP)NDXkn?3tPImMKW^*P+^*|Rsf6Xz`$pmTeg$9K<5GqP?_=-JDF@eM z5Pjo=@6R2#n}gSBH=VmzDo2Z7##!S!OX9EYdkK}tL{=e)lKG9MRRaLPVJ;>Zv_jR5 zZY=8t_b*tDZ&W6rfas&2#jH_BLreX4qDikYW{sK$T=N?_9%Fml^xmp zS}twCngmQ!ZE-I_DCJnoK`9TO;@Wdrk9NAP?D=JOHx5d{I#Z=sg98?+mTk+=hcFl` zpyOSqzmBm`1#ezEyZ!Hle~07g8X`l%ZM=G~vi{G$j^gQX6$lxJOT6c5UH*3axnoCx zcKlf{ah`@jktz$4wR5$9K$*{%*L-nfwfu4)PcgSc4cV2&6cg(+XTwWY0RZ6pxtL(+ z^{Vq1ni*)eEj3=YAyoguImE-(G?iKPxT#@lZ)Q(9zeyvr#LsXrG+Wee_wX)vr3xDp z3aUlN&wP)zf`Vf;L;reuC=K5l4F=Y1s=kJ%J19xm%IAK3!0Xu0{7KqWaF8$9OzG;;)%>1=mjE_K`O%4JCUx8B=Fvp`#W zuR1r~cF=QZQDpVS44^CVDZ8(I)}~eapd>stUo8vDY(lrhV$~j7*K+Oqw+jXE9WP2o zmf;o8}kFgrnRM{ce|=cq-Z+>UgU4z|){h^Dc3xSa z--%wkm3_3E!DUi5g-x`Ab7fq+R}iL8R&vxdmo1og_bQldmc0S6=ifO>Kf!O-oL=Py_}QUm)Jbg%69 z%d1{$>^yV>(<-Z0WHr3%=&-e^Ttu!rY^~*%drc^ej@Y8w5UcgpCRV#1i$PJNuFvrJ zFtX=(y};n5d&VaI=EA_)t`3WB=p2+Dtj1fJq&kN^+Ru}*6S|*_r+pCbG6Y-86l{wj zZDA6$2=)IKu9h)-cF_I?##ucK?zXIAl-CR*0!-V>fn zgX{kH_w_^9x0ZJ!dy0Bsgt96s0sIUd88bvd_hz&EaM_iW)aCnMJp|Ro4sCY{h1rDy zc$jXgd%hi1p48O+cnhp4^KE9O zI#1@9?YBq4BB&?cdqYQ|5Y&!WIIl+oyzQedgo?KoJC#lpTT z*EtU9uUhr*bX)_zR^64|2$r5PCNLx(@?-QNUzJu3{dDFG0*-A}1>&RV-#R}&J9JU! zOl&Kv=lbW@W1eMtJ$uz%+xf|_;0GkIzA_QHUokEC=*%0pK;VWGRu>oCwC0(!cFw*= zt8iNym*!ds9W#2JnU!dAodE!-GhY@AuB>6-#22hMn~0l$8o47a_vJ`k>roh(SWs|N zjk7E$&sPiQ>QT71P{@4q)UE_zt=gdOh<>l-n-6c>n&IZ zfpEIdrS$XS?>qOL*~WtHa7^l0meA_=J9aG@RE8#+P?weM!_WfUsWsoulE}* zVL{_F;!WrB+pJR>;HSX$;M0Xa@6udDQKjYEhxygSfy*#5*&#iU0*(f>lxcG z4uqbub3R=tL(^)1zjEEse$}i4ZQn~Avn_KH8`@W=(nPO)|6+?0%{B@E0Qf02^Y=KjG9dNURHw%~%g>=@Nwh+*fW3Oo znW)L1FNl9N*Q&(nGcHzoW(Cn&Fc?PH2MGX)5@l-izKdR`-OkQYiFo~v8;%y2;5b2} z_x{;cb*%OJ)@LFeb*RC0;dMuO;MVI-vX_^cJuf9nhY7Z;3XTzvV!mGw$=1$S;Ptj z$J!^KEwRyi(*B!RY1FV(I%Un^oxX{QQ)v6z3jP;LaNIdr?gP+yd1_x-!}Y`HUC&D4 zOmx8jUfWutq?-BEHOWi?)EAKf06>%YvS8?S%Qy1XnT?5cLxarX8e6O9_W?(YWfaz{ z?Dgd}4?wPKp=r&c-tJJYN1e_A%S&ry&V#G`rmuMsq3QIaSb5ESVXLLiF=fA+s_pXY zDHjscPWCpNQE!|e*seZJ9(;4B`@V#z>fZnSeX+py7F$m%^AF>(t<;~YKGOcwvGX=v z_-sNw_OITDf=hjwaL_Qh$dsUEGgBmJAG7C|X-Uw|^JDoTI)7Cfq`>&I1NQX1p@e3V zn0}pNYZ;sUu)D8pUkRsJoTvd`8H;1+T-G_Q||VGL8JRO?~OnRcW~)Q7Sze=QrSXyM6fm zsB9#^*{gKqQmesQS^ksX*eBzSt)>YR&>Fk{qX$yW>%o1$c0K}d)6#_ zW!u$`cfWEaYwe?11zTNStZbUD)xg(S=x6Edsb4^v&_X;SXi0X%2xR`mqA%bEANrGj~-{465m5K^S|@e?Q1;&qfx1x zNIe!Q5#&q^oC{K?R5t3)^XGig<5E2YdaXw*(HguP_@?7a&CO&d0RWoImjr|LFLcYU zLQS*A3pZ7*2p_@*BCQov&2qtTn;wPXv5Z3If~VN==+fvpb%R$>@i-Y3nU}Dl+s#*W zwK9ok`eB@Cn0njQeSl|y?bE~>cHb`4SQ?{ReFcYu!Rgg+ou_&qu4%U!=d82fbbUFG zvV@H+jTNLmj0ZN;L846MFR!mNYu+z@oZ8+VP-AwPrq+we(z$VS6?ih za9J#`zZ&dnn-^B@q`LgL`Lyfn$5oE@I<1cjP@M?2s~c~-8diAC&eDc=wJlR~iT$Yl zmWQEp5b7kXe&hG0^0ilcZ_S*wq2ukZ1Z#dCxLW!B`8)Je&DF@SGONXEXw#L2u2&LN zVWRn02{yC0m`dEy+>A=8k5=vvWeD^+T>xLsnks;|86ore#hTc)y(NOHP1L$ZDTA?M zo(llLUGOErFo>oi+sd~&Y-F{?`OrJ35INYyP0oSfdSsIiFxpcRUCwrOQZ$nbYo5)w;a8hY_x0(gCmK87 z`{~_G^HziQzkfHr(Y)L<@}J*N*}u=P7F751fHwS0=e~ruG8IjsZL>YbB{w?D5apSI z7-zTIGn?e4q^)~NKG`q004l)d|EI#pYiC|ePdr8vD=w1 zr;)v+YyPXO;QRMKo6WACQ4k6O26;wdn3$vB`a#yk42ACu@D%WBMOxeEDH_0}O{f5+ z^J|i?Ci;oi1PSlZ{`g=XbAv*!Z%fw`Pj zkB7Gqz+Wg6s4P|(`WB=2B~db)--jRt0DwK877Pk>dcA1HYhBO&g|O|B`_C=hs6nwz}E# z8zoAIQ2CF|yQp~6tKZ;vdy@TqnVvn3xbJ%v`Uj4mLr8f3`M_l2rr`#TO*Iy-)H5P+ zrg9neG-z9eaxInYs7YF`Rdw#U+RuQAhqPsWVB9|Y>1IMayz9f#l|w>7{R)@5jyT7( zhj%Vfx`zJE1?lq61StRjI9l2N_kTWhCsCuYZX6+CQ5sr7NnOxNW8Ztwrz{YiP?(to z<7fX5A@=ULY;%|Fu^qr&H^e;`h$I95@nX2CTb0~G#Q)ViqW=}tu4bH0RZloPiGjatK)U4 zVb^=o%A$F;4|)ez@U_}IoxWv@8>PriPz z+;pmy-2eQZSaT&VO7F3T-4{3IH@2;{L1g)=cgKA3-#4Y21JdMhRzU%q_C>WsM61y5 zwSG>bgVe(ej9Q`6b_v zIWhT+!Xb;)FmO#b-KO1e70*f#6fR2n>SH@9QBo<00@h1Tki8dd2$)=o^6l~%)tq;N zgHrzI)Z4Cx=2DfWyvr(>>x~m1akfu5mztj?7KDk}{Cv_j)S^M$?5rM+*SEPBYVP~$ zYwC2IP4IX33JELuk;73XW1s~YnGa}x>O9kok0%pFYe1B(sv=a)$WCN()-z*Oz<})`u=vEEQ>Qm?(Xs}kG zryH%lnrdws(0*4SqwW6~1+_&}Zzs4YHFKcfwXnc;I=8^pnGCV3(l0+BV|s=8 z80Qe0mKB^=GX^SERK~!>LjIX_e5fR}YMH9J6VnT3O+$0Dn_3==g{>bzxU97+9smGb zj!y{&4Qq=7b9rswx|GIx0>V_=;bH%I-PqK~Jbk;}N~;>0$5y7(e>XW=+i2!93JSFE zWo6CTK>m^?_C}YM$N&iLOGr99gaGdxqIJmybs_nmmvwW9OBms<&%0XCcOgy{472t8069tFjt@DZC8(V z;~x$Oe&||CC@d_aaEnqY6EFGAeEjfmu%TJoNP(eNFPAqAL~e~rlq4S2)Elpg2N#!K zZ+TIB$9uubP5!)^fBqnH@~Vmj1#5r)zS*Ca!5I!q&R;sL)HqEr=g@UP2Sn7?4%T9&PZ=JvQ>b3;{0BJrf7<5C4SCGw?^hP%j1yJfwQ29&z9s&wP zmrFNvZL_{jV6GAYH8hXSG3dQ`QNW=ae;w+hZ-KH5a!DEw*Cn?a8}ycEgL*1a%J+{P zYG99oFlA|a-O0hMg6i_$Y^t_9h9poY6$c&Xu+^M_WVgW1zv;Z_X9%T9`o09bYutB+ z1OaV-l`=_KELR&V4O2gI4$7^)IZiD;RVG@B6g9{;ZbzxarJGD?M7R zZWEZBaLRAwXexC6wh{#pZmEf?Z_}LTQppzcdTubu%~N@IMWH%LRf&f1I&& zPDEY%Qno^YyteZ)KdyD%lXyFH{F;c<_kG!<_NlHB!+zh6|J3Y^ji25eH@vIdQeq+g z9TSlGXL_5>E>;SvM(W`KCnU>sgx(GgE&zZZ%ZCL+?1m#2S4`QvY0|FlxY~Fp+|V^; z6lU4#R#S$(L)6G@TL%ZM#F&12x;5}P&lbU7!{pYdx-e@>9MD`;z6I|3m0c)NY+FV^*GiY!NDtW4@vm|pC$in*OWWo!jPh*A z@SRxDIde&|T?p1mIb)?+4$5H6ZSs8v002Ljj|+xgxn}xWlRYIAo0Fs6R$FmVIF9V4wN6+B;A$0LCL#>``wm(b5VtH=wxBxSzdQfEodwe_V7IRuIFzMO zNs*fFhu*HV+tu}Dn7zEb6_0TZy=yZi&}#cQVW!{&fCPaqpq=b9Xfr4SH(xrdX9eeB z+vqyuoRG>QQl&@gSC}s@S9aDm``Ph3+tjrmBuI%H004*&35GE3GoV$r_2#m{vGoMx ztEaL(?3yKM`RC3eb(YO|;w*rXq*c_s&tbCoc%0@`rzbBL^sn_Mv57Z0vt-bWJ;TzRfPhxHUtZsmgAlE>CTeuHGM4<%j)zc z7W{BAXJZ_!m$!C~=(B~D`CH*;Urh6B%dg^lqkcb|w%=!FRC=`10KNQ}RSBfBW4&(A zKJ$@8!AW#&u+pa0CeOYtt&gXA4eR(h48!Og**7=8*?YSbZb00FEy~1b|LC>qGK>=d z0KT6O2?mu<#4DSs)4$Xl0oP33wL0$JfoZm8Nh+a`uf}a|wSwPL&xUh98V(PXA7z;} zqG}iv&OfJ7(DO&utDBLPK!nX1T$K8GQ1)ykO84u+A`u+C?PC->TVwN)(jxQfBwb@* zolO&st;SZ98#|2~+qkhCJ85jQZEV}NoyNAU1~-kJ@Am!vKELMKojG%6_v{Q=iX3o* zF?`*Q1vZUODTyTBLndi01k~aqqu9Y@9JhMB<*|E3n6$G2r8_%q$erkX+M3{zr2I8x z>)5uTw%8&G;jSw<{yq<}Sh3{MXQ_ThLt_Y$Iz@eSNcE^bPY0+RW@KiLvf4KhHyP}a znFuKPQIvD#GiqnXfqTvPyHpj4=95WHC>ACJgt(71>n%fIX9Mv>w|MD8lVIrUk$M%$ z(l7PC(6N}MvvuuwxQEY4WF+*Fs)*88HsLpH730fgRf)31zmtGX>}AAFGYzN$_QAT9xhBaT z+-c)hY_91(rG)5*{JV*RZ-EB*5D=x;Y+!X~;pnnqMaI&klWCEl*o*fUxY@DvdZh6o zJ2~}@t0s7crqXVjs_QO!3v;W8f$3vM)GlPKfEcchZ~pi?k#qA@XXSOy-K|f;y*3!K zvA2uW#L9ml*^wu)v>Rq_J|SDT_*Ro`oW9w_W?H}V!vo5~;|r47;O&@pP;m4A*v~|H zE~kf$GaO^0DF(RQ*s*rWfMPS8~$C^ER=l6X22Q|Y#!B?t06RSaem5>FClT|fCZ;U$nKn&F^9qZ|=?M4Ij z;V!L>Te#w0OHNYVhC2!tA6UyHi7ADD{S7m8^RbKL z81RWTWMdnz1(I6cZacqoF~CMm;gH1K5Sijtx(uZ#t2ZE-3+!la27g{L&X`pmJJ`qq z!eJxR_*R1(ae;+2FV>Tz%i`-g1mpI87oYg1;h&)TyuOZu<=cwxT4Q{tD;}O{q_$ok zNc!W9@>{FIXZSwqxWTX(5D?Oi%|^;Q;65D=*Ev=?D2Gz*GHcdWO*G&xFHf=4da)h_ zL|Un3S68f_$68p*PjTtwqx5>Xn)wHWjAkrrR#Iy2H@?@~KK=qdibUG^g%H}L&x!!@*tR*|0;{qf{LJur`du#KFMBBpIhQHyb~f9VOnvp6c1qdB%+R~fkd0*C-I{a; zj5DsgIfe=6{{9Bl*;X^&5#E-Kb|u{+FB++K*4?Opq-<4Qh~iCnYNX~3xznn&>s?nF|(Lw^Wf#=>aA1BQu%MMtXv%nCa$YW z32|KxHytGuSNXIWh!qRggD8Q8ZsAGF2Z4o98K;#5lZQG?$>bWWE7c2y8S9g0!yERZ ztFk^mQ`LIaMGsYsO0I$-mBCHVU0b$-I7YhWbpFvFhfpetmRQ;sVH2v%gpD<31KyKc zgG+@oBHuyKn zi^Pt%W(H8@Dy)Koze1kba%F+5nG`Z@3@*Y$kd2RHaZpg5qS>Dcn3(2Z4NV7ip?5U| zYT1u>-%$WkasIA0($Rg8otK(LRtzO%`9rx0H2?)Zp<+o2+Lt89iD2~T$6-JTg1!8J z@l&RMhJH2VvRzDCmF@6+Xj9CcgBf8p!N?zcdKj_y^yf9k8h^o#{rxVvrKU=Gb;;*M zi^%eCBHBM!GXrhGPe@2D5aD1MowSFR&=vV5N-oA?Dpzk}UsU`C>aPok+Q}l_{N}Ue zNzoLo-Kg0)7@m}8_z2PK?STLj+}xOIz*`9#aR-2FRD)U8bEnW&jQAv#%&*2o&D(eaHS_zgf&(>=#vD zRUW*>dGg^#8(!fyiXY?ONFxk1h8LT{w?h$+59v1fGrIC1-sjTfnCv^J8BIOmj(?p_ zg0%w_Q*5RraL1W+>2GLC~^4Gv+#*uRqImZC_P4P16eyTUu`&^^MPI1c^0#k7L0Al}(}tX8S1^_Pd8r~Y4WyU!Kx36Jenp`;29)fp>r5CPB5 z$wnud#Y7B7yx4pvl0^ZE1fgQp^tg#iCDq#3zkMOHUOD6eST==K`MtN)aZJipZkD2n zj>=I&K9$PFRQ}H`0&46TOjoQu}DSUzmfbTu5e*4H#?Y z&oA#IyEl?An)S&BzNGu#@p3-o{!uJ^4?JETcUYfkz~CM|Ykf+{k$d3Uh5--M8}I}x zl}N8XgC4~!aSSR#HpSI$&c-Xu@a!XD?>se(eON0Tv(^7hq1(mhvI;%xQ4Qv(T&m

&Q9u^UPg{4@12*hw+*JOUeVhs&GCVqPx%^2E8SV5^3ifM)v9b{rfx51M zv~jD-R>7-#!RU=RF9{7mS5w}nsMB; zGaDK?LdMLj|5lf4GmvpaD$n9D%P7TQwgdj)Jc0@*&Ikd~d(1uR&EsCy}96pq4%@)8l=eJ{oJ}8>>9`Y@TiCtIUlz1am|7RO?aRf(-a)K^oA?7ZX+hl^LGR|pZ2VN! zOgf{AK}__Y)tX?dso=ihSuAj&PEz$Q;2+cmjvIQ&mE`zk}94}&J-WeuuaobWIKXB`{nKUMs zn+wk@Bh9_~l(w^E9GWI(8UnO?4BM=vGF)ZmF8CMU<1nCK7t=RL2ngnWnZB8``z_B< z27_7a_H=>p;D?0tCTjfAWMZk;%h41(I!}C{;b;aP1=9m zm{7e=R`;k?EyS<7QYyKrX#E2tMHU$jpJCKx_|zOQENlLIl@?FK>+KL;Hg|{hl1I<{ z<9)StE3Q;rrfI#$C%7z$R)2@5(fmFCyqYm~*^eExCtK0FImX+(YH-$Rodi<@wQ=}- z59O|AW#rJrqD|XKGogd16?O%6d`K(wkwed{=0#$W>FCLzb|+mp2$cq|-CMDxV8zz? z8(~~(Ufwu8xyw9{kJ&rBJGI<)lW9}u>1`c_=`C8uY>6o=b9*_r}`{S{aX#dt;I#uxAYw*Lhs8R(tgX zY?#y2EHz~5Yp;K~W0Tl@md~NBTgC>ux(l5AbtBg*#Bf+bo2@ETRl&dBUky}JQ)jg0 z>UhQX?TX4>xD!vPs}Kb}5pYw14QG^s4OZR!i>eEi?<>qGe~7@5xdt!7tAMu+ zg{C(x2-~lGT!zNLvEoy!15zpquM3lRef_tjZyw%RQ7cpR>&RgmZW+_MZyr@FJXCGn zMPlFj%yN=75w=|QKGX=taB-Q;!GcAIR#vci0<$r9kn}tn8oT`9rwXQ$`*GUE8o~6d z-C>pe?u>izL>jPl1<l+hPA>F* zD3ch1i4Sbhq5(dMuD$5ry9aF_J-rtUI`xl(oF{&?QMVyi>yD0WavRNOWx*RKS6gYI zpddI`zGl?i8h&oDawf?h+w(Y!8Rr#Sg@D*WqJj;E0xS-biZW>5JiV^hBW=F=Dge-v z<6~3;Zg4Xro7c}f#2n4g`}M+x^*B+&%($s}GhR!$>u~y(xfj=K=+vH}mXu=Qt&-FgCFNSP6m z6&A=F&YNBMK^&pW!n$l|S55jtH#+;f6m_+eU?Id%bc0-h{Bli+6WfkrNSL)*7X(-d z*(U;?CHCM@HFm%Cp;fW#0B+vyR3mDx9jd`a96bSBW}Q;bcb$>}?_4sgs{(ffZr#JB zb*pdZ%ZV_pL3@)cmVME_D|h9i`S$oV7w$pREalp+8Z)kS+nn{}=-UpP_bel7PnL;Z zg8y=QaRs&gn2uHX?U$fllkdj>1m558)2I+VPIus0u~N(W1W+zX+f>0?da)y-WD z(0>JW2=S+Md0msl&6sgHRi5TR{PJLO-(c`pG@92%L4TA4jLuE8bWj;l0wcj|Q4*!K zWg}{y5!3aX?xr}LA$IIeY9$QRl;6oztfq^9{~GktrB{o$E0i?{;*mL+z_K909XuAy z1;Nhe3;k+NPnZ9ggf_CX(9}5aTRLr3{mh`^m5~Ism$#S~v(@HLhdpp1G z3l0gnU?%d&(4on;Ulm|*!h`?2#=X3Dloh34Rqb$WF1OEKSg*BW3clC>a(4Qod)X&r zBu%kqwOa3`AA_eF2TT_gkos~fgS3HYUZ643Mjc!)9D83ARjUOf){)=npprl790>{r z2AoG>Wx3*aps^5nH2EJIGlk}oZ?A`6TIoKa_`uomCt06Nx5gA+Knq6BfLjwlf^Twa zF=H>j|K(~aeg|c&T+}PY^7KNMUS>^eRw4whbiC|vTKnZqp*2{Gv~v?2lF-@rqZWwa5J$R}{qlfMotoF<&> zCvq*lGR9$`QQyVB-n@*0?-E`Wp>|i5Zr-Q%rfltsFk6-zE))#g6`;VIHzbSkPW zWkcADXo~I{bMnNhJI<$Tj<3VZyA4b@oY0H>QHO53m>P?58R!fj9UY@8m6u`IO5eu# z!DR+)Y^P;2UTX5(X|~JdDTgM!z3&mSu@NMb818`Ua$P$#k!QFt4{z(V>*=Rh5U%ju zy8o^^94}uy$aZWZMeK`FyhQ-vN`%H4*9dQS8Gr5yAK0>E9kzt_CbUHL?w^V)%{qko%~Sx z>RuvD1E1JV>BYq++3*jRO-1sQX|c_OG2w#ZC6?4_84&DL`iM|W?fc*%Q3iTkzWO1N z47W+}f1xg;hqs?4AqXS3sIDdy)`L@l#G;$1?I6doYxoUlur8mhT+VnS4j#$kx+e00 zb0G-9w1m`y4

x?IAjbRNX)RB9EKjnvp+wS*3? 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 T{d=Gb|g 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 M)*I2OmbOs-3k{Tus1}~sZyT# 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 { - // setTimeout(a, 1000); + // setTimeout(a, 3000); // }); return ; } diff --git a/src/app/dev/home/loading.tsx b/src/app/dev/home/loading.tsx index b1f8b62f..623b464d 100644 --- a/src/app/dev/home/loading.tsx +++ b/src/app/dev/home/loading.tsx @@ -3,7 +3,7 @@ import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loadi export default async function Page() { return ( <> - + {/* */} ); } diff --git a/src/app/dev/home/page.tsx b/src/app/dev/home/page.tsx index c27b1df5..e70705ff 100644 --- a/src/app/dev/home/page.tsx +++ b/src/app/dev/home/page.tsx @@ -1,17 +1,15 @@ -import { HomeView } from "@/app_modules/home"; -import { cookies } from "next/headers"; -import { unsealData } from "iron-session"; -import _ from "lodash"; -import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token"; -import { user_getOneByUserId } from "@/app_modules/home/fun/get/get_one_user_by_id"; -import { redirect } from "next/navigation"; import { RouterAdminDashboard } from "@/app/lib/router_hipmi/router_admin"; import { RouterHome } from "@/app/lib/router_hipmi/router_home"; -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; +import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token"; +import { HomeView } from "@/app_modules/home"; +import { user_getOneByUserId } from "@/app_modules/home/fun/get/get_one_user_by_id"; +import { job_getTwoForHomeView } from "@/app_modules/job/fun/get/get_two_for_home_view"; +import { redirect } from "next/navigation"; export default async function Page() { const userId = await user_getOneUserId(); const dataUser = await user_getOneByUserId(userId); + const dataJob = await job_getTwoForHomeView(); if (dataUser?.active === false) { return redirect(RouterHome.home_user_non_active); @@ -23,12 +21,12 @@ export default async function Page() { // if (dataUser?.Profile === null) return ; // await new Promise((a, b) => { - // setTimeout(a, 4000); + // setTimeout(a, 3000); // }); return ( <> - + ); } diff --git a/src/app/zCoba/page.tsx b/src/app/zCoba/page.tsx index 4a504557..d171ef0a 100644 --- a/src/app/zCoba/page.tsx +++ b/src/app/zCoba/page.tsx @@ -1,9 +1,16 @@ import Coba_TestLoading from "@/app_modules/zCoba"; export default async function Page() { + + + await new Promise((a, b) => { + setTimeout(a, 3000); + }); + return ( <> + ); } diff --git a/src/app_modules/component_global/is_empty_data.tsx b/src/app_modules/component_global/is_empty_data.tsx index 5f2262d7..f7418471 100644 --- a/src/app_modules/component_global/is_empty_data.tsx +++ b/src/app_modules/component_global/is_empty_data.tsx @@ -2,10 +2,20 @@ import { Center } from "@mantine/core"; -export default function ComponentGlobal_IsEmptyData({ text }: { text: string }) { +export default function ComponentGlobal_IsEmptyData({ + text, + height, +}: { + text: string; + height?: number}) { return ( <> -

+
{text}
diff --git a/src/app_modules/component_global/loading_page_v2.tsx b/src/app_modules/component_global/loading_page_v2.tsx index d05c5d3d..a36ab160 100644 --- a/src/app_modules/component_global/loading_page_v2.tsx +++ b/src/app_modules/component_global/loading_page_v2.tsx @@ -1,43 +1,56 @@ "use client"; -import { Box, Center, Group, LoadingOverlay, Skeleton, Text } from "@mantine/core"; +import { + Box, + Center, + Group, + LoadingOverlay, + Skeleton, + Text, +} from "@mantine/core"; +import { MainColor } from "./color/color_pallet"; export default function ComponentGlobal_V2_LoadingPage() { -const listhHuruf = [ - { - huruf: "H", - }, - { - huruf: "I", - }, - { - huruf: "P", - }, - { - huruf: "M", - }, - { - huruf: "I", - }, -]; -const customLOader = ( -
- - {listhHuruf.map((e, i) => ( -
- - - {e.huruf} - -
- ))} -
-
-); + const listhHuruf = [ + { + huruf: "H", + }, + { + huruf: "I", + }, + { + huruf: "P", + }, + { + huruf: "M", + }, + { + huruf: "I", + }, + ]; + const customLOader = ( +
+ + {listhHuruf.map((e, i) => ( +
+ + + {e.huruf} + +
+ ))} +
+
+ ); -return ( - <> - - -); + return ( + <> + + + ); } diff --git a/src/app_modules/home/layout.tsx b/src/app_modules/home/layout.tsx index 090698df..75784e11 100644 --- a/src/app_modules/home/layout.tsx +++ b/src/app_modules/home/layout.tsx @@ -3,6 +3,7 @@ import { ActionIcon, AppShell, Avatar, + BackgroundImage, Box, Center, Flex, @@ -12,6 +13,8 @@ import { Header, Indicator, Loader, + Paper, + ScrollArea, SimpleGrid, Stack, Text, @@ -25,6 +28,9 @@ import { IconQrcode, IconUserCircle, IconBell, + IconMessages, + IconShoppingBag, + IconMap2, } from "@tabler/icons-react"; import { Logout } from "../auth"; import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; @@ -38,6 +44,8 @@ import { RouterNotifikasi } from "@/app/lib/router_hipmi/router_notifikasi"; import { useShallowEffect } from "@mantine/hooks"; import notifikasi_countUserNotifikasi from "../notifikasi/fun/count/fun_count_by_id"; import mqtt_client from "@/util/mqtt_client"; +import { AccentColor, MainColor } from "../component_global/color/color_pallet"; +import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; export default function HomeLayout({ dataUser, @@ -50,13 +58,38 @@ export default function HomeLayout({ }) { const router = useRouter(); // const [user, setUser] = useState(dataUser); - const [loadingProfil, setLoadingProfile] = useState(false); - const [loadingUS, setLoadingUS] = useState(false); + const [idLoadingProfil, setIsLoadingProfile] = useState(false); + const [isLoadingUS, setIsLoadingUS] = useState(false); + const [isLoadingBell, setIsLoadingBell] = useState(false); + const [isLoadingPage, setIsLoadingPage] = useState(false); + const [pageId, setPageId] = useState(0); + const [countNotif, setCountNotif] = useState(countNotifikasi); + const listHalamanFooter = [ + { + id: 1, + name: "Forums", + icon: , + link: RouterForum.splash, + }, + + { + id: 2, + name: "MarketPlace", + icon: , + link: "", + }, + { + id: 3, + name: "Business Maps", + icon: , + link: "", + }, + ]; + useShallowEffect(() => { mqtt_client.subscribe("USER"); - // mqtt_client.subscribe("Notifikasi_forum_create_komentar"); mqtt_client.on("message", (topic: any, message: any) => { console.log(topic); @@ -81,99 +114,166 @@ export default function HomeLayout({ return ( <> - + {/* Header */} - + { + if (dataUser?.Profile === null) { + ComponentGlobal_NotifikasiPeringatan("Lengkapi Profile"); + } else { + setIsLoadingUS(true); + router.push(RouterUserSearch.main); + } + }} + > + {isLoadingUS ? ( + + ) : ( + + )} + +
- + <Title order={4} c={MainColor.yellow}> HIPMI
{ - router.push(RouterNotifikasi.main); + if (dataUser?.Profile === null) { + ComponentGlobal_NotifikasiPeringatan("Lengkapi Profile"); + } else { + router.push(RouterNotifikasi.main); + setIsLoadingBell(true); + } }} > - {countNotif}}> - - + {isLoadingBell ? ( + + ) : ( + {countNotif}} + > + + + )}
{/* Children */} - - + + + + {/* {Array(10) + .fill(0) + .map((e, i) => ( + + {i + 1} + + ))} */} {children} - - + + + {/* + {children} + + */} + {/* Footer */} - -
- {loadingUS ? ( -
- -
- ) : ( -
- { - if (dataUser?.Profile === null) { - ComponentGlobal_NotifikasiPeringatan( - "Lengkapi Profile" - ); - } else { - setLoadingUS(true); - // router.push(RouterProfile.katalog + `${user.Profile.id}`); - router.push(RouterUserSearch.main); - } - }} - > - - + + {listHalamanFooter.map((e, i) => ( +
+ {isLoadingPage && e.id === pageId ? ( +
+ +
+ ) : ( + + { + if (dataUser?.Profile === null) { + ComponentGlobal_NotifikasiPeringatan( + "Lengkapi Profile" + ); + } else { + e.link === "" + ? ComponentGlobal_NotifikasiPeringatan( + "Cooming Soon" + ) + : (router.push(e.link), + setIsLoadingPage(true), + setPageId(e?.id)); + } + }} + > + {e.icon} - - Temukan pengguna + + {e.name} -
- )} -
+ )} +
+ ))}
- {loadingProfil ? ( + {idLoadingProfil ? (
- +
) : (
@@ -181,7 +281,7 @@ export default function HomeLayout({ align="center" spacing={2} onClick={() => { - setLoadingProfile(true); + setIsLoadingProfile(true); if (dataUser?.Profile === null) { router.push(RouterProfile.create); } else { @@ -219,7 +319,7 @@ export default function HomeLayout({
- + ); } diff --git a/src/app_modules/home/view.tsx b/src/app_modules/home/view.tsx index ea4403ec..21ce749b 100644 --- a/src/app_modules/home/view.tsx +++ b/src/app_modules/home/view.tsx @@ -2,14 +2,19 @@ import { ActionIcon, + BackgroundImage, Box, Center, Flex, + Group, Image, Loader, LoadingOverlay, Paper, + ScrollArea, SimpleGrid, + Skeleton, + Stack, Text, ThemeIcon, Title, @@ -25,6 +30,7 @@ import { IconPresentation, IconShoppingBag, IconUserCircle, + IconUserSearch, } from "@tabler/icons-react"; import toast from "react-simple-toasts"; @@ -41,27 +47,35 @@ import { useDisclosure } from "@mantine/hooks"; import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; import ComponentGlobal_V2_LoadingPage from "../component_global/loading_page_v2"; import { RouterColab } from "@/app/lib/router_hipmi/router_colab"; +import { AccentColor, MainColor } from "../component_global/color/color_pallet"; +import { MODEL_JOB } from "../job/model/interface"; +import _ from "lodash"; +import ComponentGlobal_IsEmptyData from "../component_global/is_empty_data"; -export default function HomeView({ dataUser }: { dataUser: MODEL_USER }) { +export default function HomeView({ + dataUser, + dataJob, +}: { + dataUser: MODEL_USER; + dataJob: MODEL_JOB[]; +}) { const router = useRouter(); - // const [stateUser, setStateUser] = useState(user); const [loading, setLoading] = useState(false); const [visible, { toggle }] = useDisclosure(false); - const listHalaman = [ + const listPageOnBox = [ { id: 1, - name: "Forums", - icon: , - link: RouterForum.splash, - }, - - { - id: 2, name: "Event", icon: , link: RouterEvent.splash, }, + { + id: 2, + name: "Project Collaboration", + icon: , + link: RouterColab.splash, + }, { id: 3, @@ -69,51 +83,38 @@ export default function HomeView({ dataUser }: { dataUser: MODEL_USER }) { icon: , link: RouterVote.splash, }, + { id: 4, - name: "Project Collaboration", - icon: , - link: RouterColab.splash, - }, - { - id: 5, name: "Crowd Funding", icon: , link: `/dev/crowd/splash`, }, - { - id: 6, - name: "Job Vacancy", - icon: , - link: RouterJob.spalsh, - }, - { - id: 7, - name: "Business Maps", - icon: , - link: "", - }, - - { - id: 8, - name: "Marketplace", - icon: , - link: "", - }, ]; + const routePageJob = { + name: "Job Vacancy", + icon: , + link: RouterJob.spalsh, + }; + return ( <> {visible ? : ""} - - - logo + + + logo - {/*
{JSON.stringify(stateUser, null, 2)}
*/} - - + - {listHalaman.map((e, i) => ( + {listPageOnBox.map((e, i) => ( { if (dataUser.Profile === null) { return ComponentGlobal_NotifikasiPeringatan( @@ -145,27 +150,89 @@ export default function HomeView({ dataUser }: { dataUser: MODEL_USER }) { } }} > - + {e.icon} - + {e.name} - +
))} -
+ + {/* Job View */} + + + { + if (dataUser.Profile === null) { + return ComponentGlobal_NotifikasiPeringatan( + "Lengkapi Data Profile" + ); + } else { + if (routePageJob.link === "") { + return ComponentGlobal_NotifikasiPeringatan( + "Cooming Soon !!" + ); + } else { + toggle(); + return router.push(routePageJob.link); + } + } + }} + > + + + {routePageJob.icon} + + + {routePageJob.name} + + + + {_.isEmpty(dataJob) ? ( + + ) : ( + + {dataJob.map((e, i) => ( + + + + + + + + {e?.Author.username} + + + {e?.title} + + + + + ))} + + )} + + + ); diff --git a/src/app_modules/job/fun/get/get_two_for_home_view.ts b/src/app_modules/job/fun/get/get_two_for_home_view.ts new file mode 100644 index 00000000..e1a0fd6a --- /dev/null +++ b/src/app_modules/job/fun/get/get_two_for_home_view.ts @@ -0,0 +1,28 @@ +"use server"; + +import prisma from "@/app/lib/prisma"; + +export async function job_getTwoForHomeView() { + const get = await prisma.job.findMany({ + take: 2, + orderBy: { + createdAt: "desc", + }, + where: { + isActive: true, + }, + select: { + id: true, + Author: { + select: { + id: true, + username: true, + }, + }, + title: true, + deskripsi: true + }, + }); + + return get; +} diff --git a/src/app_modules/zCoba/index.tsx b/src/app_modules/zCoba/index.tsx index ae664453..2d2f6607 100644 --- a/src/app_modules/zCoba/index.tsx +++ b/src/app_modules/zCoba/index.tsx @@ -1,6 +1,7 @@ "use client"; import { + BackgroundImage, Box, Button, Center, @@ -21,6 +22,7 @@ import { v4 as uuidv4 } from "uuid"; import { useShallowEffect } from "@mantine/hooks"; import { ScrollOnly } from "next-scroll-loader"; import _ from "lodash"; +import ComponentGlobal_V2_LoadingPage from "../component_global/loading_page_v2"; const newData = Array(20) .fill(0) @@ -70,6 +72,27 @@ export default function Coba_TestLoading() { const [data, setData] = useState(data2); + return ( + <> + + Apa + + + ); + + return ( + <> + + {Array(50) + .fill(0) + .map((e, i) => ( + {i + 1} + ))} + + + + ); + return ( <> From 11b5e8f7222d8ad09146188fa837f75c1796b19b Mon Sep 17 00:00:00 2001 From: Bagasbanuna02 Date: Mon, 1 Jul 2024 14:26:26 +0800 Subject: [PATCH 06/17] Perbaikan UI pada Forum # style: - Tampilan keseluruhan forum di ganti menguikuti UI ## No Issue --- package.json | 2 - .../sub-detail/report-komentar/[id]/page.tsx | 10 +- .../forum/sub-menu/report-komentar/page.tsx | 12 + .../detail/{ => main-detail}/[id]/layout.tsx | 0 .../detail/{ => main-detail}/[id]/loading.tsx | 0 .../detail/{ => main-detail}/[id]/page.tsx | 8 +- .../detail/report-komentar/[id]/page.tsx | 13 + .../forum/detail/report-posting/[id]/page.tsx | 12 + src/app/dev/forum/forumku/[id]/page.tsx | 4 +- .../dev/forum/report/komentar/[id]/page.tsx | 4 + .../report/posting-lainnya/[id]/page.tsx | 9 +- .../dev/forum/report/posting/[id]/page.tsx | 4 +- src/app/dev/forum/splash/loading.tsx | 9 - src/app/dev/home/page.tsx | 2 +- src/app/emotion.tsx | 4 +- .../lib/router_admin/router_admin_forum.ts | 2 +- src/app/lib/router_hipmi/router_forum.ts | 6 +- src/app/zCoba/page.tsx | 13 +- .../forum/component/detail_one_komentar.tsx | 64 +++ .../forum/component/detail_one_posting.tsx | 8 +- .../fun/count/fun_count_laporan_komentar.ts | 3 + .../fun/count/fun_count_laporan_posting.ts | 3 + .../forum/fun/count/fun_count_publish.ts | 2 + .../forum/fun/get/get_all_report_komentar.ts | 98 +++++ ..._posting.tsx => get_all_report_posting.ts} | 0 .../forum/fun/get/get_one_komentar_by_id.ts | 31 ++ .../forum/fun/get/get_one_posting_by_id.ts | 1 + src/app_modules/admin/forum/index.tsx | 2 + .../sub_detail/hasil_report_komentar.tsx | 92 ++++- .../forum/sub_detail/hasil_report_posting.tsx | 63 ++- .../forum/sub_menu/table_report_komentar.tsx | 261 ++++++++++++ .../forum/sub_menu/table_report_posting.tsx | 37 +- src/app_modules/admin/list_page.tsx | 10 +- src/app_modules/auth/login/view.tsx | 95 ++--- src/app_modules/auth/register/view.tsx | 151 +++---- src/app_modules/auth/splash/view.tsx | 40 +- src/app_modules/auth/validasi/view.tsx | 125 +++--- src/app_modules/colab/detail/chat/index.tsx | 35 +- .../component_global/color/color_pallet.ts | 1 + .../component_layout_tamplate.tsx | 16 +- .../component_global/loading_page_v2.tsx | 4 +- .../ui/ui_header_tamplate.tsx | 89 +++++ .../ui/ui_layout_tamplate.tsx | 77 ++++ .../forum/component/beranda/beranda_card.tsx | 99 ----- .../detail_create_komentar.tsx | 119 ++++++ .../detail_component/detail_list_komentar.tsx | 82 ++++ .../detail_component/detail_view.tsx | 81 ++++ .../forumku_header.tsx} | 121 +++--- .../forumku_more_button.tsx} | 228 +++++++---- .../forumku_component/forumku_view.tsx | 88 ++++ .../komentar_author_header_name.tsx | 2 +- .../komentar_button_more.tsx | 4 +- .../component/main_component/card_header.tsx | 32 +- .../main_component/card_more_button.tsx | 52 +-- .../component/main_component/card_view.tsx | 36 +- .../more_button/posting_button_more.tsx | 6 +- src/app_modules/forum/create/index.tsx | 15 +- src/app_modules/forum/create/layout.tsx | 13 +- .../forum/detail/detail_report_komentar.tsx | 79 ++++ .../forum/detail/detail_report_posting.tsx | 61 +++ src/app_modules/forum/detail/index.tsx | 376 ------------------ src/app_modules/forum/detail/main_detail.tsx | 106 +++++ src/app_modules/forum/edit/posting/index.tsx | 18 +- src/app_modules/forum/edit/posting/layout.tsx | 12 +- .../forum/forumku/forum_profile.tsx | 100 +++++ src/app_modules/forum/forumku/index.tsx | 230 +++-------- src/app_modules/forum/forumku/layout.tsx | 17 +- .../forum/forumku/postingan_pribadi.tsx | 85 ++++ .../fun/create/fun_create_report_komentar.ts | 36 +- .../fun_create_notifikasi.tsx | 21 + ...tar_by_id.ts => get_all_komentar_by_id.ts} | 2 +- .../fun/get/get_list_posting_by_author_id.ts | 39 +- .../forum/fun/get/get_one_kategori_by_id.ts | 2 +- .../fun/get/get_one_posting_reported_by_id.ts | 46 +++ .../fun/get/get_one_report_komentar_by_id.tsx | 60 +++ src/app_modules/forum/index.ts | 8 +- src/app_modules/forum/main/beranda.tsx | 41 +- src/app_modules/forum/main/layout.tsx | 49 ++- src/app_modules/forum/model/interface.tsx | 17 +- .../forum/report/komentar/index.tsx | 87 +++- .../forum/report/komentar/lainnya.tsx | 2 +- .../forum/report/posting/index.tsx | 5 +- .../forum/report/posting/lainnya.tsx | 63 ++- src/app_modules/forum/splash/index.tsx | 45 ++- src/app_modules/home/layout.tsx | 4 +- src/app_modules/home/view.tsx | 43 +- src/app_modules/notif/index.tsx | 17 - .../fun/create/create_notif_to_admin.tsx | 3 + src/app_modules/notifikasi/main/index.tsx | 23 +- src/app_modules/zCoba/index.tsx | 2 +- yarn.lock | 36 +- 91 files changed, 2711 insertions(+), 1424 deletions(-) create mode 100644 src/app/dev/admin/forum/sub-menu/report-komentar/page.tsx rename src/app/dev/forum/detail/{ => main-detail}/[id]/layout.tsx (100%) rename src/app/dev/forum/detail/{ => main-detail}/[id]/loading.tsx (100%) rename src/app/dev/forum/detail/{ => main-detail}/[id]/page.tsx (76%) create mode 100644 src/app/dev/forum/detail/report-komentar/[id]/page.tsx create mode 100644 src/app/dev/forum/detail/report-posting/[id]/page.tsx delete mode 100644 src/app/dev/forum/splash/loading.tsx create mode 100644 src/app_modules/admin/forum/component/detail_one_komentar.tsx create mode 100644 src/app_modules/admin/forum/fun/get/get_all_report_komentar.ts rename src/app_modules/admin/forum/fun/get/{get_all_report_posting.tsx => get_all_report_posting.ts} (100%) create mode 100644 src/app_modules/admin/forum/fun/get/get_one_komentar_by_id.ts create mode 100644 src/app_modules/admin/forum/sub_menu/table_report_komentar.tsx create mode 100644 src/app_modules/component_global/ui/ui_header_tamplate.tsx create mode 100644 src/app_modules/component_global/ui/ui_layout_tamplate.tsx delete mode 100644 src/app_modules/forum/component/beranda/beranda_card.tsx create mode 100644 src/app_modules/forum/component/detail_component/detail_create_komentar.tsx create mode 100644 src/app_modules/forum/component/detail_component/detail_list_komentar.tsx create mode 100644 src/app_modules/forum/component/detail_component/detail_view.tsx rename src/app_modules/forum/component/{beranda/beranda_author_header.tsx => forumku_component/forumku_header.tsx} (52%) rename src/app_modules/forum/component/{beranda/beranda_button_more.tsx => forumku_component/forumku_more_button.tsx} (66%) create mode 100644 src/app_modules/forum/component/forumku_component/forumku_view.tsx rename src/app_modules/forum/component/{header => komentar_component}/komentar_author_header_name.tsx (97%) rename src/app_modules/forum/component/{more_button => komentar_component}/komentar_button_more.tsx (97%) create mode 100644 src/app_modules/forum/detail/detail_report_komentar.tsx create mode 100644 src/app_modules/forum/detail/detail_report_posting.tsx delete mode 100644 src/app_modules/forum/detail/index.tsx create mode 100644 src/app_modules/forum/detail/main_detail.tsx create mode 100644 src/app_modules/forum/forumku/forum_profile.tsx create mode 100644 src/app_modules/forum/forumku/postingan_pribadi.tsx create mode 100644 src/app_modules/forum/fun/forum_notifikasi/fun_create_notifikasi.tsx rename src/app_modules/forum/fun/get/{get_komentar_by_id.ts => get_all_komentar_by_id.ts} (89%) create mode 100644 src/app_modules/forum/fun/get/get_one_posting_reported_by_id.ts create mode 100644 src/app_modules/forum/fun/get/get_one_report_komentar_by_id.tsx delete mode 100644 src/app_modules/notif/index.tsx diff --git a/package.json b/package.json index 53ba7399..c1cd1e9b 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,6 @@ "@types/node": "20.4.5", "@types/react": "18.2.17", "@types/react-dom": "18.2.7", - "@types/react-virtualized": "^9.21.30", "@types/uuid": "^9.0.4", "autoprefixer": "10.4.14", "bufferutil": "^4.0.8", @@ -67,7 +66,6 @@ "react-responsive-carousel": "^3.2.23", "react-simple-toasts": "^5.10.0", "react-toastify": "^9.1.3", - "react-virtualized": "^9.22.5", "socket.io-client": "^4.7.2", "tailwindcss": "3.3.3", "ts-node": "^10.9.2", diff --git a/src/app/dev/admin/forum/sub-detail/report-komentar/[id]/page.tsx b/src/app/dev/admin/forum/sub-detail/report-komentar/[id]/page.tsx index 32d1107c..94f2bd0f 100644 --- a/src/app/dev/admin/forum/sub-detail/report-komentar/[id]/page.tsx +++ b/src/app/dev/admin/forum/sub-detail/report-komentar/[id]/page.tsx @@ -1,15 +1,23 @@ import { AdminForum_HasilReportKomentar } from "@/app_modules/admin/forum"; import { adminForum_getListReportKomentarbyId } from "@/app_modules/admin/forum/fun/get/get_list_report_komentar_by_id"; +import adminForum_funGetOneKomentarById from "@/app_modules/admin/forum/fun/get/get_one_komentar_by_id"; export default async function Page({ params }: { params: { id: string } }) { let komentarId = params.id; - const listReport = await adminForum_getListReportKomentarbyId({komentarId: komentarId, page: 1}); + const listReport = await adminForum_getListReportKomentarbyId({ + komentarId: komentarId, + page: 1, + }); + const dataKomentar = await adminForum_funGetOneKomentarById({ + komentarId: komentarId, + }); return ( <> ); diff --git a/src/app/dev/admin/forum/sub-menu/report-komentar/page.tsx b/src/app/dev/admin/forum/sub-menu/report-komentar/page.tsx new file mode 100644 index 00000000..dfff6d5b --- /dev/null +++ b/src/app/dev/admin/forum/sub-menu/report-komentar/page.tsx @@ -0,0 +1,12 @@ +import adminForum_funGetAllReportKomentar from "@/app_modules/admin/forum/fun/get/get_all_report_komentar"; +import AdminForum_TableReportKomentar from "@/app_modules/admin/forum/sub_menu/table_report_komentar"; + +export default async function Page() { + const listData = await adminForum_funGetAllReportKomentar({ page: 1 }); + + return ( + <> + + + ); +} diff --git a/src/app/dev/forum/detail/[id]/layout.tsx b/src/app/dev/forum/detail/main-detail/[id]/layout.tsx similarity index 100% rename from src/app/dev/forum/detail/[id]/layout.tsx rename to src/app/dev/forum/detail/main-detail/[id]/layout.tsx diff --git a/src/app/dev/forum/detail/[id]/loading.tsx b/src/app/dev/forum/detail/main-detail/[id]/loading.tsx similarity index 100% rename from src/app/dev/forum/detail/[id]/loading.tsx rename to src/app/dev/forum/detail/main-detail/[id]/loading.tsx diff --git a/src/app/dev/forum/detail/[id]/page.tsx b/src/app/dev/forum/detail/main-detail/[id]/page.tsx similarity index 76% rename from src/app/dev/forum/detail/[id]/page.tsx rename to src/app/dev/forum/detail/main-detail/[id]/page.tsx index 106c53ea..325d3b6b 100644 --- a/src/app/dev/forum/detail/[id]/page.tsx +++ b/src/app/dev/forum/detail/main-detail/[id]/page.tsx @@ -1,5 +1,5 @@ -import Forum_Detail from "@/app_modules/forum/detail"; -import { forum_getKomentarById } from "@/app_modules/forum/fun/get/get_komentar_by_id"; +import Forum_MainDetail from "@/app_modules/forum/detail/main_detail"; +import { forum_funGetAllKomentarById } from "@/app_modules/forum/fun/get/get_all_komentar_by_id"; import { forum_getOnePostingById } from "@/app_modules/forum/fun/get/get_one_posting_by_id"; import { forum_countOneTotalKomentarById } from "@/app_modules/forum/fun/count/count_one_total_komentar_by_id"; import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token"; @@ -11,13 +11,13 @@ export default async function Page({ params }: { params: { id: string } }) { const userLoginId = await user_getOneUserId(); const dataPosting = await forum_getOnePostingById(postingId); - const listKomentar = await forum_getKomentarById(postingId); + const listKomentar = await forum_funGetAllKomentarById(postingId); dataPosting?.isActive === false && redirect(RouterForum.beranda); return ( <> - + + + ); +} diff --git a/src/app/dev/forum/detail/report-posting/[id]/page.tsx b/src/app/dev/forum/detail/report-posting/[id]/page.tsx new file mode 100644 index 00000000..faa3d24a --- /dev/null +++ b/src/app/dev/forum/detail/report-posting/[id]/page.tsx @@ -0,0 +1,12 @@ +import { Forum_DetailReportPosting } from "@/app_modules/forum"; +import forum_funGetOneReportedPostingById from "@/app_modules/forum/fun/get/get_one_posting_reported_by_id"; + +export default async function Page({params}: {params: {id: string}}) { + const postingId = params.id + const dataPosting = await forum_funGetOneReportedPostingById({postingId: postingId}) + return ( + <> + + + ); +} diff --git a/src/app/dev/forum/forumku/[id]/page.tsx b/src/app/dev/forum/forumku/[id]/page.tsx index ca9e99b3..2432252d 100644 --- a/src/app/dev/forum/forumku/[id]/page.tsx +++ b/src/app/dev/forum/forumku/[id]/page.tsx @@ -1,5 +1,5 @@ import { Forum_Forumku } from "@/app_modules/forum"; -import { forum_getListPostingByAuhtorId } from "@/app_modules/forum/fun/get/get_list_posting_by_author_id"; +import { forum_getAllPostingByAuhtorId } from "@/app_modules/forum/fun/get/get_list_posting_by_author_id"; import { forum_countOneTotalKomentarById } from "@/app_modules/forum/fun/count/count_one_total_komentar_by_id"; import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token"; import { user_getOneByUserId } from "@/app_modules/home/fun/get/get_one_user_by_id"; @@ -25,7 +25,7 @@ export default async function Page({ params }: { params: { id: string } }) { // setTimeout(a, 1000); // }); - const dataPosting = await forum_getListPostingByAuhtorId(authorId); + const dataPosting = await forum_getAllPostingByAuhtorId({authorId: authorId, page: 1}); const totalPosting = await forum_countPostingByAuthorId(authorId); return ( diff --git a/src/app/dev/forum/report/komentar/[id]/page.tsx b/src/app/dev/forum/report/komentar/[id]/page.tsx index 64e4a7b4..88717b66 100644 --- a/src/app/dev/forum/report/komentar/[id]/page.tsx +++ b/src/app/dev/forum/report/komentar/[id]/page.tsx @@ -1,15 +1,19 @@ import { Forum_ReportKomentar } from "@/app_modules/forum"; import { forum_getMasterKategoriReport } from "@/app_modules/forum/fun/master/get_master_kategori_report"; +import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token"; export default async function Page({ params }: { params: { id: string } }) { let komentarId = params.id; const listReport = await forum_getMasterKategoriReport(); + const userLoginId = await user_getOneUserId(); + return ( <> ); diff --git a/src/app/dev/forum/report/posting-lainnya/[id]/page.tsx b/src/app/dev/forum/report/posting-lainnya/[id]/page.tsx index 0d5b8cbd..3039aef6 100644 --- a/src/app/dev/forum/report/posting-lainnya/[id]/page.tsx +++ b/src/app/dev/forum/report/posting-lainnya/[id]/page.tsx @@ -1,11 +1,16 @@ import { Forum_ReportPostingLainnya } from "@/app_modules/forum"; +import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token"; export default async function Page({ params }: { params: { id: string } }) { - let postingIg = params.id; + let postingId = params.id; + const userLoginId = await user_getOneUserId() return ( <> - + ); } diff --git a/src/app/dev/forum/report/posting/[id]/page.tsx b/src/app/dev/forum/report/posting/[id]/page.tsx index aa172433..d52c5827 100644 --- a/src/app/dev/forum/report/posting/[id]/page.tsx +++ b/src/app/dev/forum/report/posting/[id]/page.tsx @@ -1,13 +1,11 @@ import { Forum_ReportPosting } from "@/app_modules/forum"; -import { forum_getOnePostingById } from "@/app_modules/forum/fun/get/get_one_posting_by_id"; import { forum_getMasterKategoriReport } from "@/app_modules/forum/fun/master/get_master_kategori_report"; import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token"; export default async function Page({ params }: { params: { id: string } }) { let postingId = params.id; const listReport = await forum_getMasterKategoriReport(); - const userLoginId = await user_getOneUserId() - const dataPosting = await forum_getOnePostingById(postingId) + const userLoginId = await user_getOneUserId(); return ( <> diff --git a/src/app/dev/forum/splash/loading.tsx b/src/app/dev/forum/splash/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/forum/splash/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/home/page.tsx b/src/app/dev/home/page.tsx index e70705ff..3469f504 100644 --- a/src/app/dev/home/page.tsx +++ b/src/app/dev/home/page.tsx @@ -26,7 +26,7 @@ export default async function Page() { return ( <> - + ); } diff --git a/src/app/emotion.tsx b/src/app/emotion.tsx index 478edabf..01572366 100644 --- a/src/app/emotion.tsx +++ b/src/app/emotion.tsx @@ -1,11 +1,9 @@ "use client"; -import AppNotif from "@/app_modules/notif"; // import './globals.css' import { CacheProvider } from "@emotion/react"; -import { Image, MantineProvider, useEmotionCache } from "@mantine/core"; +import { MantineProvider, useEmotionCache } from "@mantine/core"; import { Notifications } from "@mantine/notifications"; import { useServerInsertedHTML } from "next/navigation"; -import { ToastContainer, toast } from "react-toastify"; import "react-toastify/dist/ReactToastify.css"; export default function RootStyleRegistry({ diff --git a/src/app/lib/router_admin/router_admin_forum.ts b/src/app/lib/router_admin/router_admin_forum.ts index 9b68b6f9..0957a7b2 100644 --- a/src/app/lib/router_admin/router_admin_forum.ts +++ b/src/app/lib/router_admin/router_admin_forum.ts @@ -5,7 +5,7 @@ export const RouterAdminForum = { // sub menu table_posting: "/dev/admin/forum/sub-menu/posting", table_report_posting: "/dev/admin/forum/sub-menu/report-posting", - + table_report_komentar: "/dev/admin/forum/sub-menu/report-komentar", // detail detail_posting: "/dev/admin/forum/detail/", diff --git a/src/app/lib/router_hipmi/router_forum.ts b/src/app/lib/router_hipmi/router_forum.ts index ee955887..2666cc4b 100644 --- a/src/app/lib/router_hipmi/router_forum.ts +++ b/src/app/lib/router_hipmi/router_forum.ts @@ -13,9 +13,11 @@ export const RouterForum = { edit_komentar: "/dev/forum/edit/komentar/", //detail - main_detail: "/dev/forum/detail/", + main_detail: "/dev/forum/detail/main-detail/", + detail_report_komentar: "/dev/forum/detail/report-komentar/", + detail_report_posting: "/dev/forum/detail/report-posting/", - // komentra + // komentar komentar: "/dev/forum/komentar/", //report diff --git a/src/app/zCoba/page.tsx b/src/app/zCoba/page.tsx index d171ef0a..6cccd737 100644 --- a/src/app/zCoba/page.tsx +++ b/src/app/zCoba/page.tsx @@ -1,16 +1,17 @@ +import ComponentGlobal_HeaderTamplate from "@/app_modules/component_global/header_tamplate"; +import ComponentGlobal_UI_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; import Coba_TestLoading from "@/app_modules/zCoba"; +import { Text } from "@mantine/core"; export default async function Page() { - - - await new Promise((a, b) => { - setTimeout(a, 3000); - }); + await new Promise((a, b) => { + setTimeout(a, 3000); + }); return ( <> - + {/* */} ); } diff --git a/src/app_modules/admin/forum/component/detail_one_komentar.tsx b/src/app_modules/admin/forum/component/detail_one_komentar.tsx new file mode 100644 index 00000000..a2ff9e49 --- /dev/null +++ b/src/app_modules/admin/forum/component/detail_one_komentar.tsx @@ -0,0 +1,64 @@ +"use client"; + +import { MODEL_FORUM_KOMENTAR, MODEL_FORUM_POSTING } from "@/app_modules/forum/model/interface"; +import { + Badge, + Box, + Divider, + Group, + Paper, + Spoiler, + Stack, + Text, + Title, +} from "@mantine/core"; + +export default function ComponentAdminForum_ViewOneDetailKomentar({ + dataKomentar, +}: { + dataKomentar: MODEL_FORUM_KOMENTAR; +}) { + return ( + <> + + + + Detail Komentar + + + + + + + + + Username:{" "} + + {dataKomentar?.Author?.username} + + + + + {/* */} + + + + +
+ + + + + + + ); +} diff --git a/src/app_modules/admin/forum/component/detail_one_posting.tsx b/src/app_modules/admin/forum/component/detail_one_posting.tsx index 74fe370f..13312433 100644 --- a/src/app_modules/admin/forum/component/detail_one_posting.tsx +++ b/src/app_modules/admin/forum/component/detail_one_posting.tsx @@ -21,7 +21,7 @@ export default function ComponentAdminForum_ViewOneDetailPosting({ return ( <> - + Detail Posting @@ -31,9 +31,9 @@ export default function ComponentAdminForum_ViewOneDetailPosting({ - + Username:{" "} - + {dataPosting?.Author?.username} @@ -48,7 +48,7 @@ export default function ComponentAdminForum_ViewOneDetailPosting({ {dataPosting?.ForumMaster_StatusPosting?.status} - + {/* */} diff --git a/src/app_modules/admin/forum/fun/count/fun_count_laporan_komentar.ts b/src/app_modules/admin/forum/fun/count/fun_count_laporan_komentar.ts index 9402b709..c78daf1b 100644 --- a/src/app_modules/admin/forum/fun/count/fun_count_laporan_komentar.ts +++ b/src/app_modules/admin/forum/fun/count/fun_count_laporan_komentar.ts @@ -6,6 +6,9 @@ export async function adminForum_countLaporanKomentar() { const count = await prisma.forum_ReportKomentar.count({ where: { isActive: true, + Forum_Komentar: { + isActive: true, + }, }, }); diff --git a/src/app_modules/admin/forum/fun/count/fun_count_laporan_posting.ts b/src/app_modules/admin/forum/fun/count/fun_count_laporan_posting.ts index fa673c48..9e88da10 100644 --- a/src/app_modules/admin/forum/fun/count/fun_count_laporan_posting.ts +++ b/src/app_modules/admin/forum/fun/count/fun_count_laporan_posting.ts @@ -6,6 +6,9 @@ export async function adminForum_countLaporanPosting() { const count = await prisma.forum_ReportPosting.count({ where: { isActive: true, + Forum_Posting: { + isActive: true, + }, }, }); diff --git a/src/app_modules/admin/forum/fun/count/fun_count_publish.ts b/src/app_modules/admin/forum/fun/count/fun_count_publish.ts index c5fde5de..2042cc7e 100644 --- a/src/app_modules/admin/forum/fun/count/fun_count_publish.ts +++ b/src/app_modules/admin/forum/fun/count/fun_count_publish.ts @@ -6,7 +6,9 @@ export async function adminForum_countPublish() { const count = await prisma.forum_Posting.count({ where: { isActive: true, + }, + }); return count; diff --git a/src/app_modules/admin/forum/fun/get/get_all_report_komentar.ts b/src/app_modules/admin/forum/fun/get/get_all_report_komentar.ts new file mode 100644 index 00000000..e365a254 --- /dev/null +++ b/src/app_modules/admin/forum/fun/get/get_all_report_komentar.ts @@ -0,0 +1,98 @@ +"use server"; + +import prisma from "@/app/lib/prisma"; +import { ceil } from "lodash"; + +export default async function adminForum_funGetAllReportKomentar({ + page, + search, +}: { + page: number; + search?: string; +}) { + const takeData = 10; + const skipData = page * takeData - takeData; + + const data = await prisma.forum_ReportKomentar.findMany({ + take: takeData, + skip: skipData, + orderBy: { + createdAt: "desc", + }, + where: { + Forum_Komentar: { + isActive: true, + komentar: { + contains: search, + mode: "insensitive", + }, + }, + }, + select: { + id: true, + isActive: true, + createdAt: true, + deskripsi: true, + forumMaster_KategoriReportId: true, + ForumMaster_KategoriReport: { + select: { + id: true, + title: true, + deskripsi: true, + }, + }, + forum_KomentarId: true, + Forum_Komentar: { + select: { + id: true, + komentar: true, + forum_PostingId: true, + // Forum_Posting: { + // select: { + // id: true, + // diskusi: true, + // ForumMaster_StatusPosting: { + // select: { + // id: true, + // status: true, + // }, + // }, + // Author: { + // select: { + // id: true, + // username: true, + // }, + // }, + // }, + // }, + }, + }, + userId: true, + User: { + select: { + id: true, + username: true, + }, + }, + }, + }); + + const nCount = await prisma.forum_ReportKomentar.count({ + where: { + Forum_Komentar: { + isActive: true, + komentar: { + contains: search, + mode: "insensitive", + }, + }, + }, + }); + + const allData = { + data: data, + nPage: ceil(nCount / takeData), + }; + + return allData; +} diff --git a/src/app_modules/admin/forum/fun/get/get_all_report_posting.tsx b/src/app_modules/admin/forum/fun/get/get_all_report_posting.ts similarity index 100% rename from src/app_modules/admin/forum/fun/get/get_all_report_posting.tsx rename to src/app_modules/admin/forum/fun/get/get_all_report_posting.ts diff --git a/src/app_modules/admin/forum/fun/get/get_one_komentar_by_id.ts b/src/app_modules/admin/forum/fun/get/get_one_komentar_by_id.ts new file mode 100644 index 00000000..f1f0ff57 --- /dev/null +++ b/src/app_modules/admin/forum/fun/get/get_one_komentar_by_id.ts @@ -0,0 +1,31 @@ +"use server"; + +import prisma from "@/app/lib/prisma"; + +export default async function adminForum_funGetOneKomentarById({ + komentarId, +}: { + komentarId: string; +}) { + + const data = await prisma.forum_Komentar.findFirst({ + where: { + id: komentarId, + }, + select: { + id: true, + isActive: true, + authorId: true, + Author: { + select: { + id: true, + username: true, + }, + }, + komentar: true, + forum_PostingId: true, + }, + }); + + return data; +} diff --git a/src/app_modules/admin/forum/fun/get/get_one_posting_by_id.ts b/src/app_modules/admin/forum/fun/get/get_one_posting_by_id.ts index 2170f4f5..a84c0949 100644 --- a/src/app_modules/admin/forum/fun/get/get_one_posting_by_id.ts +++ b/src/app_modules/admin/forum/fun/get/get_one_posting_by_id.ts @@ -16,6 +16,7 @@ export async function adminForum_getOnePostingById(postingId: string) { status: true, }, }, + authorId: true, Author: { select: { id: true, diff --git a/src/app_modules/admin/forum/index.tsx b/src/app_modules/admin/forum/index.tsx index 199053be..df3d8971 100644 --- a/src/app_modules/admin/forum/index.tsx +++ b/src/app_modules/admin/forum/index.tsx @@ -4,6 +4,7 @@ import AdminForum_TableReportPosting from "./sub_menu/table_report_posting"; import AdminForum_DetailPosting from "./detail/detail_posting"; import AdminForum_HasilReportPosting from "./sub_detail/hasil_report_posting"; import AdminForum_HasilReportKomentar from "./sub_detail/hasil_report_komentar"; +import AdminForum_TableReportKomentar from "./sub_menu/table_report_komentar"; export { AdminForum_Main, @@ -12,4 +13,5 @@ export { AdminForum_DetailPosting as AdminForum_LihatSemuaKomentar, AdminForum_HasilReportPosting, AdminForum_HasilReportKomentar, + AdminForum_TableReportKomentar, }; diff --git a/src/app_modules/admin/forum/sub_detail/hasil_report_komentar.tsx b/src/app_modules/admin/forum/sub_detail/hasil_report_komentar.tsx index 7ec2e6b9..097ed84f 100644 --- a/src/app_modules/admin/forum/sub_detail/hasil_report_komentar.tsx +++ b/src/app_modules/admin/forum/sub_detail/hasil_report_komentar.tsx @@ -6,8 +6,9 @@ import ComponentAdminDonasi_TombolKembali from "@/app_modules/admin/donasi/compo import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { + MODEL_FORUM_KOMENTAR, MODEL_FORUM_MASTER_REPORT, - MODEL_FORUM_REPORT, + MODEL_FORUM_REPORT_POSTING, } from "@/app_modules/forum/model/interface"; import { Badge, @@ -41,22 +42,38 @@ import { useDisclosure, useShallowEffect } from "@mantine/hooks"; import ComponentAdminGlobal_IsEmptyData from "../../component_global/is_empty_data"; import { adminForum_getListReportKomentarbyId } from "../fun/get/get_list_report_komentar_by_id"; import ComponentAdminGlobal_BackButton from "../../component_global/back_button"; +import ComponentAdminForum_ViewOneDetailKomentar from "../component/detail_one_komentar"; +import adminForum_funGetOneKomentarById from "../fun/get/get_one_komentar_by_id"; +import mqtt_client from "@/util/mqtt_client"; +import adminNotifikasi_funCreateToUser from "../../notifikasi/fun/create/fun_create_notif_user"; export default function AdminForum_HasilReportKomentar({ komentarId, listReport, + dataKomentar, }: { komentarId: string; listReport: any; + dataKomentar: MODEL_FORUM_KOMENTAR; }) { + const [data, setData] = useState(dataKomentar); + console.log(komentarId); + return ( <> - + { + setData(val); + }} + /> + {/*
{JSON.stringify(listReport, null, 2)}
*/}
@@ -64,23 +81,56 @@ export default function AdminForum_HasilReportKomentar({ ); } -function ButtonDeleteKomentar({ komentarId }: { komentarId: string }) { +function ButtonDeleteKomentar({ + komentarId, + data, + onSuccess, +}: { + komentarId: string; + data: MODEL_FORUM_KOMENTAR; + onSuccess: (val: any) => void; +}) { const router = useRouter(); const [opened, { open, close }] = useDisclosure(false); const [loadingDel2, setLoadingDel2] = useState(false); async function onDelete() { - await adminForum_funDeleteKomentarById(komentarId).then((res) => { + await adminForum_funDeleteKomentarById(komentarId).then(async (res) => { if (res.status === 200) { setLoadingDel2(false); close(); - router.back(); + + const dataKomentar = await adminForum_funGetOneKomentarById({ + komentarId: komentarId, + }); + onSuccess(dataKomentar); + + const dataNotif = { + appId: data.id, + status: "Report Komentar", + userId: data.authorId, + pesan: data.komentar, + kategoriApp: "FORUM", + title: "Komentar anda telah di laporkan", + }; + + const notif = await adminNotifikasi_funCreateToUser({ + data: dataNotif as any, + }); + if (notif.status === 201) { + mqtt_client.publish( + "USER", + JSON.stringify({ userId: data.authorId, count: 1 }) + ); + } + ComponentGlobal_NotifikasiBerhasil(res.message); } else { ComponentGlobal_NotifikasiGagal(res.message); } }); } + return ( <> @@ -111,17 +161,21 @@ function ButtonDeleteKomentar({ komentarId }: { komentarId: string }) {
- + {data.isActive ? ( + + ) : ( + "" + )} ); } @@ -134,7 +188,9 @@ function HasilReportPosting({ komentarId: string; }) { const router = useRouter(); - const [data, setData] = useState(listReport.data); + const [data, setData] = useState( + listReport.data + ); const [nPage, setNPage] = useState(listReport.nPage); const [activePage, setActivePage] = useState(1); const [isSearch, setSearch] = useState(""); @@ -230,7 +286,7 @@ function HasilReportPosting({
Username
-
Title
+
Kategori
Deskripsi
diff --git a/src/app_modules/admin/forum/sub_detail/hasil_report_posting.tsx b/src/app_modules/admin/forum/sub_detail/hasil_report_posting.tsx index bea6c1f9..2f3bcdf5 100644 --- a/src/app_modules/admin/forum/sub_detail/hasil_report_posting.tsx +++ b/src/app_modules/admin/forum/sub_detail/hasil_report_posting.tsx @@ -5,7 +5,7 @@ import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_glob import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { MODEL_FORUM_POSTING, - MODEL_FORUM_REPORT, + MODEL_FORUM_REPORT_POSTING, } from "@/app_modules/forum/model/interface"; import { Button, @@ -31,6 +31,8 @@ import ComponentAdminGlobal_IsEmptyData from "../../component_global/is_empty_da import { adminForum_funDeletePostingById } from "../fun/delete/fun_delete_posting_by_id"; import { adminForum_getListReportPostingById } from "../fun/get/get_list_report_posting_by_id"; import ComponentAdminForum_ViewOneDetailPosting from "../component/detail_one_posting"; +import mqtt_client from "@/util/mqtt_client"; +import adminNotifikasi_funCreateToUser from "../../notifikasi/fun/create/fun_create_notif_user"; export default function AdminForum_HasilReportPosting({ dataPosting, @@ -45,7 +47,7 @@ export default function AdminForum_HasilReportPosting({ - + { - if (res.status === 200) { - setLoadingDel2(false); - setLoadingDel(false); - close(); - router.back(); - ComponentGlobal_NotifikasiBerhasil(res.message); - } else { - ComponentGlobal_NotifikasiGagal(res.message); + const del = await adminForum_funDeletePostingById(dataPosting.id); + if (del.status === 200) { + setLoadingDel2(false); + close(); + router.back(); + + const dataNotif = { + appId: dataPosting.id, + status: "Report Posting", + userId: dataPosting.authorId, + pesan: dataPosting.diskusi, + kategoriApp: "FORUM", + title: "Postingan anda telah di laporkan", + }; + const notif = await adminNotifikasi_funCreateToUser({ + data: dataNotif as any, + }); + if (notif.status === 201) { + mqtt_client.publish( + "USER", + JSON.stringify({ userId: dataPosting.authorId, count: 1 }) + ); } - }); + + ComponentGlobal_NotifikasiBerhasil(del.message); + } else { + ComponentGlobal_NotifikasiGagal(del.message); + } } return ( <> @@ -93,12 +116,13 @@ function ButtonDeletePosting({ postingId }: { postingId: string }) { radius={"xl"} onClick={() => { close(); - setLoadingDel(false); }} > Batal + + ); +} diff --git a/src/app_modules/admin/forum/sub_menu/table_report_posting.tsx b/src/app_modules/admin/forum/sub_menu/table_report_posting.tsx index 481dc1d7..0dac9b93 100644 --- a/src/app_modules/admin/forum/sub_menu/table_report_posting.tsx +++ b/src/app_modules/admin/forum/sub_menu/table_report_posting.tsx @@ -1,11 +1,9 @@ "use client"; import { RouterAdminForum } from "@/app/lib/router_admin/router_admin_forum"; -import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; import ComponentAdminGlobal_HeaderTamplate from "@/app_modules/admin/component_global/header_tamplate"; import { - MODEL_FORUM_POSTING, - MODEL_FORUM_REPORT, + MODEL_FORUM_REPORT_POSTING } from "@/app_modules/forum/model/interface"; import { Badge, @@ -13,7 +11,6 @@ import { Button, Center, Group, - Modal, Pagination, Paper, ScrollArea, @@ -22,23 +19,15 @@ import { Table, Text, TextInput, - Title, + Title } from "@mantine/core"; -import { IconMessageCircle, IconSearch } from "@tabler/icons-react"; -import { IconFlag3 } from "@tabler/icons-react"; -import { IconEyeCheck, IconTrash } from "@tabler/icons-react"; -import _, { isEmpty } from "lodash"; +import { IconFlag3, IconSearch } from "@tabler/icons-react"; +import { isEmpty } from "lodash"; import { useRouter } from "next/navigation"; import { useState } from "react"; -import { adminForum_funDeletePostingById } from "../fun/delete/fun_delete_posting_by_id"; -import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; -import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; -import { useDisclosure } from "@mantine/hooks"; -import { adminForum_getListPosting } from "../fun/get/get_list_publish"; -import adminJob_getListPublish from "@/app_modules/admin/job/fun/get/get_list_publish"; +import ComponentAdminGlobal_IsEmptyData from "../../component_global/is_empty_data"; import ComponentAdminForum_ButtonDeletePosting from "../component/button_delete"; import adminForum_funGetAllReportPosting from "../fun/get/get_all_report_posting"; -import ComponentAdminGlobal_IsEmptyData from "../../component_global/is_empty_data"; export default function AdminForum_TableReportPosting({ listData, @@ -58,7 +47,7 @@ export default function AdminForum_TableReportPosting({ function TableView({ listData }: { listData: any }) { const router = useRouter(); - const [data, setData] = useState(listData.data); + const [data, setData] = useState(listData.data); const [nPage, setNPage] = useState(listData.nPage); const [activePage, setActivePage] = useState(1); const [isSearch, setSearch] = useState(""); @@ -109,7 +98,7 @@ function TableView({ listData }: { listData: any }) {
- + {/*
{e?.Forum_Posting.Author.username}
@@ -130,7 +119,7 @@ function TableView({ listData }: { listData: any }) { />
- + */}
@@ -160,14 +149,14 @@ function TableView({ listData }: { listData: any }) { {/* */} - { if (val) { onLoadData(); } }} - /> + /> */} @@ -190,7 +179,7 @@ function TableView({ listData }: { listData: any }) { radius={"xl"} placeholder="Cari postingan" onChange={(val) => { - // console.log(val.currentTarget.value) + onSearch(val.currentTarget.value); }} /> @@ -218,12 +207,12 @@ function TableView({ listData }: { listData: any }) {
Jenis Laporan
- + {/*
Author
Postingan - + */}
Status Posting
diff --git a/src/app_modules/admin/list_page.tsx b/src/app_modules/admin/list_page.tsx index ae9806ee..d7e09358 100644 --- a/src/app_modules/admin/list_page.tsx +++ b/src/app_modules/admin/list_page.tsx @@ -236,11 +236,11 @@ export const listAdminPage = [ name: "Report Posting", path: RouterAdminForum.table_report_posting, }, - // { - // id: 74, - // name: "Laporan Komentar", - // path: RouterAdminForum.report_komentar, - // }, + { + id: 74, + name: "Report Komentar", + path: RouterAdminForum.table_report_komentar, + }, ], }, diff --git a/src/app_modules/auth/login/view.tsx b/src/app_modules/auth/login/view.tsx index 8b8e87c0..d345a9b6 100644 --- a/src/app_modules/auth/login/view.tsx +++ b/src/app_modules/auth/login/view.tsx @@ -1,6 +1,7 @@ "use client"; import { + BackgroundImage, Box, Button, Center, @@ -81,56 +82,56 @@ export default function Login() { return ( <> - - - - WELCOME TO - - HIPMI APPS + + + + WELCOME TO + + HIPMI APPS + + + +
+ Nomor telepon +
+ { + setPhone(val); + }} + /> + + {isError ? ( + + ) : ( + "" + )} + + +
- - -
- Nomor telepon -
- { - setPhone(val); - }} - /> - - {isError ? ( - - ) : ( - "" - )} - - -
-
+ ); } diff --git a/src/app_modules/auth/register/view.tsx b/src/app_modules/auth/register/view.tsx index 710d8b0f..59dd2e1f 100644 --- a/src/app_modules/auth/register/view.tsx +++ b/src/app_modules/auth/register/view.tsx @@ -10,8 +10,13 @@ import { Center, PinInput, Stack, + BackgroundImage, } from "@mantine/core"; -import { IconCircleLetterH, IconCloudLockOpen, IconUserCircle } from "@tabler/icons-react"; +import { + IconCircleLetterH, + IconCloudLockOpen, + IconUserCircle, +} from "@tabler/icons-react"; import { gs_nomor } from "../state/state"; import { useAtom } from "jotai"; import { useState } from "react"; @@ -28,7 +33,10 @@ import { IconPencilCheck } from "@tabler/icons-react"; import { RouterHome } from "@/app/lib/router_hipmi/router_home"; import { auth_funEditAktivasiKodeOtpById } from "../fun/fun_edit_aktivasi_kode_otp_by_id"; import ComponentGlobal_ErrorInput from "@/app_modules/component_global/error_input"; -import { AccentColor, MainColor } from "@/app_modules/component_global/color/color_pallet"; +import { + AccentColor, + MainColor, +} from "@/app_modules/component_global/color/color_pallet"; export default function Register({ dataOtp }: { dataOtp: any }) { const router = useRouter(); @@ -72,85 +80,26 @@ export default function Register({ dataOtp }: { dataOtp: any }) { return ( <> {/*
{JSON.stringify(dataOtp,null,2)}
*/} + +
+ + + REGISTRASI + -
- - - REGISTRASI - + - - - - - Anda akan terdaftar dengan nomor berikut{" "} - - +{nomor} + + + Anda akan terdaftar dengan nomor berikut{" "} + + +{nomor} + - - 0 && value.length < 5 ? ( - - ) : _.values(value).includes(" ") ? ( - - - - - ) : isValue ? ( - - ) : ( - "" - ) - } - onChange={(val) => { - val.currentTarget.value.length > 0 ? setIsValue(false) : ""; - setValue(val.currentTarget.value); - }} - /> - - - - - - - {/* -
- -
- - - - REGISTRASI - Masukan username anda ! - - - - Anda akan terdaftar dengan nomor berikut{" "} - - +{nomor} - - - - - - + + + -
*/} -
+
+
); } diff --git a/src/app_modules/auth/splash/view.tsx b/src/app_modules/auth/splash/view.tsx index b7ae6b7a..5ca2f9d8 100644 --- a/src/app_modules/auth/splash/view.tsx +++ b/src/app_modules/auth/splash/view.tsx @@ -1,12 +1,7 @@ "use client"; import { MainColor } from "@/app_modules/component_global/color/color_pallet"; -import { - Center, - Image, - Paper, - Stack -} from "@mantine/core"; +import { BackgroundImage, Center, Image, Paper, Stack } from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; import { useRouter } from "next/navigation"; @@ -24,21 +19,28 @@ export default function SplashScreen({ data }: { data: any }) { }, 2000); } }, []); + return ( <> -
- - {/* Welcome to */} - - - - -
+ +
+ + {/* Welcome to */} + + + + +
+
); } diff --git a/src/app_modules/auth/validasi/view.tsx b/src/app_modules/auth/validasi/view.tsx index bb9c4f00..2b729418 100644 --- a/src/app_modules/auth/validasi/view.tsx +++ b/src/app_modules/auth/validasi/view.tsx @@ -11,18 +11,17 @@ import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_glob import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; import { ActionIcon, + BackgroundImage, Box, Button, Center, PinInput, Stack, Text, - Title + Title, } from "@mantine/core"; import { useFocusTrap } from "@mantine/hooks"; -import { - IconChevronLeft -} from "@tabler/icons-react"; +import { IconChevronLeft } from "@tabler/icons-react"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { auth_funEditAktivasiKodeOtpById } from "../fun/fun_edit_aktivasi_kode_otp_by_id"; @@ -66,64 +65,74 @@ export default function Validasi({ dataOtp }: { dataOtp: any }) { return ( <> - - - router.back()}> - - - - - - - Verifikasi Kode OTP - - - - - Masukan 4 digit kode otp - - - Yang dikirim ke +{nomor} - -
- { - setInputOtp(val); - }} - /> -
-
- + router.back()}> + + + + + + + Verifikasi Kode OTP + + + + + Masukan 4 digit kode otp + + + Yang dikirim ke{" "} + + {" "} + +{nomor} + + +
+ { + setInputOtp(val); + }} + /> +
+
+ +
-
+ ); } diff --git a/src/app_modules/colab/detail/chat/index.tsx b/src/app_modules/colab/detail/chat/index.tsx index 40e3c30d..4debaea7 100644 --- a/src/app_modules/colab/detail/chat/index.tsx +++ b/src/app_modules/colab/detail/chat/index.tsx @@ -1,52 +1,41 @@ "use client"; import { RouterColab } from "@/app/lib/router_hipmi/router_colab"; +import { evnPesan } from "@/util/evn"; +import mqtt_client from "@/util/mqtt_client"; import { ActionIcon, Box, - Button, - Card, Center, - Code, Grid, Group, - Header, Loader, Paper, - ScrollArea, Stack, Text, Textarea, - Title, + Title } from "@mantine/core"; +import { useShallowEffect } from "@mantine/hooks"; import { IconChevronLeft, IconCircle, IconInfoSquareRounded, IconSend, } from "@tabler/icons-react"; -import { useRouter } from "next/navigation"; -import router from "next/router"; -import React, { useRef, useState } from "react"; -import { - MODEL_COLLABORATION_MESSAGE, - MODEL_COLLABORATION_ROOM_CHAT, -} from "../../model/interface"; import _ from "lodash"; -import ComponentColab_IsEmptyData from "../../component/is_empty_data"; -import colab_getMessageByRoomId from "../../fun/get/room_chat/get_message_by_room_id"; -import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; -import colab_funCreateMessageByUserId from "../../fun/create/room/fun_create_message_by_user_id"; -import { useShallowEffect } from "@mantine/hooks"; -import mqtt_client from "@/util/mqtt_client"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; import useInfiniteScroll, { ScrollDirection, ScrollDirectionBooleanState, } from "react-easy-infinite-scroll-hook"; -import toast from "react-simple-toasts"; -import colab_getOneMessageById from "../../fun/get/room_chat/get_one_message_by_id"; -import { List } from "react-virtualized"; -import { evnPesan } from "@/util/evn"; +import ComponentColab_IsEmptyData from "../../component/is_empty_data"; +import colab_getMessageByRoomId from "../../fun/get/room_chat/get_message_by_room_id"; +import { + MODEL_COLLABORATION_MESSAGE, + MODEL_COLLABORATION_ROOM_CHAT, +} from "../../model/interface"; const list = Array(100).fill(0); export default function ColabViewChat({ diff --git a/src/app_modules/component_global/color/color_pallet.ts b/src/app_modules/component_global/color/color_pallet.ts index 9ce5fab0..15f676ba 100644 --- a/src/app_modules/component_global/color/color_pallet.ts +++ b/src/app_modules/component_global/color/color_pallet.ts @@ -8,5 +8,6 @@ export const AccentColor = { blackgray: "#333533", darkblue: "#002E59", blue: "#00447D", + skyblue: "#00BFFF", yellow: "#FFD60A", }; diff --git a/src/app_modules/component_global/component_layout_tamplate.tsx b/src/app_modules/component_global/component_layout_tamplate.tsx index 627b36c3..135d2079 100644 --- a/src/app_modules/component_global/component_layout_tamplate.tsx +++ b/src/app_modules/component_global/component_layout_tamplate.tsx @@ -1,21 +1,9 @@ "use client"; -import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; -import { RouterUserSearch } from "@/app/lib/router_hipmi/router_user_search"; import { Box, - Center, - Title, - SimpleGrid, - Loader, - Stack, - ActionIcon, - Avatar, - Text, + Stack } from "@mantine/core"; -import { IconUserSearch, IconUserCircle } from "@tabler/icons-react"; -import router from "next/router"; -import { ComponentGlobal_NotifikasiPeringatan } from "./notif_global/notifikasi_peringatan"; export default function AppComponentGlobal_LayoutTamplate({ children, @@ -44,7 +32,7 @@ export default function AppComponentGlobal_LayoutTamplate({ {/* Children */} - + {children} {footer ? ( diff --git a/src/app_modules/component_global/loading_page_v2.tsx b/src/app_modules/component_global/loading_page_v2.tsx index a36ab160..a2d24ec2 100644 --- a/src/app_modules/component_global/loading_page_v2.tsx +++ b/src/app_modules/component_global/loading_page_v2.tsx @@ -47,8 +47,8 @@ export default function ComponentGlobal_V2_LoadingPage() { <> diff --git a/src/app_modules/component_global/ui/ui_header_tamplate.tsx b/src/app_modules/component_global/ui/ui_header_tamplate.tsx new file mode 100644 index 00000000..22e2f794 --- /dev/null +++ b/src/app_modules/component_global/ui/ui_header_tamplate.tsx @@ -0,0 +1,89 @@ +"use client"; + +import { + Header, + Group, + ActionIcon, + Text, + Title, + Box, + Loader, +} from "@mantine/core"; +import { IconArrowLeft, IconChevronLeft } from "@tabler/icons-react"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; +import { AccentColor, MainColor } from "../color/color_pallet"; + +export default function ComponentGlobal_UI_HeaderTamplate({ + title, + // left button + hideButtonLeft, + iconLeft, + routerLeft, + // right button + iconRight, + routerRight, +}: { + title: string; + // left button + hideButtonLeft?: boolean; + iconLeft?: any; + routerLeft?: any; + // right button + iconRight?: any; + routerRight?: any; +}) { + const router = useRouter(); + const [isLoading, setIsLoading] = useState(false); + const [isRightLoading, setRightLoading] = useState(false); + + return ( + <> +
+ + { + setIsLoading(true); + routerLeft === undefined + ? router.back() + : router.push(routerLeft); + }} + > + {isLoading ? : iconLeft ? iconLeft : } + + + {title} + + + {iconRight === undefined ? ( + + ) : routerRight === undefined ? ( + {iconRight} + ) : ( + { + setRightLoading(true); + router.push(routerRight); + }} + > + {iconRight} + + )} + +
+ + ); +} diff --git a/src/app_modules/component_global/ui/ui_layout_tamplate.tsx b/src/app_modules/component_global/ui/ui_layout_tamplate.tsx new file mode 100644 index 00000000..14cc3dd5 --- /dev/null +++ b/src/app_modules/component_global/ui/ui_layout_tamplate.tsx @@ -0,0 +1,77 @@ +"use client"; + +import { BackgroundImage, Box, Center, ScrollArea } from "@mantine/core"; +import { AccentColor, MainColor } from "../color/color_pallet"; +import ComponentGlobal_HeaderTamplate from "../header_tamplate"; +import ComponentGlobal_UI_HeaderTamplate from "./ui_header_tamplate"; +import { RouterHome } from "@/app/lib/router_hipmi/router_home"; + +export default function ComponentGlobal_UI_LayoutTamplate({ + children, + header, + footer, +}: { + children: React.ReactNode; + header?: React.ReactNode; + footer?: React.ReactNode; +}) { + return ( + <> + + {/* Header */} + {header ? ( + + {header} + + ) : ( + "" + )} + + {/* Children */} + + + {/* {Array.from({ length: 100 }).map((e, i) => ( + + {i + 1} + + ))} */} + {children} + + + + {/* Footer */} + {footer ? ( + + {footer} + + ) : ( + "" + )} + + + ); +} diff --git a/src/app_modules/forum/component/beranda/beranda_card.tsx b/src/app_modules/forum/component/beranda/beranda_card.tsx deleted file mode 100644 index d0c4d57d..00000000 --- a/src/app_modules/forum/component/beranda/beranda_card.tsx +++ /dev/null @@ -1,99 +0,0 @@ -"use client"; - -import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; -import { Stack, Card, Group, ActionIcon, Divider, Text } from "@mantine/core"; -import { IconMessageCircle, IconMessageCircleOff } from "@tabler/icons-react"; - - - -import { useState } from "react"; -import { useShallowEffect } from "@mantine/hooks"; -import { useRouter } from "next/navigation"; -import { useAtom } from "jotai"; - - -import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; -import { IconMessageCircleX } from "@tabler/icons-react"; -import { MODEL_FORUM_POSTING } from "../../model/interface"; -import ComponentForum_BerandaAuthorNameOnHeader from "./beranda_author_header"; - -export default function ComponentForum_BerandaCardView({ - data, - setData, - setLoadingKomen, - setLoadingDetail, - userLoginId, -}: { - data: MODEL_FORUM_POSTING[]; - setData: any; - setLoadingKomen: any; - setLoadingDetail: any; - userLoginId: any; -}) { - const router = useRouter(); - return ( - <> - - {data.map((e, i) => ( - - - - - - { - setLoadingDetail(true); - router.push(RouterForum.main_detail + e.id); - }} - > - -
- - - - - - - { - (e?.ForumMaster_StatusPosting.id as any) === 1 - ? (router.push(RouterForum.komentar + e?.id), - setLoadingKomen(true)) - : router.push(RouterForum.main_detail + e?.id); - }} - > - {(e?.ForumMaster_StatusPosting?.id as any) === 1 ? ( - - ) : ( - - )} - - - {/* */} - - {e?._count} - - - - - - ))} - - - ); -} diff --git a/src/app_modules/forum/component/detail_component/detail_create_komentar.tsx b/src/app_modules/forum/component/detail_component/detail_create_komentar.tsx new file mode 100644 index 00000000..64e44782 --- /dev/null +++ b/src/app_modules/forum/component/detail_component/detail_create_komentar.tsx @@ -0,0 +1,119 @@ +"use client" + +import ComponentGlobal_InputCountDown from "@/app_modules/component_global/input_countdown"; +import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; +import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; +import notifikasiToUser_funCreate from "@/app_modules/notifikasi/fun/create/create_notif_to_user"; +import { Stack, Paper, Group, Button, Divider } from "@mantine/core"; +import { useState } from "react"; +import dynamic from "next/dynamic"; +const ReactQuill = dynamic( + () => { + return import("react-quill"); + }, + { ssr: false } +); +import { forum_funCreateKomentar } from "../../fun/create/fun_create_komentar"; +import { forum_funGetAllKomentarById } from "../../fun/get/get_all_komentar_by_id"; +import { MODEL_FORUM_POSTING } from "../../model/interface"; +import { useRouter } from "next/navigation"; + +export default function ComponentForum_DetailCreateKomentar({ + postingId, + onSetKomentar, + data, + userLoginId, +}: { + postingId: string; + onSetKomentar: (val: any) => void; + data: MODEL_FORUM_POSTING; + userLoginId: string; +}) { + const router = useRouter(); + const [value, setValue] = useState(""); + const [loading, setLoading] = useState(false); + const [isEmpty, setIsEmpty] = useState(false); + + async function onComment() { + if (value.length > 500) { + return null; + } + + const createComment = await forum_funCreateKomentar(postingId, value); + if (createComment.status === 201) { + const loadKomentar = await forum_funGetAllKomentarById(data.id); + onSetKomentar(loadKomentar); + + setValue(""); + setIsEmpty(true); + ComponentGlobal_NotifikasiBerhasil(createComment.message, 2000); + + if (userLoginId !== data.Author.id) { + const dataNotif = { + appId: data.id, + userId: data.authorId, + pesan: value, + kategoriApp: "FORUM", + title: "Komentar baru", + }; + + const createNotifikasi = await notifikasiToUser_funCreate({ + data: dataNotif as any, + }); + + if (createNotifikasi.status === 201) { + mqtt_client.publish( + "USER", + JSON.stringify({ + userId: dataNotif.userId, + count: 1, + }) + ); + } + } + } else { + ComponentGlobal_NotifikasiGagal(createComment.message); + } + } + + return ( + <> + + + { + setValue(val); + }} + /> + + + + + + + + + + ); +} \ No newline at end of file diff --git a/src/app_modules/forum/component/detail_component/detail_list_komentar.tsx b/src/app_modules/forum/component/detail_component/detail_list_komentar.tsx new file mode 100644 index 00000000..c2b8eeeb --- /dev/null +++ b/src/app_modules/forum/component/detail_component/detail_list_komentar.tsx @@ -0,0 +1,82 @@ +"use client" + +import { Stack, Center, Box, Card, Spoiler, Divider, Text } from "@mantine/core"; +import _ from "lodash"; +import { MODEL_FORUM_KOMENTAR } from "../../model/interface"; +import ComponentForum_KomentarAuthorNameOnHeader from "../komentar_component/komentar_author_header_name"; + +export default function ComponentForum_ListKomentarView({ + listKomentar, + setKomentar, + postingId, + userLoginId, +}: { + listKomentar: MODEL_FORUM_KOMENTAR[]; + setKomentar: any; + postingId: string; + userLoginId: string; +}) { + return ( + <> + + {_.isEmpty(listKomentar) ? ( +
+ + Belum ada komentar + +
+ ) : ( + +
+ + {" "} + Komentar + +
+ {listKomentar.map((e, i) => ( + + + + + + + + {e.komentar ? ( + +
+ + ) : ( + "" + )} + + + + + + + + + + ))} + + )} + + + ); +} \ No newline at end of file diff --git a/src/app_modules/forum/component/detail_component/detail_view.tsx b/src/app_modules/forum/component/detail_component/detail_view.tsx new file mode 100644 index 00000000..09776292 --- /dev/null +++ b/src/app_modules/forum/component/detail_component/detail_view.tsx @@ -0,0 +1,81 @@ +"use client"; + +import { Card, Stack, Group, Text } from "@mantine/core"; +import { IconMessageCircle, IconMessageCircleX } from "@tabler/icons-react"; +import { MODEL_FORUM_POSTING } from "../../model/interface"; +import ComponentForum_DetailHeader from "./detail_header"; + +export default function ComponentForum_DetailForumView({ + data, + totalKomentar, + userLoginId, + onLoadData, +}: { + data: MODEL_FORUM_POSTING; + totalKomentar: number; + userLoginId: string; + onLoadData: (val: any) => void; +}) { + return ( + <> + + {/*
{JSON.stringify(data, null, 2)}
*/} + + {/* HEADER */} + + { + onLoadData(val); + }} + /> + + + {/* CONTENT */} + + + + {data?.diskusi ? ( +
+ ) : ( + "" + )} + + + + + {/* FOOTER */} + + + + + {(data?.ForumMaster_StatusPosting?.id as any) === 1 ? ( + + ) : ( + + )} + {totalKomentar} + + + + {new Date(data?.createdAt).toLocaleTimeString()} + {/* {new Intl.RelativeTimeFormat("id", {style: "short"}).format(-1,"day")} */} + + + {data?.createdAt + ? new Date(data?.createdAt).toLocaleDateString(["id-ID"], { + dateStyle: "medium", + }) + : new Date().toLocaleDateString(["id-ID"], { + dateStyle: "medium", + })} + + + + + + + + ); +} diff --git a/src/app_modules/forum/component/beranda/beranda_author_header.tsx b/src/app_modules/forum/component/forumku_component/forumku_header.tsx similarity index 52% rename from src/app_modules/forum/component/beranda/beranda_author_header.tsx rename to src/app_modules/forum/component/forumku_component/forumku_header.tsx index 77ddba69..89783932 100644 --- a/src/app_modules/forum/component/beranda/beranda_author_header.tsx +++ b/src/app_modules/forum/component/forumku_component/forumku_header.tsx @@ -1,79 +1,48 @@ "use client"; -import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; -import { - Stack, - Grid, - Avatar, - Divider, - Text, - Group, - Badge, - Loader, -} from "@mantine/core"; -import { useRouter } from "next/navigation"; -import moment from "moment"; -import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; -import { - IconCircleFilled, - IconDots, - IconEdit, - IconFlag3, - IconMessageCircle, - IconTrash, -} from "@tabler/icons-react"; +import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; +import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; +import { Avatar, Badge, Grid, Group, Loader, Stack, Text } from "@mantine/core"; import { IconCircle } from "@tabler/icons-react"; -import { IoIosMore } from "react-icons/io"; -import { useDisclosure } from "@mantine/hooks"; +import { useRouter } from "next/navigation"; import { useState } from "react"; -import ComponentForum_PostingButtonMore from "../more_button/posting_button_more"; -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; -import { data } from "autoprefixer"; -import ComponentForum_BerandaButtonMore from "./beranda_button_more"; +import { MODEL_FORUM_POSTING } from "../../model/interface"; +import ComponentForum_ForumkuMoreButton from "./forumku_more_button"; -export default function ComponentForum_BerandaAuthorNameOnHeader({ - authorId, - postingId, - imagesId, - authorName, - tglPublish, - isPembatas, + +export default function ComponentForum_ForumkuHeaderCard({ + data, isMoreButton, - statusId, userLoginId, - setData, + onLoadData, + allData, }: { - authorId?: string; - postingId?: string; - imagesId?: string; - authorName?: string; - tglPublish?: Date; - isPembatas?: boolean; - isMoreButton?: boolean; - statusId?: string; + data: MODEL_FORUM_POSTING; + isMoreButton: boolean; userLoginId: string; - setData?: any; + onLoadData: (val: any) => void; + allData: any[]; }) { const router = useRouter(); - const [loading, setLoading] = useState(false); + const [isLoading, setIsLoading] = useState(false); return ( <> - + { - if (authorId) { - setLoading(true); - router.push(RouterForum.forumku + authorId); + if (data.Author.id) { + setIsLoading(true); + router.push(RouterForum.forumku + data.Author.id); } else { ComponentGlobal_NotifikasiPeringatan("Id tidak ditemukan"); } }} > - {loading ? ( + {isLoading ? ( ) : ( @@ -91,23 +61,28 @@ export default function ComponentForum_BerandaAuthorNameOnHeader({ - + - - {authorName ? authorName : "Nama author "} + + {data.Author.username + ? data.Author.username + : "Nama author "} + - - {(statusId as any) === 1 ? "Open" : "Close"} - + {data?.ForumMaster_StatusPosting.status} @@ -115,9 +90,9 @@ export default function ComponentForum_BerandaAuthorNameOnHeader({ - - {tglPublish - ? tglPublish.toLocaleDateString(["id-ID"], { + + {data.createdAt !== undefined && data?.createdAt + ? new Date(data?.createdAt).toLocaleDateString(["id-ID"], { day: "numeric", month: "short", }) @@ -125,9 +100,10 @@ export default function ComponentForum_BerandaAuthorNameOnHeader({ day: "numeric", month: "short", })} + @@ -135,12 +111,13 @@ export default function ComponentForum_BerandaAuthorNameOnHeader({ {isMoreButton ? ( - ) : ( @@ -149,7 +126,7 @@ export default function ComponentForum_BerandaAuthorNameOnHeader({ - {isPembatas ? : ""} + {/* {isPembatas ? : ""} */} ); diff --git a/src/app_modules/forum/component/beranda/beranda_button_more.tsx b/src/app_modules/forum/component/forumku_component/forumku_more_button.tsx similarity index 66% rename from src/app_modules/forum/component/beranda/beranda_button_more.tsx rename to src/app_modules/forum/component/forumku_component/forumku_more_button.tsx index 2764b5ef..7d856de2 100644 --- a/src/app_modules/forum/component/beranda/beranda_button_more.tsx +++ b/src/app_modules/forum/component/forumku_component/forumku_more_button.tsx @@ -3,55 +3,50 @@ import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; import { - Drawer, - Stack, - Grid, - Button, - Modal, - Title, - Group, ActionIcon, - Text, - Box, - Center, + Button, + Drawer, + Grid, + Group, Loader, + Modal, + Stack, + Text, + Title, } from "@mantine/core"; -import { useDisclosure, useShallowEffect } from "@mantine/hooks"; +import { useDisclosure } from "@mantine/hooks"; import { - IconTrash, + IconDots, IconEdit, IconFlag3, - IconDots, - IconSquareRoundedX, IconSquareCheck, + IconSquareRoundedX, + IconTrash, } from "@tabler/icons-react"; import { useRouter } from "next/navigation"; import { useState } from "react"; -import { createStyles } from "@mantine/core"; -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; -import { useAtom } from "jotai"; -import { gs_forum_loading_edit_posting } from "../../global_state"; -import ComponentForum_LoadingDrawer from "../loading_drawer"; -import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token"; -import { forum_funDeletePostingById } from "../../fun/delete/fun_delete_posting_by_id"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; +import mqtt_client from "@/util/mqtt_client"; +import _ from "lodash"; +import { forum_funDeletePostingById } from "../../fun/delete/fun_delete_posting_by_id"; import { forum_funEditStatusPostingById } from "../../fun/edit/fun_edit_status_posting_by_id"; -import { forum_getListAllPosting } from "../../fun/get/get_list_all_posting"; -import { forum_getListPostingByAuhtorId } from "../../fun/get/get_list_posting_by_author_id"; +import { MODEL_FORUM_POSTING } from "../../model/interface"; -export default function ComponentForum_BerandaButtonMore({ +export default function ComponentForum_ForumkuMoreButton({ authorId, postingId, statusId, userLoginId, - setData, + onLoadData, + allData, }: { authorId: any; postingId?: any; statusId?: any; userLoginId: any; - setData: any; + onLoadData: (val: any) => void; + allData: any[]; }) { const router = useRouter(); @@ -177,8 +172,12 @@ export default function ComponentForum_BerandaButtonMore({ { + onLoadData(val); + }} + allData={allData} /> + {/*
{JSON.stringify(allData, null, 2)}
*/} { + onLoadData(val); + }} userLoginId={userLoginId} authorId={authorId} + allData={allData} /> - open()}> + open()}> @@ -207,11 +209,13 @@ export default function ComponentForum_BerandaButtonMore({ function ButtonDelete({ postingId, setOpenDel, - setData, + onLoadData, + allData, }: { postingId?: string; setOpenDel: any; - setData: any; + onLoadData: (val: any) => void; + allData: MODEL_FORUM_POSTING[]; }) { const [loading, setLoading] = useState(false); @@ -219,14 +223,22 @@ function ButtonDelete({ setOpenDel(false); await forum_funDeletePostingById(postingId as any).then(async (res) => { if (res.status === 200) { - // ComponentGlobal_NotifikasiBerhasil(`Postingan Terhapus`, 2000); + ComponentGlobal_NotifikasiBerhasil(`Postingan Terhapus`, 2000); setLoading(true); - const listForum = await forum_getListAllPosting(); - setData(listForum); - return null; + + const cloneData = _.clone(allData); + const hapusData = cloneData.filter((e) => e.id !== postingId); + + onLoadData(hapusData); + + mqtt_client.publish( + "Forum_hapus_data", + JSON.stringify({ + data: hapusData, + }) + ); } else { - // ComponentGlobal_NotifikasiGagal(res.message); - return null; + ComponentGlobal_NotifikasiGagal(res.message); } }); } @@ -259,16 +271,18 @@ function ButtonStatus({ postingId, setOpenStatus, statusId, - setData, + onLoadData, userLoginId, authorId, + allData, }: { postingId?: string; setOpenStatus: any; statusId?: any; - setData: any; + onLoadData: (val: any) => void; userLoginId: string; authorId: string; + allData: MODEL_FORUM_POSTING[]; }) { const [loading, setLoading] = useState(false); @@ -280,48 +294,116 @@ function ButtonStatus({ 2 ); if (upateStatusClose.status === 200) { - const loadData = await forum_getListAllPosting(); - // ComponentGlobal_NotifikasiBerhasil(`Forum Ditutup`, 2000); - setData(loadData); + ComponentGlobal_NotifikasiBerhasil(`Forum Ditutup`, 2000); setLoading(true); - return null; - } else { - // ComponentGlobal_NotifikasiGagal(upateStatusClose.message); - return null; - } - // await forum_funEditStatusPostingById(postingId as any, 2).then( - // async (res) => { - // if (res.status === 200) { - // await forum_getListAllPosting().then((val) => { - // setData(val as any); - // ComponentGlobal_NotifikasiBerhasil(`Forum Ditutup`, 2000); - // setLoading(true); - // }); - // } else { - // ComponentGlobal_NotifikasiGagal(res.message); - // } - // } - // ); + const cloneData = _.clone(allData); + const loadData = cloneData.map( + (e) => ( + e.id === postingId, + { + ...e, + ForumMaster_StatusPosting: { + id: e.id === postingId ? 2 : e.ForumMaster_StatusPosting.id, + status: + e.id === postingId + ? "Close" + : e.ForumMaster_StatusPosting.status, + }, + } + ) + ); + onLoadData(loadData); + + // + mqtt_client.publish( + "Forum_ganti_status", + JSON.stringify({ + id: postingId, + data: loadData, + }) + ); + + const findData = cloneData.find((val) => val.id === postingId); + const updateDetail = { + ...findData, + ForumMaster_StatusPosting: { + id: 2, + status: "Close", + }, + }; + + mqtt_client.publish( + "Forum_detail_ganti_status", + JSON.stringify({ + id: postingId, + data: updateDetail.ForumMaster_StatusPosting, + }) + ); + } else { + ComponentGlobal_NotifikasiGagal(upateStatusClose.message); + } } async function onBukaForum() { setOpenStatus(false); - await forum_funEditStatusPostingById(postingId as any, 1).then( - async (res) => { - if (res.status === 200) { - await forum_getListAllPosting().then((val) => { - setData(val as any); - - ComponentGlobal_NotifikasiBerhasil(`Forum Dibuka`, 2000); - setLoading(true); - }); - } else { - ComponentGlobal_NotifikasiGagal(res.message); - } - } + const updateStatusOpen = await forum_funEditStatusPostingById( + postingId as any, + 1 ); + if (updateStatusOpen.status === 200) { + ComponentGlobal_NotifikasiBerhasil(`Forum Dibuka`, 2000); + setLoading(true); + + const cloneData = _.clone(allData); + const loadData = cloneData.map( + (e) => ( + e.id === postingId, + { + ...e, + ForumMaster_StatusPosting: { + id: e.id === postingId ? 1 : e.ForumMaster_StatusPosting.id, + status: + e.id === postingId + ? "Open" + : e.ForumMaster_StatusPosting.status, + }, + } + ) + ); + + mqtt_client.publish( + "Forum_ganti_status", + JSON.stringify({ + id: postingId, + data: loadData, + }) + ); + + onLoadData(loadData); + + const findData = cloneData.find((val) => val.id === postingId); + const updateDetail = { + ...findData, + ForumMaster_StatusPosting: { + id: 1, + status: "Open", + }, + }; + + console.log(updateDetail.ForumMaster_StatusPosting); + + mqtt_client.publish( + "Forum_detail_ganti_status", + JSON.stringify({ + id: postingId, + data: updateDetail.ForumMaster_StatusPosting, + }) + ); + } else { + ComponentGlobal_NotifikasiGagal(updateStatusOpen.message); + } } return ( diff --git a/src/app_modules/forum/component/forumku_component/forumku_view.tsx b/src/app_modules/forum/component/forumku_component/forumku_view.tsx new file mode 100644 index 00000000..ed4be128 --- /dev/null +++ b/src/app_modules/forum/component/forumku_component/forumku_view.tsx @@ -0,0 +1,88 @@ +"use client"; + +import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; +import { ActionIcon, Card, Divider, Group, Stack, Text } from "@mantine/core"; +import { IconMessageCircle, IconMessageCircleX } from "@tabler/icons-react"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; +import { MODEL_FORUM_POSTING } from "../../model/interface"; +import ComponentForum_ForumkuHeaderCard from "./forumku_header"; +import { AccentColor, MainColor } from "@/app_modules/component_global/color/color_pallet"; + + +export default function ComponentForum_ForumkuMainCardView({ + data, + userLoginId, + onLoadData, + allData, +}: { + data: MODEL_FORUM_POSTING; + userLoginId: string; + onLoadData: (val: any) => void; + allData: any[]; +}) { + const router = useRouter(); + const [loadingKomen, setLoadingKomen] = useState(false); + const [loadingDetail, setLoadingDetail] = useState(false); + + const [postingId, setPostingId] = useState(""); + + return ( + <> + {/*
{JSON.stringify(data, null,2)}
*/} + + + + + + { + router.push(RouterForum.main_detail + data?.id); + }} + > + +
+ + + + + + + + {(data?.ForumMaster_StatusPosting?.id as any) === 1 ? ( + + ) : ( + + )} + + + {/* */} + + {data?.Forum_Komentar.length} + + + + + + ); +} diff --git a/src/app_modules/forum/component/header/komentar_author_header_name.tsx b/src/app_modules/forum/component/komentar_component/komentar_author_header_name.tsx similarity index 97% rename from src/app_modules/forum/component/header/komentar_author_header_name.tsx rename to src/app_modules/forum/component/komentar_component/komentar_author_header_name.tsx index afc468a1..ba5f877b 100644 --- a/src/app_modules/forum/component/header/komentar_author_header_name.tsx +++ b/src/app_modules/forum/component/komentar_component/komentar_author_header_name.tsx @@ -19,7 +19,7 @@ import { IoIosMore } from "react-icons/io"; import { useDisclosure } from "@mantine/hooks"; import { useState } from "react"; import ComponentForum_PostingButtonMore from "../more_button/posting_button_more"; -import ComponentForum_KomentarButtonMore from "../more_button/komentar_button_more"; +import ComponentForum_KomentarButtonMore from "./komentar_button_more"; export default function ComponentForum_KomentarAuthorNameOnHeader({ userId, diff --git a/src/app_modules/forum/component/more_button/komentar_button_more.tsx b/src/app_modules/forum/component/komentar_component/komentar_button_more.tsx similarity index 97% rename from src/app_modules/forum/component/more_button/komentar_button_more.tsx rename to src/app_modules/forum/component/komentar_component/komentar_button_more.tsx index cf19e190..225e2ffd 100644 --- a/src/app_modules/forum/component/more_button/komentar_button_more.tsx +++ b/src/app_modules/forum/component/komentar_component/komentar_button_more.tsx @@ -30,7 +30,7 @@ import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token"; import { forum_funDeletePostingById } from "../../fun/delete/fun_delete_posting_by_id"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { forum_funDeleteKomentarById } from "../../fun/delete/fun_delete_komentar_by_id"; -import { forum_getKomentarById } from "../../fun/get/get_komentar_by_id"; +import { forum_funGetAllKomentarById } from "../../fun/get/get_all_komentar_by_id"; export default function ComponentForum_KomentarButtonMore({ userId, @@ -178,7 +178,7 @@ function ButtonDelete({ async function onDelete() { await forum_funDeleteKomentarById(komentarId as any).then(async (res) => { if (res.status === 200) { - await forum_getKomentarById(postingId as any).then((val) => { + await forum_funGetAllKomentarById(postingId as any).then((val) => { setKomentar(val); setOpenDel(false); setLoading(true); diff --git a/src/app_modules/forum/component/main_component/card_header.tsx b/src/app_modules/forum/component/main_component/card_header.tsx index 23683649..c82ae3be 100644 --- a/src/app_modules/forum/component/main_component/card_header.tsx +++ b/src/app_modules/forum/component/main_component/card_header.tsx @@ -1,28 +1,24 @@ "use client"; -import loading from "@/app/dev/home/loading"; import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; import { - Stack, - Loader, Avatar, Badge, - Group, - Divider, Grid, - Text, + Group, + Loader, + Stack, + Text } from "@mantine/core"; import { IconCircle } from "@tabler/icons-react"; -import ComponentForum_BerandaButtonMore from "../beranda/beranda_button_more"; -import { MODEL_USER } from "@/app_modules/home/model/interface"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { MODEL_FORUM_POSTING } from "../../model/interface"; -import ComponentForum_V2_CardMoreButton from "./card_more_button"; +import ComponentForum_BerandaMoreButton from "./card_more_button"; -export default function ComponentForum_V2_HeaderCard({ +export default function ComponentForum_BerandaHeaderCard({ data, isMoreButton, userLoginId, @@ -58,7 +54,11 @@ export default function ComponentForum_V2_HeaderCard({ ) : ( - + {data.Author.username ? data.Author.username : "Nama author "} @@ -86,7 +86,7 @@ export default function ComponentForum_V2_HeaderCard({ - + {data.createdAt !== undefined && data?.createdAt ? new Date(data?.createdAt).toLocaleDateString(["id-ID"], { day: "numeric", @@ -114,7 +114,7 @@ export default function ComponentForum_V2_HeaderCard({ @@ -122,7 +122,7 @@ export default function ComponentForum_V2_HeaderCard({ {isMoreButton ? ( - ; - return ( <> + { + setLoadingEdit(true); + router.push(RouterForum.edit_posting + postingId); + }} + > + + + + + + Edit posting{" "} + {loadingEdit ? : ""} + + + { close(); @@ -112,23 +136,6 @@ export default function ComponentForum_V2_CardMoreButton({ Hapus - - { - setLoadingEdit(true); - router.push(RouterForum.edit_posting + postingId); - }} - > - - - - - - Edit posting{" "} - {loadingEdit ? : ""} - - - )} @@ -199,7 +206,7 @@ export default function ComponentForum_V2_CardMoreButton({ /> - open()}> + open()}> @@ -237,7 +244,6 @@ function ButtonDelete({ data: hapusData, }) ); - } else { ComponentGlobal_NotifikasiGagal(res.message); } diff --git a/src/app_modules/forum/component/main_component/card_view.tsx b/src/app_modules/forum/component/main_component/card_view.tsx index 109801b0..3cdae028 100644 --- a/src/app_modules/forum/component/main_component/card_view.tsx +++ b/src/app_modules/forum/component/main_component/card_view.tsx @@ -6,9 +6,13 @@ import { IconMessageCircle, IconMessageCircleX } from "@tabler/icons-react"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { MODEL_FORUM_POSTING } from "../../model/interface"; -import ComponentForum_V2_HeaderCard from "./card_header"; +import ComponentForum_BerandaHeaderCard from "./card_header"; +import { + AccentColor, + MainColor, +} from "@/app_modules/component_global/color/color_pallet"; -export default function ComponentForum_V2_MainCardView({ +export default function ComponentForum_BerandaCardView({ data, userLoginId, onLoadData, @@ -27,10 +31,18 @@ export default function ComponentForum_V2_MainCardView({ return ( <> - {/*
{JSON.stringify(data, null,2)}
*/} - + {/*
{JSON.stringify(data, null,2)}
*/} + - - +
@@ -58,16 +70,9 @@ export default function ComponentForum_V2_MainCardView({ loading={loadingKomen && data?.id === postingId ? true : false} variant="transparent" sx={{ zIndex: 1 }} - // onClick={() => { - // setPostingId(data?.id), - // (data?.ForumMaster_StatusPosting.id as any) === 1 - // ? (router.push(RouterForum.komentar + data?.id), - // setLoadingKomen(true)) - // : router.push(RouterForum.main_detail + data?.id); - // }} > {(data?.ForumMaster_StatusPosting?.id as any) === 1 ? ( - + ) : ( )} @@ -75,9 +80,8 @@ export default function ComponentForum_V2_MainCardView({ {/* */} - {data?.Forum_Komentar.length} + {data?.Forum_Komentar.length} - diff --git a/src/app_modules/forum/component/more_button/posting_button_more.tsx b/src/app_modules/forum/component/more_button/posting_button_more.tsx index a43a40c6..e319b6ce 100644 --- a/src/app_modules/forum/component/more_button/posting_button_more.tsx +++ b/src/app_modules/forum/component/more_button/posting_button_more.tsx @@ -38,7 +38,7 @@ import { forum_funDeletePostingById } from "../../fun/delete/fun_delete_posting_ import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { forum_funEditStatusPostingById } from "../../fun/edit/fun_edit_status_posting_by_id"; import { forum_getListAllPosting } from "../../fun/get/get_list_all_posting"; -import { forum_getListPostingByAuhtorId } from "../../fun/get/get_list_posting_by_author_id"; +import { forum_getAllPostingByAuhtorId } from "../../fun/get/get_list_posting_by_author_id"; export default function ComponentForum_PostingButtonMore({ authorId, @@ -277,7 +277,7 @@ function ButtonStatus({ async (res) => { if (res.status === 200) { if (userLoginId === authorId) { - await forum_getListPostingByAuhtorId(authorId).then((val: any) => + await forum_getAllPostingByAuhtorId({authorId: authorId, page: 1}).then((val: any) => setData(val) ); } else { @@ -299,7 +299,7 @@ function ButtonStatus({ async (res) => { if (res.status === 200) { if (userLoginId === authorId) { - await forum_getListPostingByAuhtorId(authorId).then((val: any) => + await forum_getAllPostingByAuhtorId({authorId: authorId, page: 1}).then((val: any) => setData(val) ); } else { diff --git a/src/app_modules/forum/create/index.tsx b/src/app_modules/forum/create/index.tsx index c3022f64..7527041f 100644 --- a/src/app_modules/forum/create/index.tsx +++ b/src/app_modules/forum/create/index.tsx @@ -36,6 +36,10 @@ const ReactQuill = dynamic( ); import mqtt_client from "@/util/mqtt_client"; +import { + AccentColor, + MainColor, +} from "@/app_modules/component_global/color/color_pallet"; export default function Forum_Create() { const [value, setValue] = useState(""); @@ -95,8 +99,10 @@ function ButtonAction({ value }: { value: string }) { ComponentGlobal_NotifikasiBerhasil(create.message); setTimeout(() => router.back(), 1000); - mqtt_client.publish("Forum_create_new", JSON.stringify({isNewPost: true, count: 1 })); - + mqtt_client.publish( + "Forum_create_new", + JSON.stringify({ isNewPost: true, count: 1 }) + ); } else { ComponentGlobal_NotifikasiGagal(create.message); } @@ -106,7 +112,12 @@ function ButtonAction({ value }: { value: string }) { - - - - - ); -} - -function KomentarView({ - listKomentar, - setKomentar, - postingId, - userLoginId, -}: { - listKomentar: MODEL_FORUM_KOMENTAR[]; - setKomentar: any; - postingId: string; - userLoginId: string; -}) { - return ( - <> - - {_.isEmpty(listKomentar) ? ( -
- - Belum ada komentar - -
- ) : ( - -
- - {" "} - Komentar - -
- {listKomentar.map((e, i) => ( - - - - - - - - {e.komentar ? ( - -
- - ) : ( - "" - )} - - - - - - - - - - ))} - - )} - - - ); -} diff --git a/src/app_modules/forum/detail/main_detail.tsx b/src/app_modules/forum/detail/main_detail.tsx new file mode 100644 index 00000000..504b24c8 --- /dev/null +++ b/src/app_modules/forum/detail/main_detail.tsx @@ -0,0 +1,106 @@ +"use client"; + +import { + Stack +} from "@mantine/core"; +import _ from "lodash"; +import { MODEL_FORUM_KOMENTAR, MODEL_FORUM_POSTING } from "../model/interface"; + +import mqtt_client from "@/util/mqtt_client"; +import { useShallowEffect } from "@mantine/hooks"; +import { useState } from "react"; +import "react-quill/dist/quill.bubble.css"; +import ComponentForum_DetailCreateKomentar from "../component/detail_component/detail_create_komentar"; +import ComponentForum_ListKomentarView from "../component/detail_component/detail_list_komentar"; +import ComponentForum_DetailForumView from "../component/detail_component/detail_view"; + + +export default function Forum_MainDetail({ + dataPosting, + listKomentar, + userLoginId, +}: { + dataPosting: MODEL_FORUM_POSTING; + listKomentar: MODEL_FORUM_KOMENTAR[]; + userLoginId: string; +}) { + const [data, setData] = useState(dataPosting); + const [komentar, setKomentar] = useState(listKomentar); + + // useShallowEffect(() => { + // onLoadKomentar({ + // onLoad(val) { + // setKomentar(val); + // }, + // }); + // }, [setKomentar]); + + // async function onLoadKomentar({ onLoad }: { onLoad: (val: any) => void }) { + // const loadKomentar = await forum_getKomentarById(data.id); + // onLoad(loadKomentar); + // } + + useShallowEffect(() => { + mqtt_client.subscribe("Forum_detail_ganti_status"); + + mqtt_client.on("message", (topic: any, message: any) => { + const newData = JSON.parse(message.toString()); + if (newData.id === data.id) { + const cloneData = _.clone(data); + + // console.log(newData.data); + const updateData = { + ...cloneData, + ForumMaster_StatusPosting: { + id: newData.data.id, + status: newData.data.status, + }, + }; + + setData(updateData as any); + } + }); + }, [data]); + + return ( + <> + + { + setData(val); + }} + /> + + {(data?.ForumMaster_StatusPosting?.id as any) === 1 ? ( + { + setKomentar(val); + }} + data={data} + userLoginId={userLoginId} + /> + ) : ( + "" + )} + + + + + + ); +} + + + + + + diff --git a/src/app_modules/forum/edit/posting/index.tsx b/src/app_modules/forum/edit/posting/index.tsx index 65b67a2d..cf52fdfc 100644 --- a/src/app_modules/forum/edit/posting/index.tsx +++ b/src/app_modules/forum/edit/posting/index.tsx @@ -26,6 +26,10 @@ import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_glob import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; import ComponentGlobal_InputCountDown from "@/app_modules/component_global/input_countdown"; +import { + AccentColor, + MainColor, +} from "@/app_modules/component_global/color/color_pallet"; const ReactQuill = dynamic( () => { return import("react-quill"); @@ -114,6 +118,17 @@ function ButtonAction({ return ( <> + + + + + ); +} diff --git a/src/app_modules/forum/forumku/index.tsx b/src/app_modules/forum/forumku/index.tsx index e246717e..065586dd 100644 --- a/src/app_modules/forum/forumku/index.tsx +++ b/src/app_modules/forum/forumku/index.tsx @@ -1,28 +1,28 @@ "use client"; import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; -import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; import { MODEL_USER } from "@/app_modules/home/model/interface"; import { ActionIcon, Affix, - Avatar, - Button, Center, - Divider, - Grid, + Loader, Stack, Text, rem, } from "@mantine/core"; import { useWindowScroll } from "@mantine/hooks"; -import { IconCircleFilled, IconPencilPlus } from "@tabler/icons-react"; +import { IconPencilPlus, IconSearchOff } from "@tabler/icons-react"; import _ from "lodash"; import { useRouter } from "next/navigation"; import { useState } from "react"; -import ComponentForum_MainCardView from "../component/main_card_view"; import { MODEL_FORUM_POSTING } from "../model/interface"; +import ComponentForum_ViewForumProfile from "./forum_profile"; +import ComponentForum_PostinganPribadi from "./postingan_pribadi"; +import { ScrollOnly } from "next-scroll-loader"; +import { forum_getAllPostingByAuhtorId } from "../fun/get/get_list_posting_by_author_id"; +import ComponentForum_ForumkuMainCardView from "../component/forumku_component/forumku_view"; +import { AccentColor } from "@/app_modules/component_global/color/color_pallet"; export default function Forum_Forumku({ auhtorSelectedData, @@ -36,6 +36,9 @@ export default function Forum_Forumku({ userLoginId: string; }) { const router = useRouter(); + const [data, setData] = useState(dataPosting); + const [activePage, setActivePage] = useState(1); + const [scroll, scrollTo] = useWindowScroll(); const [loadingCreate, setLoadingCreate] = useState(false); @@ -44,21 +47,25 @@ export default function Forum_Forumku({ {userLoginId === auhtorSelectedData.id ? ( 0 ? 0.5 : ""} style={{ transition: "0.5s", + border: `1px solid ${AccentColor.skyblue}`, }} size={"xl"} radius={"xl"} variant="transparent" - bg={"blue"} + bg={AccentColor.blue} onClick={() => { setLoadingCreate(true); router.push(RouterForum.create); }} > - + {loadingCreate ? ( + + ) : ( + + )} ) : ( @@ -66,171 +73,54 @@ export default function Forum_Forumku({ )} - - {_.isEmpty(dataPosting) ? ( -
- - Belum ada posting - -
+ + {_.isEmpty(data) ? ( + + + + + Tidak ada data + + + ) : ( - + // --- Main component --- // + ( +
+ +
+ )} + data={data} + setData={setData} + moreData={async () => { + const loadData = await forum_getAllPostingByAuhtorId({ + page: activePage + 1, + authorId: auhtorSelectedData.id, + }); + setActivePage((val) => val + 1); + + return loadData; + }} + > + {(item) => ( + { + setData(val); + }} + allData={data} + /> + )} +
)}
); } - -function ForumProfile({ - auhtorSelectedData, - totalPosting, -}: { - auhtorSelectedData: MODEL_USER; - totalPosting: number; -}) { - const router = useRouter(); - const [loading, setLoading] = useState(false); - - // if (loading) return ; - - return ( - <> -
- -
- - - - - {auhtorSelectedData?.Profile?.name} - - - - - {totalPosting} Posting - - - - - @{auhtorSelectedData?.username} - {""} - - - - - - - - - - - - - - - ); -} - -function ForumPosting({ - dataPosting, - userLoginId, -}: { - dataPosting: MODEL_FORUM_POSTING[]; - userLoginId: any; -}) { - const router = useRouter(); - const [data, setData] = useState(dataPosting); - const [loadingDetail, setLoadingDetail] = useState(false); - const [loadingKomen, setLoadingKomen] = useState(false); - - if (loadingDetail) return ; - if (loadingKomen) return ; - return ( - <> - - - {/* - {dataPosting.map((e, i) => ( - - - - - { - // console.log("halaman forum"); - setLoadingDetail(true); - router.push(RouterForum.main_detail + i); - }} - > - - - Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad, - vitae. Quisquam aspernatur, eius consequatur dicta repellendus - facere vero recusandae deleniti voluptas quod architecto, - tenetur totam excepturi rem nam iusto earum. - - - - - - - { - setLoadingKomen(true); - router.push(RouterForum.komentar + i); - }} - > - - - 1 - - - - - - ))} - */} - - ); -} diff --git a/src/app_modules/forum/forumku/layout.tsx b/src/app_modules/forum/forumku/layout.tsx index a89824b6..2ea05fa3 100644 --- a/src/app_modules/forum/forumku/layout.tsx +++ b/src/app_modules/forum/forumku/layout.tsx @@ -6,6 +6,8 @@ import ComponentForum_HeaderTamplate from "../component/header/header_tamplate"; import { MODEL_USER } from "@/app_modules/home/model/interface"; import { IconX } from "@tabler/icons-react"; import AppComponentGlobal_LayoutTamplate from "@/app_modules/component_global/component_layout_tamplate"; +import ComponentGlobal_UI_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import ComponentGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; export default function LayoutForum_Forumku({ children, @@ -16,7 +18,18 @@ export default function LayoutForum_Forumku({ }) { return ( <> - } + /> + } + > + {children} + + + {/* {children} - + */} ); } diff --git a/src/app_modules/forum/forumku/postingan_pribadi.tsx b/src/app_modules/forum/forumku/postingan_pribadi.tsx new file mode 100644 index 00000000..8d654861 --- /dev/null +++ b/src/app_modules/forum/forumku/postingan_pribadi.tsx @@ -0,0 +1,85 @@ +"use client" + +import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; +import ComponentForum_MainCardView from "../component/main_card_view"; +import { MODEL_FORUM_POSTING } from "../model/interface"; +import ComponentForum_ForumkuMainCardView from "../component/forumku_component/forumku_view"; + +export default function ComponentForum_PostinganPribadi({ + dataPosting, + userLoginId, +}: { + dataPosting: MODEL_FORUM_POSTING[]; + userLoginId: any; +}) { + const router = useRouter(); + const [data, setData] = useState(dataPosting); + const [loadingDetail, setLoadingDetail] = useState(false); + const [loadingKomen, setLoadingKomen] = useState(false); + +// if (loadingDetail) return ; +// if (loadingKomen) return ; + + return ( + <> + + + {/* */} + + {/* + {dataPosting.map((e, i) => ( + + + + + { + // console.log("halaman forum"); + setLoadingDetail(true); + router.push(RouterForum.main_detail + i); + }} + > + + + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad, + vitae. Quisquam aspernatur, eius consequatur dicta repellendus + facere vero recusandae deleniti voluptas quod architecto, + tenetur totam excepturi rem nam iusto earum. + + + + + + + { + setLoadingKomen(true); + router.push(RouterForum.komentar + i); + }} + > + + + 1 + + + + + + ))} + */} + + ); +} \ No newline at end of file diff --git a/src/app_modules/forum/fun/create/fun_create_report_komentar.ts b/src/app_modules/forum/fun/create/fun_create_report_komentar.ts index 9b33e379..e775f7e4 100644 --- a/src/app_modules/forum/fun/create/fun_create_report_komentar.ts +++ b/src/app_modules/forum/fun/create/fun_create_report_komentar.ts @@ -3,27 +3,35 @@ import prisma from "@/app/lib/prisma"; import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token"; -export async function forum_funCreateReportKomentar( - komentarId: string, - value: string -) { +export async function forum_funCreateReportKomentar({ + komentarId, + kategoriId, +}: { + komentarId: string; + kategoriId: any; +}) { const authorId = await user_getOneUserId(); const cekId = await prisma.forumMaster_KategoriReport.findFirst({ where: { - title: value, + title: kategoriId, }, }); - const createReport = await prisma.forum_ReportKomentar.create({ - data: { - userId: authorId, - forumMaster_KategoriReportId: cekId?.id, - forum_KomentarId: komentarId, - }, - }); + try { + const createReport = await prisma.forum_ReportKomentar.create({ + data: { + userId: authorId, + forumMaster_KategoriReportId: cekId?.id, + forum_KomentarId: komentarId, + }, + }); + + if (!createReport) + return { status: 400, message: "Gagal menambahkan report komentar !" }; + } catch (error) { + console.log(error); + } - if (!createReport) - return { status: 400, message: "Gagal menambahkan report komentar !" }; return { status: 201, message: "Berhasil me-report komentar !" }; } diff --git a/src/app_modules/forum/fun/forum_notifikasi/fun_create_notifikasi.tsx b/src/app_modules/forum/fun/forum_notifikasi/fun_create_notifikasi.tsx new file mode 100644 index 00000000..d0219a03 --- /dev/null +++ b/src/app_modules/forum/fun/forum_notifikasi/fun_create_notifikasi.tsx @@ -0,0 +1,21 @@ +"use server"; + +import prisma from "@/app/lib/prisma"; +import { MODEL_NOTIFIKASI } from "@/app_modules/notifikasi/model/interface"; + +export default async function forum_funCreateNotifikasiToAdmin({ + data, +}: { + data: MODEL_NOTIFIKASI; +}) { + console.log(data); + + // const getAdmin = await prisma.user.findMany({ + // where: { + // active: true, + // masterUserRoleId: "2", + // }, + // }); + + return { status: 201 }; +} diff --git a/src/app_modules/forum/fun/get/get_komentar_by_id.ts b/src/app_modules/forum/fun/get/get_all_komentar_by_id.ts similarity index 89% rename from src/app_modules/forum/fun/get/get_komentar_by_id.ts rename to src/app_modules/forum/fun/get/get_all_komentar_by_id.ts index c60c6440..4e9bdf4e 100644 --- a/src/app_modules/forum/fun/get/get_komentar_by_id.ts +++ b/src/app_modules/forum/fun/get/get_all_komentar_by_id.ts @@ -2,7 +2,7 @@ import prisma from "@/app/lib/prisma"; -export async function forum_getKomentarById(postingId: string) { +export async function forum_funGetAllKomentarById(postingId: string) { const data = await prisma.forum_Komentar.findMany({ orderBy: { createdAt: "desc", diff --git a/src/app_modules/forum/fun/get/get_list_posting_by_author_id.ts b/src/app_modules/forum/fun/get/get_list_posting_by_author_id.ts index 7b4bd9de..bfbbb073 100644 --- a/src/app_modules/forum/fun/get/get_list_posting_by_author_id.ts +++ b/src/app_modules/forum/fun/get/get_list_posting_by_author_id.ts @@ -4,8 +4,19 @@ import prisma from "@/app/lib/prisma"; import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token"; import _ from "lodash"; -export async function forum_getListPostingByAuhtorId(authorId: string) { +export async function forum_getAllPostingByAuhtorId({ + authorId, + page, +}: { + authorId: string; + page: any; +}) { + const takeData = 5; + const skipData = page * takeData - takeData; + const get = await prisma.forum_Posting.findMany({ + take: takeData, + skip: skipData, orderBy: { createdAt: "desc", }, @@ -22,7 +33,13 @@ export async function forum_getListPostingByAuhtorId(authorId: string) { Author: { select: { id: true, - Profile: true, + username: true, + Profile: { + select: { + id: true, + imagesId: true, + }, + }, }, }, Forum_Komentar: { @@ -30,14 +47,20 @@ export async function forum_getListPostingByAuhtorId(authorId: string) { isActive: true, }, }, - ForumMaster_StatusPosting: true + ForumMaster_StatusPosting: { + select: { + id: true, + status: true, + }, + }, + forumMaster_StatusPostingId: true, }, }); - const data = get.map((val) => ({ - ..._.omit(val, ["Forum_Komentar"]), - _count: val.Forum_Komentar.length, - })); + // const data = get.map((val) => ({ + // ..._.omit(val, ["Forum_Komentar"]), + // _count: val.Forum_Komentar.length, + // })); - return data; + return get; } diff --git a/src/app_modules/forum/fun/get/get_one_kategori_by_id.ts b/src/app_modules/forum/fun/get/get_one_kategori_by_id.ts index 2acabf36..e32ce4c4 100644 --- a/src/app_modules/forum/fun/get/get_one_kategori_by_id.ts +++ b/src/app_modules/forum/fun/get/get_one_kategori_by_id.ts @@ -13,5 +13,5 @@ export default async function forum_getOneKategoriById({ }, }); - return cekData + return cekData; } diff --git a/src/app_modules/forum/fun/get/get_one_posting_reported_by_id.ts b/src/app_modules/forum/fun/get/get_one_posting_reported_by_id.ts new file mode 100644 index 00000000..7ea057dc --- /dev/null +++ b/src/app_modules/forum/fun/get/get_one_posting_reported_by_id.ts @@ -0,0 +1,46 @@ +"use server"; + +import prisma from "@/app/lib/prisma"; +import _ from "lodash"; + +export default async function forum_funGetOneReportedPostingById({ + postingId, +}: { + postingId: string; +}) { + const data = await prisma.forum_Posting.findFirst({ + where: { + id: postingId, + }, + select: { + id: true, + diskusi: true, + Forum_ReportPosting: { + select: { + id: true, + deskripsi: true, + forumMaster_KategoriReportId: true, + ForumMaster_KategoriReport: true, + }, + }, + }, + }); + + // console.log(data) + + const group = _.groupBy( + data?.Forum_ReportPosting, + (val) => val.ForumMaster_KategoriReport?.title + ); + const getKey = _.keys(group); + const filterGroup = getKey.map((e) => e.replace("undefined", "Lainnya")); + + const allData = { + data: data, + list: filterGroup, + }; + + // console.log(allData); + + return allData; +} diff --git a/src/app_modules/forum/fun/get/get_one_report_komentar_by_id.tsx b/src/app_modules/forum/fun/get/get_one_report_komentar_by_id.tsx new file mode 100644 index 00000000..36993d76 --- /dev/null +++ b/src/app_modules/forum/fun/get/get_one_report_komentar_by_id.tsx @@ -0,0 +1,60 @@ +"use server"; + +import prisma from "@/app/lib/prisma"; +import _ from "lodash"; +import { MODEL_FORUM_KOMENTAR } from "../../model/interface"; +import { group } from "console"; + +export default async function forum_funGetOneReportKomentarById({ + komentarId, +}: { + komentarId: string; +}) { + const data = await prisma.forum_Komentar.findFirst({ + where: { + id: komentarId, + }, + select: { + id: true, + komentar: true, + Forum_Posting: { + select: { + id: true, + diskusi: true, + Author: { + select: { + username: true, + }, + }, + }, + }, + + Forum_ReportKomentar: { + select: { + deskripsi: true, + ForumMaster_KategoriReport: { + select: { + id: true, + title: true, + }, + }, + }, + }, + }, + }); + + const group = _.groupBy( + data?.Forum_ReportKomentar, + (v) => v.ForumMaster_KategoriReport?.title + ); + + const getKey = _.keys(group); + const filterGroup = getKey.map((e) => e.replace("undefined", "Lainnya")); + + const allData = { + data: data, + list: filterGroup, + }; + + return allData; +} diff --git a/src/app_modules/forum/index.ts b/src/app_modules/forum/index.ts index 45d85403..99bd696a 100644 --- a/src/app_modules/forum/index.ts +++ b/src/app_modules/forum/index.ts @@ -5,7 +5,7 @@ import Forum_Forumku from "./forumku"; import Forum_Create from "./create"; import LayoutForum_Create from "./create/layout"; import LayoutForum_Forumku from "./forumku/layout"; -import Forum_Detail from "./detail"; +import Forum_MainDetail from "./detail/main_detail"; import LayoutForum_Detail from "./detail/layout"; import Forum_Komentar from "./komentar"; import LayoutForum_Komentar from "./komentar/layout"; @@ -19,6 +19,8 @@ import Forum_ReportKomentar from "./report/komentar"; import LayoutForum_ReportKomentar from "./report/komentar/layout"; import Forum_ReportPostingLainnya from "./report/posting/lainnya"; import Forum_ReportKomentarLainnya from "./report/komentar/lainnya"; +import Forum_DetailReportKomentar from "./detail/detail_report_komentar"; +import Forum_DetailReportPosting from "./detail/detail_report_posting"; export { Forum_Splash, @@ -28,7 +30,7 @@ export { Forum_Create, LayoutForum_Create, LayoutForum_Forumku, - Forum_Detail, + Forum_MainDetail as Forum_Detail, LayoutForum_Detail, Forum_Komentar, LayoutForum_Komentar, @@ -42,4 +44,6 @@ export { LayoutForum_ReportKomentar, Forum_ReportPostingLainnya, Forum_ReportKomentarLainnya, + Forum_DetailReportKomentar, + Forum_DetailReportPosting, }; diff --git a/src/app_modules/forum/main/beranda.tsx b/src/app_modules/forum/main/beranda.tsx index b83e5f04..6a1c0789 100644 --- a/src/app_modules/forum/main/beranda.tsx +++ b/src/app_modules/forum/main/beranda.tsx @@ -11,20 +11,21 @@ import { Stack, Text, TextInput, - rem + rem, } from "@mantine/core"; import { useShallowEffect, useWindowScroll } from "@mantine/hooks"; -import { - IconPencilPlus, - IconSearchOff -} from "@tabler/icons-react"; +import { IconPencilPlus, IconSearchOff } from "@tabler/icons-react"; import _ from "lodash"; import { ScrollOnly } from "next-scroll-loader"; import { useRouter } from "next/navigation"; import { useState } from "react"; -import ComponentForum_V2_MainCardView from "../component/main_component/card_view"; +import ComponentForum_BerandaCardView from "../component/main_component/card_view"; import { forum_new_getAllPosting } from "../fun/get/new_get_all_posting"; import { MODEL_FORUM_POSTING } from "../model/interface"; +import { + AccentColor, + MainColor, +} from "@/app_modules/component_global/color/color_pallet"; export default function Forum_Beranda({ listForum, @@ -121,7 +122,7 @@ export default function Forum_Beranda({ return ( <> {isNewPost && ( - + setData(val)} @@ -138,25 +139,29 @@ export default function Forum_Beranda({ {/*
{JSON.stringify(listForum, null, 2)}
*/} 0 ? 0.5 : ""} style={{ transition: "0.5s", + border: `1px solid ${AccentColor.skyblue}`, }} size={"xl"} radius={"xl"} variant="transparent" - bg={"blue"} + bg={AccentColor.blue} onClick={() => { setLoadingCreate(true); router.push(RouterForum.create); }} > - + {loadingCreate ? ( + + ) : ( + + )} - + + {_.isEmpty(data) ? ( - + - + Tidak ada data @@ -176,7 +182,7 @@ export default function Forum_Beranda({ ) : ( // --- Main component --- // (
@@ -195,7 +201,7 @@ export default function Forum_Beranda({ }} > {(item) => ( - { @@ -241,6 +247,11 @@ function ButtonUpdateBeranda({ <>
- diff --git a/src/app_modules/forum/report/posting/index.tsx b/src/app_modules/forum/report/posting/index.tsx index 650f86b6..4836e4b6 100644 --- a/src/app_modules/forum/report/posting/index.tsx +++ b/src/app_modules/forum/report/posting/index.tsx @@ -77,10 +77,9 @@ function ButtonAction({ const getKategori = await forum_getOneKategoriById({ kategoriId: toNumber(kategoriId), }); - console.log(getKategori); + // console.log(getKategori); ComponentGlobal_NotifikasiBerhasil(report.message, 2000); - setLoading(true); router.back(); const dataNotif = { @@ -99,6 +98,8 @@ function ButtonAction({ if (createNotifikasi.status === 201) { mqtt_client.publish("ADMIN", JSON.stringify({ count: 1 })); } + setLoading(true); + } else { ComponentGlobal_NotifikasiGagal(report.message); } diff --git a/src/app_modules/forum/report/posting/lainnya.tsx b/src/app_modules/forum/report/posting/lainnya.tsx index de89b6c8..4b1fe678 100644 --- a/src/app_modules/forum/report/posting/lainnya.tsx +++ b/src/app_modules/forum/report/posting/lainnya.tsx @@ -8,11 +8,15 @@ import { forum_funCreateReportPosting } from "../../fun/create/fun_create_report import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { forum_funCreateReportPostingLainnya } from "../../fun/create/fun_create_report_posting_lainnya"; +import mqtt_client from "@/util/mqtt_client"; +import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif_to_admin"; export default function Forum_ReportPostingLainnya({ - postingIg, + postingId, + userLoginId, }: { - postingIg: string; + postingId: string; + userLoginId: string; }) { const [deskripsi, setDeskripsi] = useState(""); return ( @@ -26,46 +30,69 @@ export default function Forum_ReportPostingLainnya({ setDeskripsi(val.currentTarget.value); }} /> - + ); } function ButtonAction({ - postingIg, + postingId, deskripsi, + userLoginId, }: { - postingIg: string; + postingId: string; deskripsi: string; + userLoginId: string; }) { const router = useRouter(); async function onReport() { - await forum_funCreateReportPostingLainnya(postingIg, deskripsi).then( - (res) => { - if (res.status === 201) { - ComponentGlobal_NotifikasiBerhasil(res.message); - router.back(); - } else { - ComponentGlobal_NotifikasiGagal(res.message); - } - } + const report = await forum_funCreateReportPostingLainnya( + postingId, + deskripsi ); + if (report.status === 201) { + ComponentGlobal_NotifikasiBerhasil(report.message); + router.back(); + + const dataNotif = { + appId: postingId, + pesan: deskripsi, + kategoriApp: "FORUM", + title: "Lainnya", + userId: userLoginId, + status: "Report Posting", + }; + + const createNotifikasi = await notifikasiToAdmin_funCreate({ + data: dataNotif as any, + }); + + if (createNotifikasi.status === 201) { + mqtt_client.publish("ADMIN", JSON.stringify({ count: 1 })); + } + } else { + ComponentGlobal_NotifikasiGagal(report.message); + } } return ( <> - ); -} \ No newline at end of file +} diff --git a/src/app_modules/forum/component/detail_component/detail_header.tsx b/src/app_modules/forum/component/detail_component/detail_header.tsx index 63ec8d26..f241bd35 100644 --- a/src/app_modules/forum/component/detail_component/detail_header.tsx +++ b/src/app_modules/forum/component/detail_component/detail_header.tsx @@ -44,6 +44,7 @@ import { forum_funDeletePostingById } from "../../fun/delete/fun_delete_posting_ import { forum_funEditStatusPostingById } from "../../fun/edit/fun_edit_status_posting_by_id"; import { forum_getOnePostingById } from "../../fun/get/get_one_posting_by_id"; import mqtt_client from "@/util/mqtt_client"; +import { AccentColor, MainColor } from "@/app_modules/component_global/color/color_pallet"; export default function ComponentForum_DetailHeader({ data, @@ -85,13 +86,13 @@ export default function ComponentForum_DetailHeader({ - - + + {data?.Author.username ? data?.Author.username : "Nama author "} {userLoginId != authorId ? ( - "" + { + setLoadingReport(true); + router.push(RouterForum.report_posting + postingId); + }} + > + + + + + + + Laporkan posting + {" "} + {loadingReport ? : ""} + + + ) : ( + { + setLoadingEdit(true); + router.push(RouterForum.edit_posting + postingId); + }} + > + + + + + + Edit posting{" "} + {loadingEdit ? : ""} + + + + { close(); @@ -173,16 +214,16 @@ function ComponentForum_DetailButtonMore_V2({ > {statusId === 1 ? ( - + ) : ( - + )} {statusId === 1 ? ( - Tutup forum + Tutup forum ) : ( - Buka forum + Buka forum )} @@ -200,56 +241,30 @@ function ComponentForum_DetailButtonMore_V2({ Hapus - - { - setLoadingEdit(true); - router.push(RouterForum.edit_posting + postingId); - }} - > - - - - - - Edit posting{" "} - {loadingEdit ? : ""} - - - )} - {userLoginId == authorId ? ( - "" - ) : ( - { - setLoadingReport(true); - router.push(RouterForum.report_posting + postingId); - }} - > - - - - - - - Laporkan posting - {" "} - {loadingReport ? : ""} - - - - )} - - { setOpenDel(false); @@ -261,6 +276,12 @@ function ComponentForum_DetailButtonMore_V2({ setOpenStatusClose(false)} centered @@ -276,7 +297,7 @@ function ComponentForum_DetailButtonMore_V2({ /> - open()}> + open()}> @@ -317,7 +338,7 @@ function ButtonDelete({ return ( <> - Yakin menghapus posting ini ? + Yakin menghapus posting ini ? { setOpenDel(false); @@ -177,10 +192,15 @@ export default function ComponentForum_ForumkuMoreButton({ }} allData={allData} /> - {/*
{JSON.stringify(allData, null, 2)}
*/}
setOpenStatusClose(false)} centered @@ -245,7 +265,9 @@ function ButtonDelete({ return ( <> - Yakin menghapus posting ini ? + + Yakin menghapus posting ini ? + { setOpenDel(false); @@ -153,7 +151,7 @@ export default function ComponentForum_KomentarButtonMore({ /> - open()}> + open()}> @@ -188,19 +186,11 @@ function ButtonDelete({ ComponentGlobal_NotifikasiGagal(res.message); } }); - - // await forum_funDeletePostingById(komentarId as any).then((res) => { - // if (res.status === 200) { - // ComponentGlobal_NotifikasiBerhasil(`Postingan Terhapus`, 2000); - // } else { - // ComponentGlobal_NotifikasiGagal(res.message); - // } - // }); } return ( <> - Yakin menghapus komentar ini ? + Yakin menghapus komentar ini ? { setOpenDel(false); @@ -188,6 +196,12 @@ export default function ComponentForum_BerandaMoreButton({ setOpenStatusClose(false)} centered @@ -252,7 +266,9 @@ function ButtonDelete({ return ( <> - Yakin menghapus posting ini ? + + Yakin menghapus posting ini ? + diff --git a/src/app_modules/forum/report/komentar/lainnya.tsx b/src/app_modules/forum/report/komentar/lainnya.tsx index 9af12274..cd027a3e 100644 --- a/src/app_modules/forum/report/komentar/lainnya.tsx +++ b/src/app_modules/forum/report/komentar/lainnya.tsx @@ -9,8 +9,16 @@ import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_glob import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { forum_funCreateReportPostingLainnya } from "../../fun/create/fun_create_report_posting_lainnya"; import { forum_funCreateReportKomentarLainnya } from "../../fun/create/fun_create_report_komentar_lainnya"; +import mqtt_client from "@/util/mqtt_client"; +import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif_to_admin"; -export default function Forum_ReportKomentarLainnya({ komentarId }: { komentarId: string }) { +export default function Forum_ReportKomentarLainnya({ + komentarId, + userLoginId, +}: { + komentarId: string; + userLoginId: string; +}) { const [deskripsi, setDeskripsi] = useState(""); return ( <> @@ -23,7 +31,11 @@ export default function Forum_ReportKomentarLainnya({ komentarId }: { komentarId setDeskripsi(val.currentTarget.value); }} /> - + ); @@ -32,23 +44,43 @@ export default function Forum_ReportKomentarLainnya({ komentarId }: { komentarId function ButtonAction({ komentarId, deskripsi, + userLoginId, }: { komentarId: string; deskripsi: string; + userLoginId: string; }) { const router = useRouter(); async function onReport() { - await forum_funCreateReportKomentarLainnya(komentarId, deskripsi).then( - (res) => { - if (res.status === 201) { - ComponentGlobal_NotifikasiBerhasil(res.message); - router.back(); - } else { - ComponentGlobal_NotifikasiGagal(res.message); - } - } + const report = await forum_funCreateReportKomentarLainnya( + komentarId, + deskripsi ); + + if (report.status === 201) { + const dataNotif = { + appId: komentarId, + pesan: deskripsi, + kategoriApp: "FORUM", + title: "Lainnya", + userId: userLoginId, + status: "Report Komentar", + }; + + const createNotifikasi = await notifikasiToAdmin_funCreate({ + data: dataNotif as any, + }); + + if (createNotifikasi.status === 201) { + mqtt_client.publish("ADMIN", JSON.stringify({ count: 1 })); + } + + ComponentGlobal_NotifikasiBerhasil(report.message); + router.back(); + } else { + ComponentGlobal_NotifikasiGagal(report.message); + } } return ( <> @@ -61,7 +93,15 @@ function ButtonAction({ > Batal - diff --git a/src/app_modules/forum/report/komentar/layout.tsx b/src/app_modules/forum/report/komentar/layout.tsx index fd72b2ef..f131b935 100644 --- a/src/app_modules/forum/report/komentar/layout.tsx +++ b/src/app_modules/forum/report/komentar/layout.tsx @@ -1,12 +1,10 @@ "use client"; -import { ActionIcon, AppShell, Group, Header, Title } from "@mantine/core"; -import React from "react"; -import ComponentForum_HeaderTamplate from "../../component/header/header_tamplate"; -import { IconChevronLeft, IconX } from "@tabler/icons-react"; -import router from "next/router"; -import ComponentForum_HeaderRataKiri from "../../component/header/header_rata_kiri"; import AppComponentGlobal_LayoutTamplate from "@/app_modules/component_global/component_layout_tamplate"; +import React from "react"; +import ComponentForum_HeaderRataKiri from "../../component/header/header_rata_kiri"; +import ComponentGlobal_UI_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import ComponentGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; export default function LayoutForum_ReportKomentar({ children, @@ -15,13 +13,20 @@ export default function LayoutForum_ReportKomentar({ }) { return ( <> - + } + > + {children} + + {/* } > {children} - + */} ); } diff --git a/src/app_modules/forum/report/posting/index.tsx b/src/app_modules/forum/report/posting/index.tsx index 4836e4b6..47e4cbc6 100644 --- a/src/app_modules/forum/report/posting/index.tsx +++ b/src/app_modules/forum/report/posting/index.tsx @@ -1,18 +1,21 @@ "use client"; -import { Box, Button, Paper, Radio, Stack, Text, Title } from "@mantine/core"; -import { MODEL_FORUM_MASTER_REPORT } from "../../model/interface"; +import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; +import { + AccentColor, + MainColor, +} from "@/app_modules/component_global/color/color_pallet"; +import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; +import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; +import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif_to_admin"; +import mqtt_client from "@/util/mqtt_client"; +import { Button, Radio, Stack, Text, Title } from "@mantine/core"; +import { toNumber } from "lodash"; +import { useRouter } from "next/navigation"; import { useState } from "react"; import { forum_funCreateReportPosting } from "../../fun/create/fun_create_report_posting"; -import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; -import { useRouter } from "next/navigation"; -import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; -import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; -import mqtt_client from "@/util/mqtt_client"; -import adminNotifikasi_funCreateToUser from "@/app_modules/admin/notifikasi/fun/create/fun_create_notif_user"; -import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif_to_admin"; import forum_getOneKategoriById from "../../fun/get/get_one_kategori_by_id"; -import { toNumber } from "lodash"; +import { MODEL_FORUM_MASTER_REPORT } from "../../model/interface"; export default function Forum_ReportPosting({ postingId, @@ -27,8 +30,17 @@ export default function Forum_ReportPosting({ return ( <> - + { setReportValue(val); @@ -39,7 +51,11 @@ export default function Forum_ReportPosting({ {e.title}} + label={ + + {e.title} + + } /> {e.deskripsi} @@ -66,7 +82,8 @@ function ButtonAction({ userLoginId: string; }) { const router = useRouter(); - const [loading, setLoading] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [isLoadingLain, setIsLoadingLain] = useState(false); async function onReport() { const report = await forum_funCreateReportPosting({ @@ -98,8 +115,7 @@ function ButtonAction({ if (createNotifikasi.status === 201) { mqtt_client.publish("ADMIN", JSON.stringify({ count: 1 })); } - setLoading(true); - + setIsLoading(true); } else { ComponentGlobal_NotifikasiGagal(report.message); } @@ -108,10 +124,13 @@ function ButtonAction({ <> @@ -119,7 +138,7 @@ function ButtonAction({ radius={"xl"} color="orange" loaderPosition="center" - loading={loading ? true : false} + loading={isLoading ? true : false} onClick={() => onReport()} > Report diff --git a/src/app_modules/forum/report/posting/layout.tsx b/src/app_modules/forum/report/posting/layout.tsx index 888c3fcd..0b9b250b 100644 --- a/src/app_modules/forum/report/posting/layout.tsx +++ b/src/app_modules/forum/report/posting/layout.tsx @@ -1,12 +1,8 @@ "use client"; -import { ActionIcon, AppShell, Group, Header, Title } from "@mantine/core"; +import ComponentGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import ComponentGlobal_UI_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; import React from "react"; -import ComponentForum_HeaderTamplate from "../../component/header/header_tamplate"; -import { IconChevronLeft, IconX } from "@tabler/icons-react"; -import router from "next/router"; -import ComponentForum_HeaderRataKiri from "../../component/header/header_rata_kiri"; -import AppComponentGlobal_LayoutTamplate from "@/app_modules/component_global/component_layout_tamplate"; export default function LayoutForum_ReportPosting({ children, @@ -15,13 +11,15 @@ export default function LayoutForum_ReportPosting({ }) { return ( <> - + } > {children} - + + + ); } diff --git a/src/app_modules/forum/splash/index.tsx b/src/app_modules/forum/splash/index.tsx index 57888ab5..fc828945 100644 --- a/src/app_modules/forum/splash/index.tsx +++ b/src/app_modules/forum/splash/index.tsx @@ -2,8 +2,17 @@ import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; import ComponentGlobal_UI_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; -import { Center, Image, Paper, Stack } from "@mantine/core"; +import { + Avatar, + Center, + Image, + Loader, + Paper, + Stack, + Text, +} from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; +import { IconMessages } from "@tabler/icons-react"; import { useRouter } from "next/navigation"; export default function Forum_Splash() { @@ -26,18 +35,9 @@ export default function Forum_Splash() { function ViewSplash() { return ( <> - - - logo - + + + ); diff --git a/src/app_modules/home/view.tsx b/src/app_modules/home/view.tsx index b84d6a13..04fde044 100644 --- a/src/app_modules/home/view.tsx +++ b/src/app_modules/home/view.tsx @@ -3,12 +3,16 @@ import { ActionIcon, Box, + Center, Group, Image, + Loader, + LoadingOverlay, + Overlay, Paper, SimpleGrid, Stack, - Text + Text, } from "@mantine/core"; import { @@ -17,20 +21,18 @@ import { IconHeartHandshake, IconPackageImport, IconPresentation, - IconUserSearch + IconUserSearch, } from "@tabler/icons-react"; import { RouterColab } from "@/app/lib/router_hipmi/router_colab"; import { RouterEvent } from "@/app/lib/router_hipmi/router_event"; import { RouterJob } from "@/app/lib/router_hipmi/router_job"; import { RouterVote } from "@/app/lib/router_hipmi/router_vote"; -import { useDisclosure } from "@mantine/hooks"; import _ from "lodash"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { AccentColor, MainColor } from "../component_global/color/color_pallet"; import ComponentGlobal_IsEmptyData from "../component_global/is_empty_data"; -import ComponentGlobal_V2_LoadingPage from "../component_global/loading_page_v2"; import { ComponentGlobal_NotifikasiPeringatan } from "../component_global/notif_global/notifikasi_peringatan"; import { MODEL_JOB } from "../job/model/interface"; import { MODEL_USER } from "./model/interface"; @@ -43,8 +45,8 @@ export default function HomeView({ dataJob: MODEL_JOB[]; }) { const router = useRouter(); - const [loading, setLoading] = useState(false); - const [visible, { toggle }] = useDisclosure(false); + const [isLoading, setIsLoading] = useState(false); + const [pageId, setPageId] = useState(0); const listPageOnBox = [ { @@ -83,8 +85,6 @@ export default function HomeView({ return ( <> - {visible ? : ""} - - {e.icon} + {isLoading && e.id === pageId ? : e.icon} {e.name} @@ -172,7 +173,6 @@ export default function HomeView({ "Cooming Soon !!" ); } else { - toggle(); return router.push(routePageJob.link); } } From ac12dd4a98abaf2332e50f7836073a76ae178e7f Mon Sep 17 00:00:00 2001 From: Bagasbanuna02 Date: Fri, 5 Jul 2024 16:29:54 +0800 Subject: [PATCH 08/17] UI Job # style - UI Job di bagian user selesai # fix - Scroll data untuk beranda dan tampilan yang lain selesi ## No issue --- .../80b01061-3161-414e-980e-2fc3ac8ee1d3.jpg | Bin 0 -> 9709 bytes .../a2486cad-442a-4f4b-b09c-9c0aa7a54cab.jpg | Bin 0 -> 12041 bytes .../e5700057-a462-4085-84a4-c2a5acb36b4c.png | Bin 0 -> 77324 bytes src/app/dev/job/create/loading.tsx | 9 - src/app/dev/job/detail/arsip/[id]/loading.tsx | 9 - src/app/dev/job/detail/arsip/[id]/page.tsx | 4 +- src/app/dev/job/detail/draft/[id]/loading.tsx | 9 - src/app/dev/job/detail/draft/[id]/page.tsx | 4 +- src/app/dev/job/detail/main/[id]/loading.tsx | 9 - src/app/dev/job/detail/main/[id]/page.tsx | 4 +- .../dev/job/detail/publish/[id]/loading.tsx | 9 - src/app/dev/job/detail/publish/[id]/page.tsx | 4 +- .../dev/job/detail/reject/[id]/loading.tsx | 9 - src/app/dev/job/detail/reject/[id]/page.tsx | 4 +- .../dev/job/detail/review/[id]/loading.tsx | 9 - src/app/dev/job/detail/review/[id]/page.tsx | 4 +- src/app/dev/job/edit/[id]/loading.tsx | 9 - src/app/dev/job/edit/[id]/page.tsx | 4 +- src/app/dev/job/main/arsip/page.tsx | 6 +- src/app/dev/job/main/beranda/page.tsx | 8 +- src/app/dev/job/main/loading.tsx | 9 - src/app/dev/job/main/status/page.tsx | 15 +- .../dev/job/non_user_view/[id]/loading.tsx | 9 - src/app/dev/job/non_user_view/[id]/page.tsx | 6 +- src/app/dev/job/splash/loading.tsx | 9 - src/app/dev/job/splash/page.tsx | 4 +- src/app/emotion.tsx | 29 ++- src/app/layout.tsx | 1 + src/app/makuro/page.tsx | 2 +- .../author_name_on_header.tsx | 18 +- .../component_global/box_information.tsx | 52 +++++ .../component_global/is_empty_data.tsx | 12 +- .../component_global/loading_card.tsx | 4 +- .../component_global/splash/splash_global.tsx | 20 ++ .../component_global/ui/ui_drawer.tsx | 72 +++++++ .../ui/ui_header_tamplate.tsx | 10 +- .../ui/ui_layout_tamplate.tsx | 59 +++--- .../component_global/ui/ui_modal.tsx | 45 +++++ src/app_modules/forum/detail/main_detail.tsx | 61 +++--- src/app_modules/forum/main/beranda.tsx | 2 +- src/app_modules/forum/splash/index.tsx | 16 +- src/app_modules/home/layout.tsx | 173 ++++++++--------- src/app_modules/home/view.tsx | 14 +- .../job/component/beranda/card_view.tsx | 70 +++++++ .../job/component/button/create_button.tsx | 66 +++++++ .../job/component/card/card_view.tsx | 59 ++++++ .../job/component/card_view_status.tsx | 27 +-- .../job/component/default_value.ts | 10 - .../job/component/detail/detail_data.tsx | 15 +- .../job/component/is_empty_data.tsx | 2 +- src/app_modules/job/create/layout.tsx | 11 +- src/app_modules/job/create/view.tsx | 81 +++++--- src/app_modules/job/detail/arsip/layout.tsx | 11 +- src/app_modules/job/detail/arsip/view.tsx | 40 +++- src/app_modules/job/detail/draft/layout.tsx | 58 +++++- src/app_modules/job/detail/draft/view.tsx | 180 +++++++++++++++--- src/app_modules/job/detail/main/layout.tsx | 11 +- src/app_modules/job/detail/main/view.tsx | 14 +- src/app_modules/job/detail/publish/layout.tsx | 11 +- src/app_modules/job/detail/publish/view.tsx | 102 ++++++++-- src/app_modules/job/detail/reject/layout.tsx | 10 +- src/app_modules/job/detail/reject/view.tsx | 123 ++++++++---- src/app_modules/job/detail/review/layout.tsx | 11 +- src/app_modules/job/detail/review/view.tsx | 36 +++- src/app_modules/job/edit/layout.tsx | 12 +- src/app_modules/job/edit/view.tsx | 71 +++++-- ...get_list_all_arsip.ts => get_all_arsip.ts} | 12 +- .../job/fun/get/get_all_publish.ts | 45 +++++ .../fun/get/get_list_status_by_status_id.ts | 68 ------- src/app_modules/job/fun/get/get_one_by_id.ts | 2 +- .../job/fun/get/status/get_list_draft.ts | 29 +++ .../get_list_publish.ts} | 22 ++- .../job/fun/get/status/get_list_reject.ts | 29 +++ ..._get_list_reject.ts => get_list_review.ts} | 15 +- src/app_modules/job/index.ts | 16 +- src/app_modules/job/main/arsip.tsx | 16 -- src/app_modules/job/main/arsip/ui_arsip.tsx | 55 ++++++ src/app_modules/job/main/arsip/view_arsip.tsx | 11 ++ src/app_modules/job/main/beranda.tsx | 120 ------------ .../job/main/beranda/ui_beranda.tsx | 75 ++++++++ .../job/main/beranda/view_beranda.tsx | 10 + src/app_modules/job/main/layout.tsx | 133 +++++++------ src/app_modules/job/main/status/draft.tsx | 50 ++++- src/app_modules/job/main/status/publish.tsx | 50 ++++- src/app_modules/job/main/status/reject.tsx | 47 ++++- src/app_modules/job/main/status/review.tsx | 48 ++++- .../main/status/{view.tsx => ui_status.tsx} | 57 ++++-- .../job/main/status/view_status.tsx | 24 +++ src/app_modules/job/non_user_view/layout.tsx | 15 +- src/app_modules/job/non_user_view/view.tsx | 16 +- .../job/splash/{view.tsx => ui_splash.tsx} | 22 +-- src/app_modules/job/splash/view_splash.tsx | 9 + src/app_modules/zCoba/index.tsx | 126 +++++++++++- 93 files changed, 2008 insertions(+), 901 deletions(-) create mode 100644 public/job/80b01061-3161-414e-980e-2fc3ac8ee1d3.jpg create mode 100644 public/job/a2486cad-442a-4f4b-b09c-9c0aa7a54cab.jpg create mode 100644 public/job/e5700057-a462-4085-84a4-c2a5acb36b4c.png delete mode 100644 src/app/dev/job/create/loading.tsx delete mode 100644 src/app/dev/job/detail/arsip/[id]/loading.tsx delete mode 100644 src/app/dev/job/detail/draft/[id]/loading.tsx delete mode 100644 src/app/dev/job/detail/main/[id]/loading.tsx delete mode 100644 src/app/dev/job/detail/publish/[id]/loading.tsx delete mode 100644 src/app/dev/job/detail/reject/[id]/loading.tsx delete mode 100644 src/app/dev/job/detail/review/[id]/loading.tsx delete mode 100644 src/app/dev/job/edit/[id]/loading.tsx delete mode 100644 src/app/dev/job/main/loading.tsx delete mode 100644 src/app/dev/job/non_user_view/[id]/loading.tsx delete mode 100644 src/app/dev/job/splash/loading.tsx create mode 100644 src/app_modules/component_global/box_information.tsx create mode 100644 src/app_modules/component_global/splash/splash_global.tsx create mode 100644 src/app_modules/component_global/ui/ui_drawer.tsx create mode 100644 src/app_modules/component_global/ui/ui_modal.tsx create mode 100644 src/app_modules/job/component/beranda/card_view.tsx create mode 100644 src/app_modules/job/component/button/create_button.tsx create mode 100644 src/app_modules/job/component/card/card_view.tsx rename src/app_modules/job/fun/get/{get_list_all_arsip.ts => get_all_arsip.ts} (55%) create mode 100644 src/app_modules/job/fun/get/get_all_publish.ts delete mode 100644 src/app_modules/job/fun/get/get_list_status_by_status_id.ts create mode 100644 src/app_modules/job/fun/get/status/get_list_draft.ts rename src/app_modules/job/fun/get/{get_list_all_publish.ts => status/get_list_publish.ts} (55%) create mode 100644 src/app_modules/job/fun/get/status/get_list_reject.ts rename src/app_modules/job/fun/get/status/{new_get_list_reject.ts => get_list_review.ts} (53%) delete mode 100644 src/app_modules/job/main/arsip.tsx create mode 100644 src/app_modules/job/main/arsip/ui_arsip.tsx create mode 100644 src/app_modules/job/main/arsip/view_arsip.tsx delete mode 100644 src/app_modules/job/main/beranda.tsx create mode 100644 src/app_modules/job/main/beranda/ui_beranda.tsx create mode 100644 src/app_modules/job/main/beranda/view_beranda.tsx rename src/app_modules/job/main/status/{view.tsx => ui_status.tsx} (59%) create mode 100644 src/app_modules/job/main/status/view_status.tsx rename src/app_modules/job/splash/{view.tsx => ui_splash.tsx} (65%) create mode 100644 src/app_modules/job/splash/view_splash.tsx diff --git a/public/job/80b01061-3161-414e-980e-2fc3ac8ee1d3.jpg b/public/job/80b01061-3161-414e-980e-2fc3ac8ee1d3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bad7a5395426aaff928ef6a9777e06739124b5c6 GIT binary patch literal 9709 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 literal 0 HcmV?d00001 diff --git a/public/job/e5700057-a462-4085-84a4-c2a5acb36b4c.png b/public/job/e5700057-a462-4085-84a4-c2a5acb36b4c.png new file mode 100644 index 0000000000000000000000000000000000000000..f1aa5b433596398193ea71fb54819dd573e73d18 GIT binary patch literal 77324 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 b000000000000000000000000000000JXC~l literal 0 HcmV?d00001 diff --git a/src/app/dev/job/create/loading.tsx b/src/app/dev/job/create/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/job/create/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/job/detail/arsip/[id]/loading.tsx b/src/app/dev/job/detail/arsip/[id]/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/job/detail/arsip/[id]/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/job/detail/arsip/[id]/page.tsx b/src/app/dev/job/detail/arsip/[id]/page.tsx index e8fd9290..b37f2fd6 100644 --- a/src/app/dev/job/detail/arsip/[id]/page.tsx +++ b/src/app/dev/job/detail/arsip/[id]/page.tsx @@ -1,9 +1,9 @@ import { Job_DetailArsip } from "@/app_modules/job"; -import { Job_getOneById } from "@/app_modules/job/fun/get/get_one_by_id"; +import { job_getOneById } from "@/app_modules/job/fun/get/get_one_by_id"; export default async function Page({params}:{params: {id: string}}) { let jobId = params.id - const dataJob = await Job_getOneById(jobId) + const dataJob = await job_getOneById(jobId) return ( <> diff --git a/src/app/dev/job/detail/draft/[id]/loading.tsx b/src/app/dev/job/detail/draft/[id]/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/job/detail/draft/[id]/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/job/detail/draft/[id]/page.tsx b/src/app/dev/job/detail/draft/[id]/page.tsx index eaff874d..15d14b24 100644 --- a/src/app/dev/job/detail/draft/[id]/page.tsx +++ b/src/app/dev/job/detail/draft/[id]/page.tsx @@ -1,10 +1,10 @@ import Job_DetailDraft from "@/app_modules/job/detail/draft/view"; -import { Job_getOneById } from "@/app_modules/job/fun/get/get_one_by_id"; +import { job_getOneById } from "@/app_modules/job/fun/get/get_one_by_id"; export default async function Page({params}: {params: {id: string}}) { let jobId = params.id - const dataJob = await Job_getOneById(jobId) + const dataJob = await job_getOneById(jobId) return ( <> diff --git a/src/app/dev/job/detail/main/[id]/loading.tsx b/src/app/dev/job/detail/main/[id]/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/job/detail/main/[id]/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/job/detail/main/[id]/page.tsx b/src/app/dev/job/detail/main/[id]/page.tsx index 00e3a6a4..bfe9b192 100644 --- a/src/app/dev/job/detail/main/[id]/page.tsx +++ b/src/app/dev/job/detail/main/[id]/page.tsx @@ -1,11 +1,11 @@ "use server"; import { Job_MainDetail } from "@/app_modules/job"; -import { Job_getOneById } from "@/app_modules/job/fun/get/get_one_by_id"; +import { job_getOneById } from "@/app_modules/job/fun/get/get_one_by_id"; import app_config from "@/util/app_config"; export default async function Page({ params }: { params: { id: string } }) { const idJob = params.id; - const dataJob = await Job_getOneById(idJob); + const dataJob = await job_getOneById(idJob); return ( <> diff --git a/src/app/dev/job/detail/publish/[id]/loading.tsx b/src/app/dev/job/detail/publish/[id]/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/job/detail/publish/[id]/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/job/detail/publish/[id]/page.tsx b/src/app/dev/job/detail/publish/[id]/page.tsx index 1558f947..6dd30830 100644 --- a/src/app/dev/job/detail/publish/[id]/page.tsx +++ b/src/app/dev/job/detail/publish/[id]/page.tsx @@ -1,9 +1,9 @@ import { Job_DetailPublish } from "@/app_modules/job"; -import { Job_getOneById } from "@/app_modules/job/fun/get/get_one_by_id"; +import { job_getOneById } from "@/app_modules/job/fun/get/get_one_by_id"; export default async function Page({params}: {params: {id: string}}) { let jobId = params.id - const dataJob = await Job_getOneById(jobId) + const dataJob = await job_getOneById(jobId) return ( <> diff --git a/src/app/dev/job/detail/reject/[id]/loading.tsx b/src/app/dev/job/detail/reject/[id]/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/job/detail/reject/[id]/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/job/detail/reject/[id]/page.tsx b/src/app/dev/job/detail/reject/[id]/page.tsx index 0645612e..cd6f0206 100644 --- a/src/app/dev/job/detail/reject/[id]/page.tsx +++ b/src/app/dev/job/detail/reject/[id]/page.tsx @@ -1,10 +1,10 @@ import Job_DetailReject from "@/app_modules/job/detail/reject/view"; -import { Job_getOneById } from "@/app_modules/job/fun/get/get_one_by_id"; +import { job_getOneById } from "@/app_modules/job/fun/get/get_one_by_id"; export default async function Page({params}: {params: {id: string}}) { let jobId = params.id - const dataJob = await Job_getOneById(jobId) + const dataJob = await job_getOneById(jobId) return ( <> diff --git a/src/app/dev/job/detail/review/[id]/loading.tsx b/src/app/dev/job/detail/review/[id]/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/job/detail/review/[id]/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/job/detail/review/[id]/page.tsx b/src/app/dev/job/detail/review/[id]/page.tsx index 67463ad7..6dda171e 100644 --- a/src/app/dev/job/detail/review/[id]/page.tsx +++ b/src/app/dev/job/detail/review/[id]/page.tsx @@ -1,5 +1,5 @@ import Job_DetailReview from "@/app_modules/job/detail/review/view"; -import { Job_getOneById } from "@/app_modules/job/fun/get/get_one_by_id"; +import { job_getOneById } from "@/app_modules/job/fun/get/get_one_by_id"; import React from "react"; export default async function Page({ @@ -8,7 +8,7 @@ export default async function Page({ params: { id: React.ReactNode }; }) { let jobId = params.id; - const dataJob = await Job_getOneById(jobId) + const dataJob = await job_getOneById(jobId) return ( <> diff --git a/src/app/dev/job/edit/[id]/loading.tsx b/src/app/dev/job/edit/[id]/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/job/edit/[id]/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/job/edit/[id]/page.tsx b/src/app/dev/job/edit/[id]/page.tsx index 76da710e..baba6e04 100644 --- a/src/app/dev/job/edit/[id]/page.tsx +++ b/src/app/dev/job/edit/[id]/page.tsx @@ -1,9 +1,9 @@ import { Job_Edit } from "@/app_modules/job"; -import { Job_getOneById } from "@/app_modules/job/fun/get/get_one_by_id"; +import { job_getOneById } from "@/app_modules/job/fun/get/get_one_by_id"; export default async function Page({ params }: { params: { id: string } }) { let jobId = params.id; - const dataJob = await Job_getOneById(jobId); + const dataJob = await job_getOneById(jobId); return ( <> diff --git a/src/app/dev/job/main/arsip/page.tsx b/src/app/dev/job/main/arsip/page.tsx index fcd2d063..f46dce88 100644 --- a/src/app/dev/job/main/arsip/page.tsx +++ b/src/app/dev/job/main/arsip/page.tsx @@ -1,12 +1,12 @@ import { Job_Arsip } from "@/app_modules/job"; -import { Job_getListAllArsipById } from "@/app_modules/job/fun/get/get_list_all_arsip"; +import { job_getAllArsipById } from "@/app_modules/job/fun/get/get_all_arsip"; export default async function Page() { - const dataJob = await Job_getListAllArsipById() + const dataJob = await job_getAllArsipById({ page: 1 }); return ( <> - + ); } diff --git a/src/app/dev/job/main/beranda/page.tsx b/src/app/dev/job/main/beranda/page.tsx index c16c9453..1a4bce82 100644 --- a/src/app/dev/job/main/beranda/page.tsx +++ b/src/app/dev/job/main/beranda/page.tsx @@ -1,12 +1,12 @@ -import { Job_Beranda } from "@/app_modules/job"; -import { Job_getAllListPublish } from "@/app_modules/job/fun/get/get_list_all_publish"; +import { Job_ViewBeranda } from "@/app_modules/job"; +import { job_getAllListPublish } from "@/app_modules/job/fun/get/get_all_publish"; export default async function Page() { - const listJob = await Job_getAllListPublish(); + const listJob = await job_getAllListPublish({ page: 1 }); return ( <> - + ); } diff --git a/src/app/dev/job/main/loading.tsx b/src/app/dev/job/main/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/job/main/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/job/main/status/page.tsx b/src/app/dev/job/main/status/page.tsx index 3ce708be..767d88b1 100644 --- a/src/app/dev/job/main/status/page.tsx +++ b/src/app/dev/job/main/status/page.tsx @@ -1,13 +1,14 @@ import { Job_Status } from "@/app_modules/job"; -import { Job_getListStatusByStatusId } from "@/app_modules/job/fun/get/get_list_status_by_status_id"; +import job_getAllStatusDraft from "@/app_modules/job/fun/get/status/get_list_draft"; +import job_getAllStatusPublish from "@/app_modules/job/fun/get/status/get_list_publish"; +import job_getAllStatusReject from "@/app_modules/job/fun/get/status/get_list_reject"; +import job_getAllStatusReview from "@/app_modules/job/fun/get/status/get_list_review"; export default async function Page() { - const listPublish = await Job_getListStatusByStatusId("1"); - const listReview = await Job_getListStatusByStatusId("2"); - const listDraft = await Job_getListStatusByStatusId("3"); - const listReject = await Job_getListStatusByStatusId("4"); - - + const listPublish = await job_getAllStatusPublish({page: 1}); + const listReview = await job_getAllStatusReview({ page: 1 }); + const listDraft = await job_getAllStatusDraft({ page: 1 }); + const listReject = await job_getAllStatusReject({page: 1}); return ( <> diff --git a/src/app/dev/job/non_user_view/[id]/loading.tsx b/src/app/dev/job/non_user_view/[id]/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/job/non_user_view/[id]/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/job/non_user_view/[id]/page.tsx b/src/app/dev/job/non_user_view/[id]/page.tsx index 0a2a00cf..f69c2288 100644 --- a/src/app/dev/job/non_user_view/[id]/page.tsx +++ b/src/app/dev/job/non_user_view/[id]/page.tsx @@ -1,11 +1,9 @@ -"use server"; import { Job_NonUserView } from "@/app_modules/job"; -import { Job_getOneById } from "@/app_modules/job/fun/get/get_one_by_id"; -import os from "os"; +import { job_getOneById } from "@/app_modules/job/fun/get/get_one_by_id"; export default async function Page({ params }: { params: { id: string } }) { let jobId = params.id; - const dataJob = await Job_getOneById(jobId); + const dataJob = await job_getOneById(jobId); // const platform = os.platform(); // const hostName = // platform === "darwin" diff --git a/src/app/dev/job/splash/loading.tsx b/src/app/dev/job/splash/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/job/splash/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/job/splash/page.tsx b/src/app/dev/job/splash/page.tsx index 5286f7dc..9e3d7f07 100644 --- a/src/app/dev/job/splash/page.tsx +++ b/src/app/dev/job/splash/page.tsx @@ -1,9 +1,9 @@ -import { Job_Splash } from "@/app_modules/job"; +import { Job_ViewSplash } from "@/app_modules/job"; export default async function Page() { return ( <> - + ); } diff --git a/src/app/emotion.tsx b/src/app/emotion.tsx index 01572366..e8464dc0 100644 --- a/src/app/emotion.tsx +++ b/src/app/emotion.tsx @@ -1,7 +1,14 @@ "use client"; +import { MainColor } from "@/app_modules/component_global/color/color_pallet"; // import './globals.css' import { CacheProvider } from "@emotion/react"; -import { MantineProvider, useEmotionCache } from "@mantine/core"; +import { + Box, + Container, + MantineProvider, + rem, + useEmotionCache, +} from "@mantine/core"; import { Notifications } from "@mantine/notifications"; import { useServerInsertedHTML } from "next/navigation"; import "react-toastify/dist/ReactToastify.css"; @@ -33,8 +40,24 @@ export default function RootStyleRegistry({ {children} - {/* - */} + {/* + + + + */} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 1e7f4898..60515f79 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,5 +1,6 @@ import MqttLoader from "@/util/mqtt_loader"; import RootStyleRegistry from "./emotion"; +import { Container } from "@mantine/core"; export default function RootLayout({ children, diff --git a/src/app/makuro/page.tsx b/src/app/makuro/page.tsx index adb83ece..62e9732c 100644 --- a/src/app/makuro/page.tsx +++ b/src/app/makuro/page.tsx @@ -47,5 +47,5 @@ export default function App() { padding: 8, }; - return ; + return <>; } diff --git a/src/app_modules/component_global/author_name_on_header.tsx b/src/app_modules/component_global/author_name_on_header.tsx index e40f5151..940941c4 100644 --- a/src/app_modules/component_global/author_name_on_header.tsx +++ b/src/app_modules/component_global/author_name_on_header.tsx @@ -52,7 +52,11 @@ export default function ComponentGlobal_AuthorNameOnHeader({ {visible ? ( @@ -65,7 +69,11 @@ export default function ComponentGlobal_AuthorNameOnHeader({ ) : ( - + - + {authorName ? authorName : "Nama author"} {tglPublish ? ( - + {skrng.toLocaleDateString(["id-ID"], { dateStyle: "medium", })} diff --git a/src/app_modules/component_global/box_information.tsx b/src/app_modules/component_global/box_information.tsx new file mode 100644 index 00000000..e9504e1d --- /dev/null +++ b/src/app_modules/component_global/box_information.tsx @@ -0,0 +1,52 @@ +import { Center, Grid, Group, Paper, Stack, Text, Title } from "@mantine/core"; +import { AccentColor, MainColor } from "./color/color_pallet"; + +export default function ComponentGlobal_BoxInformation({ + informasi, + isReport, +}: { + informasi: string; + isReport?: boolean; +}) { + return ( + <> + {isReport ? ( + + + + * Report + + + {informasi} + + + + ) : ( + + + + *{" "} + + {informasi} + + + + + )} + + ); +} diff --git a/src/app_modules/component_global/is_empty_data.tsx b/src/app_modules/component_global/is_empty_data.tsx index f7418471..0cc2fe35 100644 --- a/src/app_modules/component_global/is_empty_data.tsx +++ b/src/app_modules/component_global/is_empty_data.tsx @@ -1,22 +1,22 @@ "use client"; -import { Center } from "@mantine/core"; +import { Center, Text } from "@mantine/core"; export default function ComponentGlobal_IsEmptyData({ text, height, }: { - text: string; - height?: number}) { + text?: string; + height?: number; +}) { return ( <>
- {text} + {text ? text : "Tidak Ada Data"}
); diff --git a/src/app_modules/component_global/loading_card.tsx b/src/app_modules/component_global/loading_card.tsx index ff43d946..2cd225c3 100644 --- a/src/app_modules/component_global/loading_card.tsx +++ b/src/app_modules/component_global/loading_card.tsx @@ -1,5 +1,3 @@ -"use client"; - import { Overlay, Center, Loader } from "@mantine/core"; export default function ComponentGlobal_CardLoadingOverlay({ @@ -16,7 +14,7 @@ export default function ComponentGlobal_CardLoadingOverlay({
diff --git a/src/app_modules/component_global/splash/splash_global.tsx b/src/app_modules/component_global/splash/splash_global.tsx new file mode 100644 index 00000000..97463ec2 --- /dev/null +++ b/src/app_modules/component_global/splash/splash_global.tsx @@ -0,0 +1,20 @@ +"use client"; + +import { Stack, Loader, ActionIcon, ThemeIcon } from "@mantine/core"; +import ComponentGlobal_UI_LayoutTamplate from "../ui/ui_layout_tamplate"; +import { IconMessages, IconX } from "@tabler/icons-react"; + +export default function ComponentGlobal_SplashScreen({ icon }: { icon: any }) { + return ( + <> + + + + {icon} + + + + + + ); +} diff --git a/src/app_modules/component_global/ui/ui_drawer.tsx b/src/app_modules/component_global/ui/ui_drawer.tsx new file mode 100644 index 00000000..ccbd53fe --- /dev/null +++ b/src/app_modules/component_global/ui/ui_drawer.tsx @@ -0,0 +1,72 @@ +import { + Drawer, + Stack, + Group, + ActionIcon, + SimpleGrid, + Text, + Box, +} from "@mantine/core"; +import { IconX, IconEdit } from "@tabler/icons-react"; +import { MainColor, AccentColor } from "../color/color_pallet"; +import React from "react"; +import { useRouter } from "next/navigation"; + +export default function ComponentGlobal_UI_Drawer({ + opened, + close, + component, +}: { + opened: boolean; + close: () => void; + component: any[]; +}) { + const router = useRouter(); + return ( + <> + close()} + position={"bottom"} + size={"auto"} + withCloseButton={false} + styles={{ + content: { + backgroundColor: "transparent", + }, + body: { + backgroundColor: MainColor.darkblue, + borderTop: `2px solid ${AccentColor.blue}`, + borderRight: `1px solid ${AccentColor.blue}`, + borderLeft: `1px solid ${AccentColor.blue}`, + borderRadius: "20px 20px 0px 0px", + color: "white", + paddingBottom: "5%", + }, + }} + > + + + + + + + + {component.map((e, i) => ( + + router.push(e.path)} + > + {e.icon} + + {e.name} + + ))} + + + + + ); +} diff --git a/src/app_modules/component_global/ui/ui_header_tamplate.tsx b/src/app_modules/component_global/ui/ui_header_tamplate.tsx index 00104819..fdeab7d9 100644 --- a/src/app_modules/component_global/ui/ui_header_tamplate.tsx +++ b/src/app_modules/component_global/ui/ui_header_tamplate.tsx @@ -66,7 +66,7 @@ export default function ComponentGlobal_UI_HeaderTamplate({ }} > {isLoading ? ( - + ) : iconLeft ? ( iconLeft ) : ( @@ -85,14 +85,18 @@ export default function ComponentGlobal_UI_HeaderTamplate({ {iconRight} ) : ( { setRightLoading(true); router.push(routerRight); }} > - {iconRight} + {isRightLoading ? ( + + ) : ( + iconRight + )} )} diff --git a/src/app_modules/component_global/ui/ui_layout_tamplate.tsx b/src/app_modules/component_global/ui/ui_layout_tamplate.tsx index 17446934..652254b1 100644 --- a/src/app_modules/component_global/ui/ui_layout_tamplate.tsx +++ b/src/app_modules/component_global/ui/ui_layout_tamplate.tsx @@ -1,10 +1,11 @@ -"use client"; - -import { BackgroundImage, Box, Center, ScrollArea } from "@mantine/core"; +import { + BackgroundImage, + Box, + Container, + Footer, + ScrollArea, +} from "@mantine/core"; import { AccentColor, MainColor } from "../color/color_pallet"; -import ComponentGlobal_HeaderTamplate from "../header_tamplate"; -import ComponentGlobal_UI_HeaderTamplate from "./ui_header_tamplate"; -import { RouterHome } from "@/app/lib/router_hipmi/router_home"; export default function ComponentGlobal_UI_LayoutTamplate({ children, @@ -17,16 +18,13 @@ export default function ComponentGlobal_UI_LayoutTamplate({ }) { return ( <> - + {/* Header */} {header ? ( + - {/* {Array.from({ length: 100 }).map((e, i) => ( - - {i + 1} - - ))} */} {children} {/* Footer */} {footer ? ( - - {footer} + + + {footer} + ) : ( "" diff --git a/src/app_modules/component_global/ui/ui_modal.tsx b/src/app_modules/component_global/ui/ui_modal.tsx new file mode 100644 index 00000000..357f905e --- /dev/null +++ b/src/app_modules/component_global/ui/ui_modal.tsx @@ -0,0 +1,45 @@ +import { Modal, Stack, Title, Group, Button, Box } from "@mantine/core"; +import { MainColor, AccentColor } from "../color/color_pallet"; + +export default function ComponentGlobal_UI_Modal({ + opened, + close, + title, + buttonKiri, + buttonKanan, +}: { + opened: any; + close: any; + title: any; + buttonKiri: any; + buttonKanan: any; +}) { + return ( + <> + { + close(); + }} + centered + withCloseButton={false} + styles={{ + content: { + backgroundColor: MainColor.darkblue, + border: `2px solid ${AccentColor.blue}`, + }, + }} + > + + + {title} + + + {buttonKiri} + {buttonKanan} + + + + + ); +} diff --git a/src/app_modules/forum/detail/main_detail.tsx b/src/app_modules/forum/detail/main_detail.tsx index 1c70379f..48315363 100644 --- a/src/app_modules/forum/detail/main_detail.tsx +++ b/src/app_modules/forum/detail/main_detail.tsx @@ -1,6 +1,6 @@ "use client"; -import { Center, Loader, Stack } from "@mantine/core"; +import { Box, Center, Loader, Stack } from "@mantine/core"; import _ from "lodash"; import { MODEL_FORUM_KOMENTAR, MODEL_FORUM_POSTING } from "../model/interface"; @@ -23,7 +23,7 @@ export default function Forum_MainDetail({ dataPosting: MODEL_FORUM_POSTING; listKomentar: MODEL_FORUM_KOMENTAR[]; userLoginId: string; - countKomentar: number + countKomentar: number; }) { const [data, setData] = useState(dataPosting); const [lsKomentar, setLsKomentar] = useState(listKomentar); @@ -90,34 +90,37 @@ export default function Forum_MainDetail({ "" )} - ( -
- -
- )} - data={lsKomentar} - setData={setLsKomentar} - moreData={async () => { - const loadData = await forum_funGetAllKomentarById({ - postingId: data.id, - page: activePage + 1, - }); - setActivePage((val) => val + 1); + + ( +
+ +
+ )} + data={lsKomentar} + setData={setLsKomentar} + moreData={async () => { + const loadData = await forum_funGetAllKomentarById({ + postingId: data.id, + page: activePage + 1, + }); + setActivePage((val) => val + 1); - return loadData; - }} - > - {(item) => ( - - )} -
+ return loadData; + }} + > + {(item) => ( + + )} +
+
); diff --git a/src/app_modules/forum/main/beranda.tsx b/src/app_modules/forum/main/beranda.tsx index 18968c7f..e3842721 100644 --- a/src/app_modules/forum/main/beranda.tsx +++ b/src/app_modules/forum/main/beranda.tsx @@ -151,7 +151,7 @@ export default function Forum_Beranda({ }} > {loadingCreate ? ( - + ) : ( )} diff --git a/src/app_modules/forum/splash/index.tsx b/src/app_modules/forum/splash/index.tsx index fc828945..195c03db 100644 --- a/src/app_modules/forum/splash/index.tsx +++ b/src/app_modules/forum/splash/index.tsx @@ -1,6 +1,7 @@ "use client"; import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; +import ComponentGlobal_SplashScreen from "@/app_modules/component_global/splash/splash_global"; import ComponentGlobal_UI_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; import { Avatar, @@ -25,20 +26,7 @@ export default function Forum_Splash() { return ( <> - - - - - ); -} - -function ViewSplash() { - return ( - <> - - - - + } /> ); } diff --git a/src/app_modules/home/layout.tsx b/src/app_modules/home/layout.tsx index 06620b75..ba42b607 100644 --- a/src/app_modules/home/layout.tsx +++ b/src/app_modules/home/layout.tsx @@ -58,7 +58,7 @@ export default function HomeLayout({ }) { const router = useRouter(); // const [user, setUser] = useState(dataUser); - const [idLoadingProfil, setIsLoadingProfile] = useState(false); + const [isLoadingProfil, setIsLoadingProfile] = useState(false); const [isLoadingUS, setIsLoadingUS] = useState(false); const [isLoadingBell, setIsLoadingBell] = useState(false); const [isLoadingPage, setIsLoadingPage] = useState(false); @@ -144,7 +144,7 @@ export default function HomeLayout({ }} > {isLoadingUS ? ( - + ) : ( )} @@ -167,12 +167,16 @@ export default function HomeLayout({ }} > {isLoadingBell ? ( - + ) : ( {countNotif}} + label={ + + {countNotif} + + } > @@ -182,7 +186,6 @@ export default function HomeLayout({
{/* Children */} - {/* {Array(10) @@ -201,14 +204,6 @@ export default function HomeLayout({ /> - {/* - {children} - - */} {/* Footer */} {listHalamanFooter.map((e, i) => (
- {isLoadingPage && e.id === pageId ? ( -
- -
- ) : ( - - { - if (dataUser?.Profile === null) { - ComponentGlobal_NotifikasiPeringatan( - "Lengkapi Profile" - ); - } else { - e.link === "" - ? ComponentGlobal_NotifikasiPeringatan( - "Cooming Soon" - ) - : (router.push(e.link), - setIsLoadingPage(true), - setPageId(e?.id)); - } - }} - > - {e.icon} - - - {e.name} - - - )} + + { + if (dataUser?.Profile === null) { + ComponentGlobal_NotifikasiPeringatan( + "Lengkapi Profile" + ); + } else { + e.link === "" + ? ComponentGlobal_NotifikasiPeringatan("Cooming Soon") + : (router.push(e.link), + setIsLoadingPage(true), + setPageId(e?.id)); + } + }} + > + {isLoadingPage && e.id === pageId ? ( + + ) : ( + e.icon + )} + + + {e.name} + +
))}
- {idLoadingProfil ? ( -
- -
- ) : ( -
- { - setIsLoadingProfile(true); - if (dataUser?.Profile === null) { - router.push(RouterProfile.create); - } else { - router.push( - RouterProfile.katalog + `${dataUser.Profile.id}` - ); + { + setIsLoadingProfile(true); + if (dataUser?.Profile === null) { + router.push(RouterProfile.create); + } else { + router.push( + RouterProfile.katalog + `${dataUser.Profile.id}` + ); + } + }} + > + + {dataUser?.Profile === null ? ( + + ) : isLoadingProfil ? ( + + ) : ( + - - {dataUser?.Profile === null ? ( - - ) : ( - - )} - - - Profile - - -
- )} + /> + )} + + + Profile + +
diff --git a/src/app_modules/home/view.tsx b/src/app_modules/home/view.tsx index 04fde044..bd984546 100644 --- a/src/app_modules/home/view.tsx +++ b/src/app_modules/home/view.tsx @@ -47,6 +47,7 @@ export default function HomeView({ const router = useRouter(); const [isLoading, setIsLoading] = useState(false); const [pageId, setPageId] = useState(0); + const [isLoadingJob, setLoadingJob] = useState(false); const listPageOnBox = [ { @@ -140,7 +141,11 @@ export default function HomeView({ variant="transparent" c={e.link === "" ? "gray.3" : "white"} > - {isLoading && e.id === pageId ? : e.icon} + {isLoading && e.id === pageId ? ( + + ) : ( + e.icon + )} {e.name} @@ -173,6 +178,7 @@ export default function HomeView({ "Cooming Soon !!" ); } else { + setLoadingJob(true); return router.push(routePageJob.link); } } @@ -183,7 +189,11 @@ export default function HomeView({ size={40} c={routePageJob.link === "" ? "gray.3" : "white"} > - {routePageJob.icon} + {isLoadingJob ? ( + + ) : ( + routePageJob.icon + )} {routePageJob.name} diff --git a/src/app_modules/job/component/beranda/card_view.tsx b/src/app_modules/job/component/beranda/card_view.tsx new file mode 100644 index 00000000..e93d2da7 --- /dev/null +++ b/src/app_modules/job/component/beranda/card_view.tsx @@ -0,0 +1,70 @@ +"use client"; + +import { RouterJob } from "@/app/lib/router_hipmi/router_job"; +import ComponentGlobal_AuthorNameOnHeader from "@/app_modules/component_global/author_name_on_header"; +import { + MainColor, + AccentColor, +} from "@/app_modules/component_global/color/color_pallet"; +import ComponentGlobal_CardLoadingOverlay from "@/app_modules/component_global/loading_card"; +import { Card, Grid, Center, Text } from "@mantine/core"; +import { MODEL_JOB } from "../../model/interface"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; + +export default function ComponentJob_BerandaCardView({ + data, +}: { + data: MODEL_JOB; +}) { + const router = useRouter(); + const [visible, setVisible] = useState(false); + const [jobId, setJobId] = useState(""); + + return ( + <> + + + + + { + visible ? "" : setJobId(data.id), + setVisible(true), + router.push(RouterJob.main_detail + data.id); + }} + mt={"lg"} + > + + +
+ + {data.title} + +
+
+
+
+ {visible && data.id === jobId ? ( + + ) : ( + "" + )} +
+ + ); +} diff --git a/src/app_modules/job/component/button/create_button.tsx b/src/app_modules/job/component/button/create_button.tsx new file mode 100644 index 00000000..0cffdbf6 --- /dev/null +++ b/src/app_modules/job/component/button/create_button.tsx @@ -0,0 +1,66 @@ +"use client"; + +import { RouterJob } from "@/app/lib/router_hipmi/router_job"; +import { AccentColor } from "@/app_modules/component_global/color/color_pallet"; +import { Affix, rem, ActionIcon, Loader, Box } from "@mantine/core"; +import { IconPencilPlus } from "@tabler/icons-react"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; + +export default function ComponentJob_CreateButton() { + const router = useRouter(); + const [isLoading, setLoading] = useState(false); + + return ( + <> + { + setLoading(true); + router.push(RouterJob.create); + }} + > + {isLoading ? ( + + ) : ( + + )} + + + {/* + { + setLoading(true); + router.push(RouterJob.create); + }} + > + {isLoading ? ( + + ) : ( + + )} + + */} + + ); +} diff --git a/src/app_modules/job/component/card/card_view.tsx b/src/app_modules/job/component/card/card_view.tsx new file mode 100644 index 00000000..610ec98d --- /dev/null +++ b/src/app_modules/job/component/card/card_view.tsx @@ -0,0 +1,59 @@ +"use client"; + +import { + AccentColor, + MainColor, +} from "@/app_modules/component_global/color/color_pallet"; +import { Card, Center, Text } from "@mantine/core"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; +import { MODEL_JOB } from "../../model/interface"; +import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; +import ComponentGlobal_CardLoadingOverlay from "@/app_modules/component_global/loading_card"; + +export default function ComponentJob_CardStatus({ + data, + path, +}: { + data: MODEL_JOB; + path: string; +}) { + const router = useRouter(); + const [visible, setVisible] = useState(false); + + return ( + <> + { + if (path === undefined) { + ComponentGlobal_NotifikasiPeringatan("Path tidak ditemukan"); + } else { + router.push(path + data.id); + setVisible(true); + // visible + // ? "" + // : (setJobId(e?.id), setVisible(true), router.push(path + e?.id)); + } + }} + > + +
+ + {data?.title} + +
+
+ {visible ? : ""} +
+ + ); +} diff --git a/src/app_modules/job/component/card_view_status.tsx b/src/app_modules/job/component/card_view_status.tsx index 26df44e1..2874a806 100644 --- a/src/app_modules/job/component/card_view_status.tsx +++ b/src/app_modules/job/component/card_view_status.tsx @@ -10,6 +10,11 @@ import { RouterJob } from "@/app/lib/router_hipmi/router_job"; import { IconChevronRight } from "@tabler/icons-react"; import { useState } from "react"; import ComponentGlobal_CardLoadingOverlay from "@/app_modules/component_global/loading_card"; +import { + MainColor, + AccentColor, +} from "@/app_modules/component_global/color/color_pallet"; +import ComponentGlobal_IsEmptyData from "@/app_modules/component_global/is_empty_data"; export default function ComponentJob_CardViewStatus({ listData, @@ -25,7 +30,7 @@ export default function ComponentJob_CardViewStatus({ if (_.isEmpty(listData)) return ( <> - + ); @@ -34,6 +39,10 @@ export default function ComponentJob_CardViewStatus({ {listData?.map((e, i) => ( - - - -
- - {e?.title} - -
-
-
+ +
+ + {e?.title} + +
{visible && e?.id === jobId ? ( diff --git a/src/app_modules/job/component/default_value.ts b/src/app_modules/job/component/default_value.ts index 6321e808..c3508021 100644 --- a/src/app_modules/job/component/default_value.ts +++ b/src/app_modules/job/component/default_value.ts @@ -11,14 +11,4 @@ export let defaultDeskripsi = `

+6281 xxx xxx xx

Kirim CV anda melalui email berikut

test-email@gmail.com

-

Atau kunjungi website kami:

-

- -https://www.google.co.id/?hl=id - -

`; diff --git a/src/app_modules/job/component/detail/detail_data.tsx b/src/app_modules/job/component/detail/detail_data.tsx index dc9d9994..dcb09260 100644 --- a/src/app_modules/job/component/detail/detail_data.tsx +++ b/src/app_modules/job/component/detail/detail_data.tsx @@ -3,6 +3,10 @@ import { Card, Stack, Skeleton, Image, Text, Center } from "@mantine/core"; import { MODEL_JOB } from "../../model/interface"; import { RouterJob } from "@/app/lib/router_hipmi/router_job"; +import { + AccentColor, + MainColor, +} from "@/app_modules/component_global/color/color_pallet"; export default function ComponentJob_DetailData({ data, @@ -13,7 +17,16 @@ export default function ComponentJob_DetailData({ <> {/*
{JSON.stringify(data, null, 2)}
*/} {data ? ( - + {data.imagesId ? ( diff --git a/src/app_modules/job/component/is_empty_data.tsx b/src/app_modules/job/component/is_empty_data.tsx index 5f77b03a..cf706ceb 100644 --- a/src/app_modules/job/component/is_empty_data.tsx +++ b/src/app_modules/job/component/is_empty_data.tsx @@ -5,7 +5,7 @@ import { Center } from "@mantine/core"; export default function ComponentJob_IsEmptyData({ text }: { text: string }) { return ( <> -
+
{text}
diff --git a/src/app_modules/job/create/layout.tsx b/src/app_modules/job/create/layout.tsx index 5e57cbfa..5b6760db 100644 --- a/src/app_modules/job/create/layout.tsx +++ b/src/app_modules/job/create/layout.tsx @@ -1,9 +1,8 @@ "use client"; -import { AppShell } from "@mantine/core"; +import ComponentGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import ComponentGlobal_UI_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; import React from "react"; -import ComponentJob_HeaderTamplate from "../component/header_tamplate"; -import AppComponentGlobal_LayoutTamplate from "@/app_modules/component_global/component_layout_tamplate"; export default function LayoutJob_Create({ children, @@ -12,11 +11,11 @@ export default function LayoutJob_Create({ }) { return ( <> - } + } > {children} - + ); } diff --git a/src/app_modules/job/create/view.tsx b/src/app_modules/job/create/view.tsx index 5684f001..b2c5fe50 100644 --- a/src/app_modules/job/create/view.tsx +++ b/src/app_modules/job/create/view.tsx @@ -27,20 +27,22 @@ const ReactQuill = dynamic( { ssr: false } ); +import { RouterJob } from "@/app/lib/router_hipmi/router_job"; +import ComponentGlobal_BoxInformation from "@/app_modules/component_global/box_information"; +import { + AccentColor, + MainColor, +} from "@/app_modules/component_global/color/color_pallet"; import ComponentGlobal_InputCountDown from "@/app_modules/component_global/input_countdown"; -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; +import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; +import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; +import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif_to_admin"; import mqtt_client from "@/util/mqtt_client"; import { useShallowEffect } from "@mantine/hooks"; import { defaultDeskripsi, defaultSyarat } from "../component/default_value"; -import ComponentJob_NotedBox from "../component/detail/noted_box"; -import { MODEL_JOB } from "../model/interface"; import { Job_funCreate } from "../fun/create/fun_create"; -import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif_to_admin"; -import { RouterJob } from "@/app/lib/router_hipmi/router_job"; -import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; -import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; -import { MODEL_NOTIFIKASI } from "@/app_modules/notifikasi/model/interface"; +import { MODEL_JOB } from "../model/interface"; export default function Job_Create() { const [value, setValue] = useState({ @@ -56,23 +58,14 @@ export default function Job_Create() { if (window && window.document) setReload(true); }, []); - if (!reload) - return ( - <> -
- -
- - ); - return ( <> {!reload ? (
- +
) : ( - + {images ? ( @@ -110,11 +103,13 @@ export default function Job_Create() { > {(props) => ( @@ -122,10 +117,23 @@ export default function Job_Create() { - + - + - + Syarat & Ketentuan {" "} @@ -150,6 +158,9 @@ export default function Job_Create() { - + Deskripsi {" "} @@ -184,6 +195,9 @@ export default function Job_Create() { - + + } + buttonKanan={ + + } + /> + - - - - - + {/* HAPUS */} + {/* + + + Yakin ingin menghapus ini ? + + + + + + + */} - + {/* AJUKAN KEMBALI */} + {/* { + setAjukan(false); + }} + centered + withCloseButton={false} + styles={{ + content: { + backgroundColor: MainColor.darkblue, + border: `2px solid ${AccentColor.blue}`, + }, + }} + > + + + Anda yakin akan melakukan pengajuan review kembali ? + + + + + + + */} + + {/* Ajukan */} + setAjukan(false)} + title={" Anda sudah yakin akan melakukan pengajuan review kembali ?"} + buttonKiri={ + + } + buttonKanan={ + + } + /> + + {/* Hapus */} + close()} + title={"Anda yakin ingin menghapus ?"} + buttonKiri={ + + } + buttonKanan={ + + } + /> + + + + + + */} + + close()} + title={ + " Mengarsipkan akan menghilangkan info lowongan kerja dari beranda, anda yakin ?" + } + buttonKiri={ + + } + buttonKanan={ + + } + /> + - - - - - + close()} + title={" Anda yakin ingin menghapus ?"} + buttonKiri={ + + } + buttonKanan={ + + } + /> - + {/* + + + Yakin ingin menghapus ini ? + + + + + + + */} + + + } + buttonKanan={ + + } + /> + @@ -133,8 +130,21 @@ export default function Job_Edit({ dataJob }: { dataJob: MODEL_JOB }) { - + - + Syarat & Ketentuan {" "} @@ -158,6 +168,9 @@ export default function Job_Edit({ dataJob }: { dataJob: MODEL_JOB }) { - + Deskripsi {" "} @@ -192,6 +205,9 @@ export default function Job_Edit({ dataJob }: { dataJob: MODEL_JOB }) { - + - Anda yakin menyimpan data ini ? + + Anda yakin menyimpan data ini ? + - - - - - {/* - - */} - + { + setLoading(false); + setOpened(false); + }} + radius={50} + > + Batal + + } + buttonKanan={ + + } + opened={opened} + close={() => setOpened(false)} + /> + + + { + setOpened(true); + }} + > + + + + Keluar + + ); } diff --git a/src/app_modules/auth/register/view.tsx b/src/app_modules/auth/register/view.tsx index 59dd2e1f..3eeec6e2 100644 --- a/src/app_modules/auth/register/view.tsx +++ b/src/app_modules/auth/register/view.tsx @@ -66,7 +66,7 @@ export default function Register({ dataOtp }: { dataOtp: any }) { if (val.status === 200) { ComponentGlobal_NotifikasiBerhasil(res.message); setLoading(true); - router.push(RouterHome.main_home); + router.push(RouterHome.main_home, { scroll: false }); } else { ComponentGlobal_NotifikasiPeringatan(val.message); } diff --git a/src/app_modules/auth/validasi/view.tsx b/src/app_modules/auth/validasi/view.tsx index 2b729418..83c32c8d 100644 --- a/src/app_modules/auth/validasi/view.tsx +++ b/src/app_modules/auth/validasi/view.tsx @@ -48,7 +48,7 @@ export default function Validasi({ dataOtp }: { dataOtp: any }) { if (res.role === "1") { ComponentGlobal_NotifikasiBerhasil(res.message); setLoading(true); - router.push(RouterHome.main_home); + router.push(RouterHome.main_home, {scroll: false}); } else { router.push(RouterAdminDashboard.splash_admin); } diff --git a/src/app_modules/component_global/ui/ui_drawer.tsx b/src/app_modules/component_global/ui/ui_drawer.tsx index ccbd53fe..7a52b0a7 100644 --- a/src/app_modules/component_global/ui/ui_drawer.tsx +++ b/src/app_modules/component_global/ui/ui_drawer.tsx @@ -12,6 +12,12 @@ import { MainColor, AccentColor } from "../color/color_pallet"; import React from "react"; import { useRouter } from "next/navigation"; +interface MODEL_DRAWER { + id: string; + name: string; + icon: string; + path: string; +} export default function ComponentGlobal_UI_Drawer({ opened, close, @@ -19,7 +25,7 @@ export default function ComponentGlobal_UI_Drawer({ }: { opened: boolean; close: () => void; - component: any[]; + component: MODEL_DRAWER[] | any[]; }) { const router = useRouter(); return ( @@ -32,10 +38,16 @@ export default function ComponentGlobal_UI_Drawer({ withCloseButton={false} styles={{ content: { + padding: 0, + position: "absolute", + margin: "auto", backgroundColor: "transparent", + left: 0, + right: 0, + width: 500, }, body: { - backgroundColor: MainColor.darkblue, + backgroundColor: AccentColor.darkblue, borderTop: `2px solid ${AccentColor.blue}`, borderRight: `1px solid ${AccentColor.blue}`, borderLeft: `1px solid ${AccentColor.blue}`, @@ -51,7 +63,7 @@ export default function ComponentGlobal_UI_Drawer({ - + {component.map((e, i) => ( {e.icon} - {e.name} + + {e.name} + ))} diff --git a/src/app_modules/component_global/ui/ui_layout_tamplate.tsx b/src/app_modules/component_global/ui/ui_layout_tamplate.tsx index d9823a7a..d7cce1d6 100644 --- a/src/app_modules/component_global/ui/ui_layout_tamplate.tsx +++ b/src/app_modules/component_global/ui/ui_layout_tamplate.tsx @@ -27,11 +27,12 @@ export default function LayoutGlobal_UI_Tamplate({ h={"100%"} style={{ overflowY: "auto", + overflowX: "auto", backgroundColor: MainColor.black, position: "fixed", }} > - + Tunggu Konfirmasi Admin ! - +
diff --git a/src/app_modules/job/detail/draft/layout.tsx b/src/app_modules/job/detail/draft/layout.tsx index 90dc406a..4d322916 100644 --- a/src/app_modules/job/detail/draft/layout.tsx +++ b/src/app_modules/job/detail/draft/layout.tsx @@ -14,7 +14,7 @@ import { } from "@mantine/core"; import React from "react"; import ComponentJob_HeaderTamplate from "../../component/header_tamplate"; -import { IconDots, IconEdit, IconX } from "@tabler/icons-react"; +import { IconDots, IconDotsVertical, IconEdit, IconX } from "@tabler/icons-react"; import { RouterJob } from "@/app/lib/router_hipmi/router_job"; import AppComponentGlobal_LayoutTamplate from "@/app_modules/component_global/component_layout_tamplate"; import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; @@ -54,7 +54,7 @@ export default function LayoutJob_DetailDraft({ title="Detail Draft" iconRight={ open()}> - + } // routerRight={} diff --git a/src/app_modules/katalog/component/button_header_right.tsx b/src/app_modules/katalog/component/button_header_right.tsx new file mode 100644 index 00000000..dc0bdd32 --- /dev/null +++ b/src/app_modules/katalog/component/button_header_right.tsx @@ -0,0 +1,44 @@ +"use client"; + +import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; +import ComponentGlobal_UI_Drawer from "@/app_modules/component_global/ui/ui_drawer"; +import { ActionIcon, Box } from "@mantine/core"; +import { useDisclosure } from "@mantine/hooks"; +import { + IconDots, + IconDotsVertical, + IconEdit, + IconPhotoEdit, + IconPolaroid, +} from "@tabler/icons-react"; +import { ComponentKatalog_DrawerKatalog } from "./drawer_katalog"; + +export function ComponentKatalog_ButtonHeaderRight({ + profileId, + userLoginId, + authorId, +}: { + profileId: string; + userLoginId: string; + authorId: string; +}) { + const [opened, { open, close }] = useDisclosure(); + + return ( + <> + {authorId !== userLoginId ? ( + + ) : ( + open()}> + + + )} + + close()} + profileId={profileId} + /> + + ); +} diff --git a/src/app_modules/katalog/component/drawer_katalog.tsx b/src/app_modules/katalog/component/drawer_katalog.tsx new file mode 100644 index 00000000..135837f0 --- /dev/null +++ b/src/app_modules/katalog/component/drawer_katalog.tsx @@ -0,0 +1,118 @@ +import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; +import Component_Logout from "@/app_modules/auth/logout/view"; +import { AccentColor } from "@/app_modules/component_global/color/color_pallet"; +import ComponentGlobal_UI_Loader from "@/app_modules/component_global/ui/ui_loader"; +import { + ActionIcon, + Drawer, + Group, + SimpleGrid, + Stack, + Text, +} from "@mantine/core"; +import { + IconEdit, + IconLogout, + IconLogout2, + IconPhotoEdit, + IconPolaroid, + IconX, +} from "@tabler/icons-react"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; + +export function ComponentKatalog_DrawerKatalog({ + opened, + close, + profileId, +}: { + opened: boolean; + close: () => void; + profileId: string; +}) { + const router = useRouter(); + const [pageId, setPageId] = useState(""); + const [isLoading, setIsLoading] = useState(false); + + const listPage = [ + { + id: "1", + name: "Edit profile", + icon: , + path: RouterProfile.edit + profileId, + }, + { + id: "2", + name: "Ubah Foto Profile", + icon: , + path: RouterProfile.update_foto_profile + profileId, + }, + { + id: "3", + name: "Ubah Latar Belakang", + icon: , + path: RouterProfile.update_foto_background + profileId, + }, + ]; + + return ( + <> + close()} + position={"bottom"} + size={"auto"} + withCloseButton={false} + styles={{ + content: { + padding: 0, + position: "absolute", + margin: "auto", + backgroundColor: "transparent", + left: 0, + right: 0, + width: 500, + }, + body: { + backgroundColor: AccentColor.darkblue, + borderTop: `2px solid ${AccentColor.blue}`, + borderRight: `1px solid ${AccentColor.blue}`, + borderLeft: `1px solid ${AccentColor.blue}`, + borderRadius: "20px 20px 0px 0px", + color: "white", + paddingBottom: "5%", + }, + }} + > + + + + + + + + {listPage.map((e, i) => ( + + { + router.push(e.path); + setPageId(e?.id); + setIsLoading(true) + }} + > + {isLoading && e.id === pageId ? : e.icon} + + + {e.name} + + + ))} + + + + + + ); +} diff --git a/src/app_modules/katalog/index.ts b/src/app_modules/katalog/index.ts index 215b6612..c95adbb5 100644 --- a/src/app_modules/katalog/index.ts +++ b/src/app_modules/katalog/index.ts @@ -1,3 +1,4 @@ import HeaderTransparent from "./component/header_transparent"; -export {HeaderTransparent as headerTransparent} \ No newline at end of file +export { HeaderTransparent as headerTransparent }; +export { Katalog_MainView } from "./view_katalog"; diff --git a/src/app_modules/katalog/main/index.ts b/src/app_modules/katalog/main/index.ts index e1ebf6e6..d45aca2e 100644 --- a/src/app_modules/katalog/main/index.ts +++ b/src/app_modules/katalog/main/index.ts @@ -1,4 +1,4 @@ -import KatalogView from "./view"; +import KatalogView from "./view_katalog"; import KatalogLayout from "./layout"; export {KatalogView, KatalogLayout} \ No newline at end of file diff --git a/src/app_modules/katalog/main/layout.tsx b/src/app_modules/katalog/main/layout.tsx index f6707ee2..c20e6148 100644 --- a/src/app_modules/katalog/main/layout.tsx +++ b/src/app_modules/katalog/main/layout.tsx @@ -1,103 +1,38 @@ "use client"; -import { Logout } from "@/app_modules/auth"; -import { - ActionIcon, - AppShell, - Group, - Header, - Text, - Title, -} from "@mantine/core"; -import { - IconUserSearch, - IconAward, - IconQrcode, - IconArrowLeft, - IconPencilPlus, - IconChevronLeft, - IconDashboard, -} from "@tabler/icons-react"; -import { useRouter } from "next/navigation"; -import ComponentKatalog_HeaderTamplate from "../component/header_tamplate"; -import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; -import { RouterHome } from "@/app/lib/router_hipmi/router_home"; -import { title } from "process"; -import { RouterAdminDashboard } from "@/app/lib/router_hipmi/router_admin"; -import AppComponentGlobal_LayoutTamplate from "@/app_modules/component_global/component_layout_tamplate"; +import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import { ComponentKatalog_ButtonHeaderRight } from "../component/button_header_right"; export default function KatalogLayout({ children, profileId, + userLoginId, + authorId, }: { children: any; profileId: any; + userLoginId: string; + authorId: string; }) { - const router = useRouter(); - return ( <> - - - { - router.back(); - }} - > - - - - Katalog - - - {/* router.push(RouterAdminDashboard.splash_admin)} - > - - */} - - + + } + /> } > {children} - - - ); - - return ( - <> - - - { - router.back(); - }} - > - - - - Katalog - - - {/* router.push(RouterAdminDashboard.splash_admin)} - > - - */} - - - } - > - {children} - + ); } diff --git a/src/app_modules/katalog/main/view.tsx b/src/app_modules/katalog/main/view.tsx deleted file mode 100644 index ae6263ce..00000000 --- a/src/app_modules/katalog/main/view.tsx +++ /dev/null @@ -1,49 +0,0 @@ -"use client"; - -import { Warna } from "@/app/lib/warna"; -import { - ActionIcon, - BackgroundImage, - Box, - Center, - Flex, - Grid, - Group, - Image, - Paper, - Stack, - Text, -} from "@mantine/core"; -import { ProfileView } from "../profile"; -import { ListPortofolioView } from "../portofolio"; -import { MODEL_PROFILE_OLD } from "@/app_modules/home/model/user_profile"; -import { MODEL_PORTOFOLIO_Lama } from "@/app_modules/model_global/portofolio"; -import User_Logout from "@/app_modules/auth/logout/view"; -import { MODEL_PORTOFOLIO } from "../portofolio/model/interface"; -import { MODEL_PROFILE } from "../profile/model/interface"; - -export default function KatalogView({ - profile, - listPorto, - userLoginId, -}: { - profile: MODEL_PROFILE; - listPorto: MODEL_PORTOFOLIO; - userLoginId: string; -}) { - return ( - <> - - - - - {profile?.User.id === userLoginId ? : ""} - - - - ); -} diff --git a/src/app_modules/katalog/main/view_katalog.tsx b/src/app_modules/katalog/main/view_katalog.tsx new file mode 100644 index 00000000..d8eb6f19 --- /dev/null +++ b/src/app_modules/katalog/main/view_katalog.tsx @@ -0,0 +1,33 @@ +"use client"; + +import Component_Logout from "@/app_modules/auth/logout/view"; +import { + Stack +} from "@mantine/core"; +import { MODEL_PORTOFOLIO } from "../portofolio/model/interface"; +import { Portofolio_UiView } from "../portofolio/ui_portofolio"; +import { MODEL_PROFILE } from "../profile/model/interface"; +import { Profile_UiView } from "../profile/ui_profile"; + +export default function KatalogView({ + profile, + listPorto, + userLoginId, +}: { + profile: MODEL_PROFILE; + listPorto: MODEL_PORTOFOLIO; + userLoginId: string; +}) { + return ( + <> + + + + + + ); +} diff --git a/src/app_modules/katalog/portofolio/create/view.tsx b/src/app_modules/katalog/portofolio/create/view.tsx index 33326b5d..b690a15b 100644 --- a/src/app_modules/katalog/portofolio/create/view.tsx +++ b/src/app_modules/katalog/portofolio/create/view.tsx @@ -1,8 +1,11 @@ "use client"; -import { myConsole } from "@/app/fun/my_console"; -import { ApiHipmi } from "@/app/lib/api"; import { Warna } from "@/app/lib/warna"; +import ComponentGlobal_ErrorInput from "@/app_modules/component_global/error_input"; +import ComponentGlobal_InputCountDown from "@/app_modules/component_global/input_countdown"; +import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; +import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; +import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; import { BIDANG_BISNIS_OLD, MODEL_PORTOFOLIO_OLD, @@ -16,25 +19,16 @@ import { Paper, Select, Stack, - Text, TextInput, - Textarea, - Title, + Textarea } from "@mantine/core"; +import { IconCamera } from "@tabler/icons-react"; import _ from "lodash"; +import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime"; import { useRouter } from "next/navigation"; import { useState } from "react"; -import toast from "react-simple-toasts"; -import funCreatePortofolio from "../fun/fun_create_portofolio"; -import { IconCamera } from "@tabler/icons-react"; import ComponentKatalog_NotedBox from "../../component/noted_box"; -import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime"; -import { NotifPeringatan } from "@/app_modules/donasi/component/notifikasi/notif_peringatan"; -import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; -import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; -import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; -import ComponentGlobal_ErrorInput from "@/app_modules/component_global/error_input"; -import ComponentGlobal_InputCountDown from "@/app_modules/component_global/input_countdown"; +import funCreatePortofolio from "../fun/fun_create_portofolio"; export default function CreatePortofolio({ bidangBisnis, diff --git a/src/app_modules/katalog/portofolio/list_view/view.tsx b/src/app_modules/katalog/portofolio/list_view/view.tsx index 9906372b..f6efd726 100644 --- a/src/app_modules/katalog/portofolio/list_view/view.tsx +++ b/src/app_modules/katalog/portofolio/list_view/view.tsx @@ -42,7 +42,6 @@ export default function ListPortofolioView({ userLoginId: string; }) { const router = useRouter(); - // const [porto, setPorto] = useState(listPorto); const [loading, setLoading] = useState(false); const [loadingPorto, setLoadingPorto] = useState(false); const [idPorto, setIdPorto] = useState(""); diff --git a/src/app_modules/katalog/portofolio/ui_portofolio.tsx b/src/app_modules/katalog/portofolio/ui_portofolio.tsx new file mode 100644 index 00000000..0b04792b --- /dev/null +++ b/src/app_modules/katalog/portofolio/ui_portofolio.tsx @@ -0,0 +1,141 @@ +import { useRouter } from "next/navigation"; +import { MODEL_PROFILE } from "../profile/model/interface"; +import { MODEL_PORTOFOLIO } from "./model/interface"; +import { useState } from "react"; +import { RouterPortofolio } from "@/app/lib/router_hipmi/router_katalog"; +import { Warna } from "@/app/lib/warna"; +import { + Paper, + Stack, + Group, + ActionIcon, + Title, + Box, + ScrollArea, + Center, + SimpleGrid, + Grid, + Loader, + Text, +} from "@mantine/core"; +import { IconPencilPlus, IconCaretRight } from "@tabler/icons-react"; +import _ from "lodash"; +import { + AccentColor, + MainColor, +} from "@/app_modules/component_global/color/color_pallet"; +import ComponentGlobal_UI_Loader from "@/app_modules/component_global/ui/ui_loader"; + +export function Portofolio_UiView({ + listPorto, + profile, + userLoginId, +}: { + listPorto: MODEL_PORTOFOLIO[]; + profile: MODEL_PROFILE; + userLoginId: string; +}) { + const router = useRouter(); + const [loading, setLoading] = useState(false); + const [loadingPorto, setLoadingPorto] = useState(false); + const [idPorto, setIdPorto] = useState(""); + return ( + <> + + + + + Portofolio + {profile?.User.id === userLoginId ? ( + { + router.push(RouterPortofolio.create + `${profile.id}`); + setLoading(true); + }} + > + {loading ? ( + + ) : ( + + )} + + ) : ( + + )} + + + + {_.isEmpty(listPorto) ? ( +
+ + - Belum Ada Portofolio - + +
+ ) : ( + + {listPorto.map((e, i) => ( + { + setIdPorto(e?.id); + setLoadingPorto(true); + router.push(`/dev/portofolio/main/${e?.id}/`); + }} + > + + + + {e?.namaBisnis} + + + + + {idPorto === e?.id && loadingPorto ? ( + + ) : ( + + )} + + + + + ))} + + )} +
+
+
+
+ + ); +} diff --git a/src/app_modules/katalog/profile/edit/view.tsx b/src/app_modules/katalog/profile/edit/view.tsx index ff14742e..51793b8e 100644 --- a/src/app_modules/katalog/profile/edit/view.tsx +++ b/src/app_modules/katalog/profile/edit/view.tsx @@ -1,25 +1,17 @@ "use client"; -import { myConsole } from "@/app/fun/my_console"; -import { ApiHipmi } from "@/app/lib/api"; import { Warna } from "@/app/lib/warna"; import { Button, Loader, Select, Stack, TextInput } from "@mantine/core"; -import { useShallowEffect } from "@mantine/hooks"; -import { useAtom } from "jotai"; import _ from "lodash"; import { useRouter } from "next/navigation"; import { useState } from "react"; -import toast from "react-simple-toasts"; -import funEditProfile from "../fun/fun_edit_profile"; +import ComponentGlobal_ErrorInput from "@/app_modules/component_global/error_input"; import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; -import { MODEL_PROFILE } from "../model/interface"; -import { Profile_funEditById } from "../fun/update/fun_edit_profile_by_id"; -import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; import { validRegex } from "../../component/regular_expressions"; -import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; -import ComponentGlobal_ErrorInput from "@/app_modules/component_global/error_input"; +import { Profile_funEditById } from "../fun/update/fun_edit_profile_by_id"; +import { MODEL_PROFILE } from "../model/interface"; export default function EditProfile({ data }: { data: MODEL_PROFILE }) { const router = useRouter(); diff --git a/src/app_modules/katalog/profile/fun/get/get_one_user_profile.ts b/src/app_modules/katalog/profile/fun/get/get_one_user_profile.ts index 68a34ee7..9403b99a 100644 --- a/src/app_modules/katalog/profile/fun/get/get_one_user_profile.ts +++ b/src/app_modules/katalog/profile/fun/get/get_one_user_profile.ts @@ -8,21 +8,18 @@ export async function Profile_getOneProfileAndUserById(profileId: string) { id: profileId, }, select: { - userId: true, - User: true, - id: true, - name: true, - email: true, - alamat: true, - jenisKelamin: true, - imagesId: true, - imagesBackgroundId: true, - ImageProfile: true, - ImagesBackground: true - - - - } + userId: true, + User: true, + id: true, + name: true, + email: true, + alamat: true, + jenisKelamin: true, + imagesId: true, + imagesBackgroundId: true, + ImageProfile: true, + ImagesBackground: true, + }, }); // console.log(data) return data; diff --git a/src/app_modules/katalog/profile/index.ts b/src/app_modules/katalog/profile/index.ts index 2590cf5e..b23c734c 100644 --- a/src/app_modules/katalog/profile/index.ts +++ b/src/app_modules/katalog/profile/index.ts @@ -2,18 +2,12 @@ import ProfileLayout from "./create/layout"; import CreateProfile from "./create/view"; import EditProfileLayout from "./edit/layout"; import EditProfileView from "./edit/view"; +import ProfileView from "./main/view_profile"; import UploadFotoProfile from "./upload/foto_profile"; -import UploadFotoProfileLayout from "./upload/foto_profile/layout" -import ProfileView from "./main/view"; -import Profile_UpdateFotoBackground from "./upload/foto_background"; -import LayoutProfile_UpdateFotoBackground from "./upload/foto_background/layout"; +import UploadFotoProfileLayout from "./upload/foto_profile/layout"; export { - ProfileLayout, - CreateProfile, - EditProfileView, - EditProfileLayout, - UploadFotoProfile, - UploadFotoProfileLayout, - ProfileView + CreateProfile, EditProfileLayout, EditProfileView, ProfileLayout, ProfileView, UploadFotoProfile, + UploadFotoProfileLayout }; + diff --git a/src/app_modules/katalog/profile/main/view.tsx b/src/app_modules/katalog/profile/main/view_profile.tsx similarity index 96% rename from src/app_modules/katalog/profile/main/view.tsx rename to src/app_modules/katalog/profile/main/view_profile.tsx index 0a25fdf7..b8d0a8c4 100644 --- a/src/app_modules/katalog/profile/main/view.tsx +++ b/src/app_modules/katalog/profile/main/view_profile.tsx @@ -31,6 +31,7 @@ import { useState } from "react"; import { MODEL_PROFILE_OLD } from "@/app_modules/home/model/user_profile"; import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; import { MODEL_PROFILE } from "../model/interface"; +import { AccentColor, MainColor } from "@/app_modules/component_global/color/color_pallet"; export default function ProfileView({ profile, @@ -44,16 +45,14 @@ export default function ProfileView({ const [loadingBG, setLoadingBG] = useState(false); const [loadingEdit, setLoadingEdit] = useState(false); - // const [data, setData] = useState(profile); - // useShallowEffect(() => { - // funGetUserProfile(user.id ?? "").then(setProfile as any); - // }, []); - // if (!profile) return <>; return ( <> {/*
{JSON.stringify(profile, null,2)}
*/} - + {/* Background dan foto */} {/* Upload Background Profile */} diff --git a/src/app_modules/katalog/profile/ui_profile.tsx b/src/app_modules/katalog/profile/ui_profile.tsx new file mode 100644 index 00000000..541ab28d --- /dev/null +++ b/src/app_modules/katalog/profile/ui_profile.tsx @@ -0,0 +1,156 @@ +"use client"; + +import { + MainColor, + AccentColor, +} from "@/app_modules/component_global/color/color_pallet"; +import { + Avatar, + Box, + Center, + Group, + Image, + Paper, + Stack, + Text, + ThemeIcon, +} from "@mantine/core"; +import { MODEL_PROFILE } from "./model/interface"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; +import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog"; +import { + IconBrandGmail, + IconGenderFemale, + IconGenderMale, + IconHome, + IconPhone, +} from "@tabler/icons-react"; + +export function Profile_UiView({ + profile, + userLoginId, +}: { + profile: MODEL_PROFILE; + userLoginId: string; +}) { + const router = useRouter(); + const [loadingPP, setLoadingPP] = useState(false); + const [loadingBG, setLoadingBG] = useState(false); + const [loadingEdit, setLoadingEdit] = useState(false); + + const listInformation = [ + { + icon: , + value: profile?.User.nomor, + }, + { + icon: , + value: profile?.email, + }, + { + icon: , + value: profile?.alamat, + }, + { + icon: + profile.jenisKelamin === "Laki-laki" ? ( + + ) : ( + + ), + value: profile?.jenisKelamin, + }, + ]; + + return ( + <> + + + Background + +
+ +
+ + + {profile?.name} + + + @{profile?.User?.username} + + +
+
+ + + + {listInformation.map((e, i) => ( + + + {e.icon} + + + {e?.value} + + + ))} + + + {/*
+          {JSON.stringify(profile, null, 2)}
+        
*/} +
+ + ); +} diff --git a/src/app_modules/katalog/ui/ui_katalog.tsx b/src/app_modules/katalog/ui/ui_katalog.tsx new file mode 100644 index 00000000..bee69dbe --- /dev/null +++ b/src/app_modules/katalog/ui/ui_katalog.tsx @@ -0,0 +1,31 @@ +"use client" + +import { Stack } from "@mantine/core"; +import { Portofolio_UiView } from "../portofolio/ui_portofolio"; +import { Profile_UiView } from "../profile/ui_profile"; +import { MODEL_PORTOFOLIO } from "../portofolio/model/interface"; +import { MODEL_PROFILE } from "../profile/model/interface"; + + +export function Katalog_UiView({ + profile, + listPorto, + userLoginId, +}: { + profile: MODEL_PROFILE; + listPorto: MODEL_PORTOFOLIO; + userLoginId: string; +}) { + return ( + <> + + + + + + ); +} \ No newline at end of file diff --git a/src/app_modules/katalog/view_katalog.tsx b/src/app_modules/katalog/view_katalog.tsx new file mode 100644 index 00000000..5829b0a3 --- /dev/null +++ b/src/app_modules/katalog/view_katalog.tsx @@ -0,0 +1,23 @@ +import { MODEL_PORTOFOLIO } from "./portofolio/model/interface"; +import { MODEL_PROFILE } from "./profile/model/interface"; +import { Katalog_UiView } from "./ui/ui_katalog"; + +export async function Katalog_MainView({ + profile, + listPorto, + userLoginId, +}: { + profile: MODEL_PROFILE; + listPorto: MODEL_PORTOFOLIO; + userLoginId: string; +}) { + return ( + <> + + + ); +} diff --git a/src/app_modules/zCoba/index.tsx b/src/app_modules/zCoba/index.tsx index 50213dba..e38bc529 100644 --- a/src/app_modules/zCoba/index.tsx +++ b/src/app_modules/zCoba/index.tsx @@ -2,36 +2,16 @@ import { ActionIcon, - Affix, - BackgroundImage, Box, Button, - Center, - Group, - LoadingOverlay, - Paper, - ScrollArea, - SimpleGrid, - Skeleton, - Stack, - Text, - rem, + Stack } from "@mantine/core"; import { useState } from "react"; -import useInfiniteScroll, { - ScrollDirection, -} from "react-easy-infinite-scroll-hook"; -import { createItems, loadMore } from "./utils"; -import { v4 as uuidv4 } from "uuid"; -import { useShallowEffect } from "@mantine/hooks"; -import { ScrollOnly } from "next-scroll-loader"; +import { IconPencilPlus } from "@tabler/icons-react"; import _ from "lodash"; -import ComponentGlobal_V2_LoadingPage from "../component_global/loading_page_v2"; import LayoutGlobal_UI_Tamplate from "../component_global/ui/ui_layout_tamplate"; -import LayoutGlobal_UI_HeaderTamplate from "../component_global/ui/ui_header_tamplate"; -import { Icon123, IconPencilPlus, IconX } from "@tabler/icons-react"; -import { AccentColor, MainColor } from "../component_global/color/color_pallet"; + const newData = Array(20) .fill(0) @@ -56,49 +36,16 @@ const data2 = [ ]; export default function Coba_TestLoading() { - // const [data, setData] = useState(newData); - // const [isLoading, setIsLoading] = useState(false); - - // return ( - // <> - // { - // const newData = Array.from( - // { length: 50 }, - // (_, i) => i + data.length + 1 - // ); - // await new Promise((resolve) => setTimeout(resolve, 2000)); - // return newData; - // }} - // > - // {(item) =>
{item}
} - //
- // - // ); - const [data, setData] = useState(data2); + const [openDrawer, setOpenDrawer] = useState(false); return ( <> - + {/* */} + - - ); - return ( - <> - - {Array(50) - .fill(0) - .map((e, i) => ( - {i + 1} - ))} - - ); @@ -174,71 +121,3 @@ function CreateButton() { ); } - -function BackgroundImageComponent() { - const footer = ( - - {Array.from({ length: 4 }).map((e, i) => ( -
- - - - - Apa - -
- ))} -
- ); - return ( - <> - - {/* Header */} - - - - - {/* Children */} - - - {Array.from({ length: 10 }).map((e, i) => ( - - {i + 1} - - ))} - - - - {/* Footer */} - - - {footer} - - - - - ); -} From ab6f2fe8a75e479e21967e868f87fa6bdf336c3c Mon Sep 17 00:00:00 2001 From: Bagasbanuna02 Date: Wed, 10 Jul 2024 17:07:41 +0800 Subject: [PATCH 11/17] #style: UI Katalog Deskripsi: - UI Katalog selesai - UI Portofolio selesai - UI Profile selesa ## NO Isuuee --- .../55409a1f-8d3d-455a-b5bf-10cd64eda28b.png | Bin 0 -> 6638 bytes .../a7ebdb61-1200-45b3-b868-ed9cc811c8b8.png | Bin 0 -> 5200 bytes .../c457514a-9b0b-48b8-8ae6-2d903f8964bc.jpg | Bin 0 -> 3755 bytes .../dev/portofolio/create/[id]/loading.tsx | 9 - .../daftar-portofolio/[id]/page.tsx | 17 ++ .../dev/portofolio/edit/data/[id]/loading.tsx | 9 - .../dev/portofolio/edit/logo/[id]/loading.tsx | 9 - .../portofolio/edit/medsos/[id]/loading.tsx | 9 - src/app/dev/portofolio/main/[id]/loading.tsx | 9 - src/app/dev/portofolio/main/[id]/page.tsx | 9 +- src/app/dev/profile/create/loading.tsx | 9 - src/app/dev/profile/edit/[id]/loading.tsx | 9 - .../profile/upload/background/[id]/layout.tsx | 16 +- .../upload/background/[id]/loading.tsx | 9 - .../dev/profile/upload/foto/[id]/layout.tsx | 15 +- .../dev/profile/upload/foto/[id]/loading.tsx | 9 - src/app/lib/router_hipmi/router_katalog.ts | 4 + src/app/zCoba/page.tsx | 2 +- .../component_global/splash/splash_global.tsx | 6 +- .../component_global/ui/ui_drawer.tsx | 40 ++- .../ui/ui_header_tamplate.tsx | 2 +- .../ui/ui_layout_tamplate.tsx | 2 +- src/app_modules/forum/create/layout.tsx | 10 +- .../forum/detail/detail_report_komentar.tsx | 10 +- .../forum/detail/detail_report_posting.tsx | 10 +- src/app_modules/forum/detail/layout.tsx | 10 +- src/app_modules/forum/edit/posting/layout.tsx | 10 +- src/app_modules/forum/forumku/layout.tsx | 10 +- src/app_modules/forum/main/layout.tsx | 10 +- .../forum/report/komentar/layout.tsx | 10 +- .../forum/report/posting/layout.tsx | 10 +- src/app_modules/forum/splash/index.tsx | 2 +- .../home/component/button_header.tsx | 2 +- src/app_modules/home/view_home.tsx | 10 +- src/app_modules/job/create/layout.tsx | 10 +- src/app_modules/job/detail/arsip/layout.tsx | 10 +- src/app_modules/job/detail/draft/layout.tsx | 10 +- src/app_modules/job/detail/main/layout.tsx | 10 +- src/app_modules/job/detail/publish/layout.tsx | 10 +- src/app_modules/job/detail/reject/layout.tsx | 10 +- src/app_modules/job/detail/review/layout.tsx | 10 +- src/app_modules/job/edit/layout.tsx | 10 +- src/app_modules/job/main/layout.tsx | 10 +- src/app_modules/job/non_user_view/layout.tsx | 10 +- src/app_modules/katalog/main/index.ts | 3 +- src/app_modules/katalog/main/layout.tsx | 10 +- src/app_modules/katalog/main/view_katalog.tsx | 33 --- .../portofolio/component/button_delete.tsx | 80 ++++++ .../portofolio/component/button_more.tsx | 64 +++++ .../portofolio/component/card_view_daftar.tsx | 50 ++++ .../katalog/portofolio/create/layout.tsx | 14 +- .../katalog/portofolio/create/view.tsx | 77 +++++- .../katalog/portofolio/edit/data/layout.tsx | 11 +- .../edit/data/{index.tsx => ui_edit_data.tsx} | 58 ++++- .../katalog/portofolio/edit/logo/layout.tsx | 8 +- .../edit/logo/{index.tsx => ui_edit_logo.tsx} | 56 ++-- .../katalog/portofolio/edit/medsos/layout.tsx | 11 +- .../medsos/{index.tsx => ui_edit_medsos.tsx} | 46 +++- .../portofolio/fun/get/get_all_portofolio.tsx | 28 ++ .../portofolio/fun/get/get_list_portofolio.ts | 9 +- .../portofolio/fun/get/get_one_portofolio.ts | 1 + src/app_modules/katalog/portofolio/index.ts | 16 +- .../katalog/portofolio/list_view/view.tsx | 138 ---------- .../katalog/portofolio/main/layout.tsx | 114 --------- .../katalog/portofolio/main/view.tsx | 241 ------------------ .../katalog/portofolio/ui/ui_detail_data.tsx | 75 ++++++ .../katalog/portofolio/ui/ui_detail_logo.tsx | 36 +++ .../katalog/portofolio/ui/ui_detail_media.tsx | 98 +++++++ .../portofolio/ui/ui_detail_portofolio.tsx | 34 +++ .../katalog/portofolio/ui/ui_layout.tsx | 36 +++ .../ui/ui_list_detail_portofolio.tsx | 48 ++++ .../katalog/portofolio/ui_portofolio.tsx | 141 ---------- .../view/view_list_detail_portofolio.tsx | 23 ++ .../katalog/profile/create/layout.tsx | 22 +- .../katalog/profile/create/view.tsx | 68 ++--- .../katalog/profile/edit/layout.tsx | 23 +- src/app_modules/katalog/profile/edit/view.tsx | 36 ++- .../profile/upload/foto_background/index.tsx | 33 ++- .../profile/upload/foto_background/layout.tsx | 30 +-- .../profile/upload/foto_profile/index.tsx | 22 +- .../profile/upload/foto_profile/layout.tsx | 30 +-- src/app_modules/katalog/ui/ui_katalog.tsx | 8 +- .../katalog/ui/ui_list_portofolio.tsx | 146 +++++++++++ .../katalog/{profile => ui}/ui_profile.tsx | 2 +- .../fun/get/get_notifiaksi_by_id.ts | 2 +- .../notifikasi/view_notifikasi.tsx | 10 +- .../user_search/view_user_seach.tsx | 10 +- src/app_modules/zCoba/index.tsx | 6 +- 88 files changed, 1288 insertions(+), 1117 deletions(-) create mode 100644 public/portofolio/logo/55409a1f-8d3d-455a-b5bf-10cd64eda28b.png create mode 100644 public/portofolio/logo/a7ebdb61-1200-45b3-b868-ed9cc811c8b8.png create mode 100644 public/portofolio/logo/c457514a-9b0b-48b8-8ae6-2d903f8964bc.jpg delete mode 100644 src/app/dev/portofolio/create/[id]/loading.tsx create mode 100644 src/app/dev/portofolio/daftar-portofolio/[id]/page.tsx delete mode 100644 src/app/dev/portofolio/edit/data/[id]/loading.tsx delete mode 100644 src/app/dev/portofolio/edit/logo/[id]/loading.tsx delete mode 100644 src/app/dev/portofolio/edit/medsos/[id]/loading.tsx delete mode 100644 src/app/dev/portofolio/main/[id]/loading.tsx delete mode 100644 src/app/dev/profile/create/loading.tsx delete mode 100644 src/app/dev/profile/edit/[id]/loading.tsx delete mode 100644 src/app/dev/profile/upload/background/[id]/loading.tsx delete mode 100644 src/app/dev/profile/upload/foto/[id]/loading.tsx delete mode 100644 src/app_modules/katalog/main/view_katalog.tsx create mode 100644 src/app_modules/katalog/portofolio/component/button_delete.tsx create mode 100644 src/app_modules/katalog/portofolio/component/button_more.tsx create mode 100644 src/app_modules/katalog/portofolio/component/card_view_daftar.tsx rename src/app_modules/katalog/portofolio/edit/data/{index.tsx => ui_edit_data.tsx} (84%) rename src/app_modules/katalog/portofolio/edit/logo/{index.tsx => ui_edit_logo.tsx} (79%) rename src/app_modules/katalog/portofolio/edit/medsos/{index.tsx => ui_edit_medsos.tsx} (75%) create mode 100644 src/app_modules/katalog/portofolio/fun/get/get_all_portofolio.tsx delete mode 100644 src/app_modules/katalog/portofolio/list_view/view.tsx delete mode 100644 src/app_modules/katalog/portofolio/main/layout.tsx delete mode 100644 src/app_modules/katalog/portofolio/main/view.tsx create mode 100644 src/app_modules/katalog/portofolio/ui/ui_detail_data.tsx create mode 100644 src/app_modules/katalog/portofolio/ui/ui_detail_logo.tsx create mode 100644 src/app_modules/katalog/portofolio/ui/ui_detail_media.tsx create mode 100644 src/app_modules/katalog/portofolio/ui/ui_detail_portofolio.tsx create mode 100644 src/app_modules/katalog/portofolio/ui/ui_layout.tsx create mode 100644 src/app_modules/katalog/portofolio/ui/ui_list_detail_portofolio.tsx delete mode 100644 src/app_modules/katalog/portofolio/ui_portofolio.tsx create mode 100644 src/app_modules/katalog/portofolio/view/view_list_detail_portofolio.tsx create mode 100644 src/app_modules/katalog/ui/ui_list_portofolio.tsx rename src/app_modules/katalog/{profile => ui}/ui_profile.tsx (98%) diff --git a/public/portofolio/logo/55409a1f-8d3d-455a-b5bf-10cd64eda28b.png b/public/portofolio/logo/55409a1f-8d3d-455a-b5bf-10cd64eda28b.png new file mode 100644 index 0000000000000000000000000000000000000000..176da5a2d2ca85f6e4d2a0d84abb4b76939769ab GIT binary patch literal 6638 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 literal 0 HcmV?d00001 diff --git a/public/portofolio/logo/a7ebdb61-1200-45b3-b868-ed9cc811c8b8.png b/public/portofolio/logo/a7ebdb61-1200-45b3-b868-ed9cc811c8b8.png new file mode 100644 index 0000000000000000000000000000000000000000..256b64bac61f502a4f9c676b9b92b7e139604d04 GIT binary patch literal 5200 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 literal 0 HcmV?d00001 diff --git a/src/app/dev/portofolio/create/[id]/loading.tsx b/src/app/dev/portofolio/create/[id]/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/portofolio/create/[id]/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/portofolio/daftar-portofolio/[id]/page.tsx b/src/app/dev/portofolio/daftar-portofolio/[id]/page.tsx new file mode 100644 index 00000000..45a30f23 --- /dev/null +++ b/src/app/dev/portofolio/daftar-portofolio/[id]/page.tsx @@ -0,0 +1,17 @@ +import { Portofolio_ViewListDetail } from "@/app_modules/katalog/portofolio"; +import { portofolio_funGetAllDaftarByid } from "@/app_modules/katalog/portofolio/fun/get/get_all_portofolio"; + +export default async function Page({ params }: { params: { id: string } }) { + const profileId = params.id; + const dataPortofolio = await portofolio_funGetAllDaftarByid({ + profileId, + page: 1, + }); + + + return ( + <> + + + ); +} diff --git a/src/app/dev/portofolio/edit/data/[id]/loading.tsx b/src/app/dev/portofolio/edit/data/[id]/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/portofolio/edit/data/[id]/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/portofolio/edit/logo/[id]/loading.tsx b/src/app/dev/portofolio/edit/logo/[id]/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/portofolio/edit/logo/[id]/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/portofolio/edit/medsos/[id]/loading.tsx b/src/app/dev/portofolio/edit/medsos/[id]/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/portofolio/edit/medsos/[id]/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/portofolio/main/[id]/loading.tsx b/src/app/dev/portofolio/main/[id]/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/portofolio/main/[id]/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/portofolio/main/[id]/page.tsx b/src/app/dev/portofolio/main/[id]/page.tsx index 6e18a541..fe44019e 100644 --- a/src/app/dev/portofolio/main/[id]/page.tsx +++ b/src/app/dev/portofolio/main/[id]/page.tsx @@ -4,14 +4,15 @@ import { portofolio_getOneById } from "@/app_modules/katalog/portofolio/fun/get/ export default async function Page({ params }: { params: { id: string } }) { const getPorto = await portofolio_getOneById(params.id); - const userLoginId = await user_getOneUserId() - - + const userLoginId = await user_getOneUserId(); return ( <> {/* {JSON.stringify(getPorto)} */} - + ); } diff --git a/src/app/dev/profile/create/loading.tsx b/src/app/dev/profile/create/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/profile/create/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/profile/edit/[id]/loading.tsx b/src/app/dev/profile/edit/[id]/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/profile/edit/[id]/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/profile/upload/background/[id]/layout.tsx b/src/app/dev/profile/upload/background/[id]/layout.tsx index ff543f33..11f4cf1b 100644 --- a/src/app/dev/profile/upload/background/[id]/layout.tsx +++ b/src/app/dev/profile/upload/background/[id]/layout.tsx @@ -1,8 +1,16 @@ import LayoutProfile_UpdateFotoBackground from "@/app_modules/katalog/profile/upload/foto_background/layout"; import React from "react"; -export default async function Layout({children}: {children: React.ReactNode}) { - return<> - {children} +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + <> + + {children} + -} \ No newline at end of file + ); +} diff --git a/src/app/dev/profile/upload/background/[id]/loading.tsx b/src/app/dev/profile/upload/background/[id]/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/profile/upload/background/[id]/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/dev/profile/upload/foto/[id]/layout.tsx b/src/app/dev/profile/upload/foto/[id]/layout.tsx index b381b860..5613eabd 100644 --- a/src/app/dev/profile/upload/foto/[id]/layout.tsx +++ b/src/app/dev/profile/upload/foto/[id]/layout.tsx @@ -1,9 +1,14 @@ import { UploadFotoProfileLayout } from "@/app_modules/katalog/profile"; import React from "react"; -export default async function Layout({children, params}: {children: React.ReactNode, params: {id: string}}) { - let profileId = params.id - return <> - {children} +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + <> + {children} -} \ No newline at end of file + ); +} diff --git a/src/app/dev/profile/upload/foto/[id]/loading.tsx b/src/app/dev/profile/upload/foto/[id]/loading.tsx deleted file mode 100644 index b1f8b62f..00000000 --- a/src/app/dev/profile/upload/foto/[id]/loading.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; - -export default async function Page() { - return ( - <> - - - ); -} diff --git a/src/app/lib/router_hipmi/router_katalog.ts b/src/app/lib/router_hipmi/router_katalog.ts index 5d5bb8f7..25261c34 100644 --- a/src/app/lib/router_hipmi/router_katalog.ts +++ b/src/app/lib/router_hipmi/router_katalog.ts @@ -19,9 +19,13 @@ export const RouterProfile = { }; export const RouterPortofolio = { + main_detail: "/dev/portofolio/main/", + api_logo_porto: "/api/portofolio/logo/", create: "/dev/portofolio/create/", + daftar_portofolio: "/dev/portofolio/daftar-portofolio/", + //edit edit_data_bisnis: "/dev/portofolio/edit/data/", edit_logo_bisnis: "/dev/portofolio/edit/logo/", diff --git a/src/app/zCoba/page.tsx b/src/app/zCoba/page.tsx index be966c64..5e9b43ce 100644 --- a/src/app/zCoba/page.tsx +++ b/src/app/zCoba/page.tsx @@ -1,5 +1,5 @@ import ComponentGlobal_HeaderTamplate from "@/app_modules/component_global/header_tamplate"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; import Coba_TestLoading from "@/app_modules/zCoba"; import { Text } from "@mantine/core"; diff --git a/src/app_modules/component_global/splash/splash_global.tsx b/src/app_modules/component_global/splash/splash_global.tsx index 2f969605..b4f6e906 100644 --- a/src/app_modules/component_global/splash/splash_global.tsx +++ b/src/app_modules/component_global/splash/splash_global.tsx @@ -1,20 +1,20 @@ "use client"; import { Stack, Loader, ActionIcon, ThemeIcon } from "@mantine/core"; -import LayoutGlobal_UI_Tamplate from "../ui/ui_layout_tamplate"; +import UIGlobal_LayoutTamplate from "../ui/ui_layout_tamplate"; import { IconMessages, IconX } from "@tabler/icons-react"; export default function ComponentGlobal_SplashScreen({ icon }: { icon: any }) { return ( <> - + {icon} - + ); } diff --git a/src/app_modules/component_global/ui/ui_drawer.tsx b/src/app_modules/component_global/ui/ui_drawer.tsx index 7a52b0a7..8a2c077d 100644 --- a/src/app_modules/component_global/ui/ui_drawer.tsx +++ b/src/app_modules/component_global/ui/ui_drawer.tsx @@ -1,16 +1,16 @@ import { - Drawer, - Stack, - Group, ActionIcon, + Drawer, + Group, SimpleGrid, + Stack, Text, - Box, } from "@mantine/core"; -import { IconX, IconEdit } from "@tabler/icons-react"; -import { MainColor, AccentColor } from "../color/color_pallet"; -import React from "react"; +import { IconX } from "@tabler/icons-react"; import { useRouter } from "next/navigation"; +import { useState } from "react"; +import { AccentColor } from "../color/color_pallet"; +import ComponentGlobal_UI_Loader from "./ui_loader"; interface MODEL_DRAWER { id: string; @@ -25,9 +25,19 @@ export default function ComponentGlobal_UI_Drawer({ }: { opened: boolean; close: () => void; - component: MODEL_DRAWER[] | any[]; + component: + | { + id: string; + name: string; + icon: string; + path: string; + }[] + | any[]; }) { const router = useRouter(); + const [isLoading, setIsLoading] = useState(false); + const [pageId, setPageId] = useState(""); + return ( <> router.push(e.path)} + onClick={() => { + setPageId(e?.id); + setIsLoading(true); + router.push(e?.path); + }} > - {e.icon} + {isLoading && e?.id === pageId ? ( + + ) : ( + e?.icon + )} - {e.name} + {e?.name}
))} diff --git a/src/app_modules/component_global/ui/ui_header_tamplate.tsx b/src/app_modules/component_global/ui/ui_header_tamplate.tsx index 00df1c10..85093b23 100644 --- a/src/app_modules/component_global/ui/ui_header_tamplate.tsx +++ b/src/app_modules/component_global/ui/ui_header_tamplate.tsx @@ -14,7 +14,7 @@ import { useRouter } from "next/navigation"; import React, { useState } from "react"; import { AccentColor, MainColor } from "../color/color_pallet"; -export default function LayoutGlobal_UI_HeaderTamplate({ +export default function UIGlobal_LayoutHeaderTamplate({ title, posotion, // left button diff --git a/src/app_modules/component_global/ui/ui_layout_tamplate.tsx b/src/app_modules/component_global/ui/ui_layout_tamplate.tsx index d7cce1d6..57c900c2 100644 --- a/src/app_modules/component_global/ui/ui_layout_tamplate.tsx +++ b/src/app_modules/component_global/ui/ui_layout_tamplate.tsx @@ -11,7 +11,7 @@ import { import { AccentColor, MainColor } from "../color/color_pallet"; import React from "react"; -export default function LayoutGlobal_UI_Tamplate({ +export default function UIGlobal_LayoutTamplate({ children, header, footer, diff --git a/src/app_modules/forum/create/layout.tsx b/src/app_modules/forum/create/layout.tsx index 121dad16..b5131ef3 100644 --- a/src/app_modules/forum/create/layout.tsx +++ b/src/app_modules/forum/create/layout.tsx @@ -4,8 +4,8 @@ import { AppShell } from "@mantine/core"; import React from "react"; import ComponentForum_HeaderTamplate from "../component/header/header_tamplate"; import AppComponentGlobal_LayoutTamplate from "@/app_modules/component_global/component_layout_tamplate"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; -import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; export default function LayoutForum_Create({ children, @@ -14,11 +14,11 @@ export default function LayoutForum_Create({ }) { return ( <> - } + } > {children} - + {/* }> diff --git a/src/app_modules/forum/detail/detail_report_komentar.tsx b/src/app_modules/forum/detail/detail_report_komentar.tsx index f3c1e417..ebdf24ee 100644 --- a/src/app_modules/forum/detail/detail_report_komentar.tsx +++ b/src/app_modules/forum/detail/detail_report_komentar.tsx @@ -1,5 +1,5 @@ -import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; import { ComponentForum_UiDetailReportKomentar } from "../component/detail_component/ui_report_komentar"; @@ -10,11 +10,11 @@ export default function Forum_DetailReportKomentar({ }) { return ( <> - } + } > {} - + ); } diff --git a/src/app_modules/forum/detail/detail_report_posting.tsx b/src/app_modules/forum/detail/detail_report_posting.tsx index 0322485b..71f09dfc 100644 --- a/src/app_modules/forum/detail/detail_report_posting.tsx +++ b/src/app_modules/forum/detail/detail_report_posting.tsx @@ -1,5 +1,5 @@ -import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; import { Stack, Text } from "@mantine/core"; import { ComponentForum_UiDetailReportPosting } from "../component/detail_component/ui_report_posting"; @@ -10,11 +10,11 @@ export default function Forum_DetailReportPosting({ }) { return ( <> - } + } > - + ); } diff --git a/src/app_modules/forum/detail/layout.tsx b/src/app_modules/forum/detail/layout.tsx index e3339f95..20ddfe01 100644 --- a/src/app_modules/forum/detail/layout.tsx +++ b/src/app_modules/forum/detail/layout.tsx @@ -8,8 +8,8 @@ import { IconChevronLeft } from "@tabler/icons-react"; import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2"; import { revalidatePath } from "next/cache"; import AppComponentGlobal_LayoutTamplate from "@/app_modules/component_global/component_layout_tamplate"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; -import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; export const dynamic = "force-dynamic"; export default function LayoutForum_Detail({ @@ -24,11 +24,11 @@ export default function LayoutForum_Detail({ return ( <> - } + } > {children} - + {/* - } + } > {children} - + {/* } diff --git a/src/app_modules/forum/forumku/layout.tsx b/src/app_modules/forum/forumku/layout.tsx index 8281d194..070adeeb 100644 --- a/src/app_modules/forum/forumku/layout.tsx +++ b/src/app_modules/forum/forumku/layout.tsx @@ -6,8 +6,8 @@ import ComponentForum_HeaderTamplate from "../component/header/header_tamplate"; import { MODEL_USER } from "@/app_modules/home/model/interface"; import { IconX } from "@tabler/icons-react"; import AppComponentGlobal_LayoutTamplate from "@/app_modules/component_global/component_layout_tamplate"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; -import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; export default function LayoutForum_Forumku({ children, @@ -18,16 +18,16 @@ export default function LayoutForum_Forumku({ }) { return ( <> - } /> } > {children} - + {/* - {children} - + {/* - + } > {children} - + {/* diff --git a/src/app_modules/forum/report/posting/layout.tsx b/src/app_modules/forum/report/posting/layout.tsx index 784e3d60..53316d06 100644 --- a/src/app_modules/forum/report/posting/layout.tsx +++ b/src/app_modules/forum/report/posting/layout.tsx @@ -1,7 +1,7 @@ "use client"; -import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; import React from "react"; export default function LayoutForum_ReportPosting({ @@ -11,13 +11,13 @@ export default function LayoutForum_ReportPosting({ }) { return ( <> - + } > {children} - + diff --git a/src/app_modules/forum/splash/index.tsx b/src/app_modules/forum/splash/index.tsx index 03f44677..2daa2c84 100644 --- a/src/app_modules/forum/splash/index.tsx +++ b/src/app_modules/forum/splash/index.tsx @@ -2,7 +2,7 @@ import { RouterForum } from "@/app/lib/router_hipmi/router_forum"; import ComponentGlobal_SplashScreen from "@/app_modules/component_global/splash/splash_global"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; import { Avatar, Center, diff --git a/src/app_modules/home/component/button_header.tsx b/src/app_modules/home/component/button_header.tsx index 05e5898f..6378216a 100644 --- a/src/app_modules/home/component/button_header.tsx +++ b/src/app_modules/home/component/button_header.tsx @@ -1,6 +1,6 @@ "use client"; -import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; import { ActionIcon, Indicator, Loader, Text } from "@mantine/core"; import { MODEL_USER } from "../model/interface"; import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; diff --git a/src/app_modules/home/view_home.tsx b/src/app_modules/home/view_home.tsx index 78708e1a..eae253b1 100644 --- a/src/app_modules/home/view_home.tsx +++ b/src/app_modules/home/view_home.tsx @@ -1,5 +1,5 @@ -import LayoutGlobal_UI_HeaderTamplate from "../component_global/ui/ui_header_tamplate"; -import LayoutGlobal_UI_Tamplate from "../component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "../component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "../component_global/ui/ui_layout_tamplate"; import { MODEL_JOB } from "../job/model/interface"; import { ComponentHome_ButtonHeaderLeft, @@ -19,9 +19,9 @@ export default function HomeView({ }) { return ( <> - @@ -37,7 +37,7 @@ export default function HomeView({ footer={} > - + ); } diff --git a/src/app_modules/job/create/layout.tsx b/src/app_modules/job/create/layout.tsx index 2909f632..5dd2ccd2 100644 --- a/src/app_modules/job/create/layout.tsx +++ b/src/app_modules/job/create/layout.tsx @@ -1,7 +1,7 @@ "use client"; -import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; import React from "react"; export default function LayoutJob_Create({ @@ -11,11 +11,11 @@ export default function LayoutJob_Create({ }) { return ( <> - } + } > {children} - + ); } diff --git a/src/app_modules/job/detail/arsip/layout.tsx b/src/app_modules/job/detail/arsip/layout.tsx index de2c7329..88d07b13 100644 --- a/src/app_modules/job/detail/arsip/layout.tsx +++ b/src/app_modules/job/detail/arsip/layout.tsx @@ -1,7 +1,7 @@ "use client"; -import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; import React from "react"; export default function LayoutJob_DetailArsip({ @@ -11,11 +11,11 @@ export default function LayoutJob_DetailArsip({ }) { return ( <> - } + } > {children} - + ); } diff --git a/src/app_modules/job/detail/draft/layout.tsx b/src/app_modules/job/detail/draft/layout.tsx index 4d322916..7d117cec 100644 --- a/src/app_modules/job/detail/draft/layout.tsx +++ b/src/app_modules/job/detail/draft/layout.tsx @@ -17,8 +17,8 @@ import ComponentJob_HeaderTamplate from "../../component/header_tamplate"; import { IconDots, IconDotsVertical, IconEdit, IconX } from "@tabler/icons-react"; import { RouterJob } from "@/app/lib/router_hipmi/router_job"; import AppComponentGlobal_LayoutTamplate from "@/app_modules/component_global/component_layout_tamplate"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; -import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; import { useRouter } from "next/navigation"; import { useDisclosure } from "@mantine/hooks"; import { @@ -48,9 +48,9 @@ export default function LayoutJob_DetailDraft({ return ( <> - open()}> @@ -62,7 +62,7 @@ export default function LayoutJob_DetailDraft({ } > {children} - + - } + } > {children} - + ); } diff --git a/src/app_modules/job/detail/publish/layout.tsx b/src/app_modules/job/detail/publish/layout.tsx index 2b98cf44..2313d9d5 100644 --- a/src/app_modules/job/detail/publish/layout.tsx +++ b/src/app_modules/job/detail/publish/layout.tsx @@ -1,7 +1,7 @@ "use client"; -import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; import React from "react"; export default function LayoutJob_DetailPublish({ @@ -11,11 +11,11 @@ export default function LayoutJob_DetailPublish({ }) { return ( <> - } + } > {children} - + ); } diff --git a/src/app_modules/job/detail/reject/layout.tsx b/src/app_modules/job/detail/reject/layout.tsx index 42eb63df..7a237dbd 100644 --- a/src/app_modules/job/detail/reject/layout.tsx +++ b/src/app_modules/job/detail/reject/layout.tsx @@ -5,8 +5,8 @@ import React from "react"; import ComponentJob_HeaderTamplate from "../../component/header_tamplate"; import AppComponentGlobal_LayoutTamplate from "@/app_modules/component_global/component_layout_tamplate"; import { RouterJob } from "@/app/lib/router_hipmi/router_job"; -import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; import { IconEdit } from "@tabler/icons-react"; export default function LayoutJob_DetailReject({ @@ -16,11 +16,11 @@ export default function LayoutJob_DetailReject({ }) { return ( <> - } + } > {children} - + ); } diff --git a/src/app_modules/job/detail/review/layout.tsx b/src/app_modules/job/detail/review/layout.tsx index dd7bf43d..8954e16a 100644 --- a/src/app_modules/job/detail/review/layout.tsx +++ b/src/app_modules/job/detail/review/layout.tsx @@ -1,7 +1,7 @@ "use client"; -import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; import React from "react"; export default function LayoutJob_DetailReview({ @@ -11,11 +11,11 @@ export default function LayoutJob_DetailReview({ }) { return ( <> - } + } > {children} - + ); } diff --git a/src/app_modules/job/edit/layout.tsx b/src/app_modules/job/edit/layout.tsx index 7b9b8763..ca17e086 100644 --- a/src/app_modules/job/edit/layout.tsx +++ b/src/app_modules/job/edit/layout.tsx @@ -1,7 +1,7 @@ "use client"; -import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; import React from "react"; export default function LayoutJob_Edit({ @@ -11,11 +11,11 @@ export default function LayoutJob_Edit({ }) { return ( <> - } + } > {children} - + ); diff --git a/src/app_modules/job/main/layout.tsx b/src/app_modules/job/main/layout.tsx index e7e05fa9..291296d4 100644 --- a/src/app_modules/job/main/layout.tsx +++ b/src/app_modules/job/main/layout.tsx @@ -3,8 +3,8 @@ import { RouterJob } from "@/app/lib/router_hipmi/router_job"; import { MainColor } from "@/app_modules/component_global/color/color_pallet"; import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan"; -import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; import { ActionIcon, SimpleGrid, Stack, Text } from "@mantine/core"; import { IconHistory, IconHome, IconReservedLine } from "@tabler/icons-react"; import { useAtom } from "jotai"; @@ -46,9 +46,9 @@ export default function LayoutJob_Main({ return ( <> - @@ -118,7 +118,7 @@ export default function LayoutJob_Main({ } > {children} - + ); } diff --git a/src/app_modules/job/non_user_view/layout.tsx b/src/app_modules/job/non_user_view/layout.tsx index 2d32cd54..81798eec 100644 --- a/src/app_modules/job/non_user_view/layout.tsx +++ b/src/app_modules/job/non_user_view/layout.tsx @@ -4,8 +4,8 @@ import { AppShell, Center } from "@mantine/core"; import React from "react"; import ComponentJob_HeaderTamplate from "../component/header_tamplate"; import AppComponentGlobal_LayoutTamplate from "@/app_modules/component_global/component_layout_tamplate"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; -import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; export default function LayoutJob_NonUserView({ children, @@ -14,11 +14,11 @@ export default function LayoutJob_NonUserView({ }) { return ( <> - } + } > {children} - + ); } diff --git a/src/app_modules/katalog/main/index.ts b/src/app_modules/katalog/main/index.ts index d45aca2e..793e49ee 100644 --- a/src/app_modules/katalog/main/index.ts +++ b/src/app_modules/katalog/main/index.ts @@ -1,4 +1,3 @@ -import KatalogView from "./view_katalog"; import KatalogLayout from "./layout"; -export {KatalogView, KatalogLayout} \ No newline at end of file +export { KatalogLayout }; diff --git a/src/app_modules/katalog/main/layout.tsx b/src/app_modules/katalog/main/layout.tsx index c20e6148..5ee0d691 100644 --- a/src/app_modules/katalog/main/layout.tsx +++ b/src/app_modules/katalog/main/layout.tsx @@ -1,7 +1,7 @@ "use client"; -import LayoutGlobal_UI_HeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; -import LayoutGlobal_UI_Tamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; import { ComponentKatalog_ButtonHeaderRight } from "../component/button_header_right"; export default function KatalogLayout({ @@ -17,9 +17,9 @@ export default function KatalogLayout({ }) { return ( <> - {children} - + ); } diff --git a/src/app_modules/katalog/main/view_katalog.tsx b/src/app_modules/katalog/main/view_katalog.tsx deleted file mode 100644 index d8eb6f19..00000000 --- a/src/app_modules/katalog/main/view_katalog.tsx +++ /dev/null @@ -1,33 +0,0 @@ -"use client"; - -import Component_Logout from "@/app_modules/auth/logout/view"; -import { - Stack -} from "@mantine/core"; -import { MODEL_PORTOFOLIO } from "../portofolio/model/interface"; -import { Portofolio_UiView } from "../portofolio/ui_portofolio"; -import { MODEL_PROFILE } from "../profile/model/interface"; -import { Profile_UiView } from "../profile/ui_profile"; - -export default function KatalogView({ - profile, - listPorto, - userLoginId, -}: { - profile: MODEL_PROFILE; - listPorto: MODEL_PORTOFOLIO; - userLoginId: string; -}) { - return ( - <> - - - - - - ); -} diff --git a/src/app_modules/katalog/portofolio/component/button_delete.tsx b/src/app_modules/katalog/portofolio/component/button_delete.tsx new file mode 100644 index 00000000..10e552a3 --- /dev/null +++ b/src/app_modules/katalog/portofolio/component/button_delete.tsx @@ -0,0 +1,80 @@ +import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil"; +import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal"; +import { Button, Group, Modal, Stack, Title } from "@mantine/core"; +import { IconTrash } from "@tabler/icons-react"; +import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime"; +import router from "next/router"; +import { useState } from "react"; +import { Portofolio_funDeletePortofolioById } from "../fun/delete/fun_delete_by_id"; +import { MODEL_PORTOFOLIO } from "../model/interface"; +import { useRouter } from "next/navigation"; +import ComponentGlobal_UI_Modal from "@/app_modules/component_global/ui/ui_modal"; + +export function ComponentPortofolio_ButtonDelete({ + userLoginId, + dataPorto, +}: { + userLoginId: string; + dataPorto: MODEL_PORTOFOLIO; +}) { + const router = useRouter(); + const [openModal, setModal] = useState(false); + const [loadingDel, setLoadingDel] = useState(false); + + return ( + <> + {userLoginId === dataPorto?.Profile.userId ? ( + + ) : ( + "" + )} + + setModal(false)} + buttonKiri={ + + } + buttonKanan={ + + } + /> + + ); +} + +async function onDelete( + router: AppRouterInstance, + dataPorto: MODEL_PORTOFOLIO, + setLoadingDel: any +) { + await Portofolio_funDeletePortofolioById(dataPorto).then((res) => { + if (res.status === 200) { + setLoadingDel(true); + ComponentGlobal_NotifikasiBerhasil(res.message); + router.back(); + } else { + ComponentGlobal_NotifikasiGagal(res.message); + } + }); +} diff --git a/src/app_modules/katalog/portofolio/component/button_more.tsx b/src/app_modules/katalog/portofolio/component/button_more.tsx new file mode 100644 index 00000000..590dc835 --- /dev/null +++ b/src/app_modules/katalog/portofolio/component/button_more.tsx @@ -0,0 +1,64 @@ +"use client"; + +import { RouterPortofolio } from "@/app/lib/router_hipmi/router_katalog"; +import ComponentGlobal_UI_Drawer from "@/app_modules/component_global/ui/ui_drawer"; +import { ActionIcon } from "@mantine/core"; +import { + IconDots, + IconDotsVertical, + IconEdit, + IconId, + IconPhotoEdit, +} from "@tabler/icons-react"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; + +export function ComponentPortofolio_ButtonMore({ + portoId, + userLoginId, + authorId, +}: { + portoId: string; + userLoginId: string; + authorId: string; +}) { + const [openDrawer, setOpenDrawer] = useState(false); + const listPage = [ + { + id: "1", + name: "Update detail bisnis", + icon: , + path: RouterPortofolio.edit_data_bisnis + `${portoId}`, + }, + { + id: "2", + name: "Update logo ", + icon: , + path: RouterPortofolio.edit_logo_bisnis + `${portoId}`, + }, + { + id: "3", + name: "Update sosial media", + icon: , + path: RouterPortofolio.edit_medsos_bisnis + `${portoId}`, + }, + ]; + + return ( + <> + {userLoginId === authorId ? ( + setOpenDrawer(true)}> + + + ) : ( + + )} + + setOpenDrawer(false)} + component={listPage} + /> + + ); +} diff --git a/src/app_modules/katalog/portofolio/component/card_view_daftar.tsx b/src/app_modules/katalog/portofolio/component/card_view_daftar.tsx new file mode 100644 index 00000000..4dca5bd8 --- /dev/null +++ b/src/app_modules/katalog/portofolio/component/card_view_daftar.tsx @@ -0,0 +1,50 @@ +import { Group, Paper, Stack, Text } from "@mantine/core"; +import { MODEL_PORTOFOLIO } from "../model/interface"; +import { AccentColor } from "@/app_modules/component_global/color/color_pallet"; +import ComponentGlobal_UI_Loader from "@/app_modules/component_global/ui/ui_loader"; +import { IconCaretRight } from "@tabler/icons-react"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; +import { RouterPortofolio } from "@/app/lib/router_hipmi/router_katalog"; + +export function ComponentPortofolio_DaftarBoxView({ + data, +}: { + data: MODEL_PORTOFOLIO; +}) { + const router = useRouter(); + const [isLoading, setIsLoading] = useState(false); + return ( + <> + { + setIsLoading(true); + router.push(RouterPortofolio.main_detail + data.id); + }} + style={{ + backgroundColor: AccentColor.darkblue, + border: `2px solid ${AccentColor.blue}`, + borderRadius: "10px ", + padding: "15px", + color: "white", + }} + > + + + {data?.namaBisnis} + + + {isLoading ? ( + + ) : ( + + )} + + + + + ); +} diff --git a/src/app_modules/katalog/portofolio/create/layout.tsx b/src/app_modules/katalog/portofolio/create/layout.tsx index b4165cf3..4bb550c7 100644 --- a/src/app_modules/katalog/portofolio/create/layout.tsx +++ b/src/app_modules/katalog/portofolio/create/layout.tsx @@ -1,22 +1,18 @@ "use client"; -import { ActionIcon, AppShell, Group, Header, Text } from "@mantine/core"; -import { IconArrowLeft } from "@tabler/icons-react"; -import { useRouter } from "next/navigation"; -import ComponentKatalog_HeaderTamplate from "../../component/header_tamplate"; -import AppComponentGlobal_LayoutTamplate from "@/app_modules/component_global/component_layout_tamplate"; +import UIGlobal_LayoutHeaderTamplate from "@/app_modules/component_global/ui/ui_header_tamplate"; +import UIGlobal_LayoutTamplate from "@/app_modules/component_global/ui/ui_layout_tamplate"; export default function CreatePortofolioLayout({ children, profileId }: { children: any, profileId: any }) { - const router = useRouter(); return ( <> - + } > {children} - + ); } diff --git a/src/app_modules/katalog/portofolio/create/view.tsx b/src/app_modules/katalog/portofolio/create/view.tsx index b690a15b..f220efd9 100644 --- a/src/app_modules/katalog/portofolio/create/view.tsx +++ b/src/app_modules/katalog/portofolio/create/view.tsx @@ -20,7 +20,7 @@ import { Select, Stack, TextInput, - Textarea + Textarea, } from "@mantine/core"; import { IconCamera } from "@tabler/icons-react"; import _ from "lodash"; @@ -29,6 +29,11 @@ import { useRouter } from "next/navigation"; import { useState } from "react"; import ComponentKatalog_NotedBox from "../../component/noted_box"; import funCreatePortofolio from "../fun/fun_create_portofolio"; +import ComponentGlobal_BoxInformation from "@/app_modules/component_global/box_information"; +import { + AccentColor, + MainColor, +} from "@/app_modules/component_global/color/color_pallet"; export default function CreatePortofolio({ bidangBisnis, @@ -63,10 +68,15 @@ export default function CreatePortofolio({ <> {/* {JSON.stringify(profileId)} */} - + - +