From 409ad4f1a2cd5ed60ed003bf26b91053dceb590b Mon Sep 17 00:00:00 2001 From: nico Date: Thu, 26 Feb 2026 22:10:28 +0800 Subject: [PATCH] Fix Login KodeOtp WA --- prisma/schema.prisma | 2 +- .../{desa => }/musik/[id]/edit/page.tsx | 6 ++-- .../{desa => }/musik/[id]/page.tsx | 21 ++++++++----- .../{desa => }/musik/create/page.tsx | 6 ++-- .../(dashboard)/{desa => }/musik/page.tsx | 10 +++--- src/app/admin/_com/list_PageAdmin.tsx | 31 +++++++++++++++++-- src/app/admin/layout.tsx | 7 ++++- .../_lib/fileStorage/_lib/create.ts | 10 ++++-- 8 files changed, 68 insertions(+), 25 deletions(-) rename src/app/admin/(dashboard)/{desa => }/musik/[id]/edit/page.tsx (98%) rename src/app/admin/(dashboard)/{desa => }/musik/[id]/page.tsx (93%) rename src/app/admin/(dashboard)/{desa => }/musik/create/page.tsx (98%) rename src/app/admin/(dashboard)/{desa => }/musik/page.tsx (95%) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 91e4a850..c1bbd2d3 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -60,7 +60,7 @@ model FileStorage { deletedAt DateTime? isActive Boolean @default(true) link String - category String // "image" / "document" / "other" + category String // "image" / "document" / "audio" / "other" Berita Berita[] PotensiDesa PotensiDesa[] Posyandu Posyandu[] diff --git a/src/app/admin/(dashboard)/desa/musik/[id]/edit/page.tsx b/src/app/admin/(dashboard)/musik/[id]/edit/page.tsx similarity index 98% rename from src/app/admin/(dashboard)/desa/musik/[id]/edit/page.tsx rename to src/app/admin/(dashboard)/musik/[id]/edit/page.tsx index 06890b1e..7e56648c 100644 --- a/src/app/admin/(dashboard)/desa/musik/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/musik/[id]/edit/page.tsx @@ -1,6 +1,6 @@ 'use client' -import CreateEditor from '@/app/admin/(dashboard)/_com/createEditor'; -import stateDashboardMusik from '@/app/admin/(dashboard)/_state/desa/musik'; +import CreateEditor from '../../../_com/createEditor'; +import stateDashboardMusik from '../../../_state/desa/musik'; import colors from '@/con/colors'; import ApiFetch from '@/lib/api-fetch'; import { @@ -116,7 +116,7 @@ export default function EditMusik() { await musikState.musik.edit.update(); resetForm(); - router.push('/admin/desa/musik'); + router.push('/admin/musik'); } catch (error) { console.error('Error updating musik:', error); toast.error('Terjadi kesalahan saat mengupdate musik'); diff --git a/src/app/admin/(dashboard)/desa/musik/[id]/page.tsx b/src/app/admin/(dashboard)/musik/[id]/page.tsx similarity index 93% rename from src/app/admin/(dashboard)/desa/musik/[id]/page.tsx rename to src/app/admin/(dashboard)/musik/[id]/page.tsx index cb501b47..31cec93f 100644 --- a/src/app/admin/(dashboard)/desa/musik/[id]/page.tsx +++ b/src/app/admin/(dashboard)/musik/[id]/page.tsx @@ -19,7 +19,7 @@ import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useState } from 'react'; import { useProxy } from 'valtio/utils'; -import stateDashboardMusik from '../../../_state/desa/musik'; +import stateDashboardMusik from '../../_state/desa/musik'; export default function DetailMusik() { const musikState = useProxy(stateDashboardMusik); @@ -63,7 +63,7 @@ export default function DetailMusik() { setIsDeleting(true); await musikState.musik.delete.byId(id); setShowDeleteModal(false); - router.push('/admin/desa/musik'); + router.push('/admin/musik'); } catch (error) { console.error('Error deleting musik:', error); } finally { @@ -77,7 +77,7 @@ export default function DetailMusik() { diff --git a/src/app/admin/(dashboard)/desa/musik/create/page.tsx b/src/app/admin/(dashboard)/musik/create/page.tsx similarity index 98% rename from src/app/admin/(dashboard)/desa/musik/create/page.tsx rename to src/app/admin/(dashboard)/musik/create/page.tsx index 13c6cd0c..c5a233bf 100644 --- a/src/app/admin/(dashboard)/desa/musik/create/page.tsx +++ b/src/app/admin/(dashboard)/musik/create/page.tsx @@ -1,6 +1,6 @@ 'use client' -import CreateEditor from '@/app/admin/(dashboard)/_com/createEditor'; -import stateDashboardMusik from '@/app/admin/(dashboard)/_state/desa/musik'; +import CreateEditor from '../../_com/createEditor'; +import stateDashboardMusik from '../../_state/desa/musik'; import colors from '@/con/colors'; import ApiFetch from '@/lib/api-fetch'; import { @@ -126,7 +126,7 @@ export default function CreateMusik() { await musikState.musik.create.create(); resetForm(); - router.push('/admin/desa/musik'); + router.push('/admin/musik'); } catch (error) { console.error('Error creating musik:', error); toast.error('Terjadi kesalahan saat membuat musik'); diff --git a/src/app/admin/(dashboard)/desa/musik/page.tsx b/src/app/admin/(dashboard)/musik/page.tsx similarity index 95% rename from src/app/admin/(dashboard)/desa/musik/page.tsx rename to src/app/admin/(dashboard)/musik/page.tsx index b87005b4..d9071067 100644 --- a/src/app/admin/(dashboard)/desa/musik/page.tsx +++ b/src/app/admin/(dashboard)/musik/page.tsx @@ -23,8 +23,8 @@ import { IconCircleDashedPlus, IconDeviceImacCog, IconSearch } from '@tabler/ico import { useRouter } from 'next/navigation'; import { useState } from 'react'; import { useProxy } from 'valtio/utils'; -import HeaderSearch from '../../_com/header'; -import stateDashboardMusik from '../../_state/desa/musik'; +import HeaderSearch from '../_com/header'; +import stateDashboardMusik from '../_state/desa/musik'; function Musik() { @@ -73,7 +73,7 @@ function ListMusik({ search }: { search: string }) { leftSection={} color="blue" variant="light" - onClick={() => router.push('/admin/desa/musik/create')} + onClick={() => router.push('/admin/musik/create')} > Tambah Baru @@ -122,7 +122,7 @@ function ListMusik({ search }: { search: string }) { variant="light" color="blue" onClick={() => - router.push(`/admin/desa/musik/${item.id}`) + router.push(`/admin/musik/${item.id}`) } fz="sm" px="sm" @@ -189,7 +189,7 @@ function ListMusik({ search }: { search: string }) { fullWidth mt="sm" onClick={() => - router.push(`/admin/desa/musik/${item.id}`) + router.push(`/admin/musik/${item.id}`) } fz="sm" h={36} diff --git a/src/app/admin/_com/list_PageAdmin.tsx b/src/app/admin/_com/list_PageAdmin.tsx index 132fbbab..05014daa 100644 --- a/src/app/admin/_com/list_PageAdmin.tsx +++ b/src/app/admin/_com/list_PageAdmin.tsx @@ -330,7 +330,7 @@ export const devBar = [ path: "/admin/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana" } ] - }, + }, { id: "Pendidikan", name: "Pendidikan", @@ -373,6 +373,11 @@ export const devBar = [ } ] }, + { + id: "Musik", + name: "Musik", + path: "/admin/musik" + }, { id: "User & Role", name: "User & Role", @@ -729,7 +734,7 @@ export const navBar = [ path: "/admin/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana" } ] - }, + }, { id: "Pendidikan", name: "Pendidikan", @@ -772,6 +777,11 @@ export const navBar = [ } ] }, + { + id: "Musik", + name: "Musik", + path: "/admin/musik" + }, { id: "User & Role", name: "User & Role", @@ -1051,7 +1061,7 @@ export const role1 = [ } ] - }, + }, { id: "Lingkungan", name: "Lingkungan", @@ -1088,6 +1098,11 @@ export const role1 = [ path: "/admin/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana" } ] + }, + { + id: "Musik", + name: "Musik", + path: "/admin/musik" } ] @@ -1133,6 +1148,11 @@ export const role2 = [ path: "/admin/kesehatan/info-wabah-penyakit" } ] + }, + { + id: "Musik", + name: "Musik", + path: "/admin/musik" } ] @@ -1178,5 +1198,10 @@ export const role3 = [ path: "/admin/pendidikan/data-pendidikan" } ] + }, + { + id: "Musik", + name: "Musik", + path: "/admin/musik" } ] \ No newline at end of file diff --git a/src/app/admin/layout.tsx b/src/app/admin/layout.tsx index edf8a02c..d5897b59 100644 --- a/src/app/admin/layout.tsx +++ b/src/app/admin/layout.tsx @@ -316,8 +316,13 @@ export default function Layout({ children }: { children: React.ReactNode }) { }} variant="light" active={isParentActive} + onClick={(e) => { + e.preventDefault(); + if (v.path) handleNavClick(v.path); + }} + href={v.path || undefined} > - {v.children.map((child, key) => { + {v.children?.map((child, key) => { const isChildActive = segments.includes(_.lowerCase(child.name)); return ( { if (!UPLOAD_DIR) return { status: 500, body: "UPLOAD_DIR is not defined" }; const isImage = file.type.startsWith("image/"); - const category = isImage ? "image" : "document"; + const isAudio = file.type.startsWith("audio/"); + const category = isImage ? "image" : isAudio ? "audio" : "document"; - const pathName = category === "image" ? "images" : "documents"; + const pathName = category === "image" ? "images" : category === "audio" ? "audio" : "documents"; const rootPath = path.join(UPLOAD_DIR, pathName); await fs.mkdir(rootPath, { recursive: true }); @@ -54,6 +55,11 @@ const fileStorageCreate = async (context: Context) => { // Simpan metadata untuk versi desktop sebagai default finalName = desktopName; finalMimeType = "image/webp"; + } else if (isAudio) { + // Simpan file audio tanpa kompresi + const ext = file.name.split(".").pop() || "mp3"; + finalName = `${finalName}.${ext}`; + await fs.writeFile(path.join(rootPath, finalName), buffer); } else { // Jika file adalah PDF, simpan tanpa kompresi if (file.type === "application/pdf") {