From 9e8bf1c73b59ea972968c443f00b71f8ea625204 Mon Sep 17 00:00:00 2001 From: amel Date: Tue, 7 Jan 2025 11:07:52 +0800 Subject: [PATCH 1/2] rev: detail diskusi divisi Deskripsi: - jam pada komentar diskusi divisi No Issues --- src/module/discussion/ui/detail_discussion.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/module/discussion/ui/detail_discussion.tsx b/src/module/discussion/ui/detail_discussion.tsx index 5731dfa..163da33 100644 --- a/src/module/discussion/ui/detail_discussion.tsx +++ b/src/module/discussion/ui/detail_discussion.tsx @@ -275,7 +275,7 @@ export default function DetailDiscussion({ id, idDivision }: { id: string, idDiv - {moment(v.createdAt).format("ll")} + {moment(v.createdAt).format("lll").replace('pukul', '')} From e4f631e397154416825e85c5b3664739b80a9b11 Mon Sep 17 00:00:00 2001 From: amel Date: Tue, 7 Jan 2025 17:16:12 +0800 Subject: [PATCH 2/2] rev: calender Deskripsi: - check jika ada acara di tgl yg sama di beda divisi 1 grup No Issues --- src/app/api/calender/route.ts | 40 ++++++++++++ src/module/calender/lib/api_calender.ts | 24 +++++-- .../ui/create_calender_division_caleder.tsx | 65 ++++++++++++++++--- 3 files changed, 114 insertions(+), 15 deletions(-) diff --git a/src/app/api/calender/route.ts b/src/app/api/calender/route.ts index 37cbc76..320d328 100644 --- a/src/app/api/calender/route.ts +++ b/src/app/api/calender/route.ts @@ -193,4 +193,44 @@ export async function POST(request: Request) { console.error(error); return NextResponse.json({ success: false, message: "Gagal membuat acara kalender, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); } +} + + + +// CEK TGL AVAILABLE +export async function PUT(request: Request) { + try { + const user = await funGetUserByCookies(); + if (user.id == undefined) { + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + } + + const { idDivision, title, desc, timeStart, timeEnd, dateStart, dateEnd, repeatEventTyper, member, linkMeet, repeatValue } = (await request.json()); + const division = await prisma.division.findUnique({ + where: { + id: idDivision + } + }) + + const cek = await prisma.divisionCalendarReminder.count({ + where: { + isActive: true, + dateStart: new Date(dateStart), + Division: { + idGroup: division?.idGroup + } + } + }) + + if (cek > 0) { + return NextResponse.json({ success: false, message: "Tidak dapat membuat acara kalender, acara kalender sudah ada pada tanggal tersebut" }, { status: 400 }); + } else { + return NextResponse.json({ success: true, message: "Berhasil membuat acara kalender" }, { status: 200 }); + } + + + } catch (error) { + console.error(error) + return NextResponse.json({ success: false, message: "Gagal membuat acara kalender, coba lagi nanti (error: 500)" }, { status: 404 }); + } } \ No newline at end of file diff --git a/src/module/calender/lib/api_calender.ts b/src/module/calender/lib/api_calender.ts index 92786d1..8166de4 100644 --- a/src/module/calender/lib/api_calender.ts +++ b/src/module/calender/lib/api_calender.ts @@ -19,6 +19,18 @@ export const funGetOneCalenderByIdCalendar = async (path: string) => { return await response.json().catch(() => null); } + +export const funCheckCalender = async (data: IFormCreateCalender) => { + const response = await fetch("/api/calender", { + method: "PUT", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }); + return await response.json().catch(() => null); +} + export const funCreateCalender = async (data: IFormCreateCalender) => { const response = await fetch("/api/calender", { method: "POST", @@ -67,11 +79,11 @@ export const funAddMemberCalender = async (path: string, data: IFormMemberCalend export const funDeleteMemberCalender = async (path: string, data: { idUser: string }) => { const response = await fetch(`/api/calender/${path}/member`, { - method: "DELETE", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(data), + method: "DELETE", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(data), }); return await response.json().catch(() => null); - }; \ No newline at end of file +}; \ No newline at end of file diff --git a/src/module/calender/ui/create_calender_division_caleder.tsx b/src/module/calender/ui/create_calender_division_caleder.tsx index fd3f4d0..8730faa 100644 --- a/src/module/calender/ui/create_calender_division_caleder.tsx +++ b/src/module/calender/ui/create_calender_division_caleder.tsx @@ -11,7 +11,7 @@ import { useState } from 'react'; import toast from 'react-hot-toast'; import { IoIosArrowDropright } from 'react-icons/io'; import { useWibuRealtime } from 'wibu-realtime'; -import { funCreateCalender } from '../lib/api_calender'; +import { funCheckCalender, funCreateCalender } from '../lib/api_calender'; import { IFormMemberCalender } from '../lib/type_calender'; import { globalCalender } from '../lib/val_calender'; import CreateUserCalender from './create_user_calender'; @@ -20,7 +20,9 @@ export default function CreateCalenderDivisionCaleder() { const [value, setValue] = useState(null); const router = useRouter() const [isModal, setModal] = useState(false) + const [isModalKonfirmasiTglSama, setModalKonfirmasiTglSama] = useState(false) const [loadingModal, setLoadingModal] = useState(false) + const [loadingModalKonfirmasiTglSama, setLoadingModalKonfirmasiTglSama] = useState(false) const member = useHookstate(globalCalender) const memberValue = member.get() as IFormMemberCalender[] const [openMember, setOpenMember] = useState(false) @@ -53,10 +55,40 @@ export default function CreateCalenderDivisionCaleder() { project: "sdm" }) - - async function onSubmit(val: boolean) { + async function onCheckDate() { try { setLoadingModal(true) + const response = await funCheckCalender({ + idDivision: param.id, + title: isData.title, + dateStart: isData.dateStart, + timeStart: isData.timeStart, + timeEnd: isData.timeEnd, + linkMeet: isData.linkMeet, + repeatEventTyper: isData.repeatEventTyper, + desc: isData.desc, + repeatValue: isData.repeatValue, + member: memberValue + }) + + if (response.success) { + onSubmit() + } else { + setModalKonfirmasiTglSama(true) + } + } catch (error) { + console.error(error) + toast.error("Gagal menambahkan acara, coba lagi nanti"); + } finally { + setLoadingModal(false) + } + } + + + async function onSubmit() { + try { + setLoadingModal(true) + setLoadingModalKonfirmasiTglSama(true) const response = await funCreateCalender({ idDivision: param.id, title: isData.title, @@ -76,20 +108,20 @@ export default function CreateCalenderDivisionCaleder() { division: param.id, date: isData.dateStart }]) - setModal(false) router.push(`/division/${param.id}/calender`) toast.success(response.message) member.set([]) } else { toast.error(response.message) - setModal(false) } } catch (error) { console.error(error) - toast.error("Gagal menambahkan pengumuman, coba lagi nanti"); + toast.error("Gagal menambahkan acara, coba lagi nanti"); } finally { setModal(false) + setModalKonfirmasiTglSama(false) setLoadingModal(false) + setLoadingModalKonfirmasiTglSama(false) } } @@ -381,8 +413,7 @@ export default function CreateCalenderDivisionCaleder() { member.get().map((v: any, i: any) => { return ( - + @@ -430,11 +461,27 @@ export default function CreateCalenderDivisionCaleder() { description="Apakah Anda yakin ingin menambahkan data?" onYes={(val) => { if (val) { - onSubmit(val) + onCheckDate() } else { setModal(false) } }} /> + + + { + setModalKonfirmasiTglSama(false) + setModal(false) + }} + description="Sudah ada acara pada tanggal yang sama. Apakah Anda yakin ingin menambahkan data?" + onYes={(val) => { + if (val) { + onSubmit() + } else { + setModalKonfirmasiTglSama(false) + setModal(false) + } + }} /> ); } \ No newline at end of file