(listReview.data);
+ const [nPage, setNPage] = useState(listReview.nPage);
+ const [activePage, setActivePage] = useState(1);
+ const [isSearch, setSearch] = useState("");
+
+ const [reject, setReject] = useState(false);
+ const [jobId, setJobId] = useState("");
+ const [catatan, setCatatan] = useState("");
+
+ useShallowEffect(() => {
+ onLoadData({
+ onSuccessLoad(val) {
+ setData(val.data);
+ setNPage(val.nPage);
+ },
+ });
+ }, [setData, setNPage]);
+
+ async function onLoadData({
+ onSuccessLoad,
+ }: {
+ onSuccessLoad: (val: any) => any;
+ }) {
+ const loadData = await adminJob_getListReview({ page: 1 });
+ onSuccessLoad(loadData);
+ }
+
+ async function onSearch(s: string) {
+ setSearch(s);
+ setActivePage(1)
+ const loadData = await adminJob_getListReview({
+ page: 1,
+ search: s,
+ });
+ setData(loadData.data as any);
+ setNPage(loadData.nPage);
+ }
+
+ async function onPageClick(p: any) {
+ setActivePage(p);
+ const loadData = await adminJob_getListReview({
+ search: isSearch,
+ page: p,
+ });
+ setData(loadData.data as any);
+ setNPage(loadData.nPage);
+ }
+
+ const rowTable = data?.map((e, i) => (
+
+ |
+
+ {e?.Author?.username}
+
+ |
+
+
+ {e.title}
+
+ |
+
+
+ {e.imagesId ? (
+ }
+ onClick={() => {
+ router.push(RouterAdminJob.detail_poster + e?.imagesId);
+ }}
+ >
+ Lihat
+
+ ) : (
+
+
+ Tidak ada poster
+
+
+ )}
+
+ |
+
+
+
+
+ |
+
+
+
+
+ |
+
+
+
+ }
+ radius={"xl"}
+ onClick={() =>
+ onPublish({
+ jobId: e?.id,
+ onLoadData(val: any) {
+ setData(val.data);
+ setNPage(val.nPage);
+ },
+ })
+ }
+ >
+ Publish
+
+ }
+ radius={"xl"}
+ onClick={() => {
+ setReject(true);
+ setJobId(e.id);
+ }}
+ >
+ Reject
+
+
+
+ |
+
+ ));
+
+ return (
+ <>
+ {
+ setReject(false);
+ }}
+ withCloseButton={false}
+ size={"sm"}
+ centered
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Review
+
+ }
+ radius={"xl"}
+ placeholder="Masukan judul"
+ onChange={(val) => {
+ onSearch(val.currentTarget.value);
+ }}
+ />
+
+
+
+
+
+
+
+ |
+ Author
+ |
+
+ Judul
+ |
+
+ Poster
+ |
+
+ Syarat Ketentuan
+ |
+
+ Deskripsi
+ |
+
+ Aksi
+ |
+
+
+ {rowTable}
+
+
+
+ {
+ onPageClick(val);
+ }}
+ />
+
+
+
+ >
+ );
+}
+
+async function onPublish({
+ jobId,
+ onLoadData,
+}: {
+ jobId: string;
+ onLoadData: (val: any) => void;
+}) {
+ const publish = await AdminJob_funEditStatusPublishById(jobId);
+ if (publish.status === 200) {
+ const loadData = await adminJob_getListReview({ page: 1 });
+ onLoadData(loadData);
+
+ const dataNotif = {
+ appId: publish.data?.id as any,
+ status: publish.data?.MasterStatus?.name as any,
+ userId: publish.data?.authorId as any,
+ pesan: publish.data?.title as any,
+ kategoriApp: "JOB",
+ title: "Job publish",
+ };
+
+ const notif = await adminNotifikasi_funCreateToUser({
+ data: dataNotif as any,
+ });
+
+ if (notif.status === 201) {
+ mqtt_client.publish(
+ "USER",
+ JSON.stringify({ userId: publish?.data?.authorId, count: 1 })
+ );
+ }
+
+ ComponentGlobal_NotifikasiBerhasil(publish.message);
+ } else {
+ ComponentGlobal_NotifikasiGagal(publish.message);
+ }
+}
+
+async function onReject({
+ jobId,
+ catatan,
+ onLoadData,
+}: {
+ jobId: string;
+ catatan: string;
+ onLoadData: (val: any) => void;
+}) {
+ const reject = await AdminJob_funEditCatatanById(jobId, catatan);
+
+ if (reject.status === 200) {
+ const loadData = await adminJob_getListReview({ page: 1 });
+ onLoadData(loadData);
+ ComponentGlobal_NotifikasiBerhasil(reject.message);
+
+ const dataNotif = {
+ appId: reject.data?.id as any,
+ status: reject.data?.MasterStatus?.name as any,
+ userId: reject.data?.authorId as any,
+ pesan: reject.data?.title as any,
+ kategoriApp: "JOB",
+ title: "Job anda ditolak !",
+ };
+
+ const notif = await adminNotifikasi_funCreateToUser({
+ data: dataNotif as any,
+ });
+
+ if (notif.status === 201) {
+ mqtt_client.publish(
+ "USER",
+ JSON.stringify({ userId: reject?.data?.authorId, count: 1 })
+ );
+ }
+ } else {
+ ComponentGlobal_NotifikasiGagal(reject.message);
+ }
+}
diff --git a/src/app_modules/admin/job/child/table_publish/index.tsx b/src/app_modules/admin/job/child/table_publish/index.tsx
deleted file mode 100644
index ec5da27f..00000000
--- a/src/app_modules/admin/job/child/table_publish/index.tsx
+++ /dev/null
@@ -1,171 +0,0 @@
-"use client";
-
-import { RouterJob } from "@/app/lib/router_hipmi/router_job";
-import ComponentAdminGlobal_HeaderTamplate from "@/app_modules/admin/component_global/header_tamplate";
-import { MODEL_JOB } from "@/app_modules/job/model/interface";
-import {
- Avatar,
- Badge,
- Box,
- Button,
- Card,
- Center,
- Divider,
- Grid,
- Group,
- Image,
- Modal,
- Paper,
- ScrollArea,
- Spoiler,
- Stack,
- Table,
- Text,
- Title,
-} from "@mantine/core";
-import { useDisclosure } from "@mantine/hooks";
-import { IconBan, IconEyeCheck, IconEyeShare } from "@tabler/icons-react";
-import _ from "lodash";
-import { useRouter } from "next/navigation";
-import { useState } from "react";
-
-export default function AdminJob_TablePublish({
- dataVote,
-}: {
- dataVote?: any;
-}) {
- return (
- <>
-
-
-
-
- >
- );
-}
-
-function TableStatus({ listReview }: { listReview: MODEL_JOB[] }) {
- const router = useRouter();
- const [opened, { open, close }] = useDisclosure(false);
- const [data, setData] = useState(listReview);
- const [img, setImg] = useState("");
-
- const TableRows = data?.map((e, i) => (
-
- |
-
- {e.title}
-
- |
-
-
- {e.imagesId ? (
- }
- onClick={() => {
- setImg(e.imagesId);
- open();
- }}
- >
- Lihat
-
- ) : (
-
-
- Tidak ada poster
-
-
- )}
-
- |
-
-
-
-
- |
-
-
-
-
- |
-
- ));
-
- return (
- <>
-
-
-
-
-
-
-
-
-
- PUBLISH
-
-
-
-
-
-
- |
- Judul
- |
-
- Poster
- |
-
- Syarat Ketentuan
- |
-
- Deskripsi
- |
-
-
- {TableRows}
-
-
-
- {_.isEmpty(TableRows) ? (
-
- Tidak Ada Data
-
- ) : (
- ""
- )}
-
-
- {/* {JSON.stringify(data, null, 2)} */}
- >
- );
-}
diff --git a/src/app_modules/admin/job/child/table_reject/index.tsx b/src/app_modules/admin/job/child/table_reject/index.tsx
deleted file mode 100644
index 4ca9cecd..00000000
--- a/src/app_modules/admin/job/child/table_reject/index.tsx
+++ /dev/null
@@ -1,251 +0,0 @@
-"use client";
-
-import { RouterJob } from "@/app/lib/router_hipmi/router_job";
-import ComponentAdminGlobal_HeaderTamplate from "@/app_modules/admin/component_global/header_tamplate";
-import { MODEL_JOB } from "@/app_modules/job/model/interface";
-import {
- Avatar,
- Badge,
- Box,
- Button,
- Card,
- Center,
- Divider,
- Grid,
- Group,
- Image,
- Modal,
- Paper,
- ScrollArea,
- Spoiler,
- Stack,
- Table,
- Text,
- Textarea,
- Title,
-} from "@mantine/core";
-import { useDisclosure } from "@mantine/hooks";
-import { IconBan, IconEyeCheck, IconEyeShare } from "@tabler/icons-react";
-import _ from "lodash";
-import { useRouter } from "next/navigation";
-import { useState } from "react";
-import { AdminJob_funEditCatatanById } from "../../fun/edit/fun_edit_catatan_by_id";
-import { AdminJob_getListTableByStatusId } from "../../fun/get/get_list_table_by_status_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";
-
-export default function AdminJob_TableReject({ dataVote }: { dataVote?: any }) {
- return (
- <>
-
-
-
-
- >
- );
-}
-
-function TableStatus({ listReject }: { listReject: MODEL_JOB[] }) {
- const [opened, { open, close }] = useDisclosure(false);
- const [data, setData] = useState(listReject);
- const [reject, setReject] = useState(false);
- const [img, setImg] = useState("");
- const [jobId, setJobId] = useState("");
- const [catatan, setCatatan] = useState("");
-
- const TableRows = data?.map((e, i) => (
-
- |
-
- {e.title}
-
- |
-
-
- {e.imagesId ? (
- }
- onClick={() => {
- setImg(e.imagesId);
- open();
- }}
- >
- Lihat
-
- ) : (
-
-
- Tidak ada poster
-
-
- )}
-
- |
-
-
-
-
- |
-
-
-
-
- |
-
-
- {e.catatan}
-
- |
-
- }
- radius={"xl"}
- onClick={() => {
- setReject(true);
- setJobId(e.id);
- setCatatan(e.catatan);
- }}
- >
- Reject
-
- |
-
- ));
-
- return (
- <>
-
-
-
-
-
-
- {
- setReject(false);
- }}
- withCloseButton={false}
- size={"lg"}
- centered
- >
-
-
-
-
-
-
-
- REJECT
-
-
-
-
-
-
- |
- Judul
- |
-
- Poster
- |
-
- Syarat Ketentuan
- |
-
- Deskripsi
- |
-
- Catatan
- |
-
- Aksi
- |
-
-
- {TableRows}
-
-
-
- {_.isEmpty(TableRows) ? (
-
- Tidak Ada Data
-
- ) : (
- ""
- )}
-
-
- {/* {JSON.stringify(data, null, 2)} */}
- >
- );
-}
-
-async function onReject(jobId: string, catatan: string, setData: any) {
- await AdminJob_funEditCatatanById(jobId, catatan).then(async (res) => {
- if (res.status === 200) {
- await AdminJob_getListTableByStatusId("4").then((val) => {
- setData(val);
- ComponentGlobal_NotifikasiBerhasil(res.message);
- });
- } else {
- ComponentGlobal_NotifikasiGagal(res.message);
- }
- });
-}
diff --git a/src/app_modules/admin/job/child/table_review/index.tsx b/src/app_modules/admin/job/child/table_review/index.tsx
deleted file mode 100644
index 257a36b1..00000000
--- a/src/app_modules/admin/job/child/table_review/index.tsx
+++ /dev/null
@@ -1,263 +0,0 @@
-"use client";
-
-import { RouterJob } from "@/app/lib/router_hipmi/router_job";
-import ComponentAdminGlobal_HeaderTamplate from "@/app_modules/admin/component_global/header_tamplate";
-import { MODEL_JOB } from "@/app_modules/job/model/interface";
-import {
- Avatar,
- Badge,
- Box,
- Button,
- Card,
- Center,
- Divider,
- Grid,
- Group,
- Image,
- Modal,
- Paper,
- ScrollArea,
- Spoiler,
- Stack,
- Table,
- Text,
- Textarea,
- Title,
-} from "@mantine/core";
-import { useDisclosure } from "@mantine/hooks";
-import { IconBan, IconEyeCheck, IconEyeShare } from "@tabler/icons-react";
-import _ from "lodash";
-import { useRouter } from "next/navigation";
-import { useState } from "react";
-import { AdminJob_funEditStatusPublishById } from "../../fun/edit/fun_edit_status_publish_by_id";
-import { AdminJob_getListTableByStatusId } from "../../fun/get/get_list_table_by_status_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 { AdminJob_funEditCatatanById } from "../../fun/edit/fun_edit_catatan_by_id";
-
-export default function AdminJob_TableReview({ dataVote }: { dataVote?: any }) {
- return (
- <>
-
-
-
-
- >
- );
-}
-
-function TableStatus({ listReview }: { listReview: MODEL_JOB[] }) {
- const router = useRouter();
- const [opened, { open, close }] = useDisclosure(false);
- const [data, setData] = useState(listReview);
- const [reject, setReject] = useState(false);
- const [img, setImg] = useState("");
- const [jobId, setJobId] = useState("");
- const [catatan, setCatatan] = useState("");
-
- const TableRows = data?.map((e, i) => (
-
- |
-
- {e.title}
-
- |
-
-
- {e.imagesId ? (
- }
- onClick={() => {
- setImg(e.imagesId);
- open();
- }}
- >
- Lihat
-
- ) : (
-
-
- Tidak ada poster
-
-
- )}
-
- |
-
-
-
-
- |
-
-
-
-
- |
-
-
-
- }
- radius={"xl"}
- onClick={() => onPublish(e.id, setData)}
- >
- Publish
-
- }
- radius={"xl"}
- onClick={() => {
- setReject(true);
- setJobId(e.id);
- }}
- >
- Reject
-
-
-
- |
-
- ));
-
- return (
- <>
-
-
-
-
-
-
- {
- setReject(false);
- }}
- withCloseButton={false}
- size={"lg"}
- centered
- >
-
-
-
-
-
-
-
- REVIEW
-
-
-
-
-
-
- |
- Judul
- |
-
- Poster
- |
-
- Syarat Ketentuan
- |
-
- Deskripsi
- |
-
- Aksi
- |
-
-
- {TableRows}
-
-
-
- {_.isEmpty(TableRows) ? (
-
- Tidak Ada Data
-
- ) : (
- ""
- )}
-
-
- {/* {JSON.stringify(data, null, 2)} */}
- >
- );
-}
-
-async function onPublish(jobId: string, setData: any) {
- await AdminJob_funEditStatusPublishById(jobId).then(async (res) => {
- if (res.status === 200) {
- await AdminJob_getListTableByStatusId("2").then((res) => {
- setData(res);
- ComponentGlobal_NotifikasiBerhasil("Berhasil Update");
- });
- } else {
- ComponentGlobal_NotifikasiGagal(res.message);
- }
- });
-}
-
-async function onReject(jobId: string, catatan: string, setData: any) {
- await AdminJob_funEditCatatanById(jobId, catatan).then(async (res) => {
- if (res.status === 200) {
- await AdminJob_getListTableByStatusId("2").then((val) => {
- setData(val);
- ComponentGlobal_NotifikasiBerhasil(res.message);
- });
- } else {
- ComponentGlobal_NotifikasiGagal(res.message);
- }
- });
-}
diff --git a/src/app_modules/admin/job/detail/detail_poster.tsx b/src/app_modules/admin/job/detail/detail_poster.tsx
new file mode 100644
index 00000000..a3757528
--- /dev/null
+++ b/src/app_modules/admin/job/detail/detail_poster.tsx
@@ -0,0 +1,27 @@
+"use client";
+
+import { RouterJob } from "@/app/lib/router_hipmi/router_job";
+import { Center, Image, Stack } from "@mantine/core";
+import ComponentGlobalAdmin_BackButton from "../../component_global/back_button";
+
+export default function AdminJob_DetailPoster({
+ imageId,
+}: {
+ imageId: string;
+}) {
+ return (
+ <>
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/src/app_modules/admin/job/fun/edit/fun_edit_catatan_by_id.ts b/src/app_modules/admin/job/fun/edit/fun_edit_catatan_by_id.ts
index 9efc1005..18aee664 100644
--- a/src/app_modules/admin/job/fun/edit/fun_edit_catatan_by_id.ts
+++ b/src/app_modules/admin/job/fun/edit/fun_edit_catatan_by_id.ts
@@ -7,7 +7,7 @@ export async function AdminJob_funEditCatatanById(
jobId: string,
catatan: string
) {
- const up = await prisma.job.update({
+ const udpt = await prisma.job.update({
where: {
id: jobId,
},
@@ -15,9 +15,21 @@ export async function AdminJob_funEditCatatanById(
masterStatusId: "4",
catatan: catatan,
},
+ select: {
+ id: true,
+ authorId: true,
+ MasterStatus: {
+ select: {
+ name: true,
+ },
+ },
+ title: true,
+ },
});
- if (!up) return { status: 400, message: "Gagal reject" };
+
+
+ if (!udpt) return { status: 400, message: "Gagal menambah catatan" };
revalidatePath("/dev/admin/job/child/table_review");
- return { status: 200, message: "Berhasil reject" };
+ return {data: udpt, status: 200, message: "Berhasil menambah catatan" };
}
diff --git a/src/app_modules/admin/job/fun/edit/fun_edit_status_publish_by_id.ts b/src/app_modules/admin/job/fun/edit/fun_edit_status_publish_by_id.ts
index 95c9f233..b2933fde 100644
--- a/src/app_modules/admin/job/fun/edit/fun_edit_status_publish_by_id.ts
+++ b/src/app_modules/admin/job/fun/edit/fun_edit_status_publish_by_id.ts
@@ -11,10 +11,20 @@ export async function AdminJob_funEditStatusPublishById(jobId: string) {
data: {
masterStatusId: "1",
},
+ select: {
+ id: true,
+ authorId: true,
+ MasterStatus: {
+ select: {
+ name: true,
+ },
+ },
+ title: true,
+ },
});
if(!updt) return {status: 400, message: "Update Gagal"}
revalidatePath("/dev/admin/job/child/table_review");
- return {status: 200, message: "Berhasil Update"}
+ return {data: updt, status: 200, message: "Berhasil Update"}
}
diff --git a/src/app_modules/admin/job/fun/get/get_list_publish.ts b/src/app_modules/admin/job/fun/get/get_list_publish.ts
new file mode 100644
index 00000000..48c0c5f2
--- /dev/null
+++ b/src/app_modules/admin/job/fun/get/get_list_publish.ts
@@ -0,0 +1,63 @@
+"use server";
+
+import prisma from "@/app/lib/prisma";
+import { ceil } from "lodash";
+
+export default async function adminJob_getListPublish({
+ page,
+ search,
+}: {
+ page: number;
+ search?: string;
+}) {
+ let takeData = 5;
+ let skipData = page * takeData - takeData;
+
+ const getData = await prisma.job.findMany({
+ skip: skipData,
+ take: takeData,
+ orderBy: {
+ updatedAt: "desc",
+ },
+ where: {
+ masterStatusId: "1",
+ isActive: true,
+ title: {
+ contains: search,
+ mode: "insensitive",
+ },
+ },
+ select: {
+ id: true,
+ title: true,
+ isActive: true,
+ isArsip: true,
+ createdAt: true,
+ updatedAt: true,
+ content: true,
+ deskripsi: true,
+ catatan: true,
+ authorId: true,
+ Author: true,
+ imagesId: true,
+ },
+ });
+
+ const nCount = await prisma.job.count({
+ where: {
+ masterStatusId: "1",
+ isActive: true,
+ title: {
+ contains: search,
+ mode: "insensitive",
+ },
+ },
+ });
+
+ const allData = {
+ data: getData,
+ nPage: ceil(nCount / takeData),
+ };
+
+ return allData;
+}
diff --git a/src/app_modules/admin/job/fun/get/get_list_reject.ts b/src/app_modules/admin/job/fun/get/get_list_reject.ts
new file mode 100644
index 00000000..a0bd212d
--- /dev/null
+++ b/src/app_modules/admin/job/fun/get/get_list_reject.ts
@@ -0,0 +1,62 @@
+"use server";
+
+import prisma from "@/app/lib/prisma";
+import { ceil } from "lodash";
+
+export default async function adminJob_getListReject({
+ page,
+ search,
+}: {
+ page: number;
+ search?: string;
+}) {
+ let takeData = 5;
+ let skipData = page * takeData - takeData;
+
+ const getData = await prisma.job.findMany({
+ skip: skipData,
+ take: takeData,
+ orderBy: {
+ updatedAt: "desc",
+ },
+ where: {
+ masterStatusId: "4",
+ isActive: true,
+ title: {
+ contains: search,
+ mode: "insensitive",
+ },
+ },
+ select: {
+ id: true,
+ title: true,
+ isActive: true,
+ createdAt: true,
+ updatedAt: true,
+ content: true,
+ deskripsi: true,
+ catatan: true,
+ authorId: true,
+ Author: true,
+ imagesId: true,
+ },
+ });
+
+ const nCount = await prisma.job.count({
+ where: {
+ masterStatusId: "4",
+ isActive: true,
+ title: {
+ contains: search,
+ mode: "insensitive",
+ },
+ },
+ });
+
+ const allData = {
+ data: getData,
+ nPage: ceil(nCount / takeData),
+ };
+
+ return allData;
+}
diff --git a/src/app_modules/admin/job/fun/get/get_list_review.ts b/src/app_modules/admin/job/fun/get/get_list_review.ts
new file mode 100644
index 00000000..a5b1fa49
--- /dev/null
+++ b/src/app_modules/admin/job/fun/get/get_list_review.ts
@@ -0,0 +1,62 @@
+"use server";
+
+import prisma from "@/app/lib/prisma";
+import { ceil } from "lodash";
+
+export default async function adminJob_getListReview({
+ page,
+ search,
+}: {
+ page: number;
+ search?: string;
+}) {
+ let takeData = 5;
+ let skipData = page * takeData - takeData;
+
+ const getData = await prisma.job.findMany({
+ skip: skipData,
+ take: takeData,
+ orderBy: {
+ updatedAt: "desc",
+ },
+ where: {
+ masterStatusId: "2",
+ isActive: true,
+ title: {
+ contains: search,
+ mode: "insensitive",
+ },
+ },
+ select: {
+ id: true,
+ title: true,
+ isActive: true,
+ createdAt: true,
+ updatedAt: true,
+ content: true,
+ deskripsi: true,
+ catatan: true,
+ authorId: true,
+ Author: true,
+ imagesId: true,
+ },
+ });
+
+ const nCount = await prisma.job.count({
+ where: {
+ masterStatusId: "2",
+ isActive: true,
+ title: {
+ contains: search,
+ mode: "insensitive",
+ },
+ },
+ });
+
+ const allData = {
+ data: getData,
+ nPage: ceil(nCount / takeData),
+ };
+
+ return allData;
+}
diff --git a/src/app_modules/admin/job/index.tsx b/src/app_modules/admin/job/index.tsx
index 1ad41655..66200ba8 100644
--- a/src/app_modules/admin/job/index.tsx
+++ b/src/app_modules/admin/job/index.tsx
@@ -1,6 +1,13 @@
import AdminJob_Main from "./main";
-import AdminJob_TablePublish from "./child/table_publish";
-import AdminJob_TableReview from "./child/table_review";
-import AdminJob_TableReject from "./child/table_reject";
+import AdminJob_TablePublish from "./child/publish";
+import AdminJob_TableReview from "./child/review";
+import AdminJob_TableReject from "./child/reject";
+import AdminJob_DetailPoster from "./detail/detail_poster";
-export { AdminJob_Main, AdminJob_TablePublish, AdminJob_TableReview, AdminJob_TableReject };
+export {
+ AdminJob_Main,
+ AdminJob_TablePublish,
+ AdminJob_TableReview,
+ AdminJob_TableReject,
+ AdminJob_DetailPoster,
+};
diff --git a/src/app_modules/admin/job/main/index.tsx b/src/app_modules/admin/job/main/index.tsx
index 39113c0a..3e1c4f77 100644
--- a/src/app_modules/admin/job/main/index.tsx
+++ b/src/app_modules/admin/job/main/index.tsx
@@ -23,24 +23,28 @@ export default function AdminJob_Main({
name: "Publish",
jumlah: countPublish,
color: "green",
+ text_color: "white",
},
{
id: 2,
name: "Review",
jumlah: countReview,
color: "orange",
+ text_color: "white",
},
{
id: 3,
name: "Reject",
jumlah: countReject,
color: "red",
+ text_color: "white",
},
{
id: 4,
name: "Arsip",
jumlah: countArsip,
color: "gray",
+ text_color: "white",
},
];
return (
diff --git a/src/app_modules/admin/layout.tsx b/src/app_modules/admin/layout.tsx
index a86bb63f..56552365 100644
--- a/src/app_modules/admin/layout.tsx
+++ b/src/app_modules/admin/layout.tsx
@@ -1,71 +1,83 @@
"use client";
+import mqtt_client from "@/util/mqtt_client";
import {
ActionIcon,
AppShell,
+ Badge,
Box,
Burger,
+ Card,
+ Center,
Divider,
Drawer,
Group,
Header,
+ Indicator,
MediaQuery,
NavLink,
Navbar,
+ Paper,
ScrollArea,
Stack,
Text,
Title,
- useMantineTheme
+ useMantineTheme,
} from "@mantine/core";
import {
IconBell,
+ IconCheck,
+ IconChecks,
IconCircleDot,
IconCircleDotFilled,
- IconDashboard
+ IconUserSquareRounded,
} from "@tabler/icons-react";
import { useAtom } from "jotai";
import _ from "lodash";
+import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";
import { useRouter } from "next/navigation";
-import React, { useState } from "react";
-import { auth_Logout } from "../auth/fun/fun_logout";
-import { gs_kodeId } from "../auth/state/state";
-import { ComponentGlobal_NotifikasiBerhasil } from "../component_global/notif_global/notifikasi_berhasil";
-import { ComponentGlobal_NotifikasiPeringatan } from "../component_global/notif_global/notifikasi_peringatan";
+import React, { useEffect, useState } from "react";
+import { MODEL_USER } from "../home/model/interface";
+import { MODEL_NOTIFIKASI } from "../notifikasi/model/interface";
import Admin_Logout from "./component_global/logout";
-import { gs_admin_hotMenu, gs_admin_subMenu } from "./global_state";
+import {
+ gs_admin_hotMenu,
+ gs_admin_subMenu,
+ gs_layout_admin_isNavbarOpen,
+} from "./global_state";
import { listAdminPage } from "./list_page";
+import adminNotifikasi_countNotifikasi from "./notifikasi/fun/count/count_is_read";
+import adminNotifikasi_getByUserId from "./notifikasi/fun/get/get_notifikasi_by_user_id";
+import adminNotifikasi_funUpdateIsReadById from "./notifikasi/fun/update/fun_update_is_read_by_id";
export default function AdminLayout({
- userRole,
children,
+ listNotif,
+ dataUser,
+ countNotifikasi,
}: {
- userRole: string;
children: React.ReactNode;
+ listNotif: MODEL_NOTIFIKASI[];
+ dataUser: MODEL_USER;
+ countNotifikasi: number;
}) {
const theme = useMantineTheme();
const [opened, setOpened] = useState(false);
const router = useRouter();
- const [active, setActive] = useAtom(gs_admin_hotMenu);
+ const [activeId, setActiveId] = useAtom(gs_admin_hotMenu);
const [activeChild, setActiveChild] = useAtom(gs_admin_subMenu);
const [loading, setLoading] = useState(false);
- const [kodeId, setKodeId] = useAtom(gs_kodeId);
- async function onClickLogout() {
- // await auth_Logout(kodeId).then((res) => {
- // ComponentGlobal_NotifikasiBerhasil("Berhasil Logout");
- // });
- await auth_Logout(kodeId).then((res) => {
- if (res.status === 200) {
- ComponentGlobal_NotifikasiBerhasil(res.message);
- setKodeId("");
- } else {
- ComponentGlobal_NotifikasiPeringatan(res.message);
- }
- });
- }
+ const [user, setUser] = useState(dataUser);
+ const userRoleId = user.masterUserRoleId;
- const navbarItems = listAdminPage.map((e, i) => (
+ const [isNotif, setIsNotif] = useState(false);
+ const [dataNotif, setDataNotif] = useState(listNotif);
+
+ const [countNotif, setCountNotif] = useState(countNotifikasi);
+ const [isNavbarOpen, setIsNavbarOpen] = useAtom(gs_layout_admin_isNavbarOpen);
+
+ const developerNavbar = listAdminPage.map((e, i) => (
: e.icon : e.icon
e.icon
@@ -81,7 +93,7 @@ export default function AdminLayout({
label={{e.name}}
onClick={() => {
setLoading(true);
- setActive(e.id);
+ setActiveId(e.id);
setActiveChild(null);
e.path === "" ? router.push(e.child[0].path) : router.push(e.path);
e.path === "" ? setActiveChild(e.child[0].id) : "";
@@ -109,7 +121,7 @@ export default function AdminLayout({
)
}
onClick={() => {
- setActive(e.id);
+ setActiveId(e.id);
setActiveChild(v.id);
router.push(v.path);
}}
@@ -123,26 +135,26 @@ export default function AdminLayout({
));
const bukanDeveloper = listAdminPage.slice(0, -1);
- const notAdminDev = bukanDeveloper.map((e) => (
+ const adminNavbar = bukanDeveloper.map((e) => (
: e.icon : e.icon
- e.icon
- }
+ fw={activeId === e.id ? "bold" : "normal"}
+ icon={e.icon}
label={{e.name}}
onClick={() => {
setLoading(true);
- setActive(e.id);
+ setActiveId(e.id);
setActiveChild(null);
e.path === "" ? router.push(e.child[0].path) : router.push(e.path);
e.path === "" ? setActiveChild(e.child[0].id) : "";
+
+ setIsNavbarOpen(true);
}}
>
{_.isEmpty(e.child) ? (
@@ -167,7 +179,7 @@ export default function AdminLayout({
)
}
onClick={() => {
- setActive(e.id);
+ setActiveId(e.id);
setActiveChild(v.id);
router.push(v.path);
}}
@@ -180,20 +192,20 @@ export default function AdminLayout({
));
- const navbarAdmin = (
-
- }
- label="Developer"
- sx={{
- ":hover": {
- backgroundColor: "transparent",
- },
- }}
- />
-
- );
+ async function onLoadNotifikasi() {
+ const loadNotif = await adminNotifikasi_getByUserId();
+ setDataNotif(loadNotif as any);
+ }
+
+ useEffect(() => {
+ mqtt_client.subscribe("ADMIN");
+
+ mqtt_client.on("message", (topic: any, message: any) => {
+ const data = JSON.parse(message.toString());
+ // console.log(data);
+ setCountNotif(countNotif + data.count);
+ });
+ }, [countNotif]);
return (
<>
@@ -201,59 +213,34 @@ export default function AdminLayout({
padding="md"
navbarOffsetBreakpoint="md"
asideOffsetBreakpoint="sm"
- navbar={
-
-
- {/*
-
-
- Dashboard Admin
-
-
-
- */}
-
- {userRole === "3" ? navbarItems : notAdminDev}
-
-
-
-
-
-
- V 1.0.0
-
-
-
-
-
-
-
- }
header={
-
+
{/* Web View */}
- Dashboard Admin
- HIPMI
- {/*
- {listAdminPage.map((e) => (
- router.push(e.route)}>
- {e.name}
-
- ))}
- */}
- {/* */}
-
-
-
+ Dashboard Admin
+
+
+ {
+ setIsNotif(true);
+ onLoadNotifikasi();
+ }}
+ >
+ {countNotif}}
+ >
+
+
+
+
+
+ {user?.username}
+
+
+
@@ -276,10 +263,39 @@ export default function AdminLayout({
}
+ navbar={
+
+
+
+
+ {userRoleId === "3" ? developerNavbar : adminNavbar}
+
+
+
+
+
+
+
+ V 1.0.0
+
+
+
+
+
+
+
+ }
>
- {/* {JSON.stringify(active)} */}
{children}
+ {/* Drawer Mobile View */}
setOpened(false)} size={"50%"}>
{listAdminPage.map((e) => (
@@ -289,6 +305,210 @@ export default function AdminLayout({
))}
+
+ {/* Drawer Notifikasi */}
+
+
+ Notifikasi
+
+
+ }
+ opened={isNotif}
+ onClose={() => setIsNotif(false)}
+ position="right"
+ size={"xs"}
+ >
+ {
+ setDataNotif(val);
+ }}
+ onChangeNavbar={(val: any) => {
+ setActiveId(val.id);
+ setActiveChild(val.childId);
+ }}
+ onToggleNavbar={setIsNavbarOpen}
+ onLoadCountNotif={(val: any) => {
+ setCountNotif(val);
+ }}
+ />
+
>
);
}
+
+function DrawerNotifikasi({
+ data,
+ onLoadReadNotif,
+ onChangeNavbar,
+ onToggleNavbar,
+ onLoadCountNotif,
+}: {
+ data: MODEL_NOTIFIKASI[];
+ onLoadReadNotif: (val: any) => void;
+ onChangeNavbar: (val: any) => void;
+ onToggleNavbar: (val: any) => void;
+ onLoadCountNotif: (val: any) => void;
+}) {
+ const router = useRouter();
+
+ if (_.isEmpty(data)) {
+ return (
+ <>
+
+
+ Tidak ada notifikasi
+
+
+ >
+ );
+ }
+
+ return (
+ <>
+
+
+ {data.map((e, i) => (
+ {
+ e?.kategoriApp === "JOB" &&
+ findRouterJob({
+ data: e,
+ router: router,
+ onChangeNavbar2: (val: any) => {
+ onChangeNavbar(val);
+ },
+ onToggleNavbar2: onToggleNavbar,
+ });
+
+ const updateIsRead = await adminNotifikasi_funUpdateIsReadById({
+ notifId: e?.id,
+ });
+
+ if (updateIsRead) {
+ const loadCountNotif =
+ await adminNotifikasi_countNotifikasi();
+ onLoadCountNotif(loadCountNotif);
+
+ const loadDataNotif = await adminNotifikasi_getByUserId();
+ onLoadReadNotif(loadDataNotif);
+ } else {
+ return null;
+ }
+
+ // callBackIsNotifikasi(false);
+ }}
+ >
+
+
+
+
+ # {e?.kategoriApp}
+
+ {e?.status ? (
+
+ {e?.status}
+
+ ) : (
+ ""
+ )}
+
+
+
+
+
+
+
+ {e?.title}
+
+
+ {e?.pesan}
+
+
+
+
+
+
+ {new Intl.DateTimeFormat("id-ID", {
+ dateStyle: "long",
+ }).format(e?.createdAt)}
+
+
+ {", "}
+ {new Intl.DateTimeFormat("id-ID", {
+ timeStyle: "short",
+ }).format(e?.createdAt)}
+
+
+ {e?.isRead ? (
+
+
+
+ Sudah dilihat
+
+
+ ) : (
+
+
+
+ Belum dilihat
+
+
+ )}
+
+
+
+ ))}
+
+
+ >
+ );
+}
+
+async function findRouterJob({
+ data,
+ router,
+ onChangeNavbar2,
+ onToggleNavbar2,
+}: {
+ data: MODEL_NOTIFIKASI;
+ router: AppRouterInstance;
+ onChangeNavbar2: (val: any) => void;
+ onToggleNavbar2: (val: any) => void;
+}) {
+ const routeName = "/dev/admin/job/child/";
+
+ if (data.status === "Review") {
+ router.push(routeName + _.lowerCase(data.status));
+ onChangeNavbar2({
+ id: 6,
+ childId: 63,
+ });
+ }
+
+ if (data.status === "Draft") {
+ router.push(routeName + "review");
+ onChangeNavbar2({
+ id: 6,
+ childId: 63,
+ });
+ }
+
+ onToggleNavbar2(true);
+}
diff --git a/src/app_modules/admin/list_page.tsx b/src/app_modules/admin/list_page.tsx
index a8a35dd0..583b3244 100644
--- a/src/app_modules/admin/list_page.tsx
+++ b/src/app_modules/admin/list_page.tsx
@@ -194,23 +194,23 @@ export const listAdminPage = [
{
id: 62,
name: "Table Publish",
- path: RouterAdminJob.table_publish,
+ path: RouterAdminJob.publish,
},
{
id: 63,
name: "Table Review",
- path: RouterAdminJob.table_review,
+ path: RouterAdminJob.review,
},
{
id: 64,
name: "Table Reject",
- path: RouterAdminJob.table_reject,
- },
- {
- id: 65,
- name: "Arsip",
- path: RouterAdminJob.arsip,
+ path: RouterAdminJob.reject,
},
+ // {
+ // id: 65,
+ // name: "Arsip",
+ // path: RouterAdminJob.arsip,
+ // },
],
},
diff --git a/src/app_modules/admin/notifikasi/fun/count/count_is_read.ts b/src/app_modules/admin/notifikasi/fun/count/count_is_read.ts
new file mode 100644
index 00000000..8d1ca366
--- /dev/null
+++ b/src/app_modules/admin/notifikasi/fun/count/count_is_read.ts
@@ -0,0 +1,18 @@
+"use server";
+
+import prisma from "@/app/lib/prisma";
+import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token";
+
+export default async function adminNotifikasi_countNotifikasi() {
+ const adminId = await user_getOneUserId();
+
+ const data = await prisma.notifikasi.findMany({
+ where: {
+ adminId: adminId,
+ isRead: false,
+ userRoleId: "2",
+ },
+ });
+
+ return data.length;
+}
diff --git a/src/app_modules/admin/notifikasi/fun/create/fun_create_notif_user.ts b/src/app_modules/admin/notifikasi/fun/create/fun_create_notif_user.ts
new file mode 100644
index 00000000..9be8ca49
--- /dev/null
+++ b/src/app_modules/admin/notifikasi/fun/create/fun_create_notif_user.ts
@@ -0,0 +1,28 @@
+"use server";
+
+import prisma from "@/app/lib/prisma";
+import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token";
+import { MODEL_NOTIFIKASI } from "@/app_modules/notifikasi/model/interface";
+
+export default async function adminNotifikasi_funCreateToUser({
+ data,
+}: {
+ data: MODEL_NOTIFIKASI;
+}) {
+ const adminId = await user_getOneUserId();
+
+ const create = await prisma.notifikasi.create({
+ data: {
+ adminId: adminId,
+ userId: data.userId,
+ appId: data.appId,
+ status: data.status,
+ title: data.title,
+ pesan: data.pesan,
+ kategoriApp: data.kategoriApp,
+ userRoleId: "1",
+ },
+ });
+
+ return { status: 201, message: "Berhasil mengirim notifikasi" };
+}
diff --git a/src/app_modules/admin/notifikasi/fun/get/get_notifikasi_by_user_id.ts b/src/app_modules/admin/notifikasi/fun/get/get_notifikasi_by_user_id.ts
new file mode 100644
index 00000000..5f2bfc74
--- /dev/null
+++ b/src/app_modules/admin/notifikasi/fun/get/get_notifikasi_by_user_id.ts
@@ -0,0 +1,21 @@
+"use server";
+
+import prisma from "@/app/lib/prisma";
+import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token";
+import { NextRequest } from "next/server";
+
+export default async function adminNotifikasi_getByUserId() {
+ const adminId = await user_getOneUserId();
+
+ const data = await prisma.notifikasi.findMany({
+
+ orderBy: {
+ createdAt: "desc",
+ },
+ where: {
+ adminId: adminId,
+ userRoleId: "2",
+ },
+ });
+ return data;
+}
diff --git a/src/app_modules/admin/notifikasi/fun/update/fun_update_is_read_by_id.ts b/src/app_modules/admin/notifikasi/fun/update/fun_update_is_read_by_id.ts
new file mode 100644
index 00000000..39d680d8
--- /dev/null
+++ b/src/app_modules/admin/notifikasi/fun/update/fun_update_is_read_by_id.ts
@@ -0,0 +1,21 @@
+"use server";
+
+import prisma from "@/app/lib/prisma";
+
+export default async function adminNotifikasi_funUpdateIsReadById({
+ notifId,
+}: {
+ notifId: string;
+}) {
+ const updt = await prisma.notifikasi.update({
+ where: {
+ id: notifId,
+ },
+ data: {
+ isRead: true,
+ },
+ });
+
+ if (!updt) return { status: 400 };
+ return { status: 200 };
+}
diff --git a/src/app_modules/admin/notifikasi/index.ts b/src/app_modules/admin/notifikasi/index.ts
new file mode 100644
index 00000000..f1de6874
--- /dev/null
+++ b/src/app_modules/admin/notifikasi/index.ts
@@ -0,0 +1,2 @@
+// test notif
+
diff --git a/src/app_modules/component_global/is_empty_data.tsx b/src/app_modules/component_global/is_empty_data.tsx
new file mode 100644
index 00000000..5f2262d7
--- /dev/null
+++ b/src/app_modules/component_global/is_empty_data.tsx
@@ -0,0 +1,13 @@
+"use client";
+
+import { Center } from "@mantine/core";
+
+export default function ComponentGlobal_IsEmptyData({ text }: { text: string }) {
+ return (
+ <>
+
+ {text}
+
+ >
+ );
+}
diff --git a/src/app_modules/fun_global/get_user_token.ts b/src/app_modules/fun_global/get_user_token.ts
index 1f074563..50f0dcb9 100644
--- a/src/app_modules/fun_global/get_user_token.ts
+++ b/src/app_modules/fun_global/get_user_token.ts
@@ -12,7 +12,6 @@ export async function user_getOneUserId() {
const c = cookies().get("ssn");
if (!c?.value || c.value === "") return redirect(RouterAuth.login);
-
const token = JSON.parse(
await unsealData(c?.value as string, {
password: config.server.password,
diff --git a/src/app_modules/home/layout.tsx b/src/app_modules/home/layout.tsx
index ae5704bb..63079c15 100644
--- a/src/app_modules/home/layout.tsx
+++ b/src/app_modules/home/layout.tsx
@@ -10,6 +10,7 @@ import {
Grid,
Group,
Header,
+ Indicator,
Loader,
SimpleGrid,
Stack,
@@ -23,6 +24,7 @@ import {
IconAward,
IconQrcode,
IconUserCircle,
+ IconBell,
} from "@tabler/icons-react";
import { Logout } from "../auth";
import { RouterProfile } from "@/app/lib/router_hipmi/router_katalog";
@@ -32,116 +34,47 @@ import { useRouter } from "next/navigation";
import { ComponentGlobal_NotifikasiPeringatan } from "../component_global/notif_global/notifikasi_peringatan";
import { ComponentGlobal_NotifikasiBerhasil } from "../component_global/notif_global/notifikasi_berhasil";
import { RouterUserSearch } from "@/app/lib/router_hipmi/router_user_search";
+import { RouterNotifikasi } from "@/app/lib/router_hipmi/router_notifikasi";
+import { useShallowEffect } from "@mantine/hooks";
+import notifikasi_countUserNotifikasi from "../notifikasi/fun/count/fun_count_by_id";
+import mqtt_client from "@/util/mqtt_client";
export default function HomeLayout({
dataUser,
children,
+ countNotifikasi,
}: {
dataUser: MODEL_USER;
children: React.ReactNode;
+ countNotifikasi: number;
}) {
const router = useRouter();
// const [user, setUser] = useState(dataUser);
const [loadingProfil, setLoadingProfile] = useState(false);
const [loadingUS, setLoadingUS] = useState(false);
- const listFooter = [
- {
- id: 1,
- name: "Temukan user",
- icon: ,
- link: ``,
- },
- {
- id: 2,
- name: "Profile",
- icon: ,
- link: RouterProfile.katalog,
- },
- ];
+ const [countNotif, setCountNotif] = useState(countNotifikasi);
- const Compo_Footer = (
-
- );
+ useShallowEffect(() => {
+ mqtt_client.subscribe("USER");
+
+ mqtt_client.on("message", (topic: any, message: any) => {
+ const data = JSON.parse(message.toString());
+ if (data.userId === dataUser.id) {
+ setCountNotif(countNotif + data.count);
+ }
+ });
+
+ onLoadNotifikasi({
+ onLoad(val) {
+ setCountNotif(val);
+ },
+ });
+ }, [countNotif]);
+
+ async function onLoadNotifikasi({ onLoad }: { onLoad: (val: any) => void }) {
+ const loadNotif = await notifikasi_countUserNotifikasi();
+ onLoad(loadNotif);
+ }
return (
<>
@@ -157,11 +90,24 @@ export default function HomeLayout({
top={0}
h={50}
>
-
-
- HIPMI
-
-
+
+
+
+
+ HIPMI
+
+
+ {
+ router.push(RouterNotifikasi.main);
+ }}
+ >
+ {countNotif}}>
+
+
+
+
{/* Children */}
diff --git a/src/app_modules/job/component/default_value.ts b/src/app_modules/job/component/default_value.ts
index 565fc66a..6321e808 100644
--- a/src/app_modules/job/component/default_value.ts
+++ b/src/app_modules/job/component/default_value.ts
@@ -14,11 +14,11 @@ export let defaultDeskripsi = `
Atau kunjungi website kami:
-https://test-hipmi.wibudev.com/
+https://www.google.co.id/?hl=id
`;
diff --git a/src/app_modules/job/create/view.tsx b/src/app_modules/job/create/view.tsx
index 7ee94246..68b6eca4 100644
--- a/src/app_modules/job/create/view.tsx
+++ b/src/app_modules/job/create/view.tsx
@@ -1,13 +1,9 @@
"use client";
-import { RouterJob } from "@/app/lib/router_hipmi/router_job";
import {
- AspectRatio,
- Box,
Button,
Center,
FileButton,
- Flex,
Group,
Image,
Loader,
@@ -15,18 +11,15 @@ import {
Stack,
Text,
TextInput,
- Textarea,
} from "@mantine/core";
import { IconCamera, IconUpload } from "@tabler/icons-react";
import { useAtom } from "jotai";
-import _ from "lodash";
import { useRouter } from "next/navigation";
-import React, { useState } from "react";
+import { useState } from "react";
import { gs_job_hot_menu, gs_job_status } from "../global_state";
-import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_global/notif_global/notifikasi_berhasil";
-import "react-quill/dist/quill.snow.css";
import dynamic from "next/dynamic";
+import "react-quill/dist/quill.snow.css";
const ReactQuill = dynamic(
() => {
return import("react-quill");
@@ -34,16 +27,20 @@ const ReactQuill = dynamic(
{ ssr: false }
);
-import { useShallowEffect, useToggle } from "@mantine/hooks";
-import { Job_funCreate } from "../fun/create/fun_create";
-import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan";
-import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal";
-import { MODEL_JOB } from "../model/interface";
-import toast from "react-simple-toasts";
-import ComponentJob_NotedBox from "../component/detail/noted_box";
-import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2";
-import { defaultDeskripsi, defaultSyarat } from "../component/default_value";
import ComponentGlobal_InputCountDown from "@/app_modules/component_global/input_countdown";
+import ComponentGlobal_V2_LoadingPage from "@/app_modules/component_global/loading_page_v2";
+import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/component_global/notif_global/notifikasi_peringatan";
+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";
+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";
export default function Job_Create() {
const [value, setValue] = useState({
@@ -225,25 +222,41 @@ function ButtonAction({ value, file }: { value: MODEL_JOB; file: FormData }) {
const [hotMenu, setHotMenu] = useAtom(gs_job_hot_menu);
const [status, setStatus] = useAtom(gs_job_status);
- const [preview, setPreview] = useToggle();
- async function onAction() {
+ async function onCreate() {
const gambar = new FormData();
gambar.append("file", file as any);
- // console.log(value);
+ const create = await Job_funCreate(value as any, gambar);
+ if (create.status === 201) {
+ const dataNotif : any = {
+ appId: create.data?.id as any,
+ kategoriApp: "JOB",
+ status: create.data?.MasterStatus?.name as any,
+ userId: create.data?.authorId as any,
+ pesan: create.data?.title as any,
+ title: "Job baru",
+ };
+ const notif = await notifikasiToAdmin_funCreate({ data: dataNotif as any });
+ console.log(notif)
+
+ if (notif.status === 201) {
+ mqtt_client.publish(
+ "ADMIN",
+ JSON.stringify({
+ count: 1,
+ })
+ );
- await Job_funCreate(value as any, gambar).then((res) => {
- if (res.status === 201) {
setHotMenu(2);
setStatus("Review");
router.replace(RouterJob.status);
setIsLoading(true);
- ComponentGlobal_NotifikasiBerhasil("Tambah Lowongan Berhasil");
- } else {
- ComponentGlobal_NotifikasiGagal(res.message);
+ ComponentGlobal_NotifikasiBerhasil(create.message);
}
- });
+ } else {
+ ComponentGlobal_NotifikasiGagal(create.message);
+ }
}
return (
@@ -251,11 +264,6 @@ function ButtonAction({ value, file }: { value: MODEL_JOB; file: FormData }) {
+ {data?.isArsip === true && (
+
+
+
+ Mohon Maaf !
+
+
+ Lowongan Kerja Ini Sudah Ditutup{" "}
+
+
+
+ )}
>
diff --git a/src/app_modules/notifikasi/fun/count/fun_count_by_id.ts b/src/app_modules/notifikasi/fun/count/fun_count_by_id.ts
new file mode 100644
index 00000000..ef9daca2
--- /dev/null
+++ b/src/app_modules/notifikasi/fun/count/fun_count_by_id.ts
@@ -0,0 +1,18 @@
+"use server";
+
+import prisma from "@/app/lib/prisma";
+import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token";
+
+export default async function notifikasi_countUserNotifikasi() {
+ const userId = await user_getOneUserId();
+
+ const count = await prisma.notifikasi.findMany({
+ where: {
+ userId: userId,
+ isRead: false,
+ userRoleId: "1"
+ },
+ });
+
+ return count.length;
+}
diff --git a/src/app_modules/notifikasi/fun/create/create_notif.tsx b/src/app_modules/notifikasi/fun/create/create_notif.tsx
new file mode 100644
index 00000000..b3809973
--- /dev/null
+++ b/src/app_modules/notifikasi/fun/create/create_notif.tsx
@@ -0,0 +1,35 @@
+"use server";
+
+import prisma from "@/app/lib/prisma";
+import { MODEL_NOTIFIKASI } from "../../model/interface";
+
+export default async function notifikasiToAdmin_funCreate({
+ data,
+}: {
+ data: MODEL_NOTIFIKASI;
+}) {
+ const getAdmin = await prisma.user.findMany({
+ where: {
+ active: true,
+ masterUserRoleId: "2",
+ },
+ });
+
+ for (let a of getAdmin) {
+ const create = await prisma.notifikasi.create({
+ data: {
+ adminId: a.id,
+ userId: data.userId,
+ appId: data.appId,
+ status: data.status,
+ title: data.title,
+ pesan: data.pesan,
+ kategoriApp: data.kategoriApp,
+ userRoleId: "2",
+ },
+ });
+
+ if (!create) return { status: 400, message: "Gagal mengirim notifikasi" };
+ }
+ return { status: 201, message: "Berhasil mengirim notifikasi" };
+}
diff --git a/src/app_modules/notifikasi/fun/get/get_notifiaksi_by_id.ts b/src/app_modules/notifikasi/fun/get/get_notifiaksi_by_id.ts
new file mode 100644
index 00000000..9ba18fb9
--- /dev/null
+++ b/src/app_modules/notifikasi/fun/get/get_notifiaksi_by_id.ts
@@ -0,0 +1,20 @@
+"use server";
+
+import prisma from "@/app/lib/prisma";
+import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token";
+
+export default async function notifikasi_getByUserId() {
+ const userId = await user_getOneUserId();
+
+ const data = await prisma.notifikasi.findMany({
+ orderBy: {
+ createdAt: "desc",
+ },
+ where: {
+ userId: userId,
+ userRoleId: "1",
+ },
+ });
+
+ return data;
+}
diff --git a/src/app_modules/notifikasi/fun/update/fun_update_is_read_by_user_id.ts b/src/app_modules/notifikasi/fun/update/fun_update_is_read_by_user_id.ts
new file mode 100644
index 00000000..6859eca6
--- /dev/null
+++ b/src/app_modules/notifikasi/fun/update/fun_update_is_read_by_user_id.ts
@@ -0,0 +1,21 @@
+"use server";
+
+import prisma from "@/app/lib/prisma";
+
+export default async function notifikasi_funUpdateIsReadById({
+ notifId,
+}: {
+ notifId: string;
+}) {
+ const updt = await prisma.notifikasi.update({
+ where: {
+ id: notifId,
+ },
+ data: {
+ isRead: true,
+ },
+ });
+
+ if (!updt) return { status: 400 };
+ return { status: 200 };
+}
diff --git a/src/app_modules/notifikasi/index.ts b/src/app_modules/notifikasi/index.ts
new file mode 100644
index 00000000..a347a8b2
--- /dev/null
+++ b/src/app_modules/notifikasi/index.ts
@@ -0,0 +1,3 @@
+import Notifikasi_MainView from "./main";
+
+export { Notifikasi_MainView };
\ No newline at end of file
diff --git a/src/app_modules/notifikasi/main/index.tsx b/src/app_modules/notifikasi/main/index.tsx
new file mode 100644
index 00000000..9a9f64d2
--- /dev/null
+++ b/src/app_modules/notifikasi/main/index.tsx
@@ -0,0 +1,181 @@
+"use client";
+
+import AppComponentGlobal_LayoutTamplate from "@/app_modules/component_global/component_layout_tamplate";
+import ComponentGlobal_HeaderTamplate from "@/app_modules/component_global/header_tamplate";
+import {
+ Badge,
+ Card,
+ Divider,
+ Group,
+ Paper,
+ SimpleGrid,
+ Stack,
+ Text,
+} from "@mantine/core";
+import { MODEL_NOTIFIKASI } from "../model/interface";
+import { useState } from "react";
+import adminNotifikasi_countNotifikasi from "@/app_modules/admin/notifikasi/fun/count/count_is_read";
+import adminNotifikasi_getByUserId from "@/app_modules/admin/notifikasi/fun/get/get_notifikasi_by_user_id";
+import adminNotifikasi_funUpdateIsReadById from "@/app_modules/admin/notifikasi/fun/update/fun_update_is_read_by_id";
+import { IconChecks, IconCheck } from "@tabler/icons-react";
+import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";
+import { useRouter } from "next/navigation";
+import { RouterJob } from "@/app/lib/router_hipmi/router_job";
+import notifikasi_funUpdateIsReadById from "../fun/update/fun_update_is_read_by_user_id";
+import { useAtom } from "jotai";
+import { gs_job_hot_menu, gs_job_status } from "@/app_modules/job/global_state";
+import _ from "lodash";
+import ComponentGlobal_IsEmptyData from "@/app_modules/component_global/is_empty_data";
+
+export default function Notifikasi_MainView({
+ listNotifikasi,
+}: {
+ listNotifikasi: any[];
+}) {
+ return (
+ <>
+ }
+ >
+
+
+ >
+ );
+}
+
+function MainView({ listNotifikasi }: { listNotifikasi: MODEL_NOTIFIKASI[] }) {
+ const router = useRouter();
+ const [data, setData] = useState(listNotifikasi);
+
+ // JOB
+ const [jobMenuId, setJobMenuId] = useAtom(gs_job_hot_menu);
+ const [jobStatus, setJobStatus] = useAtom(gs_job_status);
+
+ if (_.isEmpty(data)) {
+ return ;
+ }
+ return (
+ <>
+
+ {data.map((e, i) => (
+ {
+ e?.kategoriApp === "JOB" &&
+ redirectJobPage({
+ data: e,
+ router: router,
+ onSetPage(val) {
+ setJobMenuId(val.menuId);
+ setJobStatus(val.status);
+ },
+ });
+
+ const cek = await notifikasi_funUpdateIsReadById({
+ notifId: e?.id,
+ });
+ if (cek.status === 200) return null;
+ }}
+ >
+
+
+
+
+ # {e?.kategoriApp}
+
+ {e?.status ? {e?.status} : ""}
+
+
+
+
+
+
+
+ {e?.title}
+
+
+ {e?.pesan}
+
+
+
+
+
+
+ {new Intl.DateTimeFormat("id-ID", {
+ dateStyle: "long",
+ }).format(e?.createdAt)}
+
+
+ {", "}
+ {new Intl.DateTimeFormat("id-ID", {
+ timeStyle: "short",
+ }).format(e?.createdAt)}
+
+
+ {e?.isRead ? (
+
+
+
+ Sudah dilihat
+
+
+ ) : (
+
+
+
+ Belum dilihat
+
+
+ )}
+
+
+
+ ))}
+
+ >
+ );
+}
+
+function redirectJobPage({
+ data,
+ router,
+ onSetPage,
+}: {
+ data: MODEL_NOTIFIKASI;
+ router: AppRouterInstance;
+ onSetPage: (val: any) => void;
+}) {
+ const path = RouterJob.status;
+
+ if (data.status === "Publish") {
+ onSetPage({
+ menuId: 2,
+ status: data.status,
+ });
+ }
+
+ if (data.status === "Reject") {
+ onSetPage({
+ menuId: 2,
+ status: data.status,
+ });
+ }
+
+ router.push(path);
+}
diff --git a/src/app_modules/notifikasi/model/interface.ts b/src/app_modules/notifikasi/model/interface.ts
new file mode 100644
index 00000000..33c8e93f
--- /dev/null
+++ b/src/app_modules/notifikasi/model/interface.ts
@@ -0,0 +1,20 @@
+import { MODEL_USER } from "@/app_modules/home/model/interface";
+import { MODEL_NEW_DEFAULT_MASTER } from "@/app_modules/model_global/interface";
+export interface MODEL_NOTIFIKASI {
+ id: string;
+ isActive: boolean;
+ createdAt: Date;
+ updatedAt: Date;
+ appId: string;
+ kategoriApp: string;
+ isRead: boolean;
+ title: string,
+ pesan: string;
+ User: MODEL_USER;
+ userId: string;
+ Admin: MODEL_USER;
+ adminId: string;
+ status?: string;
+ Role: MODEL_NEW_DEFAULT_MASTER;
+ userRoleId: String;
+}
diff --git a/src/bin/seeder/user_seeder.json b/src/bin/seeder/user_seeder.json
index 645e3d58..cc343dc2 100644
--- a/src/bin/seeder/user_seeder.json
+++ b/src/bin/seeder/user_seeder.json
@@ -7,6 +7,21 @@
{
"name": "firman",
"nomor": "6281339158911",
+ "masterUserRoleId": "2"
+ },
+ {
+ "name": "amalia",
+ "nomor": "628980185458",
"masterUserRoleId": "1"
+ },
+ {
+ "name": "lukman",
+ "nomor": "6287701790942",
+ "masterUserRoleId": "1"
+ },
+ {
+ "name": "fahmi",
+ "nomor": "628123833845",
+ "masterUserRoleId": "3"
}
]
diff --git a/src/util/mqtt_client.ts b/src/util/mqtt_client.ts
index 5164f0da..fc6c68a0 100644
--- a/src/util/mqtt_client.ts
+++ b/src/util/mqtt_client.ts
@@ -5,6 +5,6 @@ declare global {
}
const mqtt_client =
- globalThis.mqtt_client || mqtt.connect("wss://io.wibudev.com");
+ globalThis.mqtt_client || mqtt.connect("ws://wibudev.com:3003");
export default mqtt_client;
diff --git a/src/util/mqtt_loader.tsx b/src/util/mqtt_loader.tsx
index 713e9328..73404600 100644
--- a/src/util/mqtt_loader.tsx
+++ b/src/util/mqtt_loader.tsx
@@ -10,51 +10,17 @@ import { Button, Stack } from "@mantine/core";
export default function MqttLoader() {
useEffect(() => {
mqtt_client.on("connect", () => {
- try {
- console.log("connected");
- } catch (error) {
- console.log(error)
- };
- mqtt_client.subscribe("pesan");
- mqtt_client.subscribe("pesan2");
-
- // fetch("").then((res) => {
- // mqtt_client.subscribe("pesan");
- // });
- });
-
- mqtt_client.on("message", (topic: any, message: any) => {
- // console.log(itu)
- // evnPesan.emit("pesan", itu);
- const data = JSON.parse(message.toString());
-
- if (data) {
- if (data.id === "1") {
- console.log("ini untuk id satu", data.data);
- }
- }
+ console.log("connected");
});
}, []);
- const onClick = async () => {
- mqtt_client.publish("pesan2", "apa pesannya 2");
- };
+ return null;
- const onClick2 = () => {
- mqtt_client.publish(
- "pesan",
- JSON.stringify({
- id: "2",
- title: "donasi",
- data: "databta",
- })
- );
- };
- return null
- // (
- //
- //
- //
- //
+ // <>
+ //
+ //
+ //
+ //
+ // >
// );
}
diff --git a/yarn.lock b/yarn.lock
index 3023b91d..681f31ba 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3718,6 +3718,14 @@ next-dev@^1.1.9:
readdirp "^3.6.0"
yargs "^17.7.2"
+next-scroll-loader@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/next-scroll-loader/-/next-scroll-loader-1.0.5.tgz#e25aaed2c3e5c60bf6d2fa89a387b62483b2ffd0"
+ integrity sha512-j2/yQkjtCZttnpZcKMyLbIylBsGsutFD4Net0cdk3lYOWN7FmPRUlpK0JrZP+KGnq6pyuXh6OxCxY9HJ8BWGZQ==
+ dependencies:
+ react "^18.3.1"
+ react-dom "^18.3.1"
+
next@^13.5.4-canary.8:
version "13.5.6"
resolved "https://registry.yarnpkg.com/next/-/next-13.5.6.tgz#e964b5853272236c37ce0dd2c68302973cf010b1"