From 11b5e8f7222d8ad09146188fa837f75c1796b19b Mon Sep 17 00:00:00 2001 From: Bagasbanuna02 Date: Mon, 1 Jul 2024 14:26:26 +0800 Subject: [PATCH 1/3] 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 3/3] 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 ? +