From 8f2b9665a90671006edae6fe4ea650d9bd36a798 Mon Sep 17 00:00:00 2001 From: nico Date: Fri, 30 May 2025 21:13:55 +0800 Subject: [PATCH] Jum'at, 30 May 2025 : Yang Sudah Di Kerjakan * Tampilan UI Admin di menu inovasi * API Create, edit dan delete potensi * Tampilan UI Landing Page sudah sesuai di mobile Yang Lagi Dikerjakan: * Progress Tampilan UI Admin Di Menu lingkungan * Progress API Create, edit dan delete potensi Yang Akan Dikerjakan: * API Create, edit dan delete pengumuman * Tampilan UI Admin Di Menu Pendidikan --- .../berita/{edit/[id] => [id]/edit}/page.tsx | 52 +++--------- .../desa/berita/{detail => }/[id]/page.tsx | 80 +++++++++++-------- .../(dashboard)/desa/berita/create/page.tsx | 21 ++--- .../admin/(dashboard)/desa/berita/page.tsx | 2 +- .../[[...slugs]]/_lib/desa/berita/create.ts | 3 - .../_lib/desa/berita/find-by-id.ts | 14 +--- .../api/[[...slugs]]/_lib/desa/berita/updt.ts | 2 +- src/app/darmasaba/_com/Footer.tsx | 2 +- .../_com/main-page/desaantikorupsi/index.tsx | 8 +- .../_com/main-page/kepuasan/index.tsx | 16 ++-- .../_com/main-page/landing-page/index.tsx | 44 +++++----- .../_com/main-page/penghargaan/index.tsx | 2 +- 12 files changed, 110 insertions(+), 136 deletions(-) rename src/app/admin/(dashboard)/desa/berita/{edit/[id] => [id]/edit}/page.tsx (84%) rename src/app/admin/(dashboard)/desa/berita/{detail => }/[id]/page.tsx (55%) diff --git a/src/app/admin/(dashboard)/desa/berita/edit/[id]/page.tsx b/src/app/admin/(dashboard)/desa/berita/[id]/edit/page.tsx similarity index 84% rename from src/app/admin/(dashboard)/desa/berita/edit/[id]/page.tsx rename to src/app/admin/(dashboard)/desa/berita/[id]/edit/page.tsx index 24f18def..a753aede 100644 --- a/src/app/admin/(dashboard)/desa/berita/edit/[id]/page.tsx +++ b/src/app/admin/(dashboard)/desa/berita/[id]/edit/page.tsx @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ "use client"; import { @@ -15,19 +14,19 @@ import { Title, } from "@mantine/core"; import { IconArrowBack, IconImageInPicture } from "@tabler/icons-react"; +import { useParams, useRouter } from "next/navigation"; import { useEffect, useState } from "react"; -import { useRouter, useParams } from "next/navigation"; -import { useProxy } from "valtio/utils"; import { toast } from "react-toastify"; +import { useProxy } from "valtio/utils"; +import EditEditor from "@/app/admin/(dashboard)/_com/editEditor"; +import colors from "@/con/colors"; import ApiFetch from "@/lib/api-fetch"; import { FileInput } from "@mantine/core"; -import stateDashboardBerita from "../../../../_state/desa/berita"; -import { Prisma } from "@prisma/client"; import { useShallowEffect } from "@mantine/hooks"; -import { BeritaEditor } from "../../_com/BeritaEditor"; -import colors from "@/con/colors"; +import { Prisma } from "@prisma/client"; +import stateDashboardBerita from "../../../../_state/desa/berita"; function EditBerita() { const beritaState = useProxy(stateDashboardBerita); @@ -36,8 +35,6 @@ function EditBerita() { const [previewImage, setPreviewImage] = useState(null); const [file, setFile] = useState(null); - const [editorInstance, setEditorInstance] = useState(null); - const [isEditorReady, setIsEditorReady] = useState(false); const [formData, setFormData] = useState({ judul: beritaState.berita.edit.form.judul || '', deskripsi: beritaState.berita.edit.form.deskripsi || '', @@ -76,28 +73,7 @@ function EditBerita() { loadBerita(); }, [params?.id]); // ✅ hapus beritaState dari dependency - - - // Handle editor ready - const handleEditorReady = (editor: any) => { - setEditorInstance(editor); - setIsEditorReady(true); - - // Set initial content if exists - if (formData.content) { - editor.commands.setContent(formData.content); - } - }; - const handleSubmit = async () => { - if (!isEditorReady || !editorInstance) { - return toast.error("Editor belum siap"); - } - - const htmlContent = editorInstance.getHTML(); - if (!htmlContent || htmlContent === "

") { - return toast.warn("Konten tidak boleh kosong"); - } try { // Update global state with form data @@ -105,7 +81,7 @@ function EditBerita() { ...beritaState.berita.edit.form, judul: formData.judul, deskripsi: formData.deskripsi, - content: htmlContent, + content: formData.content, kategoriBeritaId: formData.kategoriBeritaId || '', imageId: formData.imageId // Keep existing imageId if not changed }; @@ -189,14 +165,12 @@ function EditBerita() { Konten - { - setFormData((prev) => ({ ...prev, content })); - beritaState.berita.edit.form.content = content; - }} + { + setFormData((prev) => ({ ...prev, content: htmlContent })); + beritaState.berita.edit.form.content = htmlContent; + }} /> diff --git a/src/app/admin/(dashboard)/desa/berita/detail/[id]/page.tsx b/src/app/admin/(dashboard)/desa/berita/[id]/page.tsx similarity index 55% rename from src/app/admin/(dashboard)/desa/berita/detail/[id]/page.tsx rename to src/app/admin/(dashboard)/desa/berita/[id]/page.tsx index 49335df8..a991e6ba 100644 --- a/src/app/admin/(dashboard)/desa/berita/detail/[id]/page.tsx +++ b/src/app/admin/(dashboard)/desa/berita/[id]/page.tsx @@ -8,8 +8,8 @@ import { useParams, useRouter } from 'next/navigation'; import { useState } from 'react'; import colors from '@/con/colors'; -import { ModalKonfirmasiHapus } from '../../../../_com/modalKonfirmasiHapus'; -import stateDashboardBerita from '../../../../_state/desa/berita'; +import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; +import stateDashboardBerita from '../../../_state/desa/berita'; function DetailBerita() { const beritaState = useProxy(stateDashboardBerita) @@ -45,52 +45,64 @@ function DetailBerita() { return ( - + Detail Berita - {beritaState.berita.findUnique.data ? ( - + {beritaState.berita.findUnique.data ? ( + + Kategori {beritaState.berita.findUnique.data?.kategoriBerita?.name} + + Judul {beritaState.berita.findUnique.data?.judul} + + Deskripsi {beritaState.berita.findUnique.data?.deskripsi} + + Gambar gambar - - - - - - ) : null} + + Konten + + + + + + + + + ) : null} diff --git a/src/app/admin/(dashboard)/desa/berita/create/page.tsx b/src/app/admin/(dashboard)/desa/berita/create/page.tsx index 1861a1e6..f27cc51f 100644 --- a/src/app/admin/(dashboard)/desa/berita/create/page.tsx +++ b/src/app/admin/(dashboard)/desa/berita/create/page.tsx @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' import colors from '@/con/colors'; import ApiFetch from '@/lib/api-fetch'; @@ -10,14 +9,13 @@ import { useRouter } from 'next/navigation'; import { useState } from 'react'; import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; +import CreateEditor from '../../../_com/createEditor'; import stateDashboardBerita from '../../../_state/desa/berita'; -import { BeritaEditor } from '../_com/BeritaEditor'; export default function CreateBerita() { const beritaState = useProxy(stateDashboardBerita); const [previewImage, setPreviewImage] = useState(null); const [file, setFile] = useState(null); - const [editorInstance, setEditorInstance] = useState(null); const router = useRouter() const resetForm = () => { @@ -33,21 +31,12 @@ export default function CreateBerita() { // Reset state lokal setPreviewImage(null); setFile(null); - if (editorInstance) { - editorInstance.commands.setContent(""); // Kosongkan editor - } }; const handleSubmit = async () => { if (!file) { return toast.warn("Pilih file gambar terlebih dahulu"); } - if (!editorInstance) return toast.error("Editor belum siap"); - - const htmlContent = editorInstance.getHTML(); - if (!htmlContent || htmlContent === "

") return toast.warn("Konten tidak boleh kosong"); - - beritaState.berita.create.form.content = htmlContent; // Upload gambar dulu const res = await ApiFetch.api.fileStorage.create.post({ @@ -124,9 +113,11 @@ export default function CreateBerita() { )} Konten - setEditorInstance(ed)} + { + beritaState.berita.create.form.content = htmlContent; + }} /> diff --git a/src/app/admin/(dashboard)/desa/berita/page.tsx b/src/app/admin/(dashboard)/desa/berita/page.tsx index 60a66bb5..01a96511 100644 --- a/src/app/admin/(dashboard)/desa/berita/page.tsx +++ b/src/app/admin/(dashboard)/desa/berita/page.tsx @@ -163,7 +163,7 @@ function BeritaList() { gambar - diff --git a/src/app/api/[[...slugs]]/_lib/desa/berita/create.ts b/src/app/api/[[...slugs]]/_lib/desa/berita/create.ts index 632634a7..e64f67ca 100644 --- a/src/app/api/[[...slugs]]/_lib/desa/berita/create.ts +++ b/src/app/api/[[...slugs]]/_lib/desa/berita/create.ts @@ -13,9 +13,6 @@ type FormCreate = Prisma.BeritaGetPayload<{ }>; async function beritaCreate(context: Context) { const body = context.body as FormCreate; - console.log(body) - -// console.log(body) await prisma.berita.create({ data: { diff --git a/src/app/api/[[...slugs]]/_lib/desa/berita/find-by-id.ts b/src/app/api/[[...slugs]]/_lib/desa/berita/find-by-id.ts index 92575a9e..54e6deac 100644 --- a/src/app/api/[[...slugs]]/_lib/desa/berita/find-by-id.ts +++ b/src/app/api/[[...slugs]]/_lib/desa/berita/find-by-id.ts @@ -40,26 +40,20 @@ export default async function handler( } // Ensure we're returning a proper Response object - return new Response(JSON.stringify({ + return Response.json({ success: true, message: "Success fetch berita by ID", data, - }), { + }, { status: 200, - headers: { - 'Content-Type': 'application/json', - }, }); } catch (e) { console.error("Find by ID error:", e); - return new Response(JSON.stringify({ + return Response.json({ success: false, message: "Gagal mengambil berita: " + (e instanceof Error ? e.message : 'Unknown error'), - }), { + }, { status: 500, - headers: { - 'Content-Type': 'application/json', - }, }); } } \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/desa/berita/updt.ts b/src/app/api/[[...slugs]]/_lib/desa/berita/updt.ts index ef50afee..d9c03582 100644 --- a/src/app/api/[[...slugs]]/_lib/desa/berita/updt.ts +++ b/src/app/api/[[...slugs]]/_lib/desa/berita/updt.ts @@ -85,7 +85,7 @@ async function beritaUpdate(context: Context) { { status: 200, headers: { 'Content-Type': 'application/json' } } ); } catch (error) { - console.error("Error updating berita:", error); + console.error("Error updating berita:", error); return new Response( JSON.stringify({ success: false, diff --git a/src/app/darmasaba/_com/Footer.tsx b/src/app/darmasaba/_com/Footer.tsx index 05909d12..d3755a94 100644 --- a/src/app/darmasaba/_com/Footer.tsx +++ b/src/app/darmasaba/_com/Footer.tsx @@ -10,7 +10,7 @@ function Footer() { return ( <> - +
diff --git a/src/app/darmasaba/_com/main-page/desaantikorupsi/index.tsx b/src/app/darmasaba/_com/main-page/desaantikorupsi/index.tsx index 72303ca2..b446f2da 100644 --- a/src/app/darmasaba/_com/main-page/desaantikorupsi/index.tsx +++ b/src/app/darmasaba/_com/main-page/desaantikorupsi/index.tsx @@ -44,9 +44,9 @@ function DesaAntiKorupsi() {
- Desa Anti Korupsi + Desa Anti Korupsi
- Desa antikorupsi mendorong pemerintahan jujur dan transparan. Keuangan desa dikelola terbuka dengan melibatkan warga mengawasi anggaran, sehingga digunakan tepat sasaran sesuai kebutuhan. + Desa antikorupsi mendorong pemerintahan jujur dan transparan. Keuangan desa dikelola terbuka dengan melibatkan warga mengawasi anggaran, sehingga digunakan tepat sasaran sesuai kebutuhan.
@@ -65,13 +65,13 @@ function DesaAntiKorupsi() { - {v.judul} + {v.judul} {v.icon} - {v.deskripsi} + {v.deskripsi} diff --git a/src/app/darmasaba/_com/main-page/kepuasan/index.tsx b/src/app/darmasaba/_com/main-page/kepuasan/index.tsx index c173a10f..865784a9 100644 --- a/src/app/darmasaba/_com/main-page/kepuasan/index.tsx +++ b/src/app/darmasaba/_com/main-page/kepuasan/index.tsx @@ -1,7 +1,8 @@ "use client"; -import { Stack, Container, Center, Text, Paper, Flex, Box, SimpleGrid } from "@mantine/core"; -import { BarChart, PieChart } from '@mantine/charts'; import colors from "@/con/colors"; +import { BarChart, PieChart } from '@mantine/charts'; +import { Box, Center, Container, Flex, Paper, SimpleGrid, Stack, Text } from "@mantine/core"; +import { useMediaQuery } from "@mantine/hooks"; const dataBarChart = [ { @@ -71,13 +72,14 @@ const dataPieChart3 = [ ] function Kepuasan() { + const isMobile = useMediaQuery('(max-width: 768px)'); return (
- Indeks Kepuasan Masyarakat + Indeks Kepuasan Masyarakat
- Ukur kebahagiaan warga, tingkatkan layanan desa! Dengan partisipasi aktif masyarakat, kami berkomitmen untuk terus memperbaiki layanan agar lebih transparan, efektif, dan sesuai dengan kebutuhan warga. Kepuasan Anda adalah prioritas utama kami dalam membangun desa yang lebih baik! + Ukur kebahagiaan warga, tingkatkan layanan desa! Dengan partisipasi aktif masyarakat, kami berkomitmen untuk terus memperbaiki layanan agar lebih transparan, efektif, dan sesuai dengan kebutuhan warga. Kepuasan Anda adalah prioritas utama kami dalam membangun desa yang lebih baik!
@@ -118,7 +120,7 @@ function Kepuasan() { Jenis Kelamin Pilihan Umur - - + + Jadwal Kerja @@ -168,7 +164,14 @@ function LandingPage() {
- + + + + Rabu, 10 Maret 2025 @@ -187,7 +190,8 @@ function LandingPage() {
- + + diff --git a/src/app/darmasaba/_com/main-page/penghargaan/index.tsx b/src/app/darmasaba/_com/main-page/penghargaan/index.tsx index 5900da5a..6927c548 100644 --- a/src/app/darmasaba/_com/main-page/penghargaan/index.tsx +++ b/src/app/darmasaba/_com/main-page/penghargaan/index.tsx @@ -51,7 +51,7 @@ function Penghargaan() { Juara 2 Duta Investasi - + Juara Favorit Lomba Video Pendek