From e2d49fdd7e3e9ca2ff1a02f3b40c1268f77eb48e Mon Sep 17 00:00:00 2001 From: amel Date: Wed, 14 Aug 2024 15:40:19 +0800 Subject: [PATCH] upd: announcement Deskripsi: - tambah - edit - detail No Issues --- .../(application)/announcement/[id]/page.tsx | 8 +- .../announcement/edit/[id]/page.tsx | 8 +- src/app/api/announcement/[id]/route.ts | 156 +++++++++++++- src/app/api/announcement/get/route.ts | 6 - src/app/api/announcement/post/route.ts | 6 - src/app/api/announcement/route.ts | 44 ++-- src/app/api/user/route.ts | 2 +- .../announcement/api/api_announcement.ts | 16 -- src/module/announcement/api/api_index.ts | 40 ---- .../api/get/getAllAnnouncement.ts | 38 ---- .../api/get/getOneAnnouncement.ts | 49 ----- .../api/get/getUserAnnouncement.ts | 39 ---- .../api/post/createAnnouncement.ts | 44 ---- .../api/post/deleteAnnouncement.ts | 27 --- .../api/post/updateAnnouncement.ts | 48 ----- src/module/announcement/index.ts | 12 +- .../announcement/lib/api_announcement.ts | 39 +++- .../announcement/lib/type_announcement.ts | 30 ++- .../announcement/lib/val_announcement.ts | 5 +- .../announcement/ui/create_announcement.tsx | 102 +++++---- .../ui/create_users_announcement.tsx | 35 +++- .../announcement/ui/detail_announcement.tsx | 75 +++++-- .../ui/drawer_detail_announcement.tsx | 21 +- .../announcement/ui/edit_announcement.tsx | 126 ++++++++++- .../announcement/ui/edit_choose_member.tsx | 196 ++++++++++++++++++ .../announcement/ui/list_announcement.tsx | 87 ++++---- .../ui/navbar_detail_announcement.tsx | 9 +- .../ui/view_detail_anouncement.tsx | 12 -- src/module/user/member/ui/list_member.tsx | 5 +- 29 files changed, 784 insertions(+), 501 deletions(-) delete mode 100644 src/app/api/announcement/get/route.ts delete mode 100644 src/app/api/announcement/post/route.ts delete mode 100644 src/module/announcement/api/api_announcement.ts delete mode 100644 src/module/announcement/api/api_index.ts delete mode 100644 src/module/announcement/api/get/getAllAnnouncement.ts delete mode 100644 src/module/announcement/api/get/getOneAnnouncement.ts delete mode 100644 src/module/announcement/api/get/getUserAnnouncement.ts delete mode 100644 src/module/announcement/api/post/createAnnouncement.ts delete mode 100644 src/module/announcement/api/post/deleteAnnouncement.ts delete mode 100644 src/module/announcement/api/post/updateAnnouncement.ts create mode 100644 src/module/announcement/ui/edit_choose_member.tsx delete mode 100644 src/module/announcement/ui/view_detail_anouncement.tsx diff --git a/src/app/(application)/announcement/[id]/page.tsx b/src/app/(application)/announcement/[id]/page.tsx index 872826e..8bd5211 100644 --- a/src/app/(application)/announcement/[id]/page.tsx +++ b/src/app/(application)/announcement/[id]/page.tsx @@ -1,8 +1,12 @@ -import { ViewDetailAnnouncement } from "@/module/announcement"; +import { DetailAnnouncement, NavbarDetailAnnouncement } from "@/module/announcement"; +import { Box } from "@mantine/core"; function Page({ params }: { params: { id: string } }) { return ( - + + + + ) } diff --git a/src/app/(application)/announcement/edit/[id]/page.tsx b/src/app/(application)/announcement/edit/[id]/page.tsx index 11a0820..31ddb52 100644 --- a/src/app/(application)/announcement/edit/[id]/page.tsx +++ b/src/app/(application)/announcement/edit/[id]/page.tsx @@ -1,9 +1,11 @@ -// import { ViewEditAnnouncement } from "@/module/announcement"; +import { EditAnnouncement } from "@/module/announcement"; +import { Box } from "@mantine/core"; function Page({ params }: { params: { id: any } }) { return ( - // - "" + + + ) } diff --git a/src/app/api/announcement/[id]/route.ts b/src/app/api/announcement/[id]/route.ts index 6f86b70..95535bd 100644 --- a/src/app/api/announcement/[id]/route.ts +++ b/src/app/api/announcement/[id]/route.ts @@ -3,15 +3,19 @@ import { funGetUserByCookies } from "@/module/auth"; import _ from "lodash"; import { NextResponse } from "next/server"; + + +// GET ONE PENGUMUMAN, UNTUK TAMPIL DETAIL PENGUMUMAN export async function GET(request: Request, context: { params: { id: string } }) { try { const { id } = context.params; + const { searchParams } = new URL(request.url); + const kategori = searchParams.get('category'); const user = await funGetUserByCookies() if (user.id == undefined) { return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); } - const { searchParams } = new URL(request.url); - // const announcementId = searchParams.get("announcement"); + const announcement = await prisma.announcement.findUnique({ where: { id: id, @@ -22,12 +26,12 @@ export async function GET(request: Request, context: { params: { id: string } }) desc: true, }, }); + const announcementMember = await prisma.announcementMember.findMany({ where: { idAnnouncement: id, }, select: { - idAnnouncement: true, idGroup: true, idDivision: true, Group: { @@ -35,24 +39,162 @@ export async function GET(request: Request, context: { params: { id: string } }) name: true, }, }, + Division: { + select: { + name: true, + }, + }, }, }); - const allAnnouncementMember = announcementMember.map((v: any) => ({ - ..._.omit(v, ["Group"]), + const formatMember = announcementMember.map((v: any) => ({ + ..._.omit(v, ["Group", "Division"]), + idGroup: v.idGroup, + idDivision: v.idDivision, group: v.Group.name, + division: v.Division.name })) + const fixMember = Object.groupBy(formatMember, ({ group }) => group); + return NextResponse.json( { success: true, message: "Berhasil mendapatkan announcement", - announcement, allAnnouncementMember + data: announcement, + member: fixMember }, { status: 200 } ); + + + } catch (error) { console.error(error); return NextResponse.json({ success: false, message: "Gagal mendapatkan announcement, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); } -} \ No newline at end of file +} + + + +// HAPUS PENGUMUMAN +export async function DELETE(request: Request, context: { params: { id: string } }) { + try { + const user = await funGetUserByCookies() + if (user.id == undefined) { + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + } + const { id } = context.params; + const data = await prisma.announcement.count({ + where: { + id: id, + }, + }); + + if (data == 0) { + return NextResponse.json( + { + success: false, + message: "Hapus pengumuman gagal, data tidak ditemukan", + }, + { status: 404 } + ); + } + + const update = await prisma.announcement.update({ + where: { + id: id, + }, + data: { + isActive: false, + }, + }); + + return NextResponse.json( + { + success: true, + message: "Pengumuman berhasil dihapus", + data, + }, + { status: 200 } + ); + } catch (error) { + console.log(error); + return NextResponse.json({ success: false, message: "Gagal mendapatkan pengumuman, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + } +} + + + +// EDIT PENGUMUMAN +export async function PUT(request: Request, context: { params: { id: string } }) { + try { + const user = await funGetUserByCookies(); + if (user.id == undefined) { + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + } + + + const { title, desc, groups } = (await request.json()); + const { id } = context.params; + + const data = await prisma.announcement.count({ + where: { + id: id, + }, + }); + + if (data == 0) { + return NextResponse.json( + { + success: false, + message: "Hapus pengumuman gagal, data tidak ditemukan", + }, + { status: 404 } + ); + } + + const update = await prisma.announcement.update({ + where: { + id: id + }, + data: { + title, + desc, + }, + }); + + // hapus semua member divisi pengumuman + const hapus = await prisma.announcementMember.deleteMany({ + where: { + idAnnouncement: id + } + }) + + let memberDivision = [] + + for (var i = 0, l = groups.length; i < l; i++) { + var obj = groups[i].Division; + for (let index = 0; index < obj.length; index++) { + const element = obj[index]; + const fix = { + idAnnouncement: id, + idGroup: groups[i].id, + idDivision: element.id + } + memberDivision.push(fix) + } + } + + const announcementMember = await prisma.announcementMember.createMany({ + data: memberDivision, + }); + + return NextResponse.json({ success: true, message: "Berhasil mengedit pengumuman" }, { status: 200 }); + + } catch (error) { + console.error(error); + return NextResponse.json({ success: false, message: "Gagal mengedit pengumuman, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + } +} + diff --git a/src/app/api/announcement/get/route.ts b/src/app/api/announcement/get/route.ts deleted file mode 100644 index baf9e82..0000000 --- a/src/app/api/announcement/get/route.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { apiAnnouncement } from "@/module/announcement"; -import { NextRequest } from "next/server"; - -export async function GET(req: NextRequest) { - return apiAnnouncement(req, "GET") -} \ No newline at end of file diff --git a/src/app/api/announcement/post/route.ts b/src/app/api/announcement/post/route.ts deleted file mode 100644 index 138ee81..0000000 --- a/src/app/api/announcement/post/route.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { apiAnnouncement } from "@/module/announcement"; -import { NextRequest } from "next/server"; - -export async function POST(req: NextRequest) { - return apiAnnouncement(req, "POST"); -} diff --git a/src/app/api/announcement/route.ts b/src/app/api/announcement/route.ts index c3c2af1..90cfd9c 100644 --- a/src/app/api/announcement/route.ts +++ b/src/app/api/announcement/route.ts @@ -7,6 +7,10 @@ import "moment/locale/id"; import { NextResponse } from "next/server"; export const dynamic = 'force-dynamic' + + + +// GET ALL PENGUMUMAN export async function GET(request: Request) { try { const user = await funGetUserByCookies(); @@ -32,6 +36,9 @@ export async function GET(request: Request) { desc: true, createdAt: true, }, + orderBy: { + createdAt: 'desc' + } }); const allData = announcements.map((v: any) => ({ @@ -47,6 +54,8 @@ export async function GET(request: Request) { } + +// CREATE PENGUMUMAN export async function POST(request: Request) { try { const user = await funGetUserByCookies(); @@ -54,40 +63,45 @@ export async function POST(request: Request) { return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); } - const { title, desc, createBy, groups } = (await request.json()); + const { title, desc, groups } = (await request.json()); const villaId = user.idVillage - const roleId = user.idUserRole + const userId = user.id const data = await prisma.announcement.create({ data: { title, desc, idVillage: String(villaId), - createdBy: String(roleId), + createdBy: String(userId), }, select: { id: true, - title: true, - desc: true, - createdAt: true, } }); - const dataMember = groups.map((group: any) => ({ - idAnnouncement: data.id, - idGroup: group.idGroup, - idDivision: group.idDivision, - isActive: true, - })); + let memberDivision = [] + + for (var i = 0, l = groups.length; i < l; i++) { + var obj = groups[i].Division; + for (let index = 0; index < obj.length; index++) { + const element = obj[index]; + const fix = { + idAnnouncement: data.id, + idGroup: groups[i].id, + idDivision: element.id + } + memberDivision.push(fix) + } + } const announcementMember = await prisma.announcementMember.createMany({ - data: dataMember, + data: memberDivision, }); - return NextResponse.json({data, groups: announcementMember, success: true, message: "Berhasil mendapatkan pengumuman"}, { status: 200 }); + return NextResponse.json({ success: true, message: "Berhasil membuat pengumuman" }, { status: 200 }); } catch (error) { console.error(error); - return NextResponse.json({ success: false, message: "Gagal mendapatkan pengumuman, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + return NextResponse.json({ success: false, message: "Gagal membuat pengumuman, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); } } \ No newline at end of file diff --git a/src/app/api/user/route.ts b/src/app/api/user/route.ts index 37d587d..1d7f3b0 100644 --- a/src/app/api/user/route.ts +++ b/src/app/api/user/route.ts @@ -25,7 +25,7 @@ export async function GET(request: Request) { const users = await prisma.user.findMany({ where: { - isActive: active == "true" ? true : false, + isActive: active == 'false' ? false : true, idGroup: String(fixGroup), name: { contains: (name == undefined || name == null) ? "" : name, diff --git a/src/module/announcement/api/api_announcement.ts b/src/module/announcement/api/api_announcement.ts deleted file mode 100644 index 91a75cb..0000000 --- a/src/module/announcement/api/api_announcement.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NextRequest } from "next/server"; -import { API_INDEX_ANNOUNCEMENT } from "./api_index"; - -type Method = "GET" | "POST"; -export async function apiAnnouncement(req: NextRequest, method: Method) { - const { searchParams } = new URL(req.url); - const path = searchParams.get("path"); - const act = API_INDEX_ANNOUNCEMENT.find( - (v) => v.path === path && v.method === method - ); - if (!path) - return Response.json({ message: "page not found" }, { status: 404 }); - if (act) return act.bin(req); - - return Response.json({ message: "404" }); -} diff --git a/src/module/announcement/api/api_index.ts b/src/module/announcement/api/api_index.ts deleted file mode 100644 index deed158..0000000 --- a/src/module/announcement/api/api_index.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { getAllAnnouncement } from "./get/getAllAnnouncement"; -import { getOneAnnouncement } from "./get/getOneAnnouncement"; -import { getUserAnnouncement } from "./get/getUserAnnouncement"; -import { createAnnouncement } from "./post/createAnnouncement"; -import { deleteAnnouncement } from "./post/deleteAnnouncement"; -import { updateAnnouncement } from "./post/updateAnnouncement"; - -export const API_INDEX_ANNOUNCEMENT = [ - { - path: "get-all-announcement", - method: "GET", - bin: getAllAnnouncement, - }, - { - path: "get-one-announcement", - method: "GET", - bin: getOneAnnouncement, - }, - { - path: "get-user-announcement", - method: "GET", - bin: getUserAnnouncement, - }, - { - path: "create-announcement", - method: "POST", - bin: createAnnouncement, - }, - { - path: "update-announcement", - method: "POST", - bin: updateAnnouncement, - }, - { - path: "delete-announcement", - method: "POST", - bin: deleteAnnouncement, - }, - ]; - \ No newline at end of file diff --git a/src/module/announcement/api/get/getAllAnnouncement.ts b/src/module/announcement/api/get/getAllAnnouncement.ts deleted file mode 100644 index c4042b0..0000000 --- a/src/module/announcement/api/get/getAllAnnouncement.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { prisma } from "@/module/_global"; -import { funGetUserByCookies } from "@/module/auth"; -import _ from "lodash"; -import moment from "moment"; -import "moment/locale/id"; -import { NextRequest } from "next/server"; - -export async function getAllAnnouncement(req: NextRequest) { - try { - const user = await funGetUserByCookies(); - const villageId = user.idVillage - const announcements = await prisma.announcement.findMany({ - where: { - idVillage: String(villageId), - isActive: true, - }, - select: { - id: true, - title: true, - desc: true, - createdAt: true, - }, - }); - - const allData = announcements.map((v: any) => ({ - ..._.omit(v, ["createdAt"]), - createdAt: moment(v.createdAt).format("LL") - })) - - return Response.json(allData); - } catch (error) { - console.error(error); - return Response.json( - { message: "Internal Server Error", success: false }, - { status: 500 } - ); - } -} diff --git a/src/module/announcement/api/get/getOneAnnouncement.ts b/src/module/announcement/api/get/getOneAnnouncement.ts deleted file mode 100644 index 2d9e164..0000000 --- a/src/module/announcement/api/get/getOneAnnouncement.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { prisma } from "@/module/_global"; -import _ from "lodash"; -import { NextRequest } from "next/server"; - -export async function getOneAnnouncement(req: NextRequest) { - try { - const searchParams = req.nextUrl.searchParams; - const announcementId = searchParams.get("announcementId"); - const announcement = await prisma.announcement.findUnique({ - where: { - id: String(announcementId), - }, - select: { - id: true, - title: true, - desc: true, - }, - }); - const announcementMember = await prisma.announcementMember.findMany({ - where: { - idAnnouncement: String(announcementId), - }, - select: { - idAnnouncement: true, - idGroup: true, - idDivision: true, - Group: { - select: { - name: true, - }, - }, - }, - }); - - const allAnnouncementMember = announcementMember.map((v: any) => ({ - ..._.omit(v, ["Group"]), - group: v.Group.name, - })) - - - return Response.json({ announcement, allAnnouncementMember }); - } catch (error) { - console.error(error); - return Response.json( - { message: "Internal Server Error", success: false }, - { status: 500 } - ); - } -} diff --git a/src/module/announcement/api/get/getUserAnnouncement.ts b/src/module/announcement/api/get/getUserAnnouncement.ts deleted file mode 100644 index c667173..0000000 --- a/src/module/announcement/api/get/getUserAnnouncement.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { prisma } from "@/module/_global"; -import { funGetUserByCookies } from "@/module/auth"; -import { revalidatePath, revalidateTag } from "next/cache"; -import { NextRequest, NextResponse } from "next/server"; - -export const dynamic = 'force-dynamic' -export const revalidate = true -export async function getUserAnnouncement(req: NextRequest) { - try { - const user = await funGetUserByCookies() - if (user.id == undefined) { - return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); - } - - const villaId = user.idVillage - const data = await prisma.group.findMany({ - where: { - isActive: true, - idVillage: String(villaId) - }, - select: { - id: true, - name: true, - Division: { - select: { - id: true, - name: true - } - } - } - }); - - return NextResponse.json({ success: true, message: "Berhasil mendapatkan grup", data, }, { status: 200 }); - - } catch (error) { - console.log(error); - return NextResponse.json({ success: false, message: "Gagal mendapatkan grup, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); - } -} diff --git a/src/module/announcement/api/post/createAnnouncement.ts b/src/module/announcement/api/post/createAnnouncement.ts deleted file mode 100644 index 039986b..0000000 --- a/src/module/announcement/api/post/createAnnouncement.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { prisma } from "@/module/_global"; -import { NextRequest } from "next/server"; - -export async function createAnnouncement(req: NextRequest) { - try { - const data = await req.json(); - const announcement = await prisma.announcement.create({ - data: { - title: data.title, - desc: data.desc, - idVillage: data.idVillage, - createdBy: data.createBy, - isActive: true, - }, - select: { - id: true, - title: true, - desc: true, - }, - }); - - const dataMember = data.groups.map((group: any) => ({ - idAnnoucement: announcement.id, - idGroup: group.idGroup, - idDivision: group.idDivision, - isActive: true, - })); - - const announcementMember = await prisma.announcementMember.createMany({ - data: dataMember, - }); - - return Response.json({ - announcement: announcement, - announcementMember: announcementMember, - }); - } catch (error) { - console.error(error); - return Response.json( - { message: "Internal Server Error", success: false }, - { status: 500 } - ); - } -} diff --git a/src/module/announcement/api/post/deleteAnnouncement.ts b/src/module/announcement/api/post/deleteAnnouncement.ts deleted file mode 100644 index a0a6044..0000000 --- a/src/module/announcement/api/post/deleteAnnouncement.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { prisma } from "@/module/_global"; -import { NextRequest } from "next/server"; - -export async function deleteAnnouncement(req: NextRequest) { - try { - const data = await req.json(); - const update = await prisma.announcement.update({ - where: { - id: data.id, - }, - data: { - isActive: false, - }, - }); - - return Response.json( - { success: true, message: "Sukses Delete Announcement" }, - { status: 200 } - ); - } catch (error) { - console.error(error); - return Response.json( - { message: "Internal Server Error", success: false }, - { status: 500 } - ); - } -} diff --git a/src/module/announcement/api/post/updateAnnouncement.ts b/src/module/announcement/api/post/updateAnnouncement.ts deleted file mode 100644 index 0f5059b..0000000 --- a/src/module/announcement/api/post/updateAnnouncement.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { prisma } from "@/module/_global"; -import { NextRequest } from "next/server"; - -export async function updateAnnouncement(req: NextRequest) { - try { - const data = await req.json(); - const udpate = await prisma.announcement.update({ - where: { - id: data.id, - }, - data: { - title: data.title, - desc: data.desc, - idVillage: data.idVillage, - createdBy: data.createBy, - isActive: true, - }, - }); - - const deleteAnnouncement = await prisma.announcementMember.deleteMany({ - where: { - idAnnouncement: data.id, - }, - }); - - const dataMember = data.groups.map((group: any) => ({ - idAnnoucement: data.id, - idGroup: group.idGroup, - idDivision: group.idDivision, - isActive: true, - })); - - const announcementMember = await prisma.announcementMember.createMany({ - data: dataMember, - }); - - return Response.json({ - success: true, - message: "Sukses Update Announcement", - }); - } catch (error) { - console.error(error); - return Response.json( - { message: "Internal Server Error", success: false }, - { status: 500 } - ); - } -} diff --git a/src/module/announcement/index.ts b/src/module/announcement/index.ts index 9ae4abe..bae423b 100644 --- a/src/module/announcement/index.ts +++ b/src/module/announcement/index.ts @@ -1,12 +1,14 @@ -import { apiAnnouncement } from "./api/api_announcement"; import CreateAnnouncement from "./ui/create_announcement"; +import DetailAnnouncement from "./ui/detail_announcement"; +import EditAnnouncement from "./ui/edit_announcement"; import ListAnnouncement from "./ui/list_announcement"; import NavbarAnnouncement from "./ui/navbar_announcement"; -import ViewDetailAnnouncement from "./ui/view_detail_anouncement" +import NavbarDetailAnnouncement from "./ui/navbar_detail_announcement"; -export { ViewDetailAnnouncement }; -export { apiAnnouncement }; export { ListAnnouncement } export { NavbarAnnouncement } -export { CreateAnnouncement } \ No newline at end of file +export { CreateAnnouncement } +export { NavbarDetailAnnouncement } +export { DetailAnnouncement } +export { EditAnnouncement } \ No newline at end of file diff --git a/src/module/announcement/lib/api_announcement.ts b/src/module/announcement/lib/api_announcement.ts index 0b36a4a..58e95f5 100644 --- a/src/module/announcement/lib/api_announcement.ts +++ b/src/module/announcement/lib/api_announcement.ts @@ -1,16 +1,22 @@ -import { ICreateData } from "./type_announcement"; +import { ICreateData, IFormCreateAnnouncement } from "./type_announcement"; export const funGetAllAnnouncement = async (path?: string) => { const response = await fetch(`/api/announcement${(path) ? path : ''}`, { next: { tags: ['announcement'] } }); return await response.json().catch(() => null); -} +} export const funGetAnnouncementById = async (path: string) => { const response = await fetch(`/api/announcement/${path}`); return await response.json().catch(() => null); } -export const funCreateAnnouncement = async (data: ICreateData) => { +export const funCreateAnnouncement = async (data: IFormCreateAnnouncement) => { + if (data.title == "" || data.desc == "") + return { success: false, message: 'Silahkan lengkapi form tambah pengumuman' } + + if (data.groups.length == 0) + return { success: false, message: 'Silahkan pilih divisi penerima pengumuman' } + const response = await fetch("/api/announcement", { method: "POST", headers: { @@ -19,4 +25,31 @@ export const funCreateAnnouncement = async (data: ICreateData) => { body: JSON.stringify(data), }); return await response.json().catch(() => null); +} + +export const funDeleteAnnouncement = async (path: string) => { + const response = await fetch(`/api/announcement/${path}`, { + method: "DELETE", + headers: { + "Content-Type": "application/json", + }, + }); + return await response.json().catch(() => null); +}; + +export const funEditAnnouncement = async (path: string, data: IFormCreateAnnouncement) => { + if (data.title == "" || data.desc == "") + return { success: false, message: 'Silahkan lengkapi form edit pengumuman' } + + if (data.groups.length == 0) + return { success: false, message: 'Silahkan pilih divisi penerima pengumuman' } + + const response = await fetch(`/api/announcement/${path}`, { + method: "PUT", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }); + return await response.json().catch(() => null); } \ No newline at end of file diff --git a/src/module/announcement/lib/type_announcement.ts b/src/module/announcement/lib/type_announcement.ts index 6b19299..0e96345 100644 --- a/src/module/announcement/lib/type_announcement.ts +++ b/src/module/announcement/lib/type_announcement.ts @@ -6,8 +6,8 @@ export interface IListDataAnnouncement { } export interface IRootAllAnnouncement { - announcement: IAnnouncement - allAnnouncementMember: IAllAnnouncementMember[] + data: IAnnouncement + member: IAllAnnouncementMember } export interface IAnnouncement { @@ -17,10 +17,12 @@ export interface IAnnouncement { } export interface IAllAnnouncementMember { - idAnnouncement: string - idGroup: string - idDivision: string - group: string + group: { + idGroup: string + idDivision: string + group: string + division: string + }[] } export interface GroupData { @@ -32,10 +34,26 @@ export interface GroupData { }[]; } +export interface GroupDataEditAnnouncement { + id: string; + name: string; + Division: { + idGroup: string; + idDivision: string; + group: string; + division: string; + }[]; +} + export interface ICreateData { title: string desc: string +} +export interface IFormCreateAnnouncement { + title: string + desc: string + groups: GroupData[] } export interface IGroupData { diff --git a/src/module/announcement/lib/val_announcement.ts b/src/module/announcement/lib/val_announcement.ts index 806fcf2..912ac66 100644 --- a/src/module/announcement/lib/val_announcement.ts +++ b/src/module/announcement/lib/val_announcement.ts @@ -1,5 +1,6 @@ import { hookstate } from "@hookstate/core"; -import { GroupData } from "./type_announcement"; +import { GroupData, GroupDataEditAnnouncement } from "./type_announcement"; -export const globalMemberAnnouncement = hookstate([]) \ No newline at end of file +export const globalMemberAnnouncement = hookstate([]) +export const globalMemberEditAnnouncement = hookstate([]) \ No newline at end of file diff --git a/src/module/announcement/ui/create_announcement.tsx b/src/module/announcement/ui/create_announcement.tsx index f4b89f7..b95ca24 100644 --- a/src/module/announcement/ui/create_announcement.tsx +++ b/src/module/announcement/ui/create_announcement.tsx @@ -1,40 +1,25 @@ 'use client' import { LayoutNavbarNew, WARNA } from "@/module/_global"; import LayoutModal from "@/module/_global/layout/layout_modal"; -import { globalMemberDivision } from "@/module/division_new/lib/val_division"; import { useHookstate } from "@hookstate/core"; import { Avatar, Box, Button, Flex, Group, Stack, Text, Textarea, TextInput } from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; -import { useRouter } from "next/navigation"; import { useState } from "react"; import toast from "react-hot-toast"; -import { HiOutlineChevronRight } from "react-icons/hi2"; import { IoIosArrowForward } from "react-icons/io"; import CreateUsersAnnouncement from "./create_users_announcement"; import { globalMemberAnnouncement } from "../lib/val_announcement"; import { funCreateAnnouncement } from "../lib/api_announcement"; -import { group } from "console"; import { GroupData, ICreateData, IGroupData } from "../lib/type_announcement"; -export type DataMember = DataGroup[] - -export interface DataGroup { - id: string - name: string - Division: Division[] -} - -export interface Division { - id: string - name: string -} export default function CreateAnnouncement() { const [isOpen, setOpen] = useState(false) const memberGroup = useHookstate(globalMemberAnnouncement) const memberValue = memberGroup.get() as GroupData[] - const [selectedFiles, setSelectedFiles] = useState([]); + const [selectedFiles, setSelectedFiles] = useState([]) + const [isChooseMember, setIsChooseMember] = useState(false) const [isData, setisData] = useState({ @@ -43,27 +28,31 @@ export default function CreateAnnouncement() { }) + async function onSubmit() { + try { + const response = await funCreateAnnouncement({ + title: isData.title, + desc: isData.desc, + groups: memberValue + }) - function onTrue(val: boolean) { - if (val) { - toast.success("Sukses! Data tersimpan"); + if (response.success) { + toast.success(response.message) + setisData({ + ...isData, + title: "", + desc: "", + }) + memberGroup.set([]) + } else { + toast.error(response.message) + } + } catch (error) { + console.log(error) + toast.error("Gagal menambahkan pengumuman, coba lagi nanti"); } - setOpen(false) - } - async function onSubmit(val: boolean) { - // const response = await funCreateAnnouncement( - // { - // title: isData.title, - // desc: isData.desc, - // groups: memberValue - // }, - - // ) setOpen(false) - console.log(isData) - console.log(memberValue) - } async function loadData() { @@ -78,7 +67,7 @@ export default function CreateAnnouncement() { setIsChooseMember(true) } - if (isChooseMember) return { setIsChooseMember(false) }} /> + if (isChooseMember) return { setIsChooseMember(false) }} /> return ( @@ -95,6 +84,7 @@ export default function CreateAnnouncement() { borderColor: WARNA.biruTua, }, }} + value={isData.title} onChange={(e) => { setisData({ ...isData, title: e.target.value }) }} />