+ |
+
+ {e?.Author?.username}
+
+ |
+
+
+
+ {e?.isArsip ? (
+ Arsip
+ ) : (
+ Publish
+ )}
+
+
+ |
|
-
+
{e.imagesId ? (
}
+ leftIcon={}
onClick={() => {
- setImg(e.imagesId);
- open();
+ router.push(RouterAdminJob.detail_poster + e?.imagesId);
}}
>
Lihat
) : (
-
+
Tidak ada poster
@@ -110,62 +147,78 @@ function TableStatus({ listReview }: { listReview: MODEL_JOB[] }) {
return (
<>
-
-
-
-
-
+
-
-
-
- PUBLISH
+
+ {/* {JSON.stringify(listUser, null, 2)} */}
+
+
+ Publish
-
-
-
-
-
- |
- Judul
- |
-
- Poster
- |
-
- Syarat Ketentuan
- |
-
- Deskripsi
- |
-
-
- {TableRows}
-
-
-
- {_.isEmpty(TableRows) ? (
-
- Tidak Ada Data
-
- ) : (
- ""
- )}
-
-
- {/* {JSON.stringify(data, null, 2)} */}
+ }
+ radius={"xl"}
+ placeholder="Masukan judul"
+ onChange={(val) => {
+ onSearch(val.currentTarget.value);
+ }}
+ />
+
+
+
+
+
+
+
+ |
+ Author
+ |
+
+ Status
+ |
+
+ Judul
+ |
+
+ Poster
+ |
+
+ Syarat Ketentuan
+ |
+
+ Deskripsi
+ |
+
+
+ {TableRows}
+
+
+
+ {
+ onPageClick(val);
+ }}
+ />
+
+
+
+
+
>
);
}
diff --git a/src/app_modules/admin/job/child/reject/index.tsx b/src/app_modules/admin/job/child/reject/index.tsx
index 4ca9cecd..c18e3829 100644
--- a/src/app_modules/admin/job/child/reject/index.tsx
+++ b/src/app_modules/admin/job/child/reject/index.tsx
@@ -1,60 +1,90 @@
"use client";
-import { RouterJob } from "@/app/lib/router_hipmi/router_job";
+import { RouterAdminJob } from "@/app/lib/router_admin/router_admin_job";
import ComponentAdminGlobal_HeaderTamplate from "@/app_modules/admin/component_global/header_tamplate";
+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 { MODEL_JOB } from "@/app_modules/job/model/interface";
import {
- Avatar,
- Badge,
- Box,
Button,
- Card,
Center,
- Divider,
- Grid,
Group,
- Image,
Modal,
+ Pagination,
Paper,
ScrollArea,
Spoiler,
Stack,
Table,
Text,
+ TextInput,
Textarea,
Title,
} from "@mantine/core";
-import { useDisclosure } from "@mantine/hooks";
-import { IconBan, IconEyeCheck, IconEyeShare } from "@tabler/icons-react";
-import _ from "lodash";
+import { IconBan, IconPhotoCheck, IconSearch } from "@tabler/icons-react";
import { useRouter } from "next/navigation";
import { useState } from "react";
import { AdminJob_funEditCatatanById } from "../../fun/edit/fun_edit_catatan_by_id";
+import adminJob_getListReject from "../../fun/get/get_list_reject";
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 mqtt_client from "@/util/mqtt_client";
+import adminNotifikasi_funCreateToUser from "@/app_modules/admin/notifikasi/fun/create/fun_create_notif_user";
-export default function AdminJob_TableReject({ dataVote }: { dataVote?: any }) {
+export default function AdminJob_TableReject({
+ dataReject,
+}: {
+ dataReject: any;
+}) {
return (
<>
-
-
+
+
>
);
}
-function TableStatus({ listReject }: { listReject: MODEL_JOB[] }) {
- const [opened, { open, close }] = useDisclosure(false);
- const [data, setData] = useState(listReject);
+function TableStatus({ listReject }: { listReject: any }) {
+ const router = useRouter();
+ const [data, setData] = useState(listReject.data);
+ const [nPage, setNPage] = useState(listReject.nPage);
+ const [activePage, setActivePage] = useState(1);
+ const [isSearch, setSearch] = useState("");
+
const [reject, setReject] = useState(false);
- const [img, setImg] = useState("");
const [jobId, setJobId] = useState("");
const [catatan, setCatatan] = useState("");
- const TableRows = data?.map((e, i) => (
+ async function onSearch(s: string) {
+ setSearch(s);
+ const loadData = await adminJob_getListReject({
+ page: 1,
+ search: s,
+ });
+ setData(loadData.data as any);
+ setNPage(loadData.nPage);
+ setActivePage(1);
+ }
+
+ async function onPageClick(p: any) {
+ setActivePage(p);
+ const loadData = await adminJob_getListReject({
+ search: isSearch,
+ page: p,
+ });
+ setData(loadData.data as any);
+ setNPage(loadData.nPage);
+ }
+
+ const rowTable = data?.map((e, i) => (
+ |
+
+ {e?.Author?.username}
+
+ |
}
+ leftIcon={}
onClick={() => {
- setImg(e.imagesId);
- open();
+ router.push(RouterAdminJob.detail_poster + e?.imagesId);
}}
>
Lihat
@@ -129,7 +158,10 @@ function TableStatus({ listReject }: { listReject: MODEL_JOB[] }) {
setCatatan(e.catatan);
}}
>
- Reject
+
+ Tambah
+ Catatan
+
|
@@ -137,42 +169,51 @@ function TableStatus({ listReject }: { listReject: MODEL_JOB[] }) {
return (
<>
-
-
-
-
-
-
{
setReject(false);
}}
withCloseButton={false}
- size={"lg"}
+ size={"sm"}
centered
>
-
-
-
-
- REJECT
+
+
+
+ Reject
-
-
-
-
-
- |
- Judul
- |
-
- Poster
- |
-
- Syarat Ketentuan
- |
-
- Deskripsi
- |
-
- Catatan
- |
-
- Aksi
- |
-
-
- {TableRows}
-
-
-
- {_.isEmpty(TableRows) ? (
-
- Tidak Ada Data
-
- ) : (
- ""
- )}
-
-
- {/* {JSON.stringify(data, null, 2)} */}
+ }
+ radius={"xl"}
+ placeholder="Masukan judul"
+ onChange={(val) => {
+ onSearch(val.currentTarget.value);
+ }}
+ />
+
+
+
+
+
+
+
+ |
+ Author
+ |
+
+ Judul
+ |
+
+ Poster
+ |
+
+ Syarat Ketentuan
+ |
+
+ Deskripsi
+ |
+
+ Report
+ |
+
+ Aksi
+ |
+
+
+ {rowTable}
+
+
+
+ {
+ onPageClick(val);
+ }}
+ />
+
+
+
>
);
}
-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);
+async function onReject({
+ jobId,
+ catatan,
+ onSetData,
+}: {
+ jobId: string;
+ catatan: string;
+ onSetData: (val: any) => void;
+}) {
+ const reject = await AdminJob_funEditCatatanById(jobId, catatan);
+ if (reject.status === 200) {
+ const loadData = await adminJob_getListReject({ page: 1 });
+ onSetData(loadData);
+
+ 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: "Report tambahan",
+ };
+
+ 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 })
+ );
}
- });
+
+ ComponentGlobal_NotifikasiBerhasil(reject.message);
+ } else {
+ ComponentGlobal_NotifikasiGagal(reject.message);
+ }
}
diff --git a/src/app_modules/admin/job/child/review/index.tsx b/src/app_modules/admin/job/child/review/index.tsx
index 257a36b1..e3805437 100644
--- a/src/app_modules/admin/job/child/review/index.tsx
+++ b/src/app_modules/admin/job/child/review/index.tsx
@@ -1,62 +1,116 @@
"use client";
-import { RouterJob } from "@/app/lib/router_hipmi/router_job";
+import { RouterAdminJob } from "@/app/lib/router_admin/router_admin_job";
import ComponentAdminGlobal_HeaderTamplate from "@/app_modules/admin/component_global/header_tamplate";
+import adminNotifikasi_funCreateToUser from "@/app_modules/admin/notifikasi/fun/create/fun_create_notif_user";
+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_JOB } from "@/app_modules/job/model/interface";
+import mqtt_client from "@/util/mqtt_client";
import {
- Avatar,
- Badge,
- Box,
Button,
- Card,
Center,
- Divider,
- Grid,
Group,
- Image,
Modal,
+ Pagination,
Paper,
ScrollArea,
Spoiler,
Stack,
Table,
Text,
+ TextInput,
Textarea,
Title,
} from "@mantine/core";
-import { useDisclosure } from "@mantine/hooks";
-import { IconBan, IconEyeCheck, IconEyeShare } from "@tabler/icons-react";
-import _ from "lodash";
+import { useShallowEffect } from "@mantine/hooks";
+import {
+ IconBan,
+ IconEyeCheck,
+ IconEyeShare,
+ IconHandFinger,
+ IconSearch,
+} from "@tabler/icons-react";
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";
+import { AdminJob_funEditStatusPublishById } from "../../fun/edit/fun_edit_status_publish_by_id";
+import adminJob_getListReview from "../../fun/get/get_list_review";
+import { IconPhotoCheck } from "@tabler/icons-react";
+import ComponentGlobal_InputCountDown from "@/app_modules/component_global/input_countdown";
-export default function AdminJob_TableReview({ dataVote }: { dataVote?: any }) {
+export default function AdminJob_TableReview({
+ dataReview,
+}: {
+ dataReview: any;
+}) {
return (
<>
-
-
+
+
>
);
}
-function TableStatus({ listReview }: { listReview: MODEL_JOB[] }) {
+function TableStatus({ listReview }: { listReview: any }) {
const router = useRouter();
- const [opened, { open, close }] = useDisclosure(false);
- const [data, setData] = useState(listReview);
+ const [data, setData] = useState(listReview.data);
+ const [nPage, setNPage] = useState(listReview.nPage);
+ const [activePage, setActivePage] = useState(1);
+ const [isSearch, setSearch] = useState("");
+
const [reject, setReject] = useState(false);
- const [img, setImg] = useState("");
const [jobId, setJobId] = useState("");
const [catatan, setCatatan] = useState("");
- const TableRows = data?.map((e, i) => (
+ 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.imagesId ? (
}
+ leftIcon={}
onClick={() => {
- setImg(e.imagesId);
- open();
+ router.push(RouterAdminJob.detail_poster + e?.imagesId);
}}
>
Lihat
@@ -117,7 +170,15 @@ function TableStatus({ listReview }: { listReview: MODEL_JOB[] }) {
color={"green"}
leftIcon={}
radius={"xl"}
- onClick={() => onPublish(e.id, setData)}
+ onClick={() =>
+ onPublish({
+ jobId: e?.id,
+ onLoadData(val: any) {
+ setData(val.data);
+ setNPage(val.nPage);
+ },
+ })
+ }
>
Publish
@@ -140,41 +201,48 @@ function TableStatus({ listReview }: { listReview: MODEL_JOB[] }) {
return (
<>
-
-
-
-
-
-
{
setReject(false);
}}
withCloseButton={false}
- size={"lg"}
+ size={"sm"}
centered
>
-
-
-
-
- REVIEW
+
+
+
+ Review
-
-
-
-
-
- |
- Judul
- |
-
- Poster
- |
-
- Syarat Ketentuan
- |
-
- Deskripsi
- |
-
- Aksi
- |
-
-
- {TableRows}
-
-
-
- {_.isEmpty(TableRows) ? (
-
- Tidak Ada Data
-
- ) : (
- ""
- )}
-
-
- {/* {JSON.stringify(data, null, 2)} */}
+ }
+ 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: 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 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: 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);
+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/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 c25c104d..66200ba8 100644
--- a/src/app_modules/admin/job/index.tsx
+++ b/src/app_modules/admin/job/index.tsx
@@ -2,5 +2,12 @@ import AdminJob_Main from "./main";
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 796e51b1..56552365 100644
--- a/src/app_modules/admin/layout.tsx
+++ b/src/app_modules/admin/layout.tsx
@@ -1,12 +1,12 @@
"use client";
+import mqtt_client from "@/util/mqtt_client";
import {
ActionIcon,
AppShell,
Badge,
Box,
Burger,
- Button,
Card,
Center,
Divider,
@@ -30,17 +30,15 @@ import {
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, { useEffect, 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 { MODEL_USER } from "../home/model/interface";
+import { MODEL_NOTIFIKASI } from "../notifikasi/model/interface";
import Admin_Logout from "./component_global/logout";
import {
gs_admin_hotMenu,
@@ -48,16 +46,9 @@ import {
gs_layout_admin_isNavbarOpen,
} from "./global_state";
import { listAdminPage } from "./list_page";
-import { MODEL_NOTIFIKASI } from "../notifikasi/model/interface";
-import { MODEL_USER } from "../home/model/interface";
-import { useHover, useShallowEffect, useToggle } from "@mantine/hooks";
-import moment from "moment";
-import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";
-import { RouterAdminJob } from "@/app/lib/router_admin/router_admin_job";
-import adminNotifikasi_funUpdateIsReadById from "./notifikasi/fun/update/fun_update_is_read_by_id";
-import adminNotifikasi_getByUserId from "./notifikasi/fun/get/get_notifikasi_by_user_id";
import adminNotifikasi_countNotifikasi from "./notifikasi/fun/count/count_is_read";
-import mqtt_client from "@/util/mqtt_client";
+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({
children,
@@ -322,7 +313,6 @@ export default function AdminLayout({
Notifikasi
- {/* */}
}
opened={isNotif}
@@ -364,7 +354,7 @@ function DrawerNotifikasi({
}) {
const router = useRouter();
- if (_.isEmpty(data)){
+ if (_.isEmpty(data)) {
return (
<>
@@ -375,7 +365,6 @@ function DrawerNotifikasi({
>
);
}
-
return (
<>
@@ -383,6 +372,9 @@ function DrawerNotifikasi({
{data.map((e, i) => (
{
@@ -426,15 +416,31 @@ function DrawerNotifikasi({
}}
>
-
-
- # {e?.kategoriApp}
-
- {e?.status ? {e?.status} : ""}
-
+
+
+
+ # {e?.kategoriApp}
+
+ {e?.status ? (
+
+ {e?.status}
+
+ ) : (
+ ""
+ )}
+
+
+
-
- {e?.pesan}
+
+
+
+ {e?.title}
+
+
+ {e?.pesan}
+
+
@@ -487,10 +493,22 @@ async function findRouterJob({
onToggleNavbar2: (val: any) => void;
}) {
const routeName = "/dev/admin/job/child/";
- router.push(routeName + _.lowerCase(data.status));
- onChangeNavbar2({
- id: 6,
- childId: 63,
- });
+
+ 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 52ffbc54..583b3244 100644
--- a/src/app_modules/admin/list_page.tsx
+++ b/src/app_modules/admin/list_page.tsx
@@ -206,11 +206,11 @@ export const listAdminPage = [
name: "Table Reject",
path: RouterAdminJob.reject,
},
- {
- id: 65,
- name: "Arsip",
- path: RouterAdminJob.arsip,
- },
+ // {
+ // 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
index 900d1a8c..8d1ca366 100644
--- a/src/app_modules/admin/notifikasi/fun/count/count_is_read.ts
+++ b/src/app_modules/admin/notifikasi/fun/count/count_is_read.ts
@@ -4,12 +4,13 @@ import prisma from "@/app/lib/prisma";
import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token";
export default async function adminNotifikasi_countNotifikasi() {
- const userId = await user_getOneUserId();
+ const adminId = await user_getOneUserId();
const data = await prisma.notifikasi.findMany({
where: {
- adminId: userId,
+ adminId: adminId,
isRead: false,
+ userRoleId: "2",
},
});
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
index 2d3adc02..5f2bfc74 100644
--- 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
@@ -2,13 +2,15 @@
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"
+
+ orderBy: {
+ createdAt: "desc",
},
where: {
adminId: adminId,
diff --git a/src/app_modules/admin/notifikasi/index.ts b/src/app_modules/admin/notifikasi/index.ts
index e0790cb3..f1de6874 100644
--- a/src/app_modules/admin/notifikasi/index.ts
+++ b/src/app_modules/admin/notifikasi/index.ts
@@ -1,5 +1,2 @@
// test notif
-import Notifikasi_MainView from "./main";
-
-export { Notifikasi_MainView };
diff --git a/src/app_modules/admin/notifikasi/main/index.tsx b/src/app_modules/admin/notifikasi/main/index.tsx
deleted file mode 100644
index f59dc3ff..00000000
--- a/src/app_modules/admin/notifikasi/main/index.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-"use client";
-
-import AppComponentGlobal_LayoutTamplate from "@/app_modules/component_global/component_layout_tamplate";
-import ComponentGlobal_HeaderTamplate from "@/app_modules/component_global/header_tamplate";
-import { Text } from "@mantine/core";
-
-export default function Notifikasi_MainView() {
- return (
- <>
- }
- >
-
-
- >
- );
-}
-
-function MainView() {
- return (
- <>
- 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/global_state/index.ts b/src/app_modules/global_state/index.ts
deleted file mode 100644
index 6ac7493e..00000000
--- a/src/app_modules/global_state/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-// index
\ No newline at end of file
diff --git a/src/app_modules/home/layout.tsx b/src/app_modules/home/layout.tsx
index 962080de..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,
@@ -34,116 +35,46 @@ import { ComponentGlobal_NotifikasiPeringatan } from "../component_global/notif_
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 (
<>
@@ -172,7 +103,9 @@ export default function HomeLayout({
router.push(RouterNotifikasi.main);
}}
>
-
+ {countNotif}}>
+
+
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 43ef52a1..68b6eca4 100644
--- a/src/app_modules/job/create/view.tsx
+++ b/src/app_modules/job/create/view.tsx
@@ -36,7 +36,7 @@ import { defaultDeskripsi, defaultSyarat } from "../component/default_value";
import ComponentJob_NotedBox from "../component/detail/noted_box";
import { MODEL_JOB } from "../model/interface";
import { Job_funCreate } from "../fun/create/fun_create";
-import notifikasi_funCreate from "@/app_modules/notifikasi/fun/create/create_notif";
+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";
@@ -229,7 +229,7 @@ function ButtonAction({ value, file }: { value: MODEL_JOB; file: FormData }) {
const create = await Job_funCreate(value as any, gambar);
if (create.status === 201) {
- const dataNotif = {
+ const dataNotif : any = {
appId: create.data?.id as any,
kategoriApp: "JOB",
status: create.data?.MasterStatus?.name as any,
@@ -237,7 +237,8 @@ function ButtonAction({ value, file }: { value: MODEL_JOB; file: FormData }) {
pesan: create.data?.title as any,
title: "Job baru",
};
- const notif = await notifikasi_funCreate({ data: dataNotif as any });
+ const notif = await notifikasiToAdmin_funCreate({ data: dataNotif as any });
+ console.log(notif)
if (notif.status === 201) {
mqtt_client.publish(
diff --git a/src/app_modules/job/detail/draft/view.tsx b/src/app_modules/job/detail/draft/view.tsx
index a3afdae6..f9082be1 100644
--- a/src/app_modules/job/detail/draft/view.tsx
+++ b/src/app_modules/job/detail/draft/view.tsx
@@ -14,6 +14,8 @@ import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/
import { Job_funDeleteById } from "../../fun/delete/fun_delete_by_id";
import ComponentJob_NotedBox from "../../component/detail/noted_box";
import { MODEL_JOB } from "../../model/interface";
+import mqtt_client from "@/util/mqtt_client";
+import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif";
export default function Job_DetailDraft({ dataJob }: { dataJob: MODEL_JOB }) {
return (
@@ -37,15 +39,31 @@ function ButtonAction({ jobId }: { jobId: string }) {
const [opened, { open, close }] = useDisclosure();
async function onAction() {
- await Job_funEditStatusByStatusId(jobId, "2").then((res) => {
- if (res.status === 200) {
- setStatus("Review");
- ComponentGlobal_NotifikasiBerhasil("Berhasil Diajukan");
- router.push(RouterJob.status);
- } else {
- ComponentGlobal_NotifikasiGagal(res.message);
+ const update = await Job_funEditStatusByStatusId(jobId, "2");
+ if (update.status === 200) {
+ const dataNotif = {
+ appId: update.data?.id as any,
+ status: update.data?.MasterStatus?.name as any,
+ userId: update.data?.authorId as any,
+ pesan: update.data?.title as any,
+ kategoriApp: "JOB",
+ title: "Mengajukan review",
+ };
+
+ const notif = await notifikasiToAdmin_funCreate({
+ data: dataNotif as any,
+ });
+
+ if (notif.status === 201) {
+ mqtt_client.publish("ADMIN", JSON.stringify({ count: 1 }));
}
- });
+
+ setStatus("Review");
+ ComponentGlobal_NotifikasiBerhasil("Berhasil Diajukan");
+ router.push(RouterJob.status);
+ } else {
+ ComponentGlobal_NotifikasiGagal(update.message);
+ }
}
async function onDelete() {
diff --git a/src/app_modules/job/detail/reject/view.tsx b/src/app_modules/job/detail/reject/view.tsx
index d45791a8..636adb16 100644
--- a/src/app_modules/job/detail/reject/view.tsx
+++ b/src/app_modules/job/detail/reject/view.tsx
@@ -16,6 +16,7 @@ import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/
import { Job_funDeleteById } from "../../fun/delete/fun_delete_by_id";
export default function Job_DetailReject({ dataJob }: { dataJob: MODEL_JOB }) {
+
return (
<>
diff --git a/src/app_modules/job/detail/review/view.tsx b/src/app_modules/job/detail/review/view.tsx
index d36fd369..7d4857d1 100644
--- a/src/app_modules/job/detail/review/view.tsx
+++ b/src/app_modules/job/detail/review/view.tsx
@@ -10,6 +10,8 @@ import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/component_glob
import { MODEL_JOB } from "../../model/interface";
import { Job_funEditStatusByStatusId } from "../../fun/edit/fun_edit_status_by_status_id";
import { ComponentGlobal_NotifikasiGagal } from "@/app_modules/component_global/notif_global/notifikasi_gagal";
+import notifikasiToAdmin_funCreate from "@/app_modules/notifikasi/fun/create/create_notif";
+import mqtt_client from "@/util/mqtt_client";
export default function Job_DetailReview({ dataJob }: { dataJob: MODEL_JOB }) {
return (
@@ -27,15 +29,31 @@ function ButtonAction({ jobId }: { jobId: string }) {
const [status, setStatus] = useAtom(gs_job_status);
async function onAction() {
- await Job_funEditStatusByStatusId(jobId, "3").then((res) => {
- if (res.status === 200) {
- setStatus("Draft");
- ComponentGlobal_NotifikasiBerhasil("Berhasil Dibatalkan");
- router.push(RouterJob.status);
- } else {
- ComponentGlobal_NotifikasiGagal(res.message);
+ const update = await Job_funEditStatusByStatusId(jobId, "3");
+ if (update.status === 200) {
+ const dataNotif = {
+ appId: update.data?.id as any,
+ kategoriApp: "JOB",
+ status: update.data?.MasterStatus?.name as any,
+ userId: update.data?.authorId as any,
+ pesan: update.data?.title as any,
+ title: "Membatalkan review",
+ };
+
+ const notif = await notifikasiToAdmin_funCreate({
+ data: dataNotif as any,
+ });
+
+ if (notif.status === 201) {
+ mqtt_client.publish("ADMIN", JSON.stringify({ count: 1 }));
}
- });
+
+ setStatus("Draft");
+ ComponentGlobal_NotifikasiBerhasil("Berhasil Dibatalkan");
+ router.push(RouterJob.status);
+ } else {
+ ComponentGlobal_NotifikasiGagal(update.message);
+ }
}
return (
<>
diff --git a/src/app_modules/job/fun/create/fun_create.ts b/src/app_modules/job/fun/create/fun_create.ts
index 6eb7e8f8..aa0a3ae7 100644
--- a/src/app_modules/job/fun/create/fun_create.ts
+++ b/src/app_modules/job/fun/create/fun_create.ts
@@ -31,7 +31,7 @@ export async function Job_funCreate(req: MODEL_JOB, file: FormData) {
if (!upload) return { status: 400, message: "Gagal upload gambar" };
const uploadFolder = Buffer.from(await dataImage.arrayBuffer());
fs.writeFileSync(`./public/job/${upload.url}`, uploadFolder);
- const create = await prisma.job.create({
+ const createDataWithImg = await prisma.job.create({
data: {
title: req.title,
content: req.content,
@@ -39,16 +39,27 @@ export async function Job_funCreate(req: MODEL_JOB, file: FormData) {
authorId: authorId,
imagesId: upload.id,
},
+ select: {
+ id: true,
+ authorId: true,
+ MasterStatus: {
+ select: {
+ name: true,
+ },
+ },
+ title: true,
+ },
});
- if (!create) return { status: 400, message: "Gagal Disimpan" };
+ if (!createDataWithImg) return { status: 400, message: "Gagal Disimpan" };
revalidatePath("/dev/job/main/status");
return {
+ data: createDataWithImg,
status: 201,
message: "Berhasil Disimpan",
};
} else {
- const create = await prisma.job.create({
+ const createDataWithoutImg = await prisma.job.create({
data: {
title: req.title,
content: req.content,
@@ -67,10 +78,11 @@ export async function Job_funCreate(req: MODEL_JOB, file: FormData) {
},
});
- if (!create) return { status: 400, message: "Gagal Disimpan" };
+ if (!createDataWithoutImg)
+ return { status: 400, message: "Gagal Disimpan" };
revalidatePath("/dev/job/main/status");
return {
- data: create,
+ data: createDataWithoutImg,
status: 201,
message: "Berhasil Disimpan",
};
diff --git a/src/app_modules/job/fun/edit/fun_edit_status_by_status_id.ts b/src/app_modules/job/fun/edit/fun_edit_status_by_status_id.ts
index 5b94a262..4da9cff1 100644
--- a/src/app_modules/job/fun/edit/fun_edit_status_by_status_id.ts
+++ b/src/app_modules/job/fun/edit/fun_edit_status_by_status_id.ts
@@ -14,9 +14,19 @@ export async function Job_funEditStatusByStatusId(
data: {
masterStatusId: statusId,
},
+ select: {
+ id: true,
+ authorId: true,
+ MasterStatus: {
+ select: {
+ name: true,
+ },
+ },
+ title: true,
+ },
});
if (!updt) return { status: 400, message: "Gagal ganti status" };
revalidatePath("/dev/job/main/status");
- return { status: 200, message: "Berhasil ganti status" };
+ return { data: updt, status: 200, message: "Berhasil ganti status" };
}
diff --git a/src/app_modules/job/fun/get/status/new_get_list_reject.ts b/src/app_modules/job/fun/get/status/new_get_list_reject.ts
new file mode 100644
index 00000000..6518baf5
--- /dev/null
+++ b/src/app_modules/job/fun/get/status/new_get_list_reject.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 job_getListReject({}: {}) {
+ const userId = await user_getOneUserId();
+ const data = await prisma.job.findMany({
+ orderBy: {
+ updatedAt: "desc",
+ },
+ where: {
+ masterStatusId: "2",
+ authorId: userId,
+ isActive: true,
+ },
+ });
+
+ return data;
+}
diff --git a/src/app_modules/job/non_user_view/view.tsx b/src/app_modules/job/non_user_view/view.tsx
index 6fede772..1bca778f 100644
--- a/src/app_modules/job/non_user_view/view.tsx
+++ b/src/app_modules/job/non_user_view/view.tsx
@@ -1,6 +1,6 @@
"use client";
-import { Card, Center, Image, Stack, Text } from "@mantine/core";
+import { Card, Center, Image, Overlay, Stack, Text, Title } from "@mantine/core";
import ComponentJob_DetailData from "../component/detail/detail_data";
import { RouterJob } from "@/app/lib/router_hipmi/router_job";
import { data } from "autoprefixer";
@@ -46,6 +46,18 @@ export default function Job_NonUserView({ data }: { data: MODEL_JOB }) {
+ {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
index e312417f..b3809973 100644
--- a/src/app_modules/notifikasi/fun/create/create_notif.tsx
+++ b/src/app_modules/notifikasi/fun/create/create_notif.tsx
@@ -3,7 +3,7 @@
import prisma from "@/app/lib/prisma";
import { MODEL_NOTIFIKASI } from "../../model/interface";
-export default async function notifikasi_funCreate({
+export default async function notifikasiToAdmin_funCreate({
data,
}: {
data: MODEL_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
index e345b3ac..9ba18fb9 100644
--- a/src/app_modules/notifikasi/fun/get/get_notifiaksi_by_id.ts
+++ b/src/app_modules/notifikasi/fun/get/get_notifiaksi_by_id.ts
@@ -1,9 +1,20 @@
-"use server"
+"use server";
-import { user_getOneUserId } from "@/app_modules/fun_global/get_user_token"
+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 userId = await user_getOneUserId();
+ const data = await prisma.notifikasi.findMany({
+ orderBy: {
+ createdAt: "desc",
+ },
+ where: {
+ userId: userId,
+ userRoleId: "1",
+ },
+ });
-}
\ No newline at end of file
+ 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
index b3586ab9..a347a8b2 100644
--- a/src/app_modules/notifikasi/index.ts
+++ b/src/app_modules/notifikasi/index.ts
@@ -1 +1,3 @@
-// test notif
+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/bin/seeder/user_seeder.json b/src/bin/seeder/user_seeder.json
index 3017ffb4..cc343dc2 100644
--- a/src/bin/seeder/user_seeder.json
+++ b/src/bin/seeder/user_seeder.json
@@ -2,7 +2,7 @@
{
"name": "banuna",
"nomor": "6282340374412",
- "masterUserRoleId": "2"
+ "masterUserRoleId": "3"
},
{
"name": "firman",
@@ -18,5 +18,10 @@
"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/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"
| |