diff --git a/prisma/schema.prisma b/prisma/schema.prisma index e1c7d2bb..217a023f 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1123,19 +1123,19 @@ model PosisiOrganisasi { } model Pegawai { - id String @id @default(uuid()) @db.Uuid - namaLengkap String @db.VarChar(255) - gelarAkademik String? @db.VarChar(100) - image FileStorage? @relation(fields: [imageId], references: [id]) - imageId String? - tanggalMasuk DateTime? @db.Date - email String? @unique @db.VarChar(255) - telepon String? @db.VarChar(20) - alamat String? @db.Text - posisiId String @db.VarChar(50) - isActive Boolean @default(true) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + id String @id @default(uuid()) @db.Uuid + namaLengkap String @db.VarChar(255) + gelarAkademik String? @db.VarChar(100) + image FileStorage? @relation(fields: [imageId], references: [id]) + imageId String? + tanggalMasuk DateTime? @db.Date + email String? @unique @db.VarChar(255) + telepon String? @db.VarChar(20) + alamat String? @db.Text + posisiId String @db.VarChar(50) + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt posisi PosisiOrganisasi @relation(fields: [posisiId], references: [id]) @@ -1201,3 +1201,29 @@ model StatistikKemiskinan { createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } + +// ========================================= JUMLAH PENDUDUK USIA KERJA YANG MENGANGGUR ========================================= // +model GrafikMenganggurBerdasarkanUsia { + id String @id @default(cuid()) + usia18_25 String + usia26_35 String + usia36_45 String + usia46_keatas String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) +} + +model GrafikMenganggurBerdasarkanPendidikan { + id String @id @default(cuid()) + SD String + SMP String + SMA String + D3 String + S1 String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) +} diff --git a/src/app/admin/(dashboard)/_com/jusulListTab.tsx b/src/app/admin/(dashboard)/_com/jusulListTab.tsx index bd5c9242..82368864 100644 --- a/src/app/admin/(dashboard)/_com/jusulListTab.tsx +++ b/src/app/admin/(dashboard)/_com/jusulListTab.tsx @@ -5,31 +5,48 @@ import { IconCircleDashedPlus, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import React from 'react'; -const JudulListTab = ({ title = "", href = "#", placeholder = "pencarian", searchIcon = }) => { +type JudulListTabProps = { + title: string; + href: string; + placeholder: string; + searchIcon: React.ReactNode; + value?: string; + onChange?: (e: React.ChangeEvent) => void; +} + + +const JudulListTab = ({ + title = "", + href = "#", + placeholder = "pencarian", + searchIcon = , + value, + onChange +}: JudulListTabProps) => { const router = useRouter(); const handleNavigate = () => { router.push(href); }; - - return ( - {title} + {title} - + - + diff --git a/src/app/admin/(dashboard)/_state/ekonomi/usia-kerja-nganggur.ts b/src/app/admin/(dashboard)/_state/ekonomi/usia-kerja-nganggur.ts new file mode 100644 index 00000000..37e87cf4 --- /dev/null +++ b/src/app/admin/(dashboard)/_state/ekonomi/usia-kerja-nganggur.ts @@ -0,0 +1,376 @@ +import ApiFetch from "@/lib/api-fetch"; +import { Prisma } from "@prisma/client"; +import { toast } from "react-toastify"; +import { proxy } from "valtio"; +import { z } from "zod"; + +const templateGrafikUsiaKerjaYangMenganggur = z.object({ + usia18_25: z.string().min(1, "Data usia 18-25 harus diisi"), + usia26_35: z.string().min(1, "Data usia 26-35 harus diisi"), + usia36_45: z.string().min(1, "Data usia 36-45 harus diisi"), + usia46_keatas: z.string().min(1, "Data usia 46 keatas harus diisi"), +}); + +type GrafikUsiaKerjaYangMenganggur = Prisma.GrafikMenganggurBerdasarkanUsiaGetPayload<{ + select: { + id: true; + usia18_25: true; + usia26_35: true; + usia36_45: true; + usia46_keatas: true; + }; +}>; + +const defaultForm: Omit & { id?: string } = { + usia18_25: "", + usia26_35: "", + usia36_45: "", + usia46_keatas: "", +}; + +const grafikBerdasarkanUsiaKerjaNganggur = proxy({ + create: { + form: defaultForm, + loading: false, + async create() { + const cek = templateGrafikUsiaKerjaYangMenganggur.safeParse( + grafikBerdasarkanUsiaKerjaNganggur.create.form + ); + if (!cek.success) { + const err = `[${cek.error.issues + .map((v) => `${v.path.join(".")}`) + .join("\n")}] required`; + return toast.error(err); + } + try { + grafikBerdasarkanUsiaKerjaNganggur.create.loading = true; + const res = await ApiFetch.api.ekonomi.grafikusiakerjayangmenganggur[ + "create" + ].post(grafikBerdasarkanUsiaKerjaNganggur.create.form); + if (res.status === 200) { + const id = res.data?.data?.id; + if (id) { + toast.success("Success create"); + grafikBerdasarkanUsiaKerjaNganggur.create.form = { + usia18_25: "", + usia26_35: "", + usia36_45: "", + usia46_keatas: "", + }; + grafikBerdasarkanUsiaKerjaNganggur.findMany.load(); + return id; + } + } + return toast.error("failed create"); + } catch (error) { + console.log((error as Error).message); + } finally { + grafikBerdasarkanUsiaKerjaNganggur.create.loading = false; + } + }, + }, + findMany: { + data: null as + | Prisma.GrafikMenganggurBerdasarkanUsiaGetPayload<{ + omit: { isActive: true }; + }>[] + | null, + loading: false, + async load() { + const res = await ApiFetch.api.ekonomi.grafikusiakerjayangmenganggur[ + "find-many" + ].get(); + if (res.status === 200) { + grafikBerdasarkanUsiaKerjaNganggur.findMany.data = res.data?.data ?? []; + } + }, + }, + findUnique: { + data: null as Prisma.GrafikMenganggurBerdasarkanUsiaGetPayload<{ + omit: { isActive: true }; + }> | null, + async load(id: string) { + try { + const res = await fetch( + `/api/ekonomi/grafikusiakerjayangmenganggur/${id}` + ); + if (res.ok) { + const data = await res.json(); + grafikBerdasarkanUsiaKerjaNganggur.findUnique.data = data.data ?? null; + } else { + console.error("Failed to fetch data", res.status, res.statusText); + grafikBerdasarkanUsiaKerjaNganggur.findUnique.data = null; + } + } catch (error) { + console.error("Error loading grafik berdasarkan usia kerja yang menganggur:", error); + grafikBerdasarkanUsiaKerjaNganggur.findUnique.data = null; + } + }, + }, + update: { + id: "", + form: {...defaultForm}, + loading: false, + async byId() { + // Method implementation if needed + }, + async submit() { + const id = this.id; + if (!id) { + toast.warn("ID tidak valid"); + return null; + } + const cek = templateGrafikUsiaKerjaYangMenganggur.safeParse(this.form); + if (!cek.success) { + const err = `[${cek.error.issues.map((v) => `${v.path.join(".")}`).join("\n")}] required`; + toast.error(err); + return null; + } + this.loading = true; + try { + const response = await fetch( + `/api/ekonomi/grafikusiakerjayangmenganggur/${id}`, { + method: "PUT", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(this.form), + }); + const result = await response.json(); + if (!response.ok || !result?.success) { + throw new Error(result?.message || "Gagal update data"); + } + toast.success("Berhasil update data!"); + await grafikBerdasarkanUsiaKerjaNganggur.findMany.load(); + return result.data; + } catch (error) { + console.error("Error update data:", error); + toast.error("Gagal update data grafik berdasarkan usia kerja yang menganggur"); + } finally { + this.loading = false; + } + }, + }, + delete: { + loading: false, + async byId(id: string) { + if (!id) return toast.warn("ID tidak valid"); + + try { + grafikBerdasarkanUsiaKerjaNganggur.delete.loading = true; + + const response = await fetch(`/api/ekonomi/grafikusiakerjayangmenganggur/del/${id}`, { + method: "DELETE", + headers: { + "Content-Type": "application/json", + }, + }); + + const result = await response.json(); + + if (response.ok && result?.success) { + toast.success(result.message || "Grafik berdasarkan usia kerja yang menganggur berhasil dihapus"); + await grafikBerdasarkanUsiaKerjaNganggur.findMany.load(); // refresh list + } else { + toast.error(result?.message || "Gagal menghapus grafik berdasarkan usia kerja yang menganggur"); + } + } catch (error) { + console.error("Gagal delete:", error); + toast.error("Terjadi kesalahan saat menghapus grafik berdasarkan usia kerja yang menganggur"); + } finally { + grafikBerdasarkanUsiaKerjaNganggur.delete.loading = false; + } + }, + } +}); + +const templateGrafikBerpendidikanYangMenganggur = z.object({ + SD: z.string().min(1, "Data SD harus diisi"), + SMP: z.string().min(1, "Data SMP harus diisi"), + SMA: z.string().min(1, "Data SMA harus diisi"), + D3: z.string().min(1, "Data D3 harus diisi"), + S1: z.string().min(1, "Data S1 harus diisi"), +}); + +type GrafikBerpendidikanYangMenganggur = Prisma.GrafikMenganggurBerdasarkanPendidikanGetPayload<{ + select: { + id: true; + SD: true; + SMP: true; + SMA: true; + D3: true; + S1: true; + }; +}>; + +const defaultFormBerpendidikan: Omit & { id?: string } = { + SD: "", + SMP: "", + SMA: "", + D3: "", + S1: "", +}; + +const grafikBerdasarkanPendidikan = proxy({ + create: { + form: defaultFormBerpendidikan, + loading: false, + async create() { + const cek = templateGrafikBerpendidikanYangMenganggur.safeParse( + grafikBerdasarkanPendidikan.create.form + ); + if (!cek.success) { + const err = `[${cek.error.issues + .map((v) => `${v.path.join(".")}`) + .join("\n")}] required`; + return toast.error(err); + } + try { + grafikBerdasarkanPendidikan.create.loading = true; + const res = await ApiFetch.api.ekonomi.grafikmenganggurberdasarkanpendidikan[ + "create" + ].post(grafikBerdasarkanPendidikan.create.form); + if (res.status === 200) { + const id = res.data?.data?.id; + if (id) { + toast.success("Success create"); + grafikBerdasarkanPendidikan.create.form = { + SD: "", + SMP: "", + SMA: "", + D3: "", + S1: "", + }; + grafikBerdasarkanPendidikan.findMany.load(); + return id; + } + } + return toast.error("failed create"); + } catch (error) { + console.log((error as Error).message); + } finally { + grafikBerdasarkanPendidikan.create.loading = false; + } + }, + }, + findMany: { + data: null as + | Prisma.GrafikMenganggurBerdasarkanPendidikanGetPayload<{ + omit: { isActive: true }; + }>[] + | null, + loading: false, + async load() { + const res = await ApiFetch.api.ekonomi.grafikmenganggurberdasarkanpendidikan[ + "find-many" + ].get(); + if (res.status === 200) { + grafikBerdasarkanPendidikan.findMany.data = res.data?.data ?? []; + } + }, + }, + findUnique: { + data: null as Prisma.GrafikMenganggurBerdasarkanPendidikanGetPayload<{ + omit: { isActive: true }; + }> | null, + async load(id: string) { + try { + const res = await fetch( + `/api/ekonomi/grafikmenganggurberdasarkanpendidikan/${id}` + ); + if (res.ok) { + const data = await res.json(); + grafikBerdasarkanPendidikan.findUnique.data = data.data ?? null; + } else { + console.error("Failed to fetch data", res.status, res.statusText); + grafikBerdasarkanPendidikan.findUnique.data = null; + } + } catch (error) { + console.error("Error loading grafik berdasarkan usia kerja yang menganggur:", error); + grafikBerdasarkanPendidikan.findUnique.data = null; + } + }, + }, + update: { + id: "", + form: {...defaultFormBerpendidikan}, + loading: false, + async byId() { + // Method implementation if needed + }, + async submit() { + const id = this.id; + if (!id) { + toast.warn("ID tidak valid"); + return null; + } + const cek = templateGrafikBerpendidikanYangMenganggur.safeParse(this.form); + if (!cek.success) { + const err = `[${cek.error.issues.map((v) => `${v.path.join(".")}`).join("\n")}] required`; + toast.error(err); + return null; + } + this.loading = true; + try { + const response = await fetch( + `/api/ekonomi/grafikmenganggurberdasarkanpendidikan/${id}`, { + method: "PUT", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(this.form), + }); + const result = await response.json(); + if (!response.ok || !result?.success) { + throw new Error(result?.message || "Gagal update data"); + } + toast.success("Berhasil update data!"); + await grafikBerdasarkanPendidikan.findMany.load(); + return result.data; + } catch (error) { + console.error("Error update data:", error); + toast.error("Gagal update data grafik berdasarkan pendidikan yang menganggur"); + } finally { + this.loading = false; + } + }, + }, + delete: { + loading: false, + async byId(id: string) { + if (!id) return toast.warn("ID tidak valid"); + + try { + grafikBerdasarkanPendidikan.delete.loading = true; + + const response = await fetch(`/api/ekonomi/grafikmenganggurberdasarkanpendidikan/del/${id}`, { + method: "DELETE", + headers: { + "Content-Type": "application/json", + }, + }); + + const result = await response.json(); + + if (response.ok && result?.success) { + toast.success(result.message || "Grafik berdasarkan pendidikan yang menganggur berhasil dihapus"); + await grafikBerdasarkanPendidikan.findMany.load(); // refresh list + } else { + toast.error(result?.message || "Gagal menghapus grafik berdasarkan pendidikan yang menganggur"); + } + } catch (error) { + console.error("Gagal delete:", error); + toast.error("Terjadi kesalahan saat menghapus grafik berdasarkan pendidikan yang menganggur"); + } finally { + grafikBerdasarkanPendidikan.delete.loading = false; + } + }, + } +}); + +const grafikNganggur = proxy({ + grafikBerdasarkanUsiaKerjaNganggur, + grafikBerdasarkanPendidikan +}) + +export default grafikNganggur; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/_lib/layoutTabs.tsx new file mode 100644 index 00000000..82508a8e --- /dev/null +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/_lib/layoutTabs.tsx @@ -0,0 +1,62 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +'use client' +import colors from '@/con/colors'; +import { Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core'; +import { usePathname, useRouter } from 'next/navigation'; +import React, { useEffect, useState } from 'react'; + +function LayoutTabs({ children }: { children: React.ReactNode }) { + const router = useRouter() + const pathname = usePathname() + const tabs = [ + { + label: "Pengangguran Berdasarkan Usia", + value: "pengangguranberdasarkanusia", + href: "/admin/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia" + }, + { + label: "Pengangguran Berdasarkan Pendidikan", + value: "pengangguranberdasarkanpendidikan", + href: "/admin/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan" + }, + ]; + const curentTab = tabs.find(tab => tab.href === pathname) + const [activeTab, setActiveTab] = useState(curentTab?.value || tabs[0].value); + + const handleTabChange = (value: string | null) => { + const tab = tabs.find(t => t.value === value) + if (tab) { + router.push(tab.href) + } + setActiveTab(value) + } + + useEffect(() => { + const match = tabs.find(tab => tab.href === pathname) + if (match) { + setActiveTab(match.value) + } + }, [pathname]) + + return ( + + Jumlah Penduduk Usia Kerja yang Menganggur + + + {tabs.map((e, i) => ( + {e.label} + ))} + + {tabs.map((e, i) => ( + + {/* Konten dummy, bisa diganti tergantung routing */} + <> + + ))} + + {children} + + ); +} + +export default LayoutTabs; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/layout.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/layout.tsx new file mode 100644 index 00000000..285fc16e --- /dev/null +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/layout.tsx @@ -0,0 +1,9 @@ +import LayoutTabs from "./_lib/layoutTabs"; + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ); +} \ No newline at end of file diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/page.tsx deleted file mode 100644 index dcf2acfa..00000000 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/page.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import colors from "@/con/colors"; -import { Box, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from "@mantine/core"; -import PengangguranBerdasarkanUsia from "./pengangguran_berdasarkan_usia/page"; -import PengangguranBerdasarkanPendidikan from "./pengangguran_berdasarkan_pendidikan/page"; - -export default function Page() { - return ( - - - Jumlah Penduduk Usia Kerja yang Menganggur - - - - Pengangguran Berdasarkan Usia - - - Pengangguran Berdasarkan Pendidikan - - - - - - - - - - - - - ); -} \ No newline at end of file diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/[id]/page.tsx new file mode 100644 index 00000000..d6233ad5 --- /dev/null +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/[id]/page.tsx @@ -0,0 +1,109 @@ +'use client' +import grafikNganggur from '@/app/admin/(dashboard)/_state/ekonomi/usia-kerja-nganggur'; +/* eslint-disable react-hooks/exhaustive-deps */ + +import colors from '@/con/colors'; +import { Box, Button, Paper, Stack, TextInput, Title } from '@mantine/core'; +import { IconArrowBack } from '@tabler/icons-react'; +import { useParams, useRouter } from 'next/navigation'; +import { useEffect } from 'react'; +import { useProxy } from 'valtio/utils'; + +function EditGrafikBerdasarkanPendidikan() { + const router = useRouter() + const params = useParams() as { id: string } + const stategrafik = useProxy(grafikNganggur.grafikBerdasarkanPendidikan) + const id = params.id + + useEffect(() => { + if(id){ + stategrafik.findUnique.load(id).then(() => { + const data = stategrafik.findUnique.data + if(data){ + stategrafik.update.form = { + SD: data.SD || '', + SMP: data.SMP || '', + SMA: data.SMA || '', + D3: data.D3 || '', + S1: data.S1 || '', + } + } + }) + } + }, [id]) + + const handleSubmit = async () => { + stategrafik.update.id = id; + await stategrafik.update.submit(); + router.push('/admin/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan') + } + + return ( + + + + + + + Edit Grafik Pengangguran Berdasarkan Pendidikan + { + stategrafik.update.form.SD = val.currentTarget.value; + }} + /> + { + stategrafik.update.form.SMP = val.currentTarget.value; + }} + /> + { + stategrafik.update.form.SMA = val.currentTarget.value; + }} + /> + { + stategrafik.update.form.D3 = val.currentTarget.value; + }} + /> + { + stategrafik.update.form.S1 = val.currentTarget.value; + }} + /> + + + + + ); +} + +export default EditGrafikBerdasarkanPendidikan; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/create/page.tsx index 144a6e4c..2bbf63e9 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/create/page.tsx @@ -1,54 +1,111 @@ 'use client' -import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; -import { IconArrowBack } from '@tabler/icons-react'; +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import React from 'react'; import { useRouter } from 'next/navigation'; +import grafikBerdasarkanJenisKelamin from '@/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanJenisKelamin'; +import { useProxy } from 'valtio/utils'; +import { useState } from 'react'; +import colors from '@/con/colors'; +import { Box, Button, Paper, Stack, Title, TextInput } from '@mantine/core'; +import { IconArrowBack } from '@tabler/icons-react'; +import grafikNganggur from '@/app/admin/(dashboard)/_state/ekonomi/usia-kerja-nganggur'; -function CreatePengangguranBerdasarkanPendidikan() { +function CreateGrafikBerdasarkanPendidikan() { const router = useRouter(); + const stategrafik = useProxy(grafikNganggur.grafikBerdasarkanPendidikan) + const [donutData, setDonutData] = useState([]); + + const resetForm = () => { + stategrafik.create.form = { + ...stategrafik.create.form, + SD: "", + SMP: "", + SMA: "", + D3: "", + S1: "", + } + } + + const handleSubmit = async () => { + const id = await stategrafik.create.create(); + if (id) { + const idStr = String(id); + await stategrafik.findUnique.load(idStr); + if (stategrafik.findUnique.data) { + setDonutData([stategrafik.findUnique.data]); + } + } + resetForm(); + router.push("/admin/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan") + } return ( - - - - - - - Create Pengangguran Berdasarkan Pendidikan - Pendidikan SD} - placeholder='Masukkan pendidikan sd' - /> - Pendidikan SMP} - placeholder='Masukkan pendidikan smp' - /> - Pendidikan SMA} - placeholder='Masukkan pendidikan sma' - /> - Pendidikan S1} - placeholder='Masukkan pendidikan s1' - /> - Pendidikan S2} - placeholder='Masukkan pendidikan s2' - /> - Pendidikan S3} - placeholder='Masukkan pendidikan s3' - /> - - - - - - + + + + + + Create Grafik Pengangguran Berdasarkan Pendidikan + { + stategrafik.create.form.SD = val.currentTarget.value; + }} + /> + { + stategrafik.create.form.SMP = val.currentTarget.value; + }} + /> + { + stategrafik.create.form.SMA = val.currentTarget.value; + }} + /> + { + stategrafik.create.form.D3 = val.currentTarget.value; + }} + /> + { + stategrafik.create.form.S1 = val.currentTarget.value; + }} + /> + + + + ); } -export default CreatePengangguranBerdasarkanPendidikan; +export default CreateGrafikBerdasarkanPendidikan; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/detail/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/detail/page.tsx deleted file mode 100644 index 1fac895a..00000000 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/detail/page.tsx +++ /dev/null @@ -1,74 +0,0 @@ -'use client' -import colors from '@/con/colors'; -import { Box, Button, Flex, Paper, Stack, Text } from '@mantine/core'; -import { IconArrowBack, IconEdit, IconX } from '@tabler/icons-react'; -import { useRouter } from 'next/navigation'; -// import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; - -function DetailPengangguranBerdasarkanPendidikan() { - const router = useRouter(); - return ( - - - - - - - Detail Pengangguran Berdasarkan Pendidikan - - - - - Pendidikan SD - 50 - - - Pendidikan SMP - 60 - - - Pendidikan SMA - 80 - - - Pendidikan S1 - 40 - - - Pendidikan S2 - 20 - - - Pendidikan S3 - 10 - - - - - - - - - - - - - {/* Modal Hapus - setModalHapus(false)} - onConfirm={handleHapus} - text="Apakah anda yakin ingin menghapus potensi ini?" - /> */} - - ); -} - -export default DetailPengangguranBerdasarkanPendidikan; - diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/edit/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/edit/page.tsx deleted file mode 100644 index 14614608..00000000 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/edit/page.tsx +++ /dev/null @@ -1,54 +0,0 @@ -'use client' -import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; -import { IconArrowBack } from '@tabler/icons-react'; -import { useRouter } from 'next/navigation'; - - -function EditPengangguranBerdasarkanPendidikan() { - const router = useRouter(); - return ( - - - - - - - - Edit Pengangguran Berdasarkan Pendidikan - Pendidikan SD} - placeholder='Masukkan pendidikan sd' - /> - Pendidikan SMP} - placeholder='Masukkan pendidikan smp' - /> - Pendidikan SMA} - placeholder='Masukkan pendidikan sma' - /> - Pendidikan S1} - placeholder='Masukkan pendidikan s1' - /> - Pendidikan S2} - placeholder='Masukkan pendidikan s2' - /> - Pendidikan S3} - placeholder='Masukkan pendidikan s3' - /> - - - - - - - ); -} - -export default EditPengangguranBerdasarkanPendidikan; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/page.tsx index 932035aa..be7112be 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/page.tsx @@ -1,49 +1,215 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' import colors from '@/con/colors'; -import { Box, Button, Paper, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Title } from '@mantine/core'; -import { IconDeviceImac, IconSearch } from '@tabler/icons-react'; +import { Box, Button, Flex, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import { IconEdit, IconSearch, IconTrash } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; +import { useEffect, useState } from 'react'; +import { Cell, Pie, PieChart } from 'recharts'; +import { useProxy } from 'valtio/utils'; import JudulListTab from '../../../_com/jusulListTab'; +import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; +import grafikNganggur from '../../../_state/ekonomi/usia-kerja-nganggur'; -function PengangguranBerdasarkanPendidikan() { - const router = useRouter(); +function GrafikBerdasarkanPendidikan() { return ( - - - - } - /> - List Pengangguran Berdasarkan Pendidikan - - - - Pendidikan SD - Pendidikan SMP - Pendidikan SMA - Detail - - - - - 80 - 40 - 20 - - - - - -
-
-
+ + + Grafik Pengangguran Berdasarkan Pendidikan + + ); } -export default PengangguranBerdasarkanPendidikan; +function ListGrafikBerdasarkanPendidikan() { + const stategrafik = useProxy(grafikNganggur.grafikBerdasarkanPendidikan) + const [donutData, setDonutData] = useState([]); + const [mounted, setMounted] = useState(false); + const [modalHapus, setModalHapus] = useState(false) + const [selectedId, setSelectedId] = useState(null) + const router = useRouter(); + const [search, setSearch] = useState(""); + + + const handleDelete = async () => { + if (selectedId) { + await stategrafik.delete.byId(selectedId) + setModalHapus(false) + setSelectedId(null) + + stategrafik.findMany.load() + } + } + + useShallowEffect(() => { + setMounted(true); + stategrafik.findMany.load() + }, []); + + useEffect(() => { + if (stategrafik.findMany.data) { + const SD = stategrafik.findMany.data.reduce((acc: number, cur: any) => acc + Number(cur.SD || 0), 0); + const SMP = stategrafik.findMany.data.reduce((acc: number, cur: any) => acc + Number(cur.SMP || 0), 0); + const SMA = stategrafik.findMany.data.reduce((acc: number, cur: any) => acc + Number(cur.SMA || 0), 0); + const D3 = stategrafik.findMany.data.reduce((acc: number, cur: any) => acc + Number(cur.D3 || 0), 0); + const S1 = stategrafik.findMany.data.reduce((acc: number, cur: any) => acc + Number(cur.S1 || 0), 0); + setDonutData([ + { name: 'SD', value: SD, color: colors['blue-button'], key: 'SD' }, + { name: 'SMP', value: SMP, color: '#10A85AFF', key: 'SMP' }, + { name: 'SMA', value: SMA, color: '#C07B13FF', key: 'SMA' }, + { name: 'D3', value: D3, color: '#1094A8FF', key: 'D3' }, + { name: 'S1', value: S1, color: '#A83610FF', key: 'S1' }, + ]); + } + }, [stategrafik.findMany.data]) + + const filteredData = (stategrafik.findMany.data || []).filter(item => { + const keyword = search.toLowerCase(); + return ( + item.SD.toString().toLowerCase().includes(keyword) || + item.SMP.toString().toLowerCase().includes(keyword) || + item.SMA.toString().toLowerCase().includes(keyword) || + item.D3.toString().toLowerCase().includes(keyword) || + item.S1.toString().toLowerCase().includes(keyword) + ); + }); + + if (!stategrafik.findMany.data) { + return ( + + + + ) + } + + return ( + + + + setSearch(e.currentTarget.value)} + title='List Grafik Pengangguran Berdasarkan Pendidikan' + href='/admin/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/create' + placeholder='pencarian' + searchIcon={} + /> + + + + SD + SMP + SMA + D3 + S1 + Edit + Delete + + + + {filteredData.length === 0 ? ( + + + Belum ada data grafik responden + + + ) : ( + filteredData.map((item) => ( + + {item.SD} + {item.SMP} + {item.SMA} + {item.D3} + {item.S1} + + + + + + + + )) + )} + + +
+
+ + {/* Chart */} + + + + Grafik Pengangguran Berdasarkan Pendidikan + {mounted && donutData.length > 0 ? ( + + + {donutData.map((entry, index) => ( + + ))} + + + + + SD : {donutData.find((entry) => entry.name === 'SD')?.value} + + + + SMP : {donutData.find((entry) => entry.name === 'SMP')?.value} + + + + SMA : {donutData.find((entry) => entry.name === 'SMA')?.value} + + + + D3 : {donutData.find((entry) => entry.name === 'D3')?.value} + + + + S1 : {donutData.find((entry) => entry.name === 'S1')?.value} + + + ) : ( + Belum ada data untuk ditampilkan dalam grafik + )} + + + +
+ + {/* Modal Konfirmasi Hapus */} + setModalHapus(false)} + onConfirm={handleDelete} + text='Apakah anda yakin ingin menghapus grafik pengangguran berdasarkan pendidikan ini?' + /> +
+ ); +} + +export default GrafikBerdasarkanPendidikan; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/[id]/page.tsx new file mode 100644 index 00000000..e374adb9 --- /dev/null +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/[id]/page.tsx @@ -0,0 +1,99 @@ +'use client' +import grafikNganggur from '@/app/admin/(dashboard)/_state/ekonomi/usia-kerja-nganggur'; +/* eslint-disable react-hooks/exhaustive-deps */ + +import colors from '@/con/colors'; +import { Box, Button, Paper, Stack, TextInput, Title } from '@mantine/core'; +import { IconArrowBack } from '@tabler/icons-react'; +import { useParams, useRouter } from 'next/navigation'; +import { useEffect } from 'react'; +import { useProxy } from 'valtio/utils'; + +function EditGrafikBerdasarkanUsiaKerjaYangMenganggur() { + const router = useRouter() + const params = useParams() as { id: string } + const stategrafik = useProxy(grafikNganggur.grafikBerdasarkanUsiaKerjaNganggur) + const id = params.id + + useEffect(() => { + if(id){ + stategrafik.findUnique.load(id).then(() => { + const data = stategrafik.findUnique.data + if(data){ + stategrafik.update.form = { + usia18_25: data.usia18_25 || '', + usia26_35: data.usia26_35 || '', + usia36_45: data.usia36_45 || '', + usia46_keatas: data.usia46_keatas || '', + } + } + }) + } + }, [id]) + + const handleSubmit = async () => { + stategrafik.update.id = id; + await stategrafik.update.submit(); + router.push('/admin/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia') + } + + return ( + + + + + + + Edit Grafik Pengangguran Berdasarkan Usia Kerja + { + stategrafik.update.form.usia18_25 = val.currentTarget.value; + }} + /> + { + stategrafik.update.form.usia26_35 = val.currentTarget.value; + }} + /> + { + stategrafik.update.form.usia36_45 = val.currentTarget.value; + }} + /> + { + stategrafik.update.form.usia46_keatas = val.currentTarget.value; + }} + /> + + + + + ); +} + +export default EditGrafikBerdasarkanUsiaKerjaYangMenganggur; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/create/page.tsx index c35c6118..79ffd790 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/create/page.tsx @@ -1,45 +1,101 @@ 'use client' -import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; -import { IconArrowBack } from '@tabler/icons-react'; +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import React from 'react'; import { useRouter } from 'next/navigation'; +import grafikBerdasarkanJenisKelamin from '@/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanJenisKelamin'; +import { useProxy } from 'valtio/utils'; +import { useState } from 'react'; +import colors from '@/con/colors'; +import { Box, Button, Paper, Stack, Title, TextInput } from '@mantine/core'; +import { IconArrowBack } from '@tabler/icons-react'; +import grafikNganggur from '@/app/admin/(dashboard)/_state/ekonomi/usia-kerja-nganggur'; -function CreatePengangguranBerdasarkanUsia() { + +function CreateGrafikBerdasarkanUsiaKerjaYangMenganggur() { const router = useRouter(); + const stategrafik = useProxy(grafikNganggur.grafikBerdasarkanUsiaKerjaNganggur) + const [donutData, setDonutData] = useState([]); + + const resetForm = () => { + stategrafik.create.form = { + ...stategrafik.create.form, + usia18_25: "", + usia26_35: "", + usia36_45: "", + usia46_keatas: "", + } + } + + const handleSubmit = async () => { + const id = await stategrafik.create.create(); + if (id) { + const idStr = String(id); + await stategrafik.findUnique.load(idStr); + if (stategrafik.findUnique.data) { + setDonutData([stategrafik.findUnique.data]); + } + } + resetForm(); + router.push("/admin/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia") + } return ( - - - - - - - Create Pengangguran Berdasarkan Usia - Usia 18 - 25} - placeholder='Masukkan usia' - /> - Usia 26 - 35} - placeholder='Masukkan usia' - /> - Usia 36 - 45} - placeholder='Masukkan usia' - /> - Usia 46 +} - placeholder='Masukkan usia' - /> - - - - - - + + + + + + Create Grafik Pengangguran Berdasarkan Usia Kerja + { + stategrafik.create.form.usia18_25 = val.currentTarget.value; + }} + /> + { + stategrafik.create.form.usia26_35 = val.currentTarget.value; + }} + /> + { + stategrafik.create.form.usia36_45 = val.currentTarget.value; + }} + /> + { + stategrafik.create.form.usia46_keatas = val.currentTarget.value; + }} + /> + + + +
); } -export default CreatePengangguranBerdasarkanUsia; +export default CreateGrafikBerdasarkanUsiaKerjaYangMenganggur; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/detail/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/detail/page.tsx deleted file mode 100644 index d10bbf64..00000000 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/detail/page.tsx +++ /dev/null @@ -1,70 +0,0 @@ -'use client' -import colors from '@/con/colors'; -import { Box, Button, Flex, Paper, Stack, Text } from '@mantine/core'; -import { IconArrowBack, IconEdit, IconX } from '@tabler/icons-react'; -import { useRouter } from 'next/navigation'; -// import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; - -function DetailPengangguranBerdasarkanUsia() { - const router = useRouter(); - return ( - - - - - - - Detail Pengangguran Berdasarkan Usia - - - - - Usia 18 - 25 - 80 - - - Usia 26 - 35 - 40 - - - Usia 36 - 45 - 20 - - - Usia 46 + - 10 - - - Total - 150 - - - - - - - - - - - - - {/* Modal Hapus - setModalHapus(false)} - onConfirm={handleHapus} - text="Apakah anda yakin ingin menghapus potensi ini?" - /> */} - - ); -} - -export default DetailPengangguranBerdasarkanUsia; - diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/edit/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/edit/page.tsx deleted file mode 100644 index c7ea2b81..00000000 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/edit/page.tsx +++ /dev/null @@ -1,47 +0,0 @@ -'use client' -import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; -import { IconArrowBack } from '@tabler/icons-react'; -import { useRouter } from 'next/navigation'; - - - -function EditPengangguranBerdasarkanUsia() { - const router = useRouter(); - return ( - - - - - - - - Edit Pengangguran Berdasarkan Usia - Usia 18 - 25} - placeholder='Masukkan usia' - /> - Usia 26 - 35} - placeholder='Masukkan usia' - /> - Usia 36 - 45} - placeholder='Masukkan usia' - /> - Usia 46 +} - placeholder='Masukkan usia' - /> - - - - - - - ); -} - -export default EditPengangguranBerdasarkanUsia; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/page.tsx index 1540744a..a829d90f 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/page.tsx @@ -1,49 +1,206 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' import colors from '@/con/colors'; -import { Box, Button, Paper, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Title } from '@mantine/core'; -import { IconDeviceImac, IconSearch } from '@tabler/icons-react'; +import { Box, Button, Flex, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import { IconEdit, IconSearch, IconTrash } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; +import { useEffect, useState } from 'react'; +import { Cell, Pie, PieChart } from 'recharts'; +import { useProxy } from 'valtio/utils'; import JudulListTab from '../../../_com/jusulListTab'; +import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; +import grafikNganggur from '../../../_state/ekonomi/usia-kerja-nganggur'; -function PengangguranBerdasarkanUsia() { - const router = useRouter(); +function GrafikBerdasarkanUsiaKerjaYangMenganggur() { return ( - - - - } - /> - List Pengangguran Berdasarkan Usia - - - - Usia 18 - 25 - Usia 26 - 35 - Usia 36 - 45 - Detail - - - - - 80 - 40 - 20 - - - - - -
-
-
+ + + Grafik Pengangguran Berdasarkan Usia Kerja + + ); } -export default PengangguranBerdasarkanUsia; +function ListGrafikBerdasarkanUsiaKerjaYangMenganggur() { + const stategrafik = useProxy(grafikNganggur.grafikBerdasarkanUsiaKerjaNganggur) + const [donutData, setDonutData] = useState([]); + const [mounted, setMounted] = useState(false); + const [modalHapus, setModalHapus] = useState(false) + const [selectedId, setSelectedId] = useState(null) + const router = useRouter(); + const [search, setSearch] = useState(""); + + + const handleDelete = async () => { + if (selectedId) { + await stategrafik.delete.byId(selectedId) + setModalHapus(false) + setSelectedId(null) + + stategrafik.findMany.load() + } + } + + useShallowEffect(() => { + setMounted(true); + stategrafik.findMany.load() + }, []); + + useEffect(() => { + if (stategrafik.findMany.data) { + const totalUsia18_25 = stategrafik.findMany.data.reduce((acc: number, cur: any) => acc + Number(cur.usia18_25 || 0), 0); + const totalUsia26_35 = stategrafik.findMany.data.reduce((acc: number, cur: any) => acc + Number(cur.usia26_35 || 0), 0); + const totalUsia36_45 = stategrafik.findMany.data.reduce((acc: number, cur: any) => acc + Number(cur.usia36_45 || 0), 0); + const totalUsia46_keatas = stategrafik.findMany.data.reduce((acc: number, cur: any) => acc + Number(cur.usia46_keatas || 0), 0); + setDonutData([ + { name: 'usia18_25', value: totalUsia18_25, color: colors['blue-button'], key: 'usia18_25' }, + { name: 'usia26_35', value: totalUsia26_35, color: '#10A85AFF', key: 'usia26_35' }, + { name: 'usia36_45', value: totalUsia36_45, color: '#C07B13FF', key: 'usia36_45' }, + { name: 'usia46_keatas', value: totalUsia46_keatas, color: '#1094A8FF', key: 'usia46_keatas' }, + ]); + } + }, [stategrafik.findMany.data]) + + const filteredData = (stategrafik.findMany.data || []).filter(item => { + const keyword = search.toLowerCase(); + return ( + item.usia18_25.toString().toLowerCase().includes(keyword) || + item.usia26_35.toString().toLowerCase().includes(keyword) || + item.usia36_45.toString().toLowerCase().includes(keyword) || + item.usia46_keatas.toString().toLowerCase().includes(keyword) + ); + }); + + if (!stategrafik.findMany.data) { + return ( + + + + ) + } + + return ( + + + + setSearch(e.currentTarget.value)} + title='List Pengangguran Berdasarkan Usia Kerja' + href='/admin/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/create' + placeholder='pencarian' + searchIcon={} + /> + + + + Usia 18-25 + Usia 26-35 + Usia 36-45 + Usia 46 + + Edit + Delete + + + + {filteredData.length === 0 ? ( + + + Belum ada data grafik responden + + + ) : ( + filteredData.map((item) => ( + + {item.usia18_25} + {item.usia26_35} + {item.usia36_45} + {item.usia46_keatas} + + + + + + + + )) + )} + + +
+
+ + {/* Chart */} + + + + Grafik Pengangguran Berdasarkan Usia Kerja + {mounted && donutData.length > 0 ? ( + + + {donutData.map((entry, index) => ( + + ))} + + + + + Usia 18-25 : {donutData.find((entry) => entry.name === 'usia18_25')?.value} + + + + Usia 26-35 : {donutData.find((entry) => entry.name === 'usia26_35')?.value} + + + + Usia 36-45 : {donutData.find((entry) => entry.name === 'usia36_45')?.value} + + + + Usia 46 + : {donutData.find((entry) => entry.name === 'usia46_keatas')?.value} + + + ) : ( + Belum ada data untuk ditampilkan dalam grafik + )} + + + +
+ + {/* Modal Konfirmasi Hapus */} + setModalHapus(false)} + onConfirm={handleDelete} + text='Apakah anda yakin ingin menghapus grafik pengangguran berdasarkan usia kerja ini?' + /> +
+ ); +} + +export default GrafikBerdasarkanUsiaKerjaYangMenganggur; diff --git a/src/app/admin/_com/list_PageAdmin.tsx b/src/app/admin/_com/list_PageAdmin.tsx index 1a8ff1f5..820548fe 100644 --- a/src/app/admin/_com/list_PageAdmin.tsx +++ b/src/app/admin/_com/list_PageAdmin.tsx @@ -240,7 +240,7 @@ export const navBar = [ { id: "Ekonomi_6", name: "Jumlah penduduk usia kerja yang menganggur", - path: "/admin/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur" + path: "/admin/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia" }, { id: "Ekonomi_7", diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/index.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/index.ts index e7a0b350..20aaf5ca 100644 --- a/src/app/api/[[...slugs]]/_lib/ekonomi/index.ts +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/index.ts @@ -4,6 +4,8 @@ import LowonganKerja from "./lowongan-kerja"; import ProgramKemiskinan from "./program-kemiskinan"; import KategoriProduk from "./pasar-desa/kategori-produk"; import StrukturOrganisasi from "./struktur-organisasi"; +import GrafikUsiaKerjaYangMenganggur from "./usia-kerja-yang-menganggur"; +import GrafikMenganggurBerdasarkanPendidikan from "./usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan"; const Ekonomi = new Elysia({ prefix: "/api/ekonomi", @@ -14,5 +16,7 @@ const Ekonomi = new Elysia({ .use(LowonganKerja) .use(ProgramKemiskinan) .use(StrukturOrganisasi) +.use(GrafikUsiaKerjaYangMenganggur) +.use(GrafikMenganggurBerdasarkanPendidikan) export default Ekonomi \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/create.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/create.ts new file mode 100644 index 00000000..151e85d6 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/create.ts @@ -0,0 +1,36 @@ +import prisma from "@/lib/prisma"; +import { Prisma } from "@prisma/client"; +import { Context } from "elysia"; + +type FormCreate = Prisma.GrafikMenganggurBerdasarkanUsiaGetPayload<{ + select: { + usia18_25: true; + usia26_35: true; + usia36_45: true; + usia46_keatas: true; + } +}> +export default async function grafikMenganggurBerdasarkanUsiaCreate(context: Context) { + const body = context.body as FormCreate; + + const created = await prisma.grafikMenganggurBerdasarkanUsia.create({ + data: { + usia18_25: body.usia18_25, + usia26_35: body.usia26_35, + usia36_45: body.usia36_45, + usia46_keatas: body.usia46_keatas, + }, + select: { + id: true, + usia18_25: true, + usia26_35: true, + usia36_45: true, + usia46_keatas: true, + } + }); + return { + success: true, + message: "Success create grafik menganggur berdasarkan usia", + data: created, + }; +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/del.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/del.ts new file mode 100644 index 00000000..32507b61 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/del.ts @@ -0,0 +1,43 @@ +import { Context } from "elysia"; +import prisma from "@/lib/prisma"; + +export default async function grafikMenganggurBerdasarkanUsiaDelete(context: Context) { + const {id} = context.params as {id: string} + + try { + const existingData = await prisma.grafikMenganggurBerdasarkanUsia.findUnique({ + where: { + id: id, + } + }) + + if (!existingData) { + return { + success: false, + message: "Data tidak ditemukan", + data: null, + } + } + + await prisma.grafikMenganggurBerdasarkanUsia.delete({ + where: { + id: id + } + }) + + return { + success: true, + message: "Data berhasil dihapus", + data: { + id: id, + }, + } + } catch (error) { + console.error("Delete error:", error); + return { + success: false, + message: "Gagal menghapus data: " + (error instanceof Error ? error.message : 'Unknown error'), + data: null, + } + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/findMany.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/findMany.ts new file mode 100644 index 00000000..3365fc1b --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/findMany.ts @@ -0,0 +1,8 @@ +import prisma from "@/lib/prisma"; + +export default async function grafikMenganggurBerdasarkanUsiaFindMany() { + const res = await prisma.grafikMenganggurBerdasarkanUsia.findMany(); + return { + data: res + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/findUnique.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/findUnique.ts new file mode 100644 index 00000000..820f65ce --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/findUnique.ts @@ -0,0 +1,50 @@ +import prisma from "@/lib/prisma"; + +export default async function grafikMenganggurBerdasarkanUsiaFindUnique( + request: Request, +) { + const url = new URL(request.url); + const pathSegments = url.pathname.split('/'); + const id = pathSegments[pathSegments.length - 1]; + + if (!id) { + return Response.json({ + success: false, + message: "ID tidak boleh kosong", + }, { status: 400 }); + } + + try { + if (typeof id !== 'string') { + return Response.json({ + success: false, + message: "ID tidak valid", + }, { status: 400 }); + } + + const data = await prisma.grafikMenganggurBerdasarkanUsia.findUnique({ + where: { id }, + }); + + if (!data) { + return Response.json({ + success: false, + message: "Data tidak ditemukan", + data: null, + }, { status: 404 }); + } + + return Response.json({ + success: true, + message: "Data berhasil ditemukan", + data, + }, { status: 200 }); + } catch (error) { + console.error("Find unique error:", error); + return Response.json({ + success: false, + message: "Gagal menemukan data: " + (error instanceof Error ? error.message : 'Unknown error'), + data: null, + }, { status: 500 }); + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/index.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/index.ts new file mode 100644 index 00000000..2aceec20 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/index.ts @@ -0,0 +1,39 @@ +import Elysia, { t } from "elysia"; +import grafikMenganggurBerdasarkanUsiaFindMany from "./findMany"; +import grafikMenganggurBerdasarkanUsiaFindUnique from "./findUnique"; +import grafikMenganggurBerdasarkanUsiaUpdate from "./updt"; +import grafikMenganggurBerdasarkanUsiaCreate from "./create"; +import grafikMenganggurBerdasarkanUsiaDelete from "./del"; + +const GrafikUsiaKerjaYangMenganggur = new Elysia({prefix: "/grafikusiakerjayangmenganggur", tags: ["Ekonomi/Jumlah Penduduk Usia Kerja Yang Menganggur"]}) +.get("/find-many", grafikMenganggurBerdasarkanUsiaFindMany) +.get("/:id", async (context) => { + const response = await grafikMenganggurBerdasarkanUsiaFindUnique(new Request(context.request)) + return response + }) +.put("/:id", grafikMenganggurBerdasarkanUsiaUpdate, { + params: t.Object({ + id: t.String(), + }), + body: t.Object({ + usia18_25: t.String(), + usia26_35: t.String(), + usia36_45: t.String(), + usia46_keatas: t.String(), + }), +}) +.post("/create", grafikMenganggurBerdasarkanUsiaCreate, { + body: t.Object({ + usia18_25: t.String(), + usia26_35: t.String(), + usia36_45: t.String(), + usia46_keatas: t.String(), + }), +}) +.delete("/del/:id", grafikMenganggurBerdasarkanUsiaDelete, { + params: t.Object({ + id: t.String(), + }), +}); + +export default GrafikUsiaKerjaYangMenganggur; diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/create.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/create.ts new file mode 100644 index 00000000..d21f3eaa --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/create.ts @@ -0,0 +1,39 @@ +import prisma from "@/lib/prisma"; +import { Prisma } from "@prisma/client"; +import { Context } from "elysia"; + +type FormCreate = Prisma.GrafikMenganggurBerdasarkanPendidikanGetPayload<{ + select: { + SD: true; + SMP: true; + SMA: true; + D3: true; + S1: true; + } +}> +export default async function grafikMenganggurBerdasarkanPendidikanCreate(context: Context) { + const body = context.body as FormCreate; + + const created = await prisma.grafikMenganggurBerdasarkanPendidikan.create({ + data: { + SD: body.SD, + SMP: body.SMP, + SMA: body.SMA, + D3: body.D3, + S1: body.S1, + }, + select: { + id: true, + SD: true, + SMP: true, + SMA: true, + D3: true, + S1: true, + } + }); + return { + success: true, + message: "Success create grafik menganggur berdasarkan pendidikan", + data: created, + }; +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/del.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/del.ts new file mode 100644 index 00000000..7113c017 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/del.ts @@ -0,0 +1,43 @@ +import { Context } from "elysia"; +import prisma from "@/lib/prisma"; + +export default async function grafikMenganggurBerdasarkanPendidikanDelete(context: Context) { + const {id} = context.params as {id: string} + + try { + const existingData = await prisma.grafikMenganggurBerdasarkanPendidikan.findUnique({ + where: { + id: id, + } + }) + + if (!existingData) { + return { + success: false, + message: "Data tidak ditemukan", + data: null, + } + } + + await prisma.grafikMenganggurBerdasarkanPendidikan.delete({ + where: { + id: id + } + }) + + return { + success: true, + message: "Data berhasil dihapus", + data: { + id: id, + }, + } + } catch (error) { + console.error("Delete error:", error); + return { + success: false, + message: "Gagal menghapus data: " + (error instanceof Error ? error.message : 'Unknown error'), + data: null, + } + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/findMany.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/findMany.ts new file mode 100644 index 00000000..558a9011 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/findMany.ts @@ -0,0 +1,8 @@ +import prisma from "@/lib/prisma"; + +export default async function grafikMenganggurBerdasarkanPendidikanFindMany() { + const res = await prisma.grafikMenganggurBerdasarkanPendidikan.findMany(); + return { + data: res + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/findUnique.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/findUnique.ts new file mode 100644 index 00000000..cda69472 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/findUnique.ts @@ -0,0 +1,50 @@ +import prisma from "@/lib/prisma"; + +export default async function grafikMenganggurBerdasarkanPendidikanFindUnique( + request: Request, +) { + const url = new URL(request.url); + const pathSegments = url.pathname.split('/'); + const id = pathSegments[pathSegments.length - 1]; + + if (!id) { + return Response.json({ + success: false, + message: "ID tidak boleh kosong", + }, { status: 400 }); + } + + try { + if (typeof id !== 'string') { + return Response.json({ + success: false, + message: "ID tidak valid", + }, { status: 400 }); + } + + const data = await prisma.grafikMenganggurBerdasarkanPendidikan.findUnique({ + where: { id }, + }); + + if (!data) { + return Response.json({ + success: false, + message: "Data tidak ditemukan", + data: null, + }, { status: 404 }); + } + + return Response.json({ + success: true, + message: "Data berhasil ditemukan", + data, + }, { status: 200 }); + } catch (error) { + console.error("Find unique error:", error); + return Response.json({ + success: false, + message: "Gagal menemukan data: " + (error instanceof Error ? error.message : 'Unknown error'), + data: null, + }, { status: 500 }); + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/index.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/index.ts new file mode 100644 index 00000000..847c1d2a --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/index.ts @@ -0,0 +1,42 @@ +import Elysia, { t } from "elysia"; +import grafikMenganggurBerdasarkanPendidikanCreate from "./create"; +import grafikMenganggurBerdasarkanPendidikanDelete from "./del"; +import grafikMenganggurBerdasarkanPendidikanFindMany from "./findMany"; +import grafikMenganggurBerdasarkanPendidikanFindUnique from "./findUnique"; +import grafikMenganggurBerdasarkanPendidikanUpdate from "./updt"; + +const GrafikMenganggurBerdasarkanPendidikan = new Elysia({prefix: "grafikmenganggurberdasarkanpendidikan", tags: ["Ekonomi/Usia Kerja Yang Menganggur/Pengangguran Berdasarkan Pendidikan"]}) +.get("/find-many", grafikMenganggurBerdasarkanPendidikanFindMany) +.get("/:id", async (context) => { + const response = await grafikMenganggurBerdasarkanPendidikanFindUnique(new Request(context.request)) + return response + }) +.put("/:id", grafikMenganggurBerdasarkanPendidikanUpdate, { + params: t.Object({ + id: t.String(), + }), + body: t.Object({ + SD: t.String(), + SMP: t.String(), + SMA: t.String(), + D3: t.String(), + S1: t.String(), + }), +}) +.post("/create", grafikMenganggurBerdasarkanPendidikanCreate, { + body: t.Object({ + SD: t.String(), + SMP: t.String(), + SMA: t.String(), + D3: t.String(), + S1: t.String(), + }), +}) +.delete("/del/:id", grafikMenganggurBerdasarkanPendidikanDelete, { + params: t.Object({ + id: t.String(), + }), +}); + + +export default GrafikMenganggurBerdasarkanPendidikan \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/updt.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/updt.ts new file mode 100644 index 00000000..741b9189 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/pengangguran-berdasrkan-pendidikan/updt.ts @@ -0,0 +1,53 @@ +import prisma from "@/lib/prisma"; +import { Context } from "elysia"; + +export default async function grafikMenganggurBerdasarkanPendidikanUpdate(context: Context) { + const id = context.params?.id; + + if (!id) { + return { + success: false, + message: "Id tidak ditemukan", + } + } + + const {SD, SMP, SMA, D3, S1} = context.body as { + SD: string; + SMP: string; + SMA: string; + D3: string; + S1: string; + } + + const existing = await prisma.grafikMenganggurBerdasarkanPendidikan.findUnique({ + where: { + id: id, + }, + }) + + if (!existing) { + return { + success: false, + message: "Data tidak ditemukan", + } + } + + const updated = await prisma.grafikMenganggurBerdasarkanPendidikan.update({ + where: { + id: id, + }, + data: { + SD: SD, + SMP: SMP, + SMA: SMA, + D3: D3, + S1: S1, + }, + }) + + return { + success: true, + message: "Data berhasil diupdate", + data: updated, + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/updt.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/updt.ts new file mode 100644 index 00000000..d869b961 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/usia-kerja-yang-menganggur/updt.ts @@ -0,0 +1,51 @@ +import prisma from "@/lib/prisma"; +import { Context } from "elysia"; + +export default async function grafikMenganggurBerdasarkanUsiaUpdate(context: Context) { + const id = context.params?.id; + + if (!id) { + return { + success: false, + message: "Id tidak ditemukan", + } + } + + const {usia18_25, usia26_35, usia36_45, usia46_keatas} = context.body as { + usia18_25: string; + usia26_35: string; + usia36_45: string; + usia46_keatas: string; + } + + const existing = await prisma.grafikMenganggurBerdasarkanUsia.findUnique({ + where: { + id: id, + }, + }) + + if (!existing) { + return { + success: false, + message: "Data tidak ditemukan", + } + } + + const updated = await prisma.grafikMenganggurBerdasarkanUsia.update({ + where: { + id: id, + }, + data: { + usia18_25: usia18_25, + usia26_35: usia26_35, + usia36_45: usia36_45, + usia46_keatas: usia46_keatas, + }, + }) + + return { + success: true, + message: "Data berhasil diupdate", + data: updated, + } +} \ No newline at end of file