From 7b2b306849bf6fc6dc38f8e8e64b2d4e596572a5 Mon Sep 17 00:00:00 2001 From: nico Date: Thu, 10 Jul 2025 00:21:33 +0800 Subject: [PATCH] API & UI Menu Ekonomi, Submenu Jumlah Pengangguran --- .../ringkasan-data-pengangguran.json | 12 - .../sedang-mencari-kerja.json | 8 - .../migration.sql | 19 + prisma/schema.prisma | 27 -- prisma/seed.ts | 48 -- .../{jusulListTab.tsx => judulListTab.tsx} | 2 + .../_state/ekonomi/jumlah-pengangguran.ts | 417 +----------------- .../(dashboard)/desa/gallery/foto/page.tsx | 2 +- .../(dashboard)/desa/gallery/video/page.tsx | 2 +- .../pelayanan_surat_keterangan/page.tsx | 2 +- .../pelayanan_telunjuk_sakti_desa/page.tsx | 2 +- .../(dashboard)/desa/penghargaan/page.tsx | 2 +- .../page.tsx | 2 +- .../pengangguran_berdasarkan_usia/page.tsx | 2 +- .../[id]/edit/page.tsx | 0 .../[id]/page.tsx | 0 .../jumlah-pengangguran/_lib/layoutTabs.tsx | 67 --- .../create/page.tsx | 0 .../detail-data-pengangguran/page.tsx | 87 ---- .../ekonomi/jumlah-pengangguran/layout.tsx | 9 - .../ekonomi/jumlah-pengangguran/page.tsx | 148 +++++++ .../[id]/edit/page.tsx | 11 - .../ringkasan-data-pengangguran/[id]/page.tsx | 11 - .../create/page.tsx | 11 - .../ringkasan-data-pengangguran/page.tsx | 11 - .../sedang-mencari-kerja/[id]/edit/page.tsx | 11 - .../sedang-mencari-kerja/[id]/page.tsx | 11 - .../sedang-mencari-kerja/create/page.tsx | 11 - .../sedang-mencari-kerja/page.tsx | 11 - .../pegawai/page.tsx | 6 +- .../posisi-organisasi/page.tsx | 8 +- .../grafik_hasil_kepuasan/page.tsx | 2 +- .../page.tsx | 2 +- .../keterangan_bank_sampah_terdekat/page.tsx | 2 +- .../page.tsx | 2 +- .../page.tsx | 2 +- .../grafik_berdasarkan_responden/page.tsx | 2 +- .../grafik_berdasarkan_umur/page.tsx | 2 +- .../grafik_hasil_kepuasan_masyarakat/page.tsx | 2 +- src/app/admin/_com/list_PageAdmin.tsx | 2 +- .../detail-data-pengangguran/index.ts | 8 +- .../_lib/ekonomi/jumlah-pengangguran/index.ts | 5 +- .../ringkasan-data-pengangguran/create.ts | 61 --- .../ringkasan-data-pengangguran/del.ts | 38 -- .../ringkasan-data-pengangguran/findMany.ts | 10 - .../ringkasan-data-pengangguran/findUnique.ts | 45 -- .../ringkasan-data-pengangguran/index.ts | 50 --- .../ringkasan-data-pengangguran/updt.ts | 70 --- .../sedang-mencari-kerja/create.ts | 49 -- .../sedang-mencari-kerja/del.ts | 38 -- .../sedang-mencari-kerja/findMany.ts | 10 - .../sedang-mencari-kerja/findUnique.ts | 46 -- .../sedang-mencari-kerja/index.ts | 42 -- .../sedang-mencari-kerja/updt.ts | 49 -- .../jumlah-pengangguran-2024-2025/page.tsx | 22 +- 55 files changed, 205 insertions(+), 1316 deletions(-) delete mode 100644 prisma/data/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran.json delete mode 100644 prisma/data/ekonomi/jumlah-pengangguran/sedang-mencari-kerja.json create mode 100644 prisma/migrations/20250709153651_nico_9_jul_25_1/migration.sql rename src/app/admin/(dashboard)/_com/{jusulListTab.tsx => judulListTab.tsx} (99%) rename src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/{detail-data-pengangguran => }/[id]/edit/page.tsx (100%) rename src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/{detail-data-pengangguran => }/[id]/page.tsx (100%) delete mode 100644 src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/_lib/layoutTabs.tsx rename src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/{detail-data-pengangguran => }/create/page.tsx (100%) delete mode 100644 src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/detail-data-pengangguran/page.tsx delete mode 100644 src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/layout.tsx create mode 100644 src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/page.tsx delete mode 100644 src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/[id]/edit/page.tsx delete mode 100644 src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/[id]/page.tsx delete mode 100644 src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/create/page.tsx delete mode 100644 src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/page.tsx delete mode 100644 src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/[id]/edit/page.tsx delete mode 100644 src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/[id]/page.tsx delete mode 100644 src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/create/page.tsx delete mode 100644 src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/page.tsx delete mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/create.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/del.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/findMany.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/findUnique.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/index.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/updt.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/create.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/del.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/findMany.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/findUnique.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/index.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/updt.ts diff --git a/prisma/data/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran.json b/prisma/data/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran.json deleted file mode 100644 index 233dc473..00000000 --- a/prisma/data/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "year": 2025, - "totalUnemployment": 140, - "educatedUnemployment": 80, - "percentageEducatedOfTotal": 57.1, - "productiveAgePopulation": 125, - "percentageProductiveOfTotal": 89.3, - "percentageChangeFromPreviousYear": -12.5 - } - ] - \ No newline at end of file diff --git a/prisma/data/ekonomi/jumlah-pengangguran/sedang-mencari-kerja.json b/prisma/data/ekonomi/jumlah-pengangguran/sedang-mencari-kerja.json deleted file mode 100644 index 39fe4f8b..00000000 --- a/prisma/data/ekonomi/jumlah-pengangguran/sedang-mencari-kerja.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - { - "recordedDate": "2025-06-30", - "count": 95, - "percentageOfTotal": 67.9 - } - ] - \ No newline at end of file diff --git a/prisma/migrations/20250709153651_nico_9_jul_25_1/migration.sql b/prisma/migrations/20250709153651_nico_9_jul_25_1/migration.sql new file mode 100644 index 00000000..0db03642 --- /dev/null +++ b/prisma/migrations/20250709153651_nico_9_jul_25_1/migration.sql @@ -0,0 +1,19 @@ +-- CreateTable +CREATE TABLE "DetailDataPengangguran" ( + "id" UUID NOT NULL, + "month" VARCHAR(20) NOT NULL, + "year" INTEGER NOT NULL, + "totalUnemployment" INTEGER NOT NULL, + "educatedUnemployment" INTEGER NOT NULL, + "uneducatedUnemployment" INTEGER NOT NULL, + "percentageChange" DOUBLE PRECISION, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "deletedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "isActive" BOOLEAN NOT NULL DEFAULT true, + + CONSTRAINT "DetailDataPengangguran_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "DetailDataPengangguran_month_year_key" ON "DetailDataPengangguran"("month", "year"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 413728e6..12ba7b7f 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1279,30 +1279,3 @@ model DetailDataPengangguran { @@unique([month, year]) } - -model RingkasanDataPengangguran { - id String @id @default(uuid()) @db.Uuid - year Int @unique - totalUnemployment Int - educatedUnemployment Int - percentageEducatedOfTotal Float? - productiveAgePopulation Int? - percentageProductiveOfTotal Float? - percentageChangeFromPreviousYear Float? - - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - deletedAt DateTime @default(now()) - isActive Boolean @default(true) -} - -model SedangMencariKerja { - id String @id @default(uuid()) @db.Uuid - count Int - percentageOfTotal Float? - recordedDate DateTime @unique @db.Date - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - deletedAt DateTime @default(now()) - isActive Boolean @default(true) -} diff --git a/prisma/seed.ts b/prisma/seed.ts index df363dd4..7d0dd7f9 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -22,8 +22,6 @@ import hubunganOrganisasi from "./data/ekonomi/struktur-organisasi/hubungan-orga import posisiOrganisasi from "./data/ekonomi/struktur-organisasi/posisi-organisasi.json"; import pegawai from "./data/ekonomi/struktur-organisasi/pegawai.json"; import detailDataPengangguran from './data/ekonomi/jumlah-pengangguran/detail-data-pengangguran.json'; -import ringkasanDataPengangguran from './data/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran.json'; -import sedangMencariKerja from './data/ekonomi/jumlah-pengangguran/sedang-mencari-kerja.json'; (async () => { for (const l of layanan) { @@ -457,52 +455,6 @@ import sedangMencariKerja from './data/ekonomi/jumlah-pengangguran/sedang-mencar }); } console.log("📊 detailDataPengangguran success ..."); - - // RingkasanDataPengangguran - for (const r of ringkasanDataPengangguran) { - await prisma.ringkasanDataPengangguran.upsert({ - where: { - year: r.year, - }, - update: { - totalUnemployment: r.totalUnemployment, - educatedUnemployment: r.educatedUnemployment, - percentageEducatedOfTotal: r.percentageEducatedOfTotal, - productiveAgePopulation: r.productiveAgePopulation, - percentageProductiveOfTotal: r.percentageProductiveOfTotal, - percentageChangeFromPreviousYear: r.percentageChangeFromPreviousYear, - }, - create: { - year: r.year, - totalUnemployment: r.totalUnemployment, - educatedUnemployment: r.educatedUnemployment, - percentageEducatedOfTotal: r.percentageEducatedOfTotal, - productiveAgePopulation: r.productiveAgePopulation, - percentageProductiveOfTotal: r.percentageProductiveOfTotal, - percentageChangeFromPreviousYear: r.percentageChangeFromPreviousYear, - }, - }); - } - console.log("📈 ringkasanDataPengangguran success ..."); - - // SedangMencariKerja - for (const s of sedangMencariKerja) { - await prisma.sedangMencariKerja.upsert({ - where: { - recordedDate: new Date(s.recordedDate), - }, - update: { - count: s.count, - percentageOfTotal: s.percentageOfTotal, - }, - create: { - recordedDate: new Date(s.recordedDate), - count: s.count, - percentageOfTotal: s.percentageOfTotal, - }, - }); - } - console.log("💼 sedangMencariKerja success ..."); })() .then(() => prisma.$disconnect()) .catch((e) => { diff --git a/src/app/admin/(dashboard)/_com/jusulListTab.tsx b/src/app/admin/(dashboard)/_com/judulListTab.tsx similarity index 99% rename from src/app/admin/(dashboard)/_com/jusulListTab.tsx rename to src/app/admin/(dashboard)/_com/judulListTab.tsx index 82368864..21037671 100644 --- a/src/app/admin/(dashboard)/_com/jusulListTab.tsx +++ b/src/app/admin/(dashboard)/_com/judulListTab.tsx @@ -15,6 +15,8 @@ type JudulListTabProps = { } + + const JudulListTab = ({ title = "", href = "#", diff --git a/src/app/admin/(dashboard)/_state/ekonomi/jumlah-pengangguran.ts b/src/app/admin/(dashboard)/_state/ekonomi/jumlah-pengangguran.ts index 33174920..de8d187b 100644 --- a/src/app/admin/(dashboard)/_state/ekonomi/jumlah-pengangguran.ts +++ b/src/app/admin/(dashboard)/_state/ekonomi/jumlah-pengangguran.ts @@ -53,7 +53,7 @@ const jumlahPengangguran = proxy({ console.error("Gagal ambil data bulan/tahun:", err); } finally { jumlahPengangguran.findByMonthYear.loading = false; - } + } }, }, create: { @@ -236,423 +236,8 @@ const jumlahPengangguran = proxy({ }, }); -const templateRingkasanData = z.object({ - year: z.number().min(1, "Tahun harus diisi"), - totalUnemployment: z.number().min(1, "Total pengangguran harus diisi"), - educatedUnemployment: z - .number() - .min(1, "Pengangguran pendidikan harus diisi"), - percentageEducatedOfTotal: z - .number() - .min(1, "Persentase pendidikan harus diisi"), - productiveAgePopulation: z.number().min(1, "Populasi produktif harus diisi"), - percentageProductiveOfTotal: z - .number() - .min(1, "Persentase produktif harus diisi"), - percentageChangeFromPreviousYear: z - .number() - .min(1, "Persentase perubahan harus diisi"), -}); - -type RingkasanData = { - year: number; - totalUnemployment: number; - educatedUnemployment: number; - percentageEducatedOfTotal: number; - productiveAgePopulation: number; - percentageProductiveOfTotal: number; - percentageChangeFromPreviousYear: number; -}; - -const ringkasanDataForm: RingkasanData = { - year: 0, - totalUnemployment: 0, - educatedUnemployment: 0, - percentageEducatedOfTotal: 0, - productiveAgePopulation: 0, - percentageProductiveOfTotal: 0, - percentageChangeFromPreviousYear: 0, -}; - -const ringkasanData = proxy({ - create: { - form: ringkasanDataForm, - loading: false, - async create() { - const cek = templateRingkasanData.safeParse(ringkasanData.create.form); - if (!cek.success) { - const err = `[${cek.error.issues - .map((v) => `${v.path.join(".")}`) - .join("\n")}] required`; - toast.error(err); - return null; - } - try { - ringkasanData.create.loading = true; - const res = - await ApiFetch.api.ekonomi.jumlahpengangguran.ringkasandatapengangguran[ - "create" - ].post(ringkasanData.create.form); - - if (res.status === 200) { - const id = res.data?.data?.id; - if (id) { - toast.success("Success create"); - ringkasanData.create.form = { ...ringkasanDataForm }; - ringkasanData.findMany.load(); - return id; - } - } - toast.error("failed create"); - return null; - } catch (error) { - console.log((error as Error).message); - return null; - } finally { - ringkasanData.create.loading = false; - } - }, - }, - findMany: { - data: null as - | Prisma.RingkasanDataPengangguranGetPayload<{ - omit: { isActive: true }; - }>[] - | null, - async load() { - const res = - await ApiFetch.api.ekonomi.jumlahpengangguran.ringkasandatapengangguran[ - "find-many" - ].get(); - if (res.status === 200) { - ringkasanData.findMany.data = res.data?.data ?? []; - } - }, - }, - findUnique: { - data: null as Prisma.RingkasanDataPengangguranGetPayload<{ - omit: { isActive: true }; - }> | null, - async load(id: string) { - try { - const res = await fetch( - `/api/ekonomi/jumlahpengangguran/ringkasandatapengangguran/${id}` - ); - if (res.ok) { - const data = await res.json(); - ringkasanData.findUnique.data = data.data ?? null; - } else { - console.error("Failed to fetch ringkasanData:", res.statusText); - ringkasanData.findUnique.data = null; - } - } catch (error) { - console.error("Error fetching ringkasanData:", error); - ringkasanData.findUnique.data = null; - } - }, - }, - update: { - id: "", - form: { ...ringkasanDataForm }, - loading: false, - async submit() { - const id = this.id; - if (!id) { - toast.warn("ID tidak valid"); - return null; - } - - const formData = { - year: this.form.year, - totalUnemployment: this.form.totalUnemployment, - educatedUnemployment: this.form.educatedUnemployment, - percentageEducatedOfTotal: this.form.percentageEducatedOfTotal, - productiveAgePopulation: this.form.productiveAgePopulation, - percentageProductiveOfTotal: this.form.percentageProductiveOfTotal, - percentageChangeFromPreviousYear: - this.form.percentageChangeFromPreviousYear, - }; - - const cek = templateJumlahPengngguran.safeParse(formData); - if (!cek.success) { - const err = `[${cek.error.issues - .map((v) => `${v.path.join(".")}`) - .join("\n")}] required`; - toast.error(err); - return null; - } - - try { - this.loading = true; - const res = await fetch( - `/api/ekonomi/jumlahpengangguran/ringkasandatapengangguran/${id}`, - { - method: "PUT", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(formData), - } - ); - - const result = await res.json(); - - if (!res.ok || !result?.success) { - throw new Error(result?.message || "Gagal update data"); - } - - toast.success("Berhasil update data!"); - await ringkasanData.findMany.load(); - return result.data; - } catch (error) { - console.error("Update error:", error); - toast.error("Gagal update data ringkasan data pengangguran"); - throw error; - } finally { - this.loading = false; - } - }, - }, - delete: { - loading: false, - async byId(id: string) { - if (!id) return toast.warn("ID tidak valid"); - - try { - ringkasanData.delete.loading = true; - - const response = await fetch( - `/api/ekonomi/jumlahpengangguran/ringkasandatapengangguran/del/${id}`, - { - method: "DELETE", - headers: { - "Content-Type": "application/json", - }, - } - ); - - const result = await response.json(); - - if (response.ok && result?.success) { - toast.success( - result.message || "Ringkasan data pengangguran berhasil dihapus" - ); - await ringkasanData.findMany.load(); - } else { - toast.error( - result?.message || "Gagal menghapus ringkasan data pengangguran" - ); - } - } catch (error) { - console.error("Gagal delete:", error); - toast.error( - "Terjadi kesalahan saat menghapus ringkasan data pengangguran" - ); - } finally { - ringkasanData.delete.loading = false; - } - }, - }, -}); - -const templateSedangMencariKerja = z.object({ - count: z.number().min(1, "Jumlah harus diisi"), - percentageOfTotal: z.number().min(1, "Persentase harus diisi"), - recordedDate: z.string().min(1, "Tanggal harus diisi"), -}); - -type SedangMencariKerja = { - count: number; - percentageOfTotal: number; - recordedDate: string; -}; - -const sedangMencariKerjaForm: SedangMencariKerja = { - count: 0, - percentageOfTotal: 0, - recordedDate: "", -}; - -const sedangMencariKerja = proxy({ - create: { - form: sedangMencariKerjaForm, - loading: false, - async create() { - const cek = templateSedangMencariKerja.safeParse( - sedangMencariKerja.create.form - ); - if (!cek.success) { - const err = `[${cek.error.issues - .map((v) => `${v.path.join(".")}`) - .join("\n")}] required`; - toast.error(err); - return null; - } - try { - sedangMencariKerja.create.loading = true; - const res = - await ApiFetch.api.ekonomi.jumlahpengangguran.sedangmencarikerja[ - "create" - ].post(sedangMencariKerja.create.form); - - if (res.status === 200) { - const id = res.data?.data?.id; - if (id) { - toast.success("Success create"); - sedangMencariKerja.create.form = { ...sedangMencariKerjaForm }; - sedangMencariKerja.findMany.load(); - return id; - } - } - toast.error("failed create"); - return null; - } catch (error) { - console.log((error as Error).message); - return null; - } finally { - sedangMencariKerja.create.loading = false; - } - }, - }, - findMany: { - data: null as - | Prisma.SedangMencariKerjaGetPayload<{ - omit: { isActive: true }; - }>[] - | null, - async load() { - const res = - await ApiFetch.api.ekonomi.jumlahpengangguran.sedangmencarikerja[ - "find-many" - ].get(); - if (res.status === 200) { - sedangMencariKerja.findMany.data = res.data?.data ?? []; - } - }, - }, - findUnique: { - data: null as Prisma.SedangMencariKerjaGetPayload<{ - omit: { isActive: true }; - }> | null, - async load(id: string) { - try { - const res = await fetch( - `/api/ekonomi/jumlahpengangguran/sedangmencarikerja/${id}` - ); - if (res.ok) { - const data = await res.json(); - sedangMencariKerja.findUnique.data = data.data ?? null; - } else { - console.error("Failed to fetch sedangMencariKerja:", res.statusText); - sedangMencariKerja.findUnique.data = null; - } - } catch (error) { - console.error("Error fetching sedangMencariKerja:", error); - sedangMencariKerja.findUnique.data = null; - } - }, - }, - update: { - id: "", - form: { ...sedangMencariKerjaForm }, - loading: false, - async submit() { - const id = this.id; - if (!id) { - toast.warn("ID tidak valid"); - return null; - } - - const formData = { - count: this.form.count, - percentageOfTotal: this.form.percentageOfTotal, - recordedDate: this.form.recordedDate, - }; - - const cek = templateSedangMencariKerja.safeParse(formData); - if (!cek.success) { - const err = `[${cek.error.issues - .map((v) => `${v.path.join(".")}`) - .join("\n")}] required`; - toast.error(err); - return null; - } - - try { - this.loading = true; - const res = await fetch( - `/api/ekonomi/jumlahpengangguran/sedangmencarikerja/${id}`, - { - method: "PUT", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(formData), - } - ); - - const result = await res.json(); - - if (!res.ok || !result?.success) { - throw new Error(result?.message || "Gagal update data"); - } - - toast.success("Berhasil update data!"); - await sedangMencariKerja.findMany.load(); - return result.data; - } catch (error) { - console.error("Update error:", error); - toast.error("Gagal update data sedang mencari kerja"); - throw error; - } finally { - this.loading = false; - } - }, - }, - delete: { - loading: false, - async byId(id: string) { - if (!id) return toast.warn("ID tidak valid"); - - try { - sedangMencariKerja.delete.loading = true; - - const response = await fetch( - `/api/ekonomi/jumlahpengangguran/sedangmencarikerja/del/${id}`, - { - method: "DELETE", - headers: { - "Content-Type": "application/json", - }, - } - ); - - const result = await response.json(); - - if (response.ok && result?.success) { - toast.success( - result.message || "Sedang mencari kerja berhasil dihapus" - ); - await sedangMencariKerja.findMany.load(); - } else { - toast.error( - result?.message || "Gagal menghapus sedang mencari kerja" - ); - } - } catch (error) { - console.error("Gagal delete:", error); - toast.error("Terjadi kesalahan saat menghapus sedang mencari kerja"); - } finally { - sedangMencariKerja.delete.loading = false; - } - }, - }, -}); - const jumlahPengangguranState = proxy({ jumlahPengangguran, - ringkasanData, - sedangMencariKerja, }); export default jumlahPengangguranState; diff --git a/src/app/admin/(dashboard)/desa/gallery/foto/page.tsx b/src/app/admin/(dashboard)/desa/gallery/foto/page.tsx index bbb60f0b..1dfcbea1 100644 --- a/src/app/admin/(dashboard)/desa/gallery/foto/page.tsx +++ b/src/app/admin/(dashboard)/desa/gallery/foto/page.tsx @@ -3,7 +3,7 @@ import colors from '@/con/colors'; import { Box, Button, Paper, Skeleton, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core'; import { IconDeviceImac, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; -import JudulListTab from '../../../_com/jusulListTab'; +import JudulListTab from '../../../_com/judulListTab'; import { useProxy } from 'valtio/utils'; import stateGallery from '../../../_state/desa/gallery'; import { useShallowEffect } from '@mantine/hooks'; diff --git a/src/app/admin/(dashboard)/desa/gallery/video/page.tsx b/src/app/admin/(dashboard)/desa/gallery/video/page.tsx index b941699d..c0a3edf2 100644 --- a/src/app/admin/(dashboard)/desa/gallery/video/page.tsx +++ b/src/app/admin/(dashboard)/desa/gallery/video/page.tsx @@ -3,7 +3,7 @@ import colors from '@/con/colors'; import { Box, Button, Paper, Skeleton, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core'; import { IconDeviceImac, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; -import JudulListTab from '../../../_com/jusulListTab'; +import JudulListTab from '../../../_com/judulListTab'; import { useProxy } from 'valtio/utils'; import stateGallery from '../../../_state/desa/gallery'; import { useShallowEffect } from '@mantine/hooks'; diff --git a/src/app/admin/(dashboard)/desa/layanan/pelayanan_surat_keterangan/page.tsx b/src/app/admin/(dashboard)/desa/layanan/pelayanan_surat_keterangan/page.tsx index 6b066706..0ed28c86 100644 --- a/src/app/admin/(dashboard)/desa/layanan/pelayanan_surat_keterangan/page.tsx +++ b/src/app/admin/(dashboard)/desa/layanan/pelayanan_surat_keterangan/page.tsx @@ -1,5 +1,5 @@ 'use client' -import JudulListTab from '@/app/admin/(dashboard)/_com/jusulListTab'; +import JudulListTab from '@/app/admin/(dashboard)/_com/judulListTab'; import colors from '@/con/colors'; import { Box, Button, Image, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core'; import { IconDeviceImac, IconSearch } from '@tabler/icons-react'; diff --git a/src/app/admin/(dashboard)/desa/layanan/pelayanan_telunjuk_sakti_desa/page.tsx b/src/app/admin/(dashboard)/desa/layanan/pelayanan_telunjuk_sakti_desa/page.tsx index acbdba14..48944d9a 100644 --- a/src/app/admin/(dashboard)/desa/layanan/pelayanan_telunjuk_sakti_desa/page.tsx +++ b/src/app/admin/(dashboard)/desa/layanan/pelayanan_telunjuk_sakti_desa/page.tsx @@ -1,5 +1,5 @@ 'use client' -import JudulListTab from '@/app/admin/(dashboard)/_com/jusulListTab'; +import JudulListTab from '@/app/admin/(dashboard)/_com/judulListTab'; import colors from '@/con/colors'; import { Box, Button, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core'; import { IconDeviceImac, IconSearch } from '@tabler/icons-react'; diff --git a/src/app/admin/(dashboard)/desa/penghargaan/page.tsx b/src/app/admin/(dashboard)/desa/penghargaan/page.tsx index bb4295ca..1e3bc58e 100644 --- a/src/app/admin/(dashboard)/desa/penghargaan/page.tsx +++ b/src/app/admin/(dashboard)/desa/penghargaan/page.tsx @@ -6,7 +6,7 @@ import { useShallowEffect } from '@mantine/hooks'; import { IconDeviceImac, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useProxy } from 'valtio/utils'; -import JudulListTab from '../../_com/jusulListTab'; +import JudulListTab from '../../_com/judulListTab'; import { useState } from 'react'; import HeaderSearch from '../../_com/header'; 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 be7112be..b9a16e85 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 @@ -8,7 +8,7 @@ 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 JudulListTab from '../../../_com/judulListTab'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import grafikNganggur from '../../../_state/ekonomi/usia-kerja-nganggur'; 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 a829d90f..736f9d85 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 @@ -8,7 +8,7 @@ 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 JudulListTab from '../../../_com/judulListTab'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import grafikNganggur from '../../../_state/ekonomi/usia-kerja-nganggur'; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/detail-data-pengangguran/[id]/edit/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/[id]/edit/page.tsx similarity index 100% rename from src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/detail-data-pengangguran/[id]/edit/page.tsx rename to src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/[id]/edit/page.tsx diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/detail-data-pengangguran/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/[id]/page.tsx similarity index 100% rename from src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/detail-data-pengangguran/[id]/page.tsx rename to src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/[id]/page.tsx diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/_lib/layoutTabs.tsx deleted file mode 100644 index 8669cb22..00000000 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/_lib/layoutTabs.tsx +++ /dev/null @@ -1,67 +0,0 @@ -/* 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: "Detail Data Pengangguran", - value: "detaildatapengangguran", - href: "/admin/ekonomi/jumlah-pengangguran/detail-data-pengangguran" - }, - { - label: "Ringkasan Data Pengangguran", - value: "ringkasandatapengangguran", - href: "/admin/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran" - }, - { - label: "Sedang Mencari Kerja", - value: "sedangmencarikerja", - href: "/admin/ekonomi/jumlah-pengangguran/sedang-mencari-kerja" - } - ]; - 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-pengangguran/detail-data-pengangguran/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/create/page.tsx similarity index 100% rename from src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/detail-data-pengangguran/create/page.tsx rename to src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/create/page.tsx diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/detail-data-pengangguran/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/detail-data-pengangguran/page.tsx deleted file mode 100644 index a8648830..00000000 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/detail-data-pengangguran/page.tsx +++ /dev/null @@ -1,87 +0,0 @@ -'use client' -import colors from '@/con/colors'; -import { Box, Button, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Title } from '@mantine/core'; -import { useShallowEffect } from '@mantine/hooks'; -import { IconDeviceImac, IconSearch } from '@tabler/icons-react'; -import { useRouter } from 'next/navigation'; -import { useState } from 'react'; -import { useProxy } from 'valtio/utils'; -import JudulListTab from '../../../_com/jusulListTab'; -import jumlahPengangguranState from '../../../_state/ekonomi/jumlah-pengangguran'; - -function DetailDataPengangguran() { - return ( - - - Detail Data Pengangguran - - - - ); -} - -function ListDetailDataPengangguran() { - const stateDetail = useProxy(jumlahPengangguranState.jumlahPengangguran) - const router = useRouter(); - const [search, setSearch] = useState("") - - useShallowEffect(() => { - stateDetail.findMany.load() - }, []) - - const filteredData = (stateDetail.findMany.data || []).filter(item => { - const keyword = search.toLowerCase(); - return ( - item.month.toLowerCase().includes(keyword) || - item.year.toString().toLowerCase().includes(keyword) - ); - }); - - if (!stateDetail.findMany.data) { - return ( - - - - ) - } - return ( - - - setSearch(e.currentTarget.value)} - placeholder='pencarian' - searchIcon={} - /> - - - - Bulan - Terdidik - Tidak Terdidik - Detail - - - - {filteredData.map((item) => ( - - {item.month} - {item.educatedUnemployment} - {item.uneducatedUnemployment} - - - - - ))} - -
-
-
- ); -} - -export default DetailDataPengangguran; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/layout.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/layout.tsx deleted file mode 100644 index 072b9266..00000000 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/layout.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import LayoutTabs from "./_lib/layoutTabs"; - -export default function Layout({ children }: { children: React.ReactNode }) { - return ( - - {children} - - ); -} diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/page.tsx new file mode 100644 index 00000000..7da97e31 --- /dev/null +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/page.tsx @@ -0,0 +1,148 @@ +'use client' +import colors from '@/con/colors'; +import { Box, Button, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import { IconDeviceImac, IconSearch } from '@tabler/icons-react'; +import { useRouter } from 'next/navigation'; +import { useEffect, useState } from 'react'; +import { useProxy } from 'valtio/utils'; + +import { BarChart } from '@mantine/charts'; +import jumlahPengangguranState from '../../_state/ekonomi/jumlah-pengangguran'; +import JudulListTab from '../../_com/judulListTab'; + +function DetailDataPengangguran() { + return ( + + + Detail Data Pengangguran + + + + ); +} + +function ListDetailDataPengangguran() { + + type DetailDataPengangguran = { + id: string; + month: string; + year: number; + educatedUnemployment: number; + uneducatedUnemployment: number; + percentageChange: number; + totalUnemployment: number; + } + const [chartData, setChartData] = useState([]); + const [mounted, setMounted] = useState(false); // untuk memastikan DOM sudah ready + const stateDetail = useProxy(jumlahPengangguranState.jumlahPengangguran) + const router = useRouter(); + const [search, setSearch] = useState("") + + useShallowEffect(() => { + setMounted(true) + stateDetail.findMany.load() + }, []) + + useEffect(() => { + setMounted(true); + if (stateDetail.findMany.data) { + setChartData(stateDetail.findMany.data.map((item) => ({ + id: item.id, + month: item.month, + year: item.year, + educatedUnemployment: Number(item.educatedUnemployment), + uneducatedUnemployment: Number(item.uneducatedUnemployment), + percentageChange: Number(item.percentageChange), + totalUnemployment: Number(item.totalUnemployment), + }))); + } + }, [stateDetail.findMany.data]); + + const filteredData = (stateDetail.findMany.data || []).filter(item => { + const keyword = search.toLowerCase(); + return ( + item.month.toLowerCase().includes(keyword) || + item.year.toString().toLowerCase().includes(keyword) + ); + }); + + if (!stateDetail.findMany.data) { + return ( + + + + ) + } + return ( + + + + setSearch(e.currentTarget.value)} + placeholder='pencarian' + searchIcon={} + /> + + + + Bulan + Terdidik + Tidak Terdidik + Detail + + + + {filteredData.map((item) => ( + + {item.month} + {item.educatedUnemployment} + {item.uneducatedUnemployment} + + + + + ))} + +
+
+ + {/* Chart */} + {!mounted && !chartData ? ( + + + Data Kelahiran & Kematian + Belum ada data untuk ditampilkan dalam grafik + + + ) : ( + + + Data Kelahiran & Kematian + {mounted && chartData.length > 0 && ( + + + + )} + + + )} +
+
+ ); +} + +export default DetailDataPengangguran; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/[id]/edit/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/[id]/edit/page.tsx deleted file mode 100644 index 69da2f21..00000000 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/[id]/edit/page.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; - -function Page() { - return ( -
- Page -
- ); -} - -export default Page; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/[id]/page.tsx deleted file mode 100644 index 69da2f21..00000000 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/[id]/page.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; - -function Page() { - return ( -
- Page -
- ); -} - -export default Page; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/create/page.tsx deleted file mode 100644 index 69da2f21..00000000 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/create/page.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; - -function Page() { - return ( -
- Page -
- ); -} - -export default Page; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/page.tsx deleted file mode 100644 index 69da2f21..00000000 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/page.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; - -function Page() { - return ( -
- Page -
- ); -} - -export default Page; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/[id]/edit/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/[id]/edit/page.tsx deleted file mode 100644 index 69da2f21..00000000 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/[id]/edit/page.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; - -function Page() { - return ( -
- Page -
- ); -} - -export default Page; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/[id]/page.tsx deleted file mode 100644 index 69da2f21..00000000 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/[id]/page.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; - -function Page() { - return ( -
- Page -
- ); -} - -export default Page; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/create/page.tsx deleted file mode 100644 index 69da2f21..00000000 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/create/page.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; - -function Page() { - return ( -
- Page -
- ); -} - -export default Page; diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/page.tsx deleted file mode 100644 index 69da2f21..00000000 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/page.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; - -function Page() { - return ( -
- Page -
- ); -} - -export default Page; diff --git a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/page.tsx b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/page.tsx index 0e526782..fe7f3864 100644 --- a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/page.tsx @@ -1,14 +1,14 @@ +/* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; import { Badge, Box, Button, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr } from '@mantine/core'; -import { useShallowEffect } from '@mantine/hooks'; import { IconDeviceImacCog, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; +import { useEffect, useState } from 'react'; import { useProxy } from 'valtio/utils'; import HeaderSearch from '../../../_com/header'; import JudulList from '../../../_com/judulList'; import strukturorganisasiState from '../../../_state/ekonomi/struktur-organisasi/struktur-organisasi'; -import { useState } from 'react'; function Pegawai() { const [search, setSearch] = useState(""); @@ -30,7 +30,7 @@ function ListPegawai({ search }: { search: string }) { const stateOrganisasi = useProxy(strukturorganisasiState.pegawai); const router = useRouter(); - useShallowEffect(() => { + useEffect(() => { const loadData = async () => { try { // Clear existing data to ensure we see the loading state diff --git a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/page.tsx b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/page.tsx index 29e5561a..6d22a51f 100644 --- a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/page.tsx @@ -1,15 +1,15 @@ +/* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; import { Box, Button, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core'; import { IconEdit, IconSearch, IconTrash } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; +import { useEffect, useState } from 'react'; +import { useProxy } from 'valtio/utils'; import HeaderSearch from '../../../_com/header'; import JudulList from '../../../_com/judulList'; -import { useProxy } from 'valtio/utils'; -import { useShallowEffect } from '@mantine/hooks'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import strukturorganisasiState from '../../../_state/ekonomi/struktur-organisasi/struktur-organisasi'; -import { useState } from 'react'; function PosisiOrganisasi() { const [search, setSearch] = useState(""); @@ -33,7 +33,7 @@ function ListPosisiOrganisasi({ search }: { search: string }) { const [modalHapus, setModalHapus] = useState(false) const [selectedId, setSelectedId] = useState(null) - useShallowEffect(() => { + useEffect(() => { stateOrganisasi.findMany.load() }, []) diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/page.tsx index a83c52fb..df46a08c 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/page.tsx @@ -7,7 +7,7 @@ import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; import { Bar, BarChart, Legend, Tooltip, XAxis, YAxis } from 'recharts'; import { useProxy } from 'valtio/utils'; -import JudulListTab from '../../../_com/jusulListTab'; +import JudulListTab from '../../../_com/judulListTab'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import grafikkepuasan from '../../../_state/kesehatan/data_kesehatan_warga/grafikKepuasan'; import HeaderSearch from '../../../_com/header'; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/page.tsx index 8b8f8c5a..d2beb0d9 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/page.tsx @@ -8,7 +8,7 @@ import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; import { Bar, BarChart, Legend, Tooltip, XAxis, YAxis } from 'recharts'; import { useProxy } from 'valtio/utils'; -import JudulListTab from '../../../_com/jusulListTab'; +import JudulListTab from '../../../_com/judulListTab'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import HeaderSearch from '../../../_com/header'; diff --git a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/keterangan_bank_sampah_terdekat/page.tsx b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/keterangan_bank_sampah_terdekat/page.tsx index af496ce6..60f9150e 100644 --- a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/keterangan_bank_sampah_terdekat/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/keterangan_bank_sampah_terdekat/page.tsx @@ -3,7 +3,7 @@ import colors from '@/con/colors'; import { Box, Button, Image, Paper, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; import { IconDeviceImacCog, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; -import JudulListTab from '../../../_com/jusulListTab'; +import JudulListTab from '../../../_com/judulListTab'; function KeteranganBankSampahTerdekat() { const router = useRouter(); diff --git a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/list_pengelolaan_sampah_bank_sampah/page.tsx b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/list_pengelolaan_sampah_bank_sampah/page.tsx index 923625eb..632e60ca 100644 --- a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/list_pengelolaan_sampah_bank_sampah/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/list_pengelolaan_sampah_bank_sampah/page.tsx @@ -3,7 +3,7 @@ import colors from '@/con/colors'; import { Box, Button, Image, Paper, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; import { IconDeviceImacCog, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; -import JudulListTab from '../../../_com/jusulListTab'; +import JudulListTab from '../../../_com/judulListTab'; function ListPengelolaanSampahBankSampah() { const router = useRouter(); diff --git a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_jenis_kelamin_responden/page.tsx b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_jenis_kelamin_responden/page.tsx index f474f7d1..79b22b48 100644 --- a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_jenis_kelamin_responden/page.tsx +++ b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_jenis_kelamin_responden/page.tsx @@ -9,7 +9,7 @@ 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 JudulListTab from '../../../_com/judulListTab'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import HeaderSearch from '../../../_com/header'; diff --git a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_responden/page.tsx b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_responden/page.tsx index 414de2c8..02895b71 100644 --- a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_responden/page.tsx +++ b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_responden/page.tsx @@ -8,7 +8,7 @@ import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; import { Cell, Pie, PieChart } from 'recharts'; import { useSnapshot } from 'valtio'; -import JudulListTab from '../../../_com/jusulListTab'; +import JudulListTab from '../../../_com/judulListTab'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import grafikBerdasarkanResponden from '../../../_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanResponden'; import HeaderSearch from '../../../_com/header'; diff --git a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_umur/page.tsx b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_umur/page.tsx index 0301bccb..4b8f22af 100644 --- a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_umur/page.tsx +++ b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_umur/page.tsx @@ -9,7 +9,7 @@ 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 JudulListTab from '../../../_com/judulListTab'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import HeaderSearch from '../../../_com/header'; diff --git a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_hasil_kepuasan_masyarakat/page.tsx b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_hasil_kepuasan_masyarakat/page.tsx index 954ef3f2..6515dcbb 100644 --- a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_hasil_kepuasan_masyarakat/page.tsx +++ b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_hasil_kepuasan_masyarakat/page.tsx @@ -1,5 +1,5 @@ 'use client' -import JudulListTab from '@/app/admin/(dashboard)/_com/jusulListTab'; +import JudulListTab from '@/app/admin/(dashboard)/_com/judulListTab'; import colors from '@/con/colors'; import { Box, Button, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; import { useMediaQuery, useShallowEffect } from '@mantine/hooks'; diff --git a/src/app/admin/_com/list_PageAdmin.tsx b/src/app/admin/_com/list_PageAdmin.tsx index 543e7453..45bd5ee7 100644 --- a/src/app/admin/_com/list_PageAdmin.tsx +++ b/src/app/admin/_com/list_PageAdmin.tsx @@ -235,7 +235,7 @@ export const navBar = [ { id: "Ekonomi_5", name: "Jumlah Pengangguran", - path: "/admin/ekonomi/jumlah-pengangguran/detail-data-pengangguran" + path: "/admin/ekonomi/jumlah-pengangguran" }, { id: "Ekonomi_6", diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/detail-data-pengangguran/index.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/detail-data-pengangguran/index.ts index ae727b29..35674412 100644 --- a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/detail-data-pengangguran/index.ts +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/detail-data-pengangguran/index.ts @@ -1,10 +1,10 @@ import Elysia, { t } from "elysia"; -import detailDataPengangguranFindMany from "./findMany"; import detailDataPengangguranCreate from "./create"; -import detailDataPengangguranUpdate from "./updt"; -import detailDataPengangguranFindUnique from "./findUnique"; import detailDataPengangguranDelete from "./del"; import findByMonthYear from "./findByMonthYear"; +import detailDataPengangguranFindMany from "./findMany"; +import detailDataPengangguranFindUnique from "./findUnique"; +import detailDataPengangguranUpdate from "./updt"; const DetailDataPengangguran = new Elysia({ prefix: "/detaildatapengangguran", @@ -50,6 +50,6 @@ const DetailDataPengangguran = new Elysia({ month: t.String(), year: t.String(), }), - }); + }) export default DetailDataPengangguran; diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/index.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/index.ts index 735dd920..a08249c8 100644 --- a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/index.ts +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/index.ts @@ -1,13 +1,10 @@ import Elysia from "elysia"; import DetailDataPengangguran from "./detail-data-pengangguran"; -import RingkasanDataPengangguran from "./ringkasan-data-pengangguran"; -import SedangMencariKerja from "./sedang-mencari-kerja"; const JumlahPengangguran = new Elysia({ prefix: "/jumlahpengangguran", }) .use(DetailDataPengangguran) -.use(RingkasanDataPengangguran) -.use(SedangMencariKerja) + export default JumlahPengangguran; \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/create.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/create.ts deleted file mode 100644 index 4f8c4b57..00000000 --- a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/create.ts +++ /dev/null @@ -1,61 +0,0 @@ -import prisma from "@/lib/prisma"; -import { Prisma } from "@prisma/client"; -import { Context } from "elysia"; - -type FormCreate = Prisma.RingkasanDataPengangguranGetPayload<{ - select: { - year: true; - totalUnemployment: true; - educatedUnemployment: true; - percentageEducatedOfTotal: true; - productiveAgePopulation: true; - percentageProductiveOfTotal: true; - percentageChangeFromPreviousYear: true; - }; -}>; - -export default async function ringkasanDataPengangguranCreate(context: Context) { - const body = context.body as FormCreate; - - const existing = await prisma.ringkasanDataPengangguran.findFirst({ - where: { - year: body.year, - }, - }); - - if (existing) { - return { - success: false, - message: `Data tahun ${body.year} sudah ada.`, - data: null, - }; - } - - const created = await prisma.ringkasanDataPengangguran.create({ - data: { - year: body.year, - totalUnemployment: body.totalUnemployment, - educatedUnemployment: body.educatedUnemployment, - percentageEducatedOfTotal: body.percentageEducatedOfTotal, - productiveAgePopulation: body.productiveAgePopulation, - percentageProductiveOfTotal: body.percentageProductiveOfTotal, - percentageChangeFromPreviousYear: body.percentageChangeFromPreviousYear, - }, - select: { - id: true, - year: true, - totalUnemployment: true, - educatedUnemployment: true, - percentageEducatedOfTotal: true, - productiveAgePopulation: true, - percentageProductiveOfTotal: true, - percentageChangeFromPreviousYear: true, - }, - }); - - return { - success: true, - message: "Berhasil menambahkan data ringkasan pengangguran", - data: created, - }; -} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/del.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/del.ts deleted file mode 100644 index f8408c1d..00000000 --- a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/del.ts +++ /dev/null @@ -1,38 +0,0 @@ -import prisma from "@/lib/prisma"; -import { Context } from "elysia"; - -export default async function ringkasanDataPengangguranDelete(context: Context) { - const id = context.params?.id; - - if (!id) { - return { - success: false, - message: "ID tidak ditemukan", - } - } - - const existing = await prisma.ringkasanDataPengangguran.findUnique({ - where: { - id: id, - }, - }) - - if (!existing) { - return { - success: false, - message: "Data tidak ditemukan", - } - } - - const deleted = await prisma.ringkasanDataPengangguran.delete({ - where: { - id: id, - }, - }) - - return { - success: true, - message: "Berhasil menghapus data ringkasan pengangguran", - data: deleted, - } -} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/findMany.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/findMany.ts deleted file mode 100644 index 9590346d..00000000 --- a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/findMany.ts +++ /dev/null @@ -1,10 +0,0 @@ -import prisma from "@/lib/prisma"; - -export default async function ringkasanDataPengangguranFindMany() { - const res = await prisma.ringkasanDataPengangguran.findMany({ - orderBy: [{ year: "desc" }], - }); - return { - data: res, - }; -} diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/findUnique.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/findUnique.ts deleted file mode 100644 index 3239b486..00000000 --- a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/findUnique.ts +++ /dev/null @@ -1,45 +0,0 @@ -import prisma from "@/lib/prisma"; - -export default async function ringkasanDataPengangguranFindUnique(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.ringkasanDataPengangguran.findUnique({ - where: { id }, - }); - - if (!data) { - return Response.json({ - success: false, - message: "Data tidak ditemukan", - }, { status: 404 }); - } - - return Response.json({ - success: true, - data: data, - }, { status: 200 }); - } catch (error) { - console.error("Error fetching data:", error); - return Response.json({ - success: false, - message: "Terjadi kesalahan saat mengambil data", - }, { status: 500 }); - } -} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/index.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/index.ts deleted file mode 100644 index bbcbb514..00000000 --- a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/index.ts +++ /dev/null @@ -1,50 +0,0 @@ -import Elysia, { t } from "elysia"; -import ringkasanDataPengangguranFindUnique from "./findUnique"; -import ringkasanDataPengangguranFindMany from "./findMany"; -import ringkasanDataPengangguranCreate from "./create"; -import ringkasanDataPengangguranUpdate from "./updt"; -import ringkasanDataPengangguranDelete from "./del"; - -const RingkasanDataPengangguran = new Elysia({ - prefix: "/ringkasandatapengangguran", - tags: ["Ekonomi/Jumlah Pengangguran/Ringkasan Data Pengangguran"], -}) -.get("/:id", async (context) => { - const response = await ringkasanDataPengangguranFindUnique( - new Request(context.request) - ); - return response; -}) -.get("/find-many", ringkasanDataPengangguranFindMany) -.post("/create", ringkasanDataPengangguranCreate, { - body: t.Object({ - year: t.Number(), - totalUnemployment: t.Number(), - educatedUnemployment: t.Number(), - percentageEducatedOfTotal: t.Number(), - productiveAgePopulation: t.Number(), - percentageProductiveOfTotal: t.Number(), - percentageChangeFromPreviousYear: t.Number(), - }), -}) -.put("/:id", ringkasanDataPengangguranUpdate, { - params: t.Object({ - id: t.String(), - }), - body: t.Object({ - year: t.Number(), - totalUnemployment: t.Number(), - educatedUnemployment: t.Number(), - percentageEducatedOfTotal: t.Number(), - productiveAgePopulation: t.Number(), - percentageProductiveOfTotal: t.Number(), - percentageChangeFromPreviousYear: t.Number(), - }), -}) -.delete("/del/:id", ringkasanDataPengangguranDelete, { - params: t.Object({ - id: t.String(), - }), -}); - -export default RingkasanDataPengangguran; diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/updt.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/updt.ts deleted file mode 100644 index d81b2a47..00000000 --- a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/ringkasan-data-pengangguran/updt.ts +++ /dev/null @@ -1,70 +0,0 @@ -import prisma from "@/lib/prisma"; -import { Context } from "elysia"; - -export default async function ringkasanDataPengangguranUpdate(context: Context) { - const id = context.params?.id; - - if (!id) { - return { - success: false, - message: "ID tidak ditemukan", - } - } - - const { year, totalUnemployment, educatedUnemployment, percentageEducatedOfTotal, productiveAgePopulation, percentageProductiveOfTotal, percentageChangeFromPreviousYear } = context.body as { - year: number; - totalUnemployment: number; - educatedUnemployment: number; - percentageEducatedOfTotal: number; - productiveAgePopulation: number; - percentageProductiveOfTotal: number; - percentageChangeFromPreviousYear: number; - } - - const duplicate = await prisma.ringkasanDataPengangguran.findFirst({ - where: { - year, - NOT: { id }, - }, - }); - - if (duplicate) { - return { - success: false, - message: `Data tahun ${year} sudah ada.`, - }; - } - - const existing = await prisma.ringkasanDataPengangguran.findUnique({ - where: { - id: id, - }, - }) - - if (!existing) { - return { - success: false, - message: "Data tidak ditemukan", - } - } - - const updated = await prisma.ringkasanDataPengangguran.update({ - where: { id }, - data: { - year, - totalUnemployment, - educatedUnemployment, - percentageEducatedOfTotal, - productiveAgePopulation, - percentageProductiveOfTotal, - percentageChangeFromPreviousYear, - }, - }) - - return { - success: true, - message: "Data berhasil diupdate", - data: updated, - } -} - \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/create.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/create.ts deleted file mode 100644 index 61a440ea..00000000 --- a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/create.ts +++ /dev/null @@ -1,49 +0,0 @@ -import prisma from "@/lib/prisma"; -import { Prisma } from "@prisma/client"; -import { Context } from "elysia"; - -type FormCreate = Prisma.SedangMencariKerjaGetPayload<{ - select: { - count: true; - percentageOfTotal: true; - recordedDate: true; - }; -}>; - -export default async function sedangMencariKerjaCreate(context: Context) { - const body = context.body as FormCreate; - - const existing = await prisma.sedangMencariKerja.findFirst({ - where: { - recordedDate: body.recordedDate, - }, - }); - - if (existing) { - return { - success: false, - message: "Data sudah ada", - data: null, - }; - } - - const created = await prisma.sedangMencariKerja.create({ - data: { - count: body.count, - percentageOfTotal: body.percentageOfTotal, - recordedDate: body.recordedDate, - }, - select: { - id: true, - count: true, - percentageOfTotal: true, - recordedDate: true, - }, - }); - - return { - success: true, - message: "Berhasil menambahkan data sedang mencari kerja", - data: created, - }; -} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/del.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/del.ts deleted file mode 100644 index c50d7b58..00000000 --- a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/del.ts +++ /dev/null @@ -1,38 +0,0 @@ -import prisma from "@/lib/prisma"; -import { Context } from "elysia"; - -export default async function sedangMencariKerjaDelete(context: Context) { - const id = context.params?.id; - - if (!id) { - return { - success: false, - message: "ID tidak ditemukan", - } - } - - const existing = await prisma.sedangMencariKerja.findUnique({ - where: { - id: id, - }, - }) - - if (!existing) { - return { - success: false, - message: "Data tidak ditemukan", - } - } - - const deleted = await prisma.sedangMencariKerja.delete({ - where: { - id: id, - }, - }) - - return { - success: true, - message: "Berhasil menghapus data sedang mencari kerja", - data: deleted, - } -} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/findMany.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/findMany.ts deleted file mode 100644 index af2b38fb..00000000 --- a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/findMany.ts +++ /dev/null @@ -1,10 +0,0 @@ -import prisma from "@/lib/prisma"; - -export default async function sedangMencariKerjaFindMany() { - const res = await prisma.sedangMencariKerja.findMany({ - orderBy: [{ recordedDate: "desc" }], - }); - return { - data: res, - }; -} diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/findUnique.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/findUnique.ts deleted file mode 100644 index 4dc460d2..00000000 --- a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/findUnique.ts +++ /dev/null @@ -1,46 +0,0 @@ -import prisma from "@/lib/prisma"; - -export default async function sedangMencariKerjaFindUnique(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.sedangMencariKerja.findUnique({ - where: { id }, - }); - - if (!data) { - return Response.json({ - success: false, - message: "Data tidak ditemukan", - }, { status: 404 }); - } - - return Response.json({ - success: true, - message: "Data ditemukan", - data, - }, { status: 200 }); - } catch (error) { - console.error("Error fetching data:", error); - return Response.json({ - success: false, - message: "Terjadi kesalahan saat mengambil data", - }, { status: 500 }); - } -} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/index.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/index.ts deleted file mode 100644 index 7423c0f9..00000000 --- a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/index.ts +++ /dev/null @@ -1,42 +0,0 @@ -import Elysia, { t } from "elysia"; -import sedangMencariKerjaFindUnique from "./findUnique"; -import sedangMencariKerjaFindMany from "./findMany"; -import sedangMencariKerjaCreate from "./create"; -import sedangMencariKerjaUpdate from "./updt"; -import sedangMencariKerjaDelete from "./del"; - -const SedangMencariKerja = new Elysia({ - prefix: "/sedangmencarikerja", - tags: ["Ekonomi/Jumlah Pengangguran/Sedang Mencari Kerja"], -}) -.get("/:id", async (context) => { - const response = await sedangMencariKerjaFindUnique( - new Request(context.request) - ); - return response; -}) -.get("/find-many", sedangMencariKerjaFindMany) -.post("/create", sedangMencariKerjaCreate, { - body: t.Object({ - count: t.Number(), - percentageOfTotal: t.Number(), - recordedDate: t.String(), - }), -}) -.put("/:id", sedangMencariKerjaUpdate, { - params: t.Object({ - id: t.String(), - }), - body: t.Object({ - count: t.Number(), - percentageOfTotal: t.Number(), - recordedDate: t.String(), - }), -}) -.delete("/del/:id", sedangMencariKerjaDelete, { - params: t.Object({ - id: t.String(), - }), -}); - -export default SedangMencariKerja; diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/updt.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/updt.ts deleted file mode 100644 index 9d2a3c36..00000000 --- a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/sedang-mencari-kerja/updt.ts +++ /dev/null @@ -1,49 +0,0 @@ -import prisma from "@/lib/prisma"; -import { Context } from "elysia"; - -export default async function sedangMencariKerjaUpdate(context: Context) { - const id = context.params?.id; - - if (!id) { - return { - success: false, - message: "ID tidak ditemukan", - } - } - - const { count, percentageOfTotal, recordedDate } = context.body as { - count: number; - percentageOfTotal: number; - recordedDate: string; - } - - const existing = await prisma.sedangMencariKerja.findUnique({ - where: { - id: id, - }, - }) - - if (!existing) { - return { - success: false, - message: "Data tidak ditemukan", - } - } - - const updated = await prisma.sedangMencariKerja.update({ - where: { - id: id, - }, - data: { - count: count, - percentageOfTotal: percentageOfTotal, - recordedDate: recordedDate, - }, - }) - - return { - success: true, - message: "Berhasil mengupdate data sedang mencari kerja", - data: updated, - } -} \ No newline at end of file diff --git a/src/app/darmasaba/(pages)/ekonomi/jumlah-pengangguran-2024-2025/page.tsx b/src/app/darmasaba/(pages)/ekonomi/jumlah-pengangguran-2024-2025/page.tsx index 827d9530..e9db94de 100644 --- a/src/app/darmasaba/(pages)/ekonomi/jumlah-pengangguran-2024-2025/page.tsx +++ b/src/app/darmasaba/(pages)/ekonomi/jumlah-pengangguran-2024-2025/page.tsx @@ -1,9 +1,8 @@ import colors from '@/con/colors'; -import { Stack, Box, Text, Group, Flex, Button, SimpleGrid, Paper, Center, ColorSwatch, TableTd, TableTr, Table, TableTbody, TableTh, TableThead } from '@mantine/core'; -import React from 'react'; -import BackButton from '../../desa/layanan/_com/BackButto'; -import { IconBriefcase, IconChevronDown, IconDownload, IconSchool, IconUserOff, IconUsersGroup } from '@tabler/icons-react'; import { BarChart } from '@mantine/charts'; +import { Box, Button, Center, ColorSwatch, Flex, Group, Paper, SimpleGrid, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core'; +import { IconChevronDown, IconDownload, IconSchool, IconSchoolOff, IconUserOff } from '@tabler/icons-react'; +import BackButton from '../../desa/layanan/_com/BackButto'; const data1 = [ { @@ -22,17 +21,10 @@ const data1 = [ }, { id: 3, - icon: , - judul: 'Usia Produktif', - jumlah: '125', - persentase: 89.3% dari total - }, - { - id: 4, - icon: , - judul: 'Sedang Mencari Kerja', - jumlah: '95', - persentase: 67.9% dari total + icon: , + judul: 'Pengangguran Tidak Terdidik', + jumlah: '60', + persentase: 42.9% dari total }, ]