diff --git a/src/app/(application)/division/[id]/(fitur-division)/calender/update/[detail]/page.tsx b/src/app/(application)/division/[id]/(fitur-division)/calender/update/[detail]/page.tsx new file mode 100644 index 0000000..2c6b1dc --- /dev/null +++ b/src/app/(application)/division/[id]/(fitur-division)/calender/update/[detail]/page.tsx @@ -0,0 +1,14 @@ +import { UpdateDivisionCalender } from '@/module/calender'; +import React from 'react'; + +function Page({ searchParams }: { searchParams: any }) { + // if (searchParams.page == "update-ulangi-event") + // return + // if (searchParams.page == "update-user-calender") + // return + return ( + + ); +} + +export default Page; diff --git a/src/app/(application)/division/[id]/(fitur-division)/calender/update/page.tsx b/src/app/(application)/division/[id]/(fitur-division)/calender/update/page.tsx deleted file mode 100644 index bb7a12e..0000000 --- a/src/app/(application)/division/[id]/(fitur-division)/calender/update/page.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { UpdateUlangiEvent, UpdateUserDivisionCalender, ViewUpdateDivisionCalender } from '@/module/division_new'; -import React from 'react'; - -function Page({ searchParams }: { searchParams: any }) { - if (searchParams.page == "update-ulangi-event") - return - if (searchParams.page == "update-user-calender") - return - return ( - - ); -} - -export default Page; diff --git a/src/app/api/calender/[id]/route.ts b/src/app/api/calender/[id]/route.ts index 02b0d7e..196c4d2 100644 --- a/src/app/api/calender/[id]/route.ts +++ b/src/app/api/calender/[id]/route.ts @@ -2,6 +2,7 @@ import { prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; import _, { result } from "lodash"; +import moment from "moment"; import { NextResponse } from "next/server"; // GET ONE CALENDER @@ -47,6 +48,12 @@ export async function GET(request: Request, context: { params: { id: string } }) } }); + const { ...dataCalender } = data + const timeStart = moment.utc(dataCalender?.timeStart).format("HH:mm") + const timeEnd = moment.utc(dataCalender?.timeEnd).format("HH:mm") + + const result = { ...dataCalender, timeStart, timeEnd } + const member = await prisma.divisionCalendarMember.findMany({ where: { @@ -69,12 +76,12 @@ export async function GET(request: Request, context: { params: { id: string } }) name: v.User.name, email: v.User.email, - + })) const dataFix = { - calender: data, + calender: result, member: fixMember, total: fixMember.length } @@ -139,4 +146,77 @@ export async function DELETE(request: Request, context: { params: { id: string } { status: 500 } ); } +} + +// EDIT CALENDER BY ID +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 { id } = context.params + + const { title, desc, timeStart, dateStart, timeEnd, linkMeet, repeatEventTyper, member } = await request.json() + + const cek = await prisma.divisionCalendar.count({ + where: { + id: id + } + }) + + if (cek == 0) { + return NextResponse.json( + { + success: false, + message: "Gagal mengedit calender, data tidak ditemukan", + }, + { status: 404 } + ); + } + + const data = await prisma.divisionCalendar.update({ + where: { + id: id + }, + data: { + title: title, + desc: desc, + timeStart: timeStart, + dateStart: dateStart, + timeEnd: timeEnd, + linkMeet: linkMeet, + repeatEventTyper: repeatEventTyper + } + }); + + await prisma.divisionCalendarMember.deleteMany({ + where: { + idCalendar: id + } + }) + + const omitMember = member.map((v: any) => ({ + ..._.omit(v, ["name", "idUser"]), + idCalendar: data.id, + idUser: v.idUser + })) + + const insertMember = await prisma.divisionCalendarMember.createMany({ + data: omitMember + }); + + + return NextResponse.json({ success: true, message: "Berhasil mengedit calender" }, { status: 200 }); + + } catch (error) { + return NextResponse.json( + { + success: false, + message: "Gagal mengedit calender, coba lagi nanti", + }, + { status: 500 } + ); + } } \ No newline at end of file diff --git a/src/module/calender/index.ts b/src/module/calender/index.ts index 02037d5..9819d1c 100644 --- a/src/module/calender/index.ts +++ b/src/module/calender/index.ts @@ -2,8 +2,10 @@ import CreateCalenderDivisionCaleder from "./ui/create_calender_division_caleder import DetailEventDivision from "./ui/detail_event_division"; import NavbarCreateDivisionCalender from "./ui/navbar_create_division_calender"; import NavbarDivisionCalender from "./ui/navbar_division_calender"; +import UpdateDivisionCalender from "./ui/update_division_calender"; export { NavbarDivisionCalender } export { NavbarCreateDivisionCalender } export { CreateCalenderDivisionCaleder } -export { DetailEventDivision } \ No newline at end of file +export { DetailEventDivision } +export { UpdateDivisionCalender } \ 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 55b6a95..67b3c25 100644 --- a/src/module/calender/lib/api_calender.ts +++ b/src/module/calender/lib/api_calender.ts @@ -1,4 +1,4 @@ -import { IFormCreateCalender } from "./type_calender"; +import { IEditCalender, IFormCreateCalender } from "./type_calender"; export const funGetAllCalender = async (path?: string) => { const response = await fetch(`/api/calender${(path) ? path : ''}`, { next: { tags: ['calender'] } }); @@ -26,4 +26,15 @@ export const funDeleteCalenderById = async (path: string) => { method: "DELETE", }); return await response.json().catch(() => null); +} + +export const funEditCalenderById = async (path: string, data: IEditCalender) => { + const response = await fetch(`/api/calender/${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/calender/lib/type_calender.ts b/src/module/calender/lib/type_calender.ts index 89129d3..e9bd438 100644 --- a/src/module/calender/lib/type_calender.ts +++ b/src/module/calender/lib/type_calender.ts @@ -51,4 +51,34 @@ export interface IFormMemberCalender { export interface IFormUlangiEvent { id: string +} + +export interface IEditCalender { + title?: string + dateStart?: String + timeStart?: string + timeEnd?: string + linkMeet?: string + repeatEventTyper?: string + desc?: string, + member?: IEditMemberCalender[] +} + +export interface IEditMemberCalender { + idUser: { + id: string + name: string + }[] +} + + +export interface IDetailByIdCalender { + title?: string + desc?: string + timeStart?: string + dateStart?: string + timeEnd?: string + createdAt?: string + linkMeet?: string + repeatEventTyper?: string } \ No newline at end of file diff --git a/src/module/calender/ui/drawer_detail_event.tsx b/src/module/calender/ui/drawer_detail_event.tsx index a4c1774..73b15d9 100644 --- a/src/module/calender/ui/drawer_detail_event.tsx +++ b/src/module/calender/ui/drawer_detail_event.tsx @@ -51,7 +51,7 @@ export default function DrawerDetailEvent() { Hapus - router.push('/calender/update')} justify={'center'} align={'center'} direction={'column'} > + router.push(`/division/${param.id}/calender/update/${param.detail}`)} justify={'center'} align={'center'} direction={'column'} > diff --git a/src/module/calender/ui/update_division_calender.tsx b/src/module/calender/ui/update_division_calender.tsx new file mode 100644 index 0000000..d4435b6 --- /dev/null +++ b/src/module/calender/ui/update_division_calender.tsx @@ -0,0 +1,324 @@ +"use client" +import { LayoutNavbarNew, WARNA } from '@/module/_global'; +import { Avatar, Box, Button, Flex, Group, Input, Select, SimpleGrid, Stack, Text, Textarea, TextInput } from '@mantine/core'; +import { DateInput, TimeInput } from '@mantine/dates'; +import React, { useState } from 'react'; +import { IoIosArrowDropright } from 'react-icons/io'; +import { useParams, useRouter } from 'next/navigation'; +import LayoutModal from '@/module/_global/layout/layout_modal'; +import toast from 'react-hot-toast'; +import { funEditCalenderById, funGetOneCalender } from '../lib/api_calender'; +import { useShallowEffect } from '@mantine/hooks'; +import { IDataDetailByIdCalender, IDataDetailByIdMember, IDetailByIdCalender, IEditMemberCalender, IFormMemberCalender } from '../lib/type_calender'; +import moment from 'moment'; +import "moment/locale/id"; +import { useHookstate } from '@hookstate/core'; +import { globalCalender } from '../lib/val_calender'; + +export default function UpdateDivisionCalender() { + const [isModal, setModal] = useState(false) + const param = useParams<{ id: string, detail: string }>() + const memberUser = useHookstate(globalCalender) + const memberValue = memberUser.get() as IFormMemberCalender[] + const [isDataCalender, setDataCalender] = useState() + const [isDataAnggota, setDataAnggota] = useState([]) + const [isLengthMember, setLengthMember] = useState() + + const fetchGetOne = async () => { + try { + const response = await funGetOneCalender(param.detail) + setDataCalender(response.data.calender) + setDataAnggota(response.data.member) + setLengthMember(response.data.member.length) + } catch (error) { + console.log(error) + } + } + + useShallowEffect(() => { + fetchGetOne() + }, []) + + function onTrue(val: boolean) { + if (val) { + toast.success("Sukses! Data tersimpan"); + } + setModal(false) + } + const [value, setValue] = useState(null); + const router = useRouter() + + async function onSubmit(val: boolean) { + try { + if (val) { + const response = await funEditCalenderById(param.detail, { + title: isDataCalender?.title, + dateStart: isDataCalender?.dateStart, + timeStart: isDataCalender?.timeStart, + timeEnd: isDataCalender?.timeEnd, + linkMeet: isDataCalender?.linkMeet, + repeatEventTyper: isDataCalender?.repeatEventTyper, + desc: isDataCalender?.desc, + member: isDataAnggota + }) + + if (response.success) { + setModal(false) + router.push(`/division/${param.id}/calender`) + } else { + toast.error(response.message) + } + } + setModal(false) + } catch (error) { + console.log(error) + toast.error("Terjadi kesalahan! Silahkan coba kembali"); + setModal(false) + } finally { + setModal(false) + } + if (val) { + console.log( + { + title: isDataCalender?.title, + dateStart: isDataCalender?.dateStart, + timeStart: isDataCalender?.timeStart, + timeEnd: isDataCalender?.timeEnd, + linkMeet: isDataCalender?.linkMeet, + repeatEventTyper: isDataCalender?.repeatEventTyper, + desc: isDataCalender?.desc, + member: isDataAnggota + } + ) + } + } + + return ( + + + + + { + setDataCalender({ + ...isDataCalender, + title: event.target.value + }) + } + } + /> + { + setValue(val); + setDataCalender({ + ...isDataCalender, + dateStart: moment(val).format("YYYY-MM-DD") + }) + } + } + placeholder="Input Tanggal" + label="Tanggal" + /> + + { + setDataCalender({ + ...isDataCalender, + timeStart: event.target.value + }) + } + } + /> + { + setDataCalender({ + ...isDataCalender, + timeEnd: event.target.value + }) + } + } + /> + + { + setDataCalender({ + ...isDataCalender, + linkMeet: event.target.value + }) + } + } + /> +