Fix Login KodeOtp WA
This commit is contained in:
@@ -60,7 +60,7 @@ model FileStorage {
|
|||||||
deletedAt DateTime?
|
deletedAt DateTime?
|
||||||
isActive Boolean @default(true)
|
isActive Boolean @default(true)
|
||||||
link String
|
link String
|
||||||
category String // "image" / "document" / "other"
|
category String // "image" / "document" / "audio" / "other"
|
||||||
Berita Berita[]
|
Berita Berita[]
|
||||||
PotensiDesa PotensiDesa[]
|
PotensiDesa PotensiDesa[]
|
||||||
Posyandu Posyandu[]
|
Posyandu Posyandu[]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import CreateEditor from '@/app/admin/(dashboard)/_com/createEditor';
|
import CreateEditor from '../../../_com/createEditor';
|
||||||
import stateDashboardMusik from '@/app/admin/(dashboard)/_state/desa/musik';
|
import stateDashboardMusik from '../../../_state/desa/musik';
|
||||||
import colors from '@/con/colors';
|
import colors from '@/con/colors';
|
||||||
import ApiFetch from '@/lib/api-fetch';
|
import ApiFetch from '@/lib/api-fetch';
|
||||||
import {
|
import {
|
||||||
@@ -116,7 +116,7 @@ export default function EditMusik() {
|
|||||||
await musikState.musik.edit.update();
|
await musikState.musik.edit.update();
|
||||||
|
|
||||||
resetForm();
|
resetForm();
|
||||||
router.push('/admin/desa/musik');
|
router.push('/admin/musik');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error updating musik:', error);
|
console.error('Error updating musik:', error);
|
||||||
toast.error('Terjadi kesalahan saat mengupdate musik');
|
toast.error('Terjadi kesalahan saat mengupdate musik');
|
||||||
@@ -19,7 +19,7 @@ import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react';
|
|||||||
import { useParams, useRouter } from 'next/navigation';
|
import { useParams, useRouter } from 'next/navigation';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import stateDashboardMusik from '../../../_state/desa/musik';
|
import stateDashboardMusik from '../../_state/desa/musik';
|
||||||
|
|
||||||
export default function DetailMusik() {
|
export default function DetailMusik() {
|
||||||
const musikState = useProxy(stateDashboardMusik);
|
const musikState = useProxy(stateDashboardMusik);
|
||||||
@@ -63,7 +63,7 @@ export default function DetailMusik() {
|
|||||||
setIsDeleting(true);
|
setIsDeleting(true);
|
||||||
await musikState.musik.delete.byId(id);
|
await musikState.musik.delete.byId(id);
|
||||||
setShowDeleteModal(false);
|
setShowDeleteModal(false);
|
||||||
router.push('/admin/desa/musik');
|
router.push('/admin/musik');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error deleting musik:', error);
|
console.error('Error deleting musik:', error);
|
||||||
} finally {
|
} finally {
|
||||||
@@ -77,7 +77,7 @@ export default function DetailMusik() {
|
|||||||
<Group mb="md">
|
<Group mb="md">
|
||||||
<Button
|
<Button
|
||||||
variant="subtle"
|
variant="subtle"
|
||||||
onClick={() => router.push('/admin/desa/musik')}
|
onClick={() => router.push('/admin/musik')}
|
||||||
p="xs"
|
p="xs"
|
||||||
radius="md"
|
radius="md"
|
||||||
>
|
>
|
||||||
@@ -99,15 +99,22 @@ export default function DetailMusik() {
|
|||||||
<Stack gap="md">
|
<Stack gap="md">
|
||||||
{/* Cover Image */}
|
{/* Cover Image */}
|
||||||
{data.coverImage && (
|
{data.coverImage && (
|
||||||
<Box style={{ textAlign: 'center' }}>
|
<Box
|
||||||
|
style={{
|
||||||
|
width: '100%',
|
||||||
|
maxWidth: 400,
|
||||||
|
margin: '0 auto',
|
||||||
|
}}
|
||||||
|
>
|
||||||
<Image
|
<Image
|
||||||
src={data.coverImage.link}
|
src={data.coverImage.link}
|
||||||
alt={data.judul}
|
alt={data.judul}
|
||||||
radius="md"
|
radius="md"
|
||||||
style={{
|
style={{
|
||||||
maxHeight: 300,
|
width: '100%',
|
||||||
|
aspectRatio: '1/1',
|
||||||
objectFit: 'cover',
|
objectFit: 'cover',
|
||||||
margin: '0 auto',
|
display: 'block',
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
@@ -219,7 +226,7 @@ export default function DetailMusik() {
|
|||||||
radius="md"
|
radius="md"
|
||||||
size="md"
|
size="md"
|
||||||
leftSection={<IconEdit size={18} />}
|
leftSection={<IconEdit size={18} />}
|
||||||
onClick={() => router.push(`/admin/desa/musik/${id}/edit`)}
|
onClick={() => router.push(`/admin/musik/${id}/edit`)}
|
||||||
>
|
>
|
||||||
Edit
|
Edit
|
||||||
</Button>
|
</Button>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import CreateEditor from '@/app/admin/(dashboard)/_com/createEditor';
|
import CreateEditor from '../../_com/createEditor';
|
||||||
import stateDashboardMusik from '@/app/admin/(dashboard)/_state/desa/musik';
|
import stateDashboardMusik from '../../_state/desa/musik';
|
||||||
import colors from '@/con/colors';
|
import colors from '@/con/colors';
|
||||||
import ApiFetch from '@/lib/api-fetch';
|
import ApiFetch from '@/lib/api-fetch';
|
||||||
import {
|
import {
|
||||||
@@ -126,7 +126,7 @@ export default function CreateMusik() {
|
|||||||
await musikState.musik.create.create();
|
await musikState.musik.create.create();
|
||||||
|
|
||||||
resetForm();
|
resetForm();
|
||||||
router.push('/admin/desa/musik');
|
router.push('/admin/musik');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error creating musik:', error);
|
console.error('Error creating musik:', error);
|
||||||
toast.error('Terjadi kesalahan saat membuat musik');
|
toast.error('Terjadi kesalahan saat membuat musik');
|
||||||
@@ -23,8 +23,8 @@ import { IconCircleDashedPlus, IconDeviceImacCog, IconSearch } from '@tabler/ico
|
|||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import HeaderSearch from '../../_com/header';
|
import HeaderSearch from '../_com/header';
|
||||||
import stateDashboardMusik from '../../_state/desa/musik';
|
import stateDashboardMusik from '../_state/desa/musik';
|
||||||
|
|
||||||
|
|
||||||
function Musik() {
|
function Musik() {
|
||||||
@@ -73,7 +73,7 @@ function ListMusik({ search }: { search: string }) {
|
|||||||
leftSection={<IconCircleDashedPlus size={18} />}
|
leftSection={<IconCircleDashedPlus size={18} />}
|
||||||
color="blue"
|
color="blue"
|
||||||
variant="light"
|
variant="light"
|
||||||
onClick={() => router.push('/admin/desa/musik/create')}
|
onClick={() => router.push('/admin/musik/create')}
|
||||||
>
|
>
|
||||||
Tambah Baru
|
Tambah Baru
|
||||||
</Button>
|
</Button>
|
||||||
@@ -122,7 +122,7 @@ function ListMusik({ search }: { search: string }) {
|
|||||||
variant="light"
|
variant="light"
|
||||||
color="blue"
|
color="blue"
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
router.push(`/admin/desa/musik/${item.id}`)
|
router.push(`/admin/musik/${item.id}`)
|
||||||
}
|
}
|
||||||
fz="sm"
|
fz="sm"
|
||||||
px="sm"
|
px="sm"
|
||||||
@@ -189,7 +189,7 @@ function ListMusik({ search }: { search: string }) {
|
|||||||
fullWidth
|
fullWidth
|
||||||
mt="sm"
|
mt="sm"
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
router.push(`/admin/desa/musik/${item.id}`)
|
router.push(`/admin/musik/${item.id}`)
|
||||||
}
|
}
|
||||||
fz="sm"
|
fz="sm"
|
||||||
h={36}
|
h={36}
|
||||||
@@ -330,7 +330,7 @@ export const devBar = [
|
|||||||
path: "/admin/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana"
|
path: "/admin/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "Pendidikan",
|
id: "Pendidikan",
|
||||||
name: "Pendidikan",
|
name: "Pendidikan",
|
||||||
@@ -373,6 +373,11 @@ export const devBar = [
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: "Musik",
|
||||||
|
name: "Musik",
|
||||||
|
path: "/admin/musik"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: "User & Role",
|
id: "User & Role",
|
||||||
name: "User & Role",
|
name: "User & Role",
|
||||||
@@ -729,7 +734,7 @@ export const navBar = [
|
|||||||
path: "/admin/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana"
|
path: "/admin/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "Pendidikan",
|
id: "Pendidikan",
|
||||||
name: "Pendidikan",
|
name: "Pendidikan",
|
||||||
@@ -772,6 +777,11 @@ export const navBar = [
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: "Musik",
|
||||||
|
name: "Musik",
|
||||||
|
path: "/admin/musik"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: "User & Role",
|
id: "User & Role",
|
||||||
name: "User & Role",
|
name: "User & Role",
|
||||||
@@ -1051,7 +1061,7 @@ export const role1 = [
|
|||||||
}
|
}
|
||||||
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "Lingkungan",
|
id: "Lingkungan",
|
||||||
name: "Lingkungan",
|
name: "Lingkungan",
|
||||||
@@ -1088,6 +1098,11 @@ export const role1 = [
|
|||||||
path: "/admin/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana"
|
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"
|
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"
|
path: "/admin/pendidikan/data-pendidikan"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "Musik",
|
||||||
|
name: "Musik",
|
||||||
|
path: "/admin/musik"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -316,8 +316,13 @@ export default function Layout({ children }: { children: React.ReactNode }) {
|
|||||||
}}
|
}}
|
||||||
variant="light"
|
variant="light"
|
||||||
active={isParentActive}
|
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));
|
const isChildActive = segments.includes(_.lowerCase(child.name));
|
||||||
return (
|
return (
|
||||||
<NavLink
|
<NavLink
|
||||||
|
|||||||
@@ -22,9 +22,10 @@ const fileStorageCreate = async (context: Context) => {
|
|||||||
if (!UPLOAD_DIR) return { status: 500, body: "UPLOAD_DIR is not defined" };
|
if (!UPLOAD_DIR) return { status: 500, body: "UPLOAD_DIR is not defined" };
|
||||||
|
|
||||||
const isImage = file.type.startsWith("image/");
|
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);
|
const rootPath = path.join(UPLOAD_DIR, pathName);
|
||||||
await fs.mkdir(rootPath, { recursive: true });
|
await fs.mkdir(rootPath, { recursive: true });
|
||||||
|
|
||||||
@@ -54,6 +55,11 @@ const fileStorageCreate = async (context: Context) => {
|
|||||||
// Simpan metadata untuk versi desktop sebagai default
|
// Simpan metadata untuk versi desktop sebagai default
|
||||||
finalName = desktopName;
|
finalName = desktopName;
|
||||||
finalMimeType = "image/webp";
|
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 {
|
} else {
|
||||||
// Jika file adalah PDF, simpan tanpa kompresi
|
// Jika file adalah PDF, simpan tanpa kompresi
|
||||||
if (file.type === "application/pdf") {
|
if (file.type === "application/pdf") {
|
||||||
|
|||||||
Reference in New Issue
Block a user