diff --git a/src/module/announcement/ui/create_announcement.tsx b/src/module/announcement/ui/create_announcement.tsx index 5dbe027..25d72cf 100644 --- a/src/module/announcement/ui/create_announcement.tsx +++ b/src/module/announcement/ui/create_announcement.tsx @@ -19,14 +19,13 @@ export default function CreateAnnouncement() { const memberGroup = useHookstate(globalMemberAnnouncement) const memberValue = memberGroup.get() as GroupData[] const [selectedFiles, setSelectedFiles] = useState([]) + const [loadingKonfirmasi, setLoadingKonfirmasi] = useState(false) const router = useRouter() const tema = useHookstate(TEMA) const [data, setData] = useWibuRealtime({ WIBU_REALTIME_TOKEN: keyWibu, project: "sdm" }) - - const [isChooseMember, setIsChooseMember] = useState(false) const [isData, setisData] = useState({ title: "", @@ -37,8 +36,10 @@ export default function CreateAnnouncement() { desc: false }); + async function onSubmit() { try { + setLoadingKonfirmasi(true) const response = await funCreateAnnouncement({ title: isData.title, desc: isData.desc, @@ -56,9 +57,11 @@ export default function CreateAnnouncement() { } catch (error) { console.error(error) toast.error("Gagal menambahkan pengumuman, coba lagi nanti"); + } finally { + setLoadingKonfirmasi(false) + setOpen(false) } - setOpen(false) } async function loadData() { @@ -69,18 +72,31 @@ export default function CreateAnnouncement() { loadData() }, []) - function onToChooseMember() { - setIsChooseMember(true) - } - - if (isChooseMember) return { setIsChooseMember(false) }} /> function onCheck() { - if (Object.values(touched).some((v) => v == true)) + const cek = checkAll() + if (!cek) return false + + if (memberValue.length == 0) + return toast.error("Error! silahkan pilih divisi") + setOpen(true) } + function checkAll() { + let nilai = true + if (isData.title === "") { + setTouched(touched => ({ ...touched, title: true })) + nilai = false + } + if (isData.desc === "") { + setTouched(touched => ({ ...touched, desc: true })) + nilai = false + } + return nilai + } + function onValidation(kategori: string, val: string) { if (kategori == 'title') { @@ -100,6 +116,8 @@ export default function CreateAnnouncement() { } } + if (isChooseMember) return { setIsChooseMember(false) }} /> + return ( } /> @@ -151,7 +169,7 @@ export default function CreateAnnouncement() { padding: 10, borderRadius: 10 }} - onClick={() => { onToChooseMember() }} + onClick={() => { setIsChooseMember(true) }} > Tambah divisi penerima pengumuman @@ -162,7 +180,7 @@ export default function CreateAnnouncement() { Divisi Terpilih {(memberGroup.length === 0) ? ( - Belum ada anggota + Belum ada divisi yang dipilih ) : memberGroup.get().map((v: any, i: any) => { return ( @@ -195,13 +213,14 @@ export default function CreateAnnouncement() { Simpan - setOpen(false)} + setOpen(false)} description="Apakah Anda yakin ingin menambahkan data?" onYes={(val) => { if (val) { onSubmit() + } else { + setOpen(false) } - setOpen(false) }} /> diff --git a/src/module/announcement/ui/create_users_announcement.tsx b/src/module/announcement/ui/create_users_announcement.tsx index b4c1037..7d2e7e5 100644 --- a/src/module/announcement/ui/create_users_announcement.tsx +++ b/src/module/announcement/ui/create_users_announcement.tsx @@ -1,15 +1,16 @@ "use client"; -import { LayoutNavbarNew, TEMA, WARNA } from '@/module/_global'; +import { LayoutNavbarNew, TEMA } from '@/module/_global'; import { funGetGroupDivision } from '@/module/group/lib/api_group'; -import { Box, Button, Divider, Flex, Group, rem, Skeleton, Stack, Text } from '@mantine/core'; -import { useMediaQuery, useShallowEffect } from '@mantine/hooks'; -import React, { useState } from 'react'; -import { FaCheck } from 'react-icons/fa'; -import { GroupData } from '../lib/type_announcement'; import { useHookstate } from '@hookstate/core'; -import { globalMemberAnnouncement } from '../lib/val_announcement'; -import { FaMinus } from 'react-icons/fa6'; +import { ActionIcon, Box, Button, Divider, Group, rem, Skeleton, Stack, Text } from '@mantine/core'; +import { useMediaQuery, useShallowEffect } from '@mantine/hooks'; +import { useState } from 'react'; import toast from 'react-hot-toast'; +import { FaCheck } from 'react-icons/fa'; +import { FaMinus } from 'react-icons/fa6'; +import { HiChevronLeft } from 'react-icons/hi2'; +import { GroupData } from '../lib/type_announcement'; +import { globalMemberAnnouncement } from '../lib/val_announcement'; @@ -112,7 +113,13 @@ export default function CreateUsersAnnouncement({ onClose }: { onClose: (val: an return (
- } /> + + { onClose(true) }} bg={tema.get().bgIcon} size="lg" radius="lg" aria-label="Settings"> + + + + } title="Tambah Divisi Penerima Pengumuman" menu={<>} /> () const [loading, setLoading] = useState(true) @@ -75,6 +75,7 @@ export default function EditAnnouncement() { toast.error("Gagal mendapatkan pengumuman, coba lagi nanti") } finally { setLoading(false) + setOpen(false) } } @@ -94,30 +95,24 @@ export default function EditAnnouncement() { if (response.success) { toast.success(response.message) - setLoadingSubmit(false) router.push(`/announcement/${param.id}`) } else { toast.error(response.message) } - setLoadingSubmit(false) } catch (error) { console.error(error) toast.error("Gagal mengedit pengumuman, coba lagi nanti"); } finally { setLoadingSubmit(false) + setOpen(false) } - setOpen(false) } - - - - if (isChooseDivisi) return { setChooseDivisi(false) }} /> - - function onCheck() { if (Object.values(touched).some((v) => v == true)) return false + if (memberGroup.get().length == 0) + return toast.error("Error! silahkan pilih divisi") setOpen(true) } @@ -140,6 +135,8 @@ export default function EditAnnouncement() { } } + if (isChooseDivisi) return { setChooseDivisi(false) }} /> + return ( <> } /> @@ -160,7 +157,7 @@ export default function EditAnnouncement() { : <> { - return ( - - {v.name} - - - - { - v.Division.map((division: any) => { - return - {division.name} - - }) - } - - - - - ); + <> + Divisi Terpilih + { + memberGroup.get().length == 0 ? Belum ada divisi yang dipilih : + memberGroup.get().map((v: any, i: any) => { + return ( + + {v.name} + + + + { + v.Division.map((division: any) => { + return + {division.name} + + }) + } + + + + + ); + + }) + } + - } - ) } @@ -282,8 +285,9 @@ export default function EditAnnouncement() { onYes={(val) => { if (val) { onSubmit() + } else { + setOpen(false) } - setOpen(false) }} /> ) diff --git a/src/module/announcement/ui/edit_choose_member.tsx b/src/module/announcement/ui/edit_choose_member.tsx index 5f234d0..642883e 100644 --- a/src/module/announcement/ui/edit_choose_member.tsx +++ b/src/module/announcement/ui/edit_choose_member.tsx @@ -1,17 +1,16 @@ "use client"; -import { LayoutNavbarNew, TEMA, WARNA } from '@/module/_global'; +import { LayoutNavbarNew, TEMA } from '@/module/_global'; import { funGetGroupDivision } from '@/module/group/lib/api_group'; -import { Box, Button, Divider, Flex, Group, rem, Skeleton, Stack, Text } from '@mantine/core'; -import { useMediaQuery, useShallowEffect } from '@mantine/hooks'; -import React, { useState } from 'react'; -import { FaCheck } from 'react-icons/fa'; -import { GroupData, GroupDataEditAnnouncement } from '../lib/type_announcement'; import { useHookstate } from '@hookstate/core'; -import { globalMemberEditAnnouncement } from '../lib/val_announcement'; -import { FaMinus } from 'react-icons/fa6'; +import { ActionIcon, Box, Button, Divider, Group, rem, Skeleton, Stack, Text } from '@mantine/core'; +import { useMediaQuery, useShallowEffect } from '@mantine/hooks'; +import { useState } from 'react'; import toast from 'react-hot-toast'; - - +import { FaCheck } from 'react-icons/fa'; +import { FaMinus } from 'react-icons/fa6'; +import { HiChevronLeft } from 'react-icons/hi2'; +import { GroupData } from '../lib/type_announcement'; +import { globalMemberEditAnnouncement } from '../lib/val_announcement'; interface CheckedState { [key: string]: string[]; @@ -111,7 +110,13 @@ export default function EditChooseMember({ onClose }: { onClose: (val: any) => v return (
- } /> + + { onClose(true) }} bg={tema.get().bgIcon} size="lg" radius="lg" aria-label="Settings"> + + + + } title="Tambah Divisi Penerima Pengumuman" menu={<>} /> (null); + const router = useRouter() + const [isModal, setModal] = useState(false) + const [loadingModal, setLoadingModal] = useState(false) + const member = useHookstate(globalCalender) + const memberValue = member.get() as IFormMemberCalender[] + const [openMember, setOpenMember] = useState(false) + const param = useParams<{ id: string, detail: string }>() + const tema = useHookstate(TEMA) + const isMobile = useMediaQuery('(max-width: 369px)'); + const isMobile2 = useMediaQuery("(max-width: 438px)"); + const [touched, setTouched] = useState({ + title: false, + dateStart: false, + timeStart: false, + timeEnd: false, + repeatEventTyper: false, + desc: false, + repeatValue: false + }) + const [isData, setData] = useState({ + idDivision: "", + title: "", + dateStart: "", + timeStart: "", + timeEnd: "", + linkMeet: "", + repeatEventTyper: "", + desc: "", + repeatValue: "1" + }) + + async function onSubmit(val: boolean) { + try { + setLoadingModal(true) + const response = await funCreateCalender({ + 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) { + 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"); + } finally { + setModal(false) + setLoadingModal(false) + } + } + + function onCheck() { + const cek = checkAll() + if (!cek) + return false + + if (memberValue.length == 0) + return toast.error("Error! silahkan pilih anggota") + + setModal(true) + } + + function checkAll() { + let nilai = true + if (isData.title === "") { + setTouched(touched => ({ ...touched, title: true })) + nilai = false + } + if (isData.dateStart === "") { + setTouched(touched => ({ ...touched, dateStart: true })) + nilai = false + } + if (isData.timeStart == "") { + setTouched(touched => ({ ...touched, timeStart: true })) + nilai = false + } + if (isData.timeEnd == "" || isData.timeStart > isData.timeEnd) { + setTouched(touched => ({ ...touched, timeEnd: true })) + nilai = false + } + if (isData.repeatEventTyper == "" || String(isData.repeatEventTyper) == "null") { + setTouched(touched => ({ ...touched, repeatEventTyper: true })) + nilai = false + } + if (isData.repeatValue === "" || Number(isData.repeatValue) <= 0) { + setTouched(touched => ({ ...touched, repeatValue: true })) + nilai = false + } + + return nilai + } + + function onValidation(kategori: string, val: any) { + if (kategori == 'title') { + setData({ ...isData, title: val }) + if (val === "") { + setTouched({ ...touched, title: true }) + } else { + setTouched({ ...touched, title: false }) + } + } else if (kategori == 'dateStart') { + setValue(val) + setData({ ...isData, dateStart: moment(val).format("YYYY-MM-DD") }) + if (val === "") { + setTouched({ ...touched, dateStart: true }) + } else { + setTouched({ ...touched, dateStart: false }) + } + } else if (kategori == 'timeStart') { + setData({ ...isData, timeStart: val }) + if (val == "") { + setTouched({ ...touched, timeStart: true }) + } else { + setTouched({ ...touched, timeStart: false }) + } + } else if (kategori == 'timeEnd') { + setData({ ...isData, timeEnd: val }) + if (val == "" || isData.timeStart > val) { + setTouched({ ...touched, timeEnd: true }) + } else { + setTouched({ ...touched, timeEnd: false }) + } + } else if (kategori == 'repeatEventTyper') { + setData(isData => ({ ...isData, repeatEventTyper: val })) + if (val == "once") { + setData(isData => ({ ...isData, repeatValue: "1" })) + } + if (val == "" || String(val) == "null") { + setTouched({ ...touched, repeatEventTyper: true }) + } else { + setTouched({ ...touched, repeatEventTyper: false }) + } + } else if (kategori == 'repeatValue') { + setData(isData => ({ ...isData, repeatValue: val, })) + if (val === "" || Number(val) <= 0) { + setTouched(touched => ({ ...touched, repeatValue: true })) + } else { + setTouched({ ...touched, repeatValue: false }) + } + } + } + + if (openMember) return setOpenMember(false)} /> + return ( - + + + + { onValidation('title', event.target.value) }} + error={ + touched.title && ( + isData.title == "" ? "Nama Acara Tidak Boleh Kosong" : null + ) + } + /> + { onValidation('dateStart', val) }} + placeholder="Input Tanggal" + label="Tanggal" + error={ + touched.dateStart && ( + isData.dateStart == "" ? "Tanggal Tidak Boleh Kosong" : null + ) + } + /> + + onValidation('timeStart', event.target.value)} + error={ + touched.timeStart && ( + isData.timeStart == "" ? "Waktu Awal Tidak Boleh Kosong" : null + ) + } + /> + onValidation('timeEnd', event.target.value)} + error={ + touched.timeEnd && ( + isData.timeEnd == "" ? "Waktu Akhir Tidak Boleh Kosong" : null + ) || + (isData.timeStart > isData.timeEnd ? "Waktu Akhir Tidak Tepat" : null) + } + /> + + setData({ ...isData, linkMeet: event.target.value })} + /> +