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