From 6806e8ba026d06c171bfe92f5f228378ffad2f35 Mon Sep 17 00:00:00 2001 From: amel Date: Thu, 7 Nov 2024 14:43:24 +0800 Subject: [PATCH 01/10] fix: total data saat loading pada fitur project --- src/module/project/ui/list_project.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/module/project/ui/list_project.tsx b/src/module/project/ui/list_project.tsx index 3e50011..d0ae65c 100644 --- a/src/module/project/ui/list_project.tsx +++ b/src/module/project/ui/list_project.tsx @@ -156,7 +156,7 @@ export default function ListProject() { Total Kegiatan - {totalData} + {loading ? 0 : totalData} {isList ? ( From 8ef750fbd3e615d2336e40cef9f05f537677ddf8 Mon Sep 17 00:00:00 2001 From: amel Date: Thu, 7 Nov 2024 14:47:10 +0800 Subject: [PATCH 02/10] fix: divisi Deskripsi: - loading skeleton saat pertama kali - total data adalah 0 jika loding No Issues --- src/module/division_new/ui/list_division.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/module/division_new/ui/list_division.tsx b/src/module/division_new/ui/list_division.tsx index 7b89d85..ca7882b 100644 --- a/src/module/division_new/ui/list_division.tsx +++ b/src/module/division_new/ui/list_division.tsx @@ -63,15 +63,18 @@ export default function ListDivision() { } }; + + useShallowEffect(() => { + fetchData(false) + }, [isPage]) + + useShallowEffect(() => { setPage(1) fetchData(true) }, [status, searchQuery]) - useShallowEffect(() => { - fetchData(false) - }, [isPage]) useEffect(() => { const handleScroll = async () => { @@ -157,7 +160,7 @@ export default function ListDivision() { Total Divisi - {jumlah} + {loading ? 0 : jumlah} From 5aec05bf06533e82aa06d9ad107717121b79ec4e Mon Sep 17 00:00:00 2001 From: amel Date: Thu, 7 Nov 2024 14:52:17 +0800 Subject: [PATCH 03/10] fix: home Deskripsi: - mengganti kegiatan terbaru menjadi kegiatan terupdate No Issuese --- src/module/home/ui/list_project.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/module/home/ui/list_project.tsx b/src/module/home/ui/list_project.tsx index 7dc653e..75fc681 100644 --- a/src/module/home/ui/list_project.tsx +++ b/src/module/home/ui/list_project.tsx @@ -46,7 +46,7 @@ export default function ListProjects() { return ( <> - Kegiatan Terbaru + Kegiatan Terupdate {loading ? From 7f394311d7cbd586b142bb9fe594f4d0b7dbf307 Mon Sep 17 00:00:00 2001 From: amel Date: Thu, 7 Nov 2024 15:54:39 +0800 Subject: [PATCH 04/10] fix: theme Deskripsi: - realtime saat ada perubahan theme No Issues --- src/app/(application)/layout.tsx | 2 +- src/app/api/theme/[id]/route.ts | 2 +- src/module/_global/components/wrap_layout.tsx | 13 ++++++++----- .../ui/drawer_palet_edit_end_default.tsx | 19 +++++++++++++++---- .../color_palette/ui/list_color_palette.tsx | 17 +++++++---------- 5 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/app/(application)/layout.tsx b/src/app/(application)/layout.tsx index 8eb45f9..31dbc45 100644 --- a/src/app/(application)/layout.tsx +++ b/src/app/(application)/layout.tsx @@ -10,7 +10,7 @@ export default async function Layout({ children }: { children: React.ReactNode } const user = await funGetUserByCookies() return ( <> - + {children} diff --git a/src/app/api/theme/[id]/route.ts b/src/app/api/theme/[id]/route.ts index 9995a73..70ae0d2 100644 --- a/src/app/api/theme/[id]/route.ts +++ b/src/app/api/theme/[id]/route.ts @@ -170,7 +170,7 @@ export async function POST(request: Request, context: { params: { id: string } } // create log user const log = await createLogUser({ act: 'DELETE', desc: 'User mengganti tema', table: 'colorTheme', data: id }) - return NextResponse.json({ success: true, message: "Tema berhasil diganti", data: dataTheme }, { status: 200 }); + return NextResponse.json({ success: true, message: "Tema berhasil diganti", data: { village: user.idVillage, user: user.id }, theme: dataTheme }, { status: 200 }); } catch (error) { console.error(error); diff --git a/src/module/_global/components/wrap_layout.tsx b/src/module/_global/components/wrap_layout.tsx index 1902a2a..26a9a62 100644 --- a/src/module/_global/components/wrap_layout.tsx +++ b/src/module/_global/components/wrap_layout.tsx @@ -1,15 +1,14 @@ 'use client' +import { globalParamJumlahNotif } from "@/module/home"; import { useHookstate } from "@hookstate/core"; -import { globalNotifPage, globalRole, keyWibu, TEMA } from "../bin/val_global"; import { useShallowEffect } from "@mantine/hooks"; +import { usePathname, useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { useWibuRealtime } from "wibu-realtime"; +import { globalNotifPage, globalRole, keyWibu, TEMA } from "../bin/val_global"; import NotificationCustome from "./notification_custome"; -import { usePathname, useRouter } from "next/navigation"; -import { globalParamJumlahNotif } from "@/module/home"; -import ReloadButtonTop from "./reload_button_top"; -export default function WrapLayout({ children, role, theme, user }: { children: React.ReactNode, role: any, theme: any, user: any }) { +export default function WrapLayout({ children, role, theme, user, village }: { children: React.ReactNode, role: any, theme: any, user: any, village: any }) { const router = useRouter() const roleLogin = useHookstate(globalRole) const tema = useHookstate(TEMA) @@ -44,6 +43,10 @@ export default function WrapLayout({ children, role, theme, user }: { children: }, 4000); } } + + if (data && data.some((v: any) => v.category == "applied-theme" && v.user != user && v.village == village)) { + tema.set(data[0]?.theme) + } }, [data]) diff --git a/src/module/color_palette/ui/drawer_palet_edit_end_default.tsx b/src/module/color_palette/ui/drawer_palet_edit_end_default.tsx index d64abd6..4487809 100644 --- a/src/module/color_palette/ui/drawer_palet_edit_end_default.tsx +++ b/src/module/color_palette/ui/drawer_palet_edit_end_default.tsx @@ -1,4 +1,4 @@ -import { TEMA } from '@/module/_global'; +import { keyWibu, TEMA } from '@/module/_global'; import LayoutModal from '@/module/_global/layout/layout_modal'; import { useHookstate } from '@hookstate/core'; import { Box, Flex, SimpleGrid, Text } from '@mantine/core'; @@ -9,6 +9,7 @@ import { FaPencil, FaTrash } from 'react-icons/fa6'; import { IoColorPalette } from 'react-icons/io5'; import { funChangeTheme, funDeleteTheme } from '../lib/api_theme'; import { globalRefreshTheme } from '../lib/val_theme'; +import { useWibuRealtime } from 'wibu-realtime'; export default function DrawerPaletEditEndDefault({ id, idVillage, isUse }: { id: string, idVillage: string, isUse: boolean }) { const router = useRouter() @@ -18,13 +19,23 @@ export default function DrawerPaletEditEndDefault({ id, idVillage, isUse }: { id const refresh = useHookstate(globalRefreshTheme) const [loadingApply, setLoadingApply] = useState(false) const [loadingDelete, setLoadingDelete] = useState(false) + const [dataRealTime, setDataRealtime] = useWibuRealtime({ + WIBU_REALTIME_TOKEN: keyWibu, + project: "sdm" + }) async function onChangeTheme() { try { setLoadingApply(true) const res = await funChangeTheme(id) if (res.success) { - tema.set(res.data) + setDataRealtime([{ + category: "applied-theme", + village: res.data.village, + user: res.data.user, + theme: res.theme + }]) + tema.set(res.theme) refresh.set(!refresh.get()) } else { toast.error(res.message); @@ -101,7 +112,7 @@ export default function DrawerPaletEditEndDefault({ id, idVillage, isUse }: { id onYes={(val) => { if (val) { onChangeTheme() - }else{ + } else { setModal(false) } }} /> @@ -112,7 +123,7 @@ export default function DrawerPaletEditEndDefault({ id, idVillage, isUse }: { id onYes={(val) => { if (val) { onDelete() - }else{ + } else { setModalDel(false) } }} /> diff --git a/src/module/color_palette/ui/list_color_palette.tsx b/src/module/color_palette/ui/list_color_palette.tsx index 1f6d3c7..91f33b9 100644 --- a/src/module/color_palette/ui/list_color_palette.tsx +++ b/src/module/color_palette/ui/list_color_palette.tsx @@ -1,21 +1,19 @@ "use client" import { LayoutDrawer, LayoutNavbarNew, TEMA } from '@/module/_global'; -import { ActionIcon, Box, Checkbox, Flex, Group, Skeleton, Text } from '@mantine/core'; -import { useRouter } from 'next/navigation'; -import React, { useState } from 'react'; +import { useHookstate } from '@hookstate/core'; +import { ActionIcon, Box, Flex, Group, Skeleton, Text } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import { useState } from 'react'; +import toast from 'react-hot-toast'; import { FaCircleCheck } from 'react-icons/fa6'; import { HiMenu } from 'react-icons/hi'; -import DrawerCreatePalette from './drawer_create_palette'; -import DrawerPaletEditEndDefault from './drawer_palet_edit_end_default'; -import { useHookstate } from '@hookstate/core'; import { funGetAllTheme } from '../lib/api_theme'; import { IDataTheme } from '../lib/type_theme'; -import toast from 'react-hot-toast'; -import { useShallowEffect } from '@mantine/hooks'; import { globalRefreshTheme } from '../lib/val_theme'; +import DrawerCreatePalette from './drawer_create_palette'; +import DrawerPaletEditEndDefault from './drawer_palet_edit_end_default'; export default function ListColorPalette() { - const router = useRouter() const [isOpen, setOpen] = useState(false) const [isOpenTambahan, setOpenTambahan] = useState(false) const tema = useHookstate(TEMA) @@ -36,7 +34,6 @@ export default function ListColorPalette() { } else { toast.error(res.message) } - setLoading(false) } catch (error) { console.error(error) toast.error("Gagal mendapatkan data tema, coba lagi nanti") From f80c8348b49fbe921ae25524f19edf2b672b4837 Mon Sep 17 00:00:00 2001 From: amel Date: Thu, 7 Nov 2024 16:10:45 +0800 Subject: [PATCH 05/10] fix: member Deskripsi: - nilai default ketika active = false No Issues --- src/module/user/member/ui/list_member.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/module/user/member/ui/list_member.tsx b/src/module/user/member/ui/list_member.tsx index c47f79c..4f62b31 100644 --- a/src/module/user/member/ui/list_member.tsx +++ b/src/module/user/member/ui/list_member.tsx @@ -42,7 +42,7 @@ export default function ListMember() { Aktif } onClick={() => { From 14b1c9c012fc8dc0e9dbf9112d9625ff2e1b6c00 Mon Sep 17 00:00:00 2001 From: amel Date: Thu, 7 Nov 2024 16:21:04 +0800 Subject: [PATCH 06/10] fix: project Deskripsi: - hanya menampilkan user dg role selain supadmin dan cosupadmin No Issues --- src/module/project/ui/create_users_project.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/module/project/ui/create_users_project.tsx b/src/module/project/ui/create_users_project.tsx index 3ea87cd..ee93619 100644 --- a/src/module/project/ui/create_users_project.tsx +++ b/src/module/project/ui/create_users_project.tsx @@ -38,7 +38,7 @@ export default function CreateUsersProject({ grup, onClose }: { grup?: string, o const res = await funGetAllmember('?active=true&group=' + grup + '&search=' + search); const user = await funGetUserByCookies(); if (res.success) { - setDataMember(res.data.filter((i: any) => i.id != user.id)) + setDataMember(res.data.filter((i: any) => i.id != user.id && i.idUserRole != 'supadmin' && i.idUserRole != 'cosupadmin')) // cek data member sebelumnya if (member.length > 0) { setSelectedFiles(JSON.parse(JSON.stringify(member.get()))) From aac649b01f2fe159218b034444cfbe452667856b Mon Sep 17 00:00:00 2001 From: amel Date: Thu, 7 Nov 2024 17:21:59 +0800 Subject: [PATCH 07/10] fix: project kegiatan Deskripsi: - fix format tgl di server soalnya di server -1 day, di tambah kegiatan, tambah task kegiatan, dan edit task kegiatan - hapus pilih semua pada bagian pilih anggota No Issues --- src/app/(application)/project/update/[id]/page.tsx | 1 - src/app/api/project/[id]/route.ts | 4 ++-- src/app/api/project/detail/[id]/route.ts | 5 ++--- src/app/api/project/route.ts | 5 ++--- src/module/project/lib/api_project.ts | 4 ++-- src/module/project/lib/type_project.ts | 10 ++++++++-- src/module/project/ui/add_detail_task_project.tsx | 6 +++--- src/module/project/ui/add_member_detail_project.tsx | 4 ++-- src/module/project/ui/create_date_end_task.tsx | 10 +++++----- src/module/project/ui/create_project.tsx | 4 ++-- src/module/project/ui/edit_detail_task_project.tsx | 4 ++-- src/module/project/ui/results_date-and_task.tsx | 9 ++++----- 12 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/app/(application)/project/update/[id]/page.tsx b/src/app/(application)/project/update/[id]/page.tsx index f49558a..988d08b 100644 --- a/src/app/(application)/project/update/[id]/page.tsx +++ b/src/app/(application)/project/update/[id]/page.tsx @@ -1,5 +1,4 @@ import { EditDetailTaskProject } from "@/module/project"; - import React from "react"; function Page() { diff --git a/src/app/api/project/[id]/route.ts b/src/app/api/project/[id]/route.ts index 5c2c2d9..19bc836 100644 --- a/src/app/api/project/[id]/route.ts +++ b/src/app/api/project/[id]/route.ts @@ -173,8 +173,8 @@ export async function POST(request: Request, context: { params: { id: string } } data: { title: name, idProject: id, - dateStart: new Date(moment(dateStart).format('YYYY-MM-DD')), - dateEnd: new Date(moment(dateEnd).format('YYYY-MM-DD')), + dateStart: new Date(dateStart), + dateEnd: new Date(dateEnd), }, select: { id: true diff --git a/src/app/api/project/detail/[id]/route.ts b/src/app/api/project/detail/[id]/route.ts index d0c4cf8..abd5571 100644 --- a/src/app/api/project/detail/[id]/route.ts +++ b/src/app/api/project/detail/[id]/route.ts @@ -1,7 +1,6 @@ import { prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; import { createLogUser } from "@/module/user"; -import moment from "moment"; import { NextResponse } from "next/server"; @@ -231,8 +230,8 @@ export async function POST(request: Request, context: { params: { id: string } } }, data: { title, - dateStart: new Date(moment(dateStart).format('YYYY-MM-DD')), - dateEnd: new Date(moment(dateEnd).format('YYYY-MM-DD')), + dateStart: new Date(dateStart), + dateEnd: new Date(dateEnd), } }) diff --git a/src/app/api/project/route.ts b/src/app/api/project/route.ts index 54d4943..142ab7d 100644 --- a/src/app/api/project/route.ts +++ b/src/app/api/project/route.ts @@ -2,7 +2,6 @@ import { DIR, funUploadFile, prisma } from "@/module/_global"; import { funGetUserByCookies } from "@/module/auth"; import { createLogUser } from "@/module/user"; import _ from "lodash"; -import moment from "moment"; import { NextResponse } from "next/server"; @@ -157,8 +156,8 @@ export async function POST(request: Request) { ..._.omit(v, ["dateStart", "dateEnd", "name"]), idProject: data.id, title: v.title, - dateStart: new Date(moment(v.dateStart).format('YYYY-MM-DD')), - dateEnd: new Date(moment(v.dateEnd).format('YYYY-MM-DD')), + dateStart: new Date(v.dateStart), + dateEnd: new Date(v.dateEnd), })) const insertTask = await prisma.projectTask.createMany({ diff --git a/src/module/project/lib/api_project.ts b/src/module/project/lib/api_project.ts index 2b602df..c3dee5b 100644 --- a/src/module/project/lib/api_project.ts +++ b/src/module/project/lib/api_project.ts @@ -1,4 +1,4 @@ -import { IFormAddDetailproject, IFormAddMemberProject, IFormDateProject } from "./type_project"; +import { IFormAddDetailproject, IFormAddMemberProject, IFormDateProject, NewIFormDateProject } from "./type_project"; export const funGetAllProject = async (path?: string) => { @@ -54,7 +54,7 @@ export const funGetDetailProject = async (path: string) => { return await response.json().catch(() => null); } -export const funEditDetailProject = async (path: string, data: IFormDateProject) => { +export const funEditDetailProject = async (path: string, data: NewIFormDateProject) => { const response = await fetch(`/api/project/detail/${path}`, { method: "POST", headers: { diff --git a/src/module/project/lib/type_project.ts b/src/module/project/lib/type_project.ts index 94df9c4..fcceeae 100644 --- a/src/module/project/lib/type_project.ts +++ b/src/module/project/lib/type_project.ts @@ -45,6 +45,12 @@ export interface IFormDateProject { title: string, } +export interface NewIFormDateProject{ + dateStart: string, + dateEnd: string, + title: string, +} + export interface IFormMemberProject { idUser: string, name: string, @@ -53,8 +59,8 @@ export interface IFormMemberProject { export interface IFormAddDetailproject { - dateStart: Date, - dateEnd: Date, + dateStart: string, + dateEnd: string, name: string } diff --git a/src/module/project/ui/add_detail_task_project.tsx b/src/module/project/ui/add_detail_task_project.tsx index 0308454..abc9bce 100644 --- a/src/module/project/ui/add_detail_task_project.tsx +++ b/src/module/project/ui/add_detail_task_project.tsx @@ -4,13 +4,13 @@ import LayoutModal from '@/module/_global/layout/layout_modal'; import { useHookstate } from '@hookstate/core'; import { Box, Button, Flex, Group, rem, SimpleGrid, Stack, Text, TextInput } from '@mantine/core'; import { DatePicker } from '@mantine/dates'; +import { useShallowEffect } from '@mantine/hooks'; import moment from 'moment'; import { useParams, useRouter } from 'next/navigation'; import { useState } from 'react'; import toast from 'react-hot-toast'; import { useWibuRealtime } from 'wibu-realtime'; import { funCreateDetailProject } from '../lib/api_project'; -import { useShallowEffect } from '@mantine/hooks'; export default function AddDetailTaskProject() { const [value, setValue] = useState<[Date | null, Date | null]>([null, null]); @@ -35,8 +35,8 @@ export default function AddDetailTaskProject() { setLoadingModal(true) const res = await funCreateDetailProject(param.id, { name, - dateStart: (value[0] != null) ? value[0] : new Date, - dateEnd: (value[1] != null) ? value[1] : new Date, + dateStart: (value[0] != null) ? moment(value[0]).format('YYYY-MM-DD') : moment(new Date).format('YYYY-MM-DD'), + dateEnd: (value[1] != null) ? moment(value[1]).format('YYYY-MM-DD') : moment(new Date).format('YYYY-MM-DD'), }) if (res.success) { diff --git a/src/module/project/ui/add_member_detail_project.tsx b/src/module/project/ui/add_member_detail_project.tsx index 79c1505..927f94e 100644 --- a/src/module/project/ui/add_member_detail_project.tsx +++ b/src/module/project/ui/add_member_detail_project.tsx @@ -223,12 +223,12 @@ export default function AddMemberDetailProject() { - + {/* Pilih Semua Anggota {selectAll ? : ""} - + */} {loading ? Array(8) .fill(null) diff --git a/src/module/project/ui/create_date_end_task.tsx b/src/module/project/ui/create_date_end_task.tsx index 116f510..acecb76 100644 --- a/src/module/project/ui/create_date_end_task.tsx +++ b/src/module/project/ui/create_date_end_task.tsx @@ -3,15 +3,15 @@ import { LayoutNavbarNew, TEMA } from "@/module/_global"; import { useHookstate } from "@hookstate/core"; import { ActionIcon, Box, Button, Flex, Group, rem, SimpleGrid, Stack, Text, TextInput } from "@mantine/core"; import { DatePicker } from "@mantine/dates"; +import { useShallowEffect } from "@mantine/hooks"; import moment from "moment"; import { useState } from "react"; import toast from "react-hot-toast"; import { HiChevronLeft } from "react-icons/hi2"; -import { IFormDateProject } from "../lib/type_project"; -import { useShallowEffect } from "@mantine/hooks"; +import { NewIFormDateProject } from "../lib/type_project"; -export default function ViewDateEndTask({ onClose, onSet }: { onClose: (val: boolean) => void, onSet: (val: IFormDateProject) => void }) { +export default function ViewDateEndTask({ onClose, onSet }: { onClose: (val: boolean) => void, onSet: (val: NewIFormDateProject) => void }) { const [value, setValue] = useState<[Date | null, Date | null]>([null, null]); const [title, setTitle] = useState("") const tema = useHookstate(TEMA) @@ -29,8 +29,8 @@ export default function ViewDateEndTask({ onClose, onSet }: { onClose: (val: boo return toast.error("Error! harus memasukkan judul tugas") onSet({ - dateStart: value[0], - dateEnd: value[1], + dateStart: moment(value[0]).format('YYYY-MM-DD'), + dateEnd: moment(value[1]).format('YYYY-MM-DD'), title: title }) } diff --git a/src/module/project/ui/create_project.tsx b/src/module/project/ui/create_project.tsx index e31f9ed..75124c2 100644 --- a/src/module/project/ui/create_project.tsx +++ b/src/module/project/ui/create_project.tsx @@ -15,7 +15,7 @@ import { FaTrash } from "react-icons/fa6"; import { IoIosArrowDropright } from "react-icons/io"; import { useWibuRealtime } from "wibu-realtime"; import { funCreateProject } from "../lib/api_project"; -import { IFormDateProject, IFormMemberProject, IListFileTaskProject } from "../lib/type_project"; +import { IFormMemberProject, IListFileTaskProject, NewIFormDateProject } from "../lib/type_project"; import { globalMemberProject } from "../lib/val_project"; import ViewDateEndTask from "./create_date_end_task"; import CreateUsersProject from "./create_users_project"; @@ -32,7 +32,7 @@ export default function CreateProject() { const member = useHookstate(globalMemberProject) const memberValue = member.get() as IFormMemberProject[] const [openTugas, setOpenTugas] = useState(false) - const [dataTask, setDataTask] = useState([]) + const [dataTask, setDataTask] = useState([]) const openRef = useRef<() => void>(null) const [fileForm, setFileForm] = useState([]) const [listFile, setListFile] = useState([]) diff --git a/src/module/project/ui/edit_detail_task_project.tsx b/src/module/project/ui/edit_detail_task_project.tsx index 4a9be91..849518c 100644 --- a/src/module/project/ui/edit_detail_task_project.tsx +++ b/src/module/project/ui/edit_detail_task_project.tsx @@ -42,8 +42,8 @@ export default function EditDetailTaskProject() { setLoadingModal(true) const res = await funEditDetailProject(param.id, { title: name, - dateStart: value[0], - dateEnd: value[1], + dateStart: moment(value[0]).format('YYYY-MM-DD'), + dateEnd: moment(value[1]).format('YYYY-MM-DD'), }) diff --git a/src/module/project/ui/results_date-and_task.tsx b/src/module/project/ui/results_date-and_task.tsx index 95cfe47..5545672 100644 --- a/src/module/project/ui/results_date-and_task.tsx +++ b/src/module/project/ui/results_date-and_task.tsx @@ -1,10 +1,9 @@ -import { Box, Center, Grid, Group, SimpleGrid, Spoiler, Text } from '@mantine/core'; -import React from 'react'; -import { AiOutlineFileSync } from "react-icons/ai"; -import { IFormDateProject } from '../lib/type_project'; +import { Box, Center, Grid, Group, SimpleGrid, Text } from '@mantine/core'; import moment from 'moment'; +import { AiOutlineFileSync } from "react-icons/ai"; +import { NewIFormDateProject } from '../lib/type_project'; -export default function ResultsDateAndTask(data: IFormDateProject) { +export default function ResultsDateAndTask(data: NewIFormDateProject) { return ( Date: Fri, 8 Nov 2024 10:45:07 +0800 Subject: [PATCH 08/10] fix: discussion Deskripsi: - loading skeleton pertama pada list diskusi - realtime setelah hapus diskusi No Issues --- src/app/api/discussion/[id]/route.ts | 4 ++-- src/module/calender/ui/detail_event_division.tsx | 2 +- src/module/discussion/ui/detail_discussion.tsx | 12 +++++++++++- .../discussion/ui/drawer_detail_discussion.tsx | 7 ++++++- src/module/discussion/ui/list_discussion.tsx | 9 ++++----- 5 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/app/api/discussion/[id]/route.ts b/src/app/api/discussion/[id]/route.ts index 4ccf71e..febd350 100644 --- a/src/app/api/discussion/[id]/route.ts +++ b/src/app/api/discussion/[id]/route.ts @@ -87,7 +87,7 @@ export async function GET(request: Request, context: { params: { id: string } }) totalComments: comments.length, }; - return NextResponse.json({ success: true, message: "Berhasil mendapatkan diskusi", data: response }, { status: 200 }); + return NextResponse.json({ success: true, message: "Berhasil mendapatkan diskusi", data: response, user: user.id }, { status: 200 }); } catch (error) { console.error(error); @@ -175,7 +175,7 @@ export async function PUT(request: Request, context: { params: { id: string } }) // create log user const log = await createLogUser({ act: 'DELETE', desc: 'User menghapus data diskusi', table: 'divisionDisscussion', data: id }) - return NextResponse.json({ success: true, message: "Berhasil menghapus diskusi" }, { status: 200 }); + return NextResponse.json({ success: true, message: "Berhasil menghapus diskusi", user: user.id }, { status: 200 }); } catch (error) { console.error(error); return NextResponse.json({ success: false, message: "Gagal menghapus diskusi, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 }); diff --git a/src/module/calender/ui/detail_event_division.tsx b/src/module/calender/ui/detail_event_division.tsx index 39c292d..d7db21b 100644 --- a/src/module/calender/ui/detail_event_division.tsx +++ b/src/module/calender/ui/detail_event_division.tsx @@ -72,7 +72,7 @@ export default function DetailEventDivision() { toast.error("Data telah di hapus, anda akan beralih ke halaman list acara") setTimeout(() => { router.push(`/division/${param.id}/calender`) - }, 2000) + }, 1000) } }, [dataRealTime]) diff --git a/src/module/discussion/ui/detail_discussion.tsx b/src/module/discussion/ui/detail_discussion.tsx index 69b6ff9..68016a6 100644 --- a/src/module/discussion/ui/detail_discussion.tsx +++ b/src/module/discussion/ui/detail_discussion.tsx @@ -6,7 +6,7 @@ import { ActionIcon, Avatar, Badge, Box, Center, Divider, Flex, Grid, Group, rem import { useMediaQuery, useShallowEffect } from "@mantine/hooks"; import moment from "moment"; import "moment/locale/id"; -import { useParams } from "next/navigation"; +import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; import toast from "react-hot-toast"; import { GrChatOption } from "react-icons/gr"; @@ -26,8 +26,10 @@ export default function DetailDiscussion({ id, idDivision }: { id: string, idDiv const refresh = useHookstate(globalRefreshDiscussion) const roleLogin = useHookstate(globalRole) const [isCreator, setCreator] = useState(false) + const [isUser, setUser] = useState('') const adminLogin = useHookstate(globalIsAdminDivision) const tema = useHookstate(TEMA) + const router = useRouter() const isMobile = useMediaQuery('(max-width: 369px)'); const isMobile2 = useMediaQuery("(max-width: 438px)"); const [dataRealTime, setDataRealtime] = useWibuRealtime({ @@ -42,6 +44,7 @@ export default function DetailDiscussion({ id, idDivision }: { id: string, idDiv setData(response.data) setIsLoad(false) setCreator(response.data.isCreator) + setUser(response.user) } catch (error) { console.error(error) } finally { @@ -57,6 +60,13 @@ export default function DetailDiscussion({ id, idDivision }: { id: string, idDiv if (dataRealTime && dataRealTime.some((i: any) => i.category == 'discussion-detail' && i.id == id)) { getData(false) } + + if (dataRealTime && dataRealTime.some((i: any) => i.category == 'discussion-delete' && i.id == id && i.user != isUser)) { + toast.error("Data telah di hapus, anda akan beralih ke halaman list diskusi") + setTimeout(() => { + router.push(`/division/${param.id}/discussion`) + }, 1000) + } }, [dataRealTime]) async function reloadData() { diff --git a/src/module/discussion/ui/drawer_detail_discussion.tsx b/src/module/discussion/ui/drawer_detail_discussion.tsx index ecaa105..5474478 100644 --- a/src/module/discussion/ui/drawer_detail_discussion.tsx +++ b/src/module/discussion/ui/drawer_detail_discussion.tsx @@ -55,10 +55,15 @@ export default function DrawerDetailDiscussion({ onSuccess, id, status, idDivisi async function fetchDeleteDiscussion(val: boolean) { try { - setLoadingDelete(true) if (val) { + setLoadingDelete(true) const response = await funDeleteDiscussion(id) if (response.success) { + setDataRealtime([{ + category: "discussion-delete", + id: id, + user: response.user + }]) toast.success(response.message) onSuccess(false) router.push(`/division/${param.id}/discussion`) diff --git a/src/module/discussion/ui/list_discussion.tsx b/src/module/discussion/ui/list_discussion.tsx index 500420d..bdda9e4 100644 --- a/src/module/discussion/ui/list_discussion.tsx +++ b/src/module/discussion/ui/list_discussion.tsx @@ -45,15 +45,15 @@ export default function ListDiscussion({ id }: { id: string }) { } } + useShallowEffect(() => { + getData(false) + }, [isPage]) + useShallowEffect(() => { setPage(1) getData(true) }, [searchQuery]) - useShallowEffect(() => { - getData(false) - }, [isPage]) - useEffect(() => { const handleScroll = async () => { if (containerRef && containerRef.current) { @@ -78,7 +78,6 @@ export default function ListDiscussion({ id }: { id: string }) { useShallowEffect(() => { - console.log(notifLoadPage.get()) if (notifLoadPage.get().category == 'division/' + param.id + '/discussion' && notifLoadPage.get().load == true) { setRefresh(true) } From daae1e1207fb106adecd36d632a192ef308b032a Mon Sep 17 00:00:00 2001 From: amel Date: Fri, 8 Nov 2024 11:43:16 +0800 Subject: [PATCH 09/10] fix: acara kalender Deskripsi: - toast saat hapus acara - realtime saat hapus acara No Issues --- .../calender/ui/date_event_division.tsx | 5 +- .../calender/ui/drawer_detail_event.tsx | 52 ++++++++++--------- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/src/module/calender/ui/date_event_division.tsx b/src/module/calender/ui/date_event_division.tsx index 04a495f..d32a4fe 100644 --- a/src/module/calender/ui/date_event_division.tsx +++ b/src/module/calender/ui/date_event_division.tsx @@ -22,6 +22,7 @@ export default function DateEventDivision() { const [isMonth, setMonth] = useState(moment().month() + 1) const [loading, setLoading] = useState(true) const isMobile = useMediaQuery('(max-width: 369px)'); + const [isDateChoose, setDataChoose] = useState(moment().format('YYYY-MM-DD')) const [dataRealTime, setDataRealtime] = useWibuRealtime({ WIBU_REALTIME_TOKEN: keyWibu, project: "sdm" @@ -37,7 +38,6 @@ export default function DateEventDivision() { } else { toast.error(response.message) } - setLoading(false) } catch (error) { console.error(error) toast.error("Gagal mendapatkan list acara") @@ -63,6 +63,7 @@ export default function DateEventDivision() { async function changeMonth(value: any) { const monthKlik = moment(value).format('MM') + setDataChoose(value) if (monthKlik != isMonth) { setMonth(monthKlik) getIndicator(value) @@ -99,7 +100,7 @@ export default function DateEventDivision() { getIndicator(isDate) getData(isDate, false) } else if (dataRealTime && dataRealTime.some((i: any) => i.category == 'calendar-event' && i.division == param.id && i.date != isDate)) { - getIndicator(isDate) + getIndicator(isDateChoose) } }, [dataRealTime]) diff --git a/src/module/calender/ui/drawer_detail_event.tsx b/src/module/calender/ui/drawer_detail_event.tsx index a193c45..2903bf9 100644 --- a/src/module/calender/ui/drawer_detail_event.tsx +++ b/src/module/calender/ui/drawer_detail_event.tsx @@ -11,7 +11,7 @@ import { FaUsers } from 'react-icons/fa6'; import { useHookstate } from '@hookstate/core'; import { useWibuRealtime } from 'wibu-realtime'; -export default function DrawerDetailEvent({ idCalendar, close }: { idCalendar: string, close: (val:boolean) => void }) { +export default function DrawerDetailEvent({ idCalendar, close }: { idCalendar: string, close: (val: boolean) => void }) { const router = useRouter() const [isModal, setModal] = useState(false) const param = useParams<{ id: string, detail: string }>() @@ -22,29 +22,27 @@ export default function DrawerDetailEvent({ idCalendar, close }: { idCalendar: s project: "sdm" }) - async function fetchDeleteCalender(val: boolean) { + async function fetchDeleteCalender() { try { - if (val) { - setLoadingDelete(true) - const response = await funDeleteCalenderById(idCalendar) - if (response.success) { - setDataRealtime([ - { - category: "calendar-detail-delete", - id: idCalendar, - }, - { - category: "calendar-event", - division: param.id, - date: response.data.dateStart, - idUserFrom: response.user - } - ]) - toast.success(response.message) - router.push(`/division/${param.id}/calender`) - } else { - toast.error(response.message) - } + setLoadingDelete(true) + const response = await funDeleteCalenderById(idCalendar) + if (response.success) { + setDataRealtime([ + { + category: "calendar-detail-delete", + id: idCalendar, + idUserFrom: response.user + }, + { + category: "calendar-event", + division: param.id, + date: response.data.dateStart, + } + ]) + toast.success(response.message) + router.push(`/division/${param.id}/calender`) + } else { + toast.error(response.message) } } catch (error) { console.error(error); @@ -94,7 +92,13 @@ export default function DrawerDetailEvent({ idCalendar, close }: { idCalendar: s setModal(false)} description="Apakah Anda yakin ingin menghapus data acara ini? Data ini akan mempengaruhi semua data yang terkait" - onYes={(val) => { fetchDeleteCalender(val) }} /> + onYes={(val) => { + if (val) { + fetchDeleteCalender() + } else { + setModal(false) + } + }} /> ); } From f07bea16a7486f8c80fc43c290861809bf3c04dd Mon Sep 17 00:00:00 2001 From: amel Date: Fri, 8 Nov 2024 17:03:58 +0800 Subject: [PATCH 10/10] upd: api version --- src/app/api/version-app/route.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/api/version-app/route.ts b/src/app/api/version-app/route.ts index b821ea4..f3d45bf 100644 --- a/src/app/api/version-app/route.ts +++ b/src/app/api/version-app/route.ts @@ -2,7 +2,7 @@ import { NextResponse } from "next/server"; export async function GET(request: Request) { try { - return NextResponse.json({ success: true, version: "0.1.9", mode: "staging" }, { status: 200 }); + return NextResponse.json({ success: true, version: "0.2.0", mode: "staging" }, { status: 200 }); } catch (error) { console.error(error); return NextResponse.json({ success: false, version: "Gagal mendapatkan version, coba lagi nanti (error: 500)", reason: (error as Error).message, }, { status: 500 });