From ca2f97fa47f1bcffc1e4bcee4ac8886a3436fcb1 Mon Sep 17 00:00:00 2001 From: nico Date: Wed, 11 Feb 2026 12:38:28 +0800 Subject: [PATCH] feat: finalize kinerja divisi feature implementation Co-authored-by: Qwen-Coder --- .../DASHBOARD_DESIGN.md | 0 Dashboard-MD/JENNA_ANALYTHIC.md | 282 ++++++++++++++++++ QWEN.md | 112 +++++++ src/{app => }/components/dashboard-card.tsx | 0 .../components/dashboard-content.tsx | 3 - .../components/figma/ImageWithFallback.tsx | 0 src/{app => }/components/header.tsx | 0 src/components/jenna-analytic.tsx | 271 +++++++++++++++++ src/{app => }/components/kinerja-divisi.tsx | 42 ++- .../components/pengaduan-layanan-publik.tsx | 14 +- src/{app => }/components/sidebar.tsx | 2 +- src/{app => }/components/ui/accordion.tsx | 0 src/{app => }/components/ui/alert-dialog.tsx | 0 src/{app => }/components/ui/alert.tsx | 0 src/{app => }/components/ui/aspect-ratio.tsx | 0 src/{app => }/components/ui/avatar.tsx | 0 src/{app => }/components/ui/badge.tsx | 0 src/{app => }/components/ui/breadcrumb.tsx | 0 src/{app => }/components/ui/button.tsx | 0 src/{app => }/components/ui/calendar.tsx | 0 src/{app => }/components/ui/card.tsx | 0 src/{app => }/components/ui/carousel.tsx | 0 src/{app => }/components/ui/chart.tsx | 0 src/{app => }/components/ui/checkbox.tsx | 0 src/{app => }/components/ui/collapsible.tsx | 0 src/{app => }/components/ui/command.tsx | 0 src/{app => }/components/ui/dialog.tsx | 0 src/{app => }/components/ui/drawer.tsx | 0 src/{app => }/components/ui/dropdown-menu.tsx | 0 src/{app => }/components/ui/form.tsx | 0 src/{app => }/components/ui/hover-card.tsx | 0 src/{app => }/components/ui/input-otp.tsx | 0 src/{app => }/components/ui/input.tsx | 0 src/{app => }/components/ui/label.tsx | 0 src/{app => }/components/ui/menubar.tsx | 0 .../components/ui/navigation-menu.tsx | 0 src/{app => }/components/ui/pagination.tsx | 0 src/{app => }/components/ui/popover.tsx | 0 src/{app => }/components/ui/progress.tsx | 0 src/{app => }/components/ui/radio-group.tsx | 0 src/{app => }/components/ui/resizable.tsx | 0 src/{app => }/components/ui/scroll-area.tsx | 0 src/{app => }/components/ui/select.tsx | 0 src/{app => }/components/ui/separator.tsx | 0 src/{app => }/components/ui/sheet.tsx | 0 src/{app => }/components/ui/sidebar.tsx | 0 src/{app => }/components/ui/skeleton.tsx | 0 src/{app => }/components/ui/slider.tsx | 0 src/{app => }/components/ui/sonner.tsx | 0 src/{app => }/components/ui/switch.tsx | 0 src/{app => }/components/ui/table.tsx | 0 src/{app => }/components/ui/tabs.tsx | 0 src/{app => }/components/ui/textarea.tsx | 0 src/{app => }/components/ui/toggle-group.tsx | 0 src/{app => }/components/ui/toggle.tsx | 0 src/{app => }/components/ui/tooltip.tsx | 0 src/{app => }/components/ui/use-mobile.ts | 0 src/{app => }/components/ui/utils.ts | 0 src/routeTree.gen.ts | 21 ++ src/routes/dashboard/index.ts | 2 +- src/routes/dashboard/jenna-analytic.ts | 6 + src/routes/dashboard/kinerja-divisi.ts | 2 +- .../dashboard/pengaduan-layanan-publik.ts | 2 +- src/routes/dashboard/route.tsx | 4 +- 64 files changed, 725 insertions(+), 38 deletions(-) rename DASHBOARD_DESIGN.md => Dashboard-MD/DASHBOARD_DESIGN.md (100%) create mode 100644 Dashboard-MD/JENNA_ANALYTHIC.md create mode 100644 QWEN.md rename src/{app => }/components/dashboard-card.tsx (100%) rename src/{app => }/components/dashboard-content.tsx (98%) rename src/{app => }/components/figma/ImageWithFallback.tsx (100%) rename src/{app => }/components/header.tsx (100%) create mode 100644 src/components/jenna-analytic.tsx rename src/{app => }/components/kinerja-divisi.tsx (82%) rename src/{app => }/components/pengaduan-layanan-publik.tsx (97%) rename src/{app => }/components/sidebar.tsx (97%) rename src/{app => }/components/ui/accordion.tsx (100%) rename src/{app => }/components/ui/alert-dialog.tsx (100%) rename src/{app => }/components/ui/alert.tsx (100%) rename src/{app => }/components/ui/aspect-ratio.tsx (100%) rename src/{app => }/components/ui/avatar.tsx (100%) rename src/{app => }/components/ui/badge.tsx (100%) rename src/{app => }/components/ui/breadcrumb.tsx (100%) rename src/{app => }/components/ui/button.tsx (100%) rename src/{app => }/components/ui/calendar.tsx (100%) rename src/{app => }/components/ui/card.tsx (100%) rename src/{app => }/components/ui/carousel.tsx (100%) rename src/{app => }/components/ui/chart.tsx (100%) rename src/{app => }/components/ui/checkbox.tsx (100%) rename src/{app => }/components/ui/collapsible.tsx (100%) rename src/{app => }/components/ui/command.tsx (100%) rename src/{app => }/components/ui/dialog.tsx (100%) rename src/{app => }/components/ui/drawer.tsx (100%) rename src/{app => }/components/ui/dropdown-menu.tsx (100%) rename src/{app => }/components/ui/form.tsx (100%) rename src/{app => }/components/ui/hover-card.tsx (100%) rename src/{app => }/components/ui/input-otp.tsx (100%) rename src/{app => }/components/ui/input.tsx (100%) rename src/{app => }/components/ui/label.tsx (100%) rename src/{app => }/components/ui/menubar.tsx (100%) rename src/{app => }/components/ui/navigation-menu.tsx (100%) rename src/{app => }/components/ui/pagination.tsx (100%) rename src/{app => }/components/ui/popover.tsx (100%) rename src/{app => }/components/ui/progress.tsx (100%) rename src/{app => }/components/ui/radio-group.tsx (100%) rename src/{app => }/components/ui/resizable.tsx (100%) rename src/{app => }/components/ui/scroll-area.tsx (100%) rename src/{app => }/components/ui/select.tsx (100%) rename src/{app => }/components/ui/separator.tsx (100%) rename src/{app => }/components/ui/sheet.tsx (100%) rename src/{app => }/components/ui/sidebar.tsx (100%) rename src/{app => }/components/ui/skeleton.tsx (100%) rename src/{app => }/components/ui/slider.tsx (100%) rename src/{app => }/components/ui/sonner.tsx (100%) rename src/{app => }/components/ui/switch.tsx (100%) rename src/{app => }/components/ui/table.tsx (100%) rename src/{app => }/components/ui/tabs.tsx (100%) rename src/{app => }/components/ui/textarea.tsx (100%) rename src/{app => }/components/ui/toggle-group.tsx (100%) rename src/{app => }/components/ui/toggle.tsx (100%) rename src/{app => }/components/ui/tooltip.tsx (100%) rename src/{app => }/components/ui/use-mobile.ts (100%) rename src/{app => }/components/ui/utils.ts (100%) create mode 100644 src/routes/dashboard/jenna-analytic.ts diff --git a/DASHBOARD_DESIGN.md b/Dashboard-MD/DASHBOARD_DESIGN.md similarity index 100% rename from DASHBOARD_DESIGN.md rename to Dashboard-MD/DASHBOARD_DESIGN.md diff --git a/Dashboard-MD/JENNA_ANALYTHIC.md b/Dashboard-MD/JENNA_ANALYTHIC.md new file mode 100644 index 0000000..e854061 --- /dev/null +++ b/Dashboard-MD/JENNA_ANALYTHIC.md @@ -0,0 +1,282 @@ +# Jenna Analytic – Dashboard Design Specification + +Dokumen ini menjelaskan desain halaman **Jenna Analytic** berdasarkan screenshot (11 Feb 2026). Dokumen ini menjadi acuan implementasi UI/UX, data, dan interaksi untuk halaman analitik chatbot desa. + +--- + +## 1. Tujuan Halaman + +Jenna Analytic berfungsi sebagai **dashboard analitik chatbot layanan desa**, berfokus pada: + +* Volume interaksi warga +* Performa jawaban otomatis +* Respons manual & waktu respons +* Pola pertanyaan dan jam sibuk + +Target user utama: + +* Kepala Desa +* Admin pelayanan +* Operator chatbot + +--- + +## 2. Tata Letak Keseluruhan (Layout) + +### 2.1 Struktur Global + +``` ++------------------------------------------------------+ +| Topbar / Header | ++-------------+----------------------------------------+ +| Sidebar | Main Content | +| | - KPI Cards (Row) | +| | - Bar Chart Interaksi | +| | - Topik Terbanyak + Jam Tersibuk | ++-------------+----------------------------------------+ +``` + +* Sidebar: fixed kiri +* Header: fixed atas +* Main content: scroll vertical + +--- + +## 3. Header (Topbar) + +### Komponen + +* Judul: `Desa Darmasaba` +* User Info: + + * Nama: `I. B. Surya Prabhawa M.` + * Role: `Kepala Desa` +* Ikon: + + * Notification (badge angka merah) + * Theme toggle / setting + * Avatar (lingkaran) + +### Gaya + +* Background: Navy / Biru Tua +* Text: Putih +* Tinggi: ±64px +* Shadow: subtle + +--- + +## 4. Sidebar Navigation + +### Elemen + +* Logo DESA+ +* Search input: `cari apa saja` +* Menu: + + * Beranda + * Kinerja Divisi + * Pengaduan & Layanan Publik + * **Jenna Analytic (active)** + * Demografi & Kependudukan + * Keuangan & Anggaran + * Bumdes & UMKM Desa + * Sosial + * Keamanan + * Bantuan + * Pengaturan + +### Gaya + +* Background: Putih +* Active state: + + * Background biru muda + * Border kiri / highlight +* Spacing menu: 12–16px + +--- + +## 5. KPI Cards (Ringkasan Atas) + +### Daftar KPI + +1. **Interaksi Hari Ini** + + * Value: `61` + * Delta: `+15% dari kemarin` + +2. **Jawaban Otomatis** + + * Value: `87%` + * Sub: `53 dari 61 interaksi` + +3. **Belum Ditindak** + + * Value: `8` + * Sub: `Perlu respon manual` + +4. **Waktu Respon** + + * Value: `2.3 sec` + * Sub: `Rata-rata` + +### Gaya + +* Card putih +* Radius: 14–16px +* Icon di kanan +* Shadow lembut +* Grid 4 kolom (desktop) + +--- + +## 6. Grafik Interaksi Chatbot + +### Deskripsi + +* Tipe: Bar Chart +* Judul: `Interaksi Chatbot` +* X-axis: Hari (Sen–Min) +* Y-axis: Jumlah interaksi + +### Gaya + +* Warna bar: Navy / Biru tua +* Grid minimal +* Tooltip saat hover + +### Data Expectation + +```ts +{ + day: 'Sen' | 'Sel' | 'Rab' | 'Kam' | 'Jum' | 'Sab' | 'Min'; + total: number; +} +``` + +--- + +## 7. Topik Pertanyaan Terbanyak + +### Deskripsi + +* Tipe: Ranked list +* Isi: + + * Cara mengurus KTP – 89x + * Syarat Kartu Keluarga – 76x + * Jadwal Posyandu – 64x + * Pengaduan jalan rusak – 52x + * Info program bansos – 48x + +### Gaya + +* Card putih +* Item list rounded +* Count di kanan + +### Data + +```ts +{ + topic: string; + count: number; +} +``` + +--- + +## 8. Jam Tersibuk + +### Deskripsi + +* Menampilkan distribusi interaksi berdasarkan waktu + +| Waktu | Persentase | +| ------------- | ---------- | +| Pagi (08–12) | 30% | +| Siang (12–16) | 40% | +| Sore (16–20) | 20% | +| Malam (20–08) | 10% | + +### Gaya + +* Horizontal bar / progress +* Label kiri, persentase kanan + +--- + +## 9. Warna & Tema + +### Palette + +* Primary (Navy): `#1E3A5F` +* Secondary: `#3B82F6` +* Success: `#22C55E` +* Warning: `#FACC15` +* Danger: `#EF4444` +* Background App: `#F5F8FB` + +--- + +## 10. Tipografi + +* Font: Inter / Poppins / system-ui +* Heading: Semi-bold +* Body: Regular +* KPI number: Bold, besar + +--- + +## 11. Spasi & Grid + +* Padding card: 16–24px +* Gap grid: 20–24px +* Line-height body: 1.5 + +--- + +## 12. Responsivitas + +### Tablet + +* KPI jadi 2 kolom +* Chart full width + +### Mobile + +* Sidebar jadi drawer +* KPI 1 kolom +* Chart & list stack vertical + +--- + +## 13. Interaksi & Perilaku + +* Hover card: shadow meningkat +* Tooltip chart +* KPI clickable (future drill-down) +* Data async dari API + +--- + +## 14. Catatan Implementasi Teknis + +* Framework: React + Vite +* UI: Mantine / Shadcn / MUI +* Chart: Recharts / Chart.js +* State: TanStack Query / SWR + +--- + +## 15. Pengembangan Lanjutan + +* Filter tanggal +* Export CSV +* Drill-down per topik +* Alert SLA respon + +--- + +> Dokumen ini bersifat **design & data contract** antara UI, frontend, dan backend. diff --git a/QWEN.md b/QWEN.md new file mode 100644 index 0000000..08c7090 --- /dev/null +++ b/QWEN.md @@ -0,0 +1,112 @@ +# Darmasaba Dashboard Noc - Project Context + +## Project Overview + +**Darmasaba Dashboard Noc** is a high-performance, full-stack React development template leveraging the **Bun** runtime. It features a unique "Single Port" architecture that combines a Bun/Elysia backend with a React frontend running on the same port (3000), eliminating CORS issues and proxy complexity. + +### Key Technologies +- **Runtime**: Bun (Fast all-in-one JS runtime) +- **Backend**: ElysiaJS (Fast, type-safe web framework) +- **Frontend**: React 19 (UI Library) +- **Routing**: TanStack React Router (Type-safe routing) +- **UI Framework**: Mantine UI (Component library) +- **Authentication**: Better Auth (Complete auth solution) +- **Database**: Prisma ORM (Database toolkit) +- **Testing**: Bun Test & Playwright + +### Architecture Highlights +- **Single Port Architecture**: Backend (Elysia) and Frontend (Vite Middleware) run on the same port (3000) +- **Contract-First API**: Strictly typed API using OpenAPI with automatic frontend type synchronization +- **PWA & TWA Support**: Ready for mobile with Service Workers, Web Manifest, and Android Trusted Web Activity verification +- **React Dev Inspector**: Alt/Option + Click to jump directly to source code in VS Code + +## Project Structure + +``` +├── __tests__/ # Consolidated test suite (API & E2E) +├── generated/ # Auto-generated API types and Prisma client +├── prisma/ # Database schema and migrations +├── scripts/ # Internal automation scripts +└── src/ + ├── api/ # Elysia backend route modules + ├── middleware/ # Backend & Frontend middlewares + ├── routes/ # TanStack file-based frontend routes + ├── store/ # Global state (Valtio) + ├── utils/ # Shared utilities (DB, Env, API Client) + ├── frontend.tsx # React client entry point + └── index.ts # Unified server entry point +``` + +## Building and Running + +### Prerequisites +Install [Bun](https://bun.sh/) if you haven't already. + +### Installation +```bash +bun install +``` + +### Setup Environment +```bash +cp .env.example .env +# Fill in your DATABASE_URL and BETTER_AUTH_SECRET +``` + +### Database Initialization +```bash +bun x prisma migrate dev +``` + +### Start Development +```bash +bun run dev +``` +- **App**: `http://localhost:3000` +- **API Docs**: `http://localhost:3000/api/docs` (Swagger) + +## Testing Commands + +- **Unit/Integration (API)**: `bun run test` +- **End-to-End (Browser)**: `bun run test:e2e` +- **Visual Dashboard**: `bun run test:ui` + +## Development Guidelines + +- **API Workflow**: + 1. Define schema in `src/api/*.ts`. + 2. Run `bun run gen:api` (or just start `dev` mode). + 3. Use `apiClient` in the frontend with full type safety. +- **Styling**: Prefer Mantine components and Style Props. +- **Code Quality**: Code is automatically formatted on save if you have the Biome extension. Manual: `bun run check`. + +## Key Configuration Files + +- **biome.json**: Code formatting and linting rules (uses tabs, double quotes) +- **tailwind.config.js**: Tailwind CSS configuration with custom Darmasaba color palette +- **tsconfig.json**: TypeScript configuration with path aliases (`@/*` maps to `./src/*`) +- **package.json**: Contains all scripts and dependencies +- **playwright.config.ts**: End-to-end testing configuration + +## Notable Features + +1. **Hot Module Replacement**: The application supports HMR for rapid development +2. **Type Safety**: Full type safety between frontend and backend through contract-first API design +3. **Authentication**: Built-in authentication using Better Auth +4. **Dark/Light Theme**: Automatic theme switching with Mantine UI +5. **Responsive Design**: Mobile-first responsive design using Tailwind CSS and Mantine +6. **Performance Optimized**: Optimized for production with proper bundling and minification + +## Development Scripts + +- `dev`: Starts the development server with HMR +- `lint`: Runs Biome linter +- `check`: Runs Biome checker with auto-fix +- `format`: Formats code using Biome +- `gen:api`: Generates API types from schema +- `test`: Runs unit/integration tests +- `test:ui`: Runs tests with UI +- `test:e2e`: Runs end-to-end tests +- `build`: Builds the application for production +- `start`: Starts the production server +- `seed`: Seeds the database with initial data \ No newline at end of file diff --git a/src/app/components/dashboard-card.tsx b/src/components/dashboard-card.tsx similarity index 100% rename from src/app/components/dashboard-card.tsx rename to src/components/dashboard-card.tsx diff --git a/src/app/components/dashboard-content.tsx b/src/components/dashboard-content.tsx similarity index 98% rename from src/app/components/dashboard-content.tsx rename to src/components/dashboard-content.tsx index 82ed46f..6f740ac 100644 --- a/src/app/components/dashboard-content.tsx +++ b/src/components/dashboard-content.tsx @@ -164,9 +164,6 @@ export function DashboardContent() { - - 87% - diff --git a/src/app/components/figma/ImageWithFallback.tsx b/src/components/figma/ImageWithFallback.tsx similarity index 100% rename from src/app/components/figma/ImageWithFallback.tsx rename to src/components/figma/ImageWithFallback.tsx diff --git a/src/app/components/header.tsx b/src/components/header.tsx similarity index 100% rename from src/app/components/header.tsx rename to src/components/header.tsx diff --git a/src/components/jenna-analytic.tsx b/src/components/jenna-analytic.tsx new file mode 100644 index 0000000..f8925ab --- /dev/null +++ b/src/components/jenna-analytic.tsx @@ -0,0 +1,271 @@ +import React from "react"; +import { + Button, + Card, + Badge, + Progress, + Title, + Text, + Group, + Stack, + Grid, + Table, + Box, +} from "@mantine/core"; + +// Sample Data +const kpiData = [ + { + id: 1, + title: "Interaksi Hari Ini", + value: "61", + delta: "+15% dari kemarin", + deltaType: "positive", + icon: ( + + + + ), + }, + { + id: 2, + title: "Jawaban Otomatis", + value: "87%", + sub: "53 dari 61 interaksi", + icon: ( + + + + ), + }, + { + id: 3, + title: "Belum Ditindak", + value: "8", + sub: "Perlu respon manual", + deltaType: "negative", + icon: ( + + + + ), + }, + { + id: 4, + title: "Waktu Respon", + value: "2.3 sec", + sub: "Rata-rata", + icon: ( + + + + ), + }, +]; + +const chartData = [ + { day: "Sen", total: 100 }, + { day: "Sel", total: 120 }, + { day: "Rab", total: 90 }, + { day: "Kam", total: 150 }, + { day: "Jum", total: 110 }, + { day: "Sab", total: 80 }, + { day: "Min", total: 130 }, +]; + +const topTopics = [ + { topic: "Cara mengurus KTP", count: 89 }, + { topic: "Syarat Kartu Keluarga", count: 76 }, + { topic: "Jadwal Posyandu", count: 64 }, + { topic: "Pengaduan jalan rusak", count: 52 }, + { topic: "Info program bansos", count: 48 }, +]; + +const busyHours = [ + { period: "Pagi (08–12)", percentage: 30 }, + { period: "Siang (12–16)", percentage: 40 }, + { period: "Sore (16–20)", percentage: 20 }, + { period: "Malam (20–08)", percentage: 10 }, +]; + +const JennaAnalytic = () => { + return ( + + + + + Jenna Analytic + + + + + {/* KPI Cards */} + + {kpiData.map((kpi) => ( + + + + + {kpi.title} + + {React.cloneElement(kpi.icon, { + className: "h-6 w-6", // Keeping classes for now, can be replaced by Mantine Icon component if available or styled with sx prop + color: "var(--mantine-color-dimmed)", // Set color via prop + })} + + + {kpi.value} + + {kpi.delta && ( + + {kpi.delta} + + )} + {kpi.sub && ( + + {kpi.sub} + + )} + + + ))} + + + {/* Charts and Lists Section */} + + {/* Grafik Interaksi Chatbot (now Table) */} + + + + Interaksi Chatbot + + + + + Day + Total Interactions + + + + {chartData.map((item, index) => ( + + {item.day} + {item.total} + + ))} + +
+
+
+ + {/* Topik Pertanyaan Terbanyak & Jam Tersibuk */} + + + {/* Topik Pertanyaan Terbanyak */} + + + Topik Pertanyaan Terbanyak + + + {topTopics.map((item, index) => ( + + + {item.topic} + + + {item.count}x + + + ))} + + + + {/* Jam Tersibuk */} + + + Jam Tersibuk + + + {busyHours.map((item, index) => ( + + + {item.period} + + + + {item.percentage}% + + + ))} + + + + +
+
+
+ ); + +} +export default JennaAnalytic; + diff --git a/src/app/components/kinerja-divisi.tsx b/src/components/kinerja-divisi.tsx similarity index 82% rename from src/app/components/kinerja-divisi.tsx rename to src/components/kinerja-divisi.tsx index 25a2386..c52dcc4 100644 --- a/src/app/components/kinerja-divisi.tsx +++ b/src/components/kinerja-divisi.tsx @@ -1,13 +1,13 @@ -import { Badge } from "@/app/components/ui/badge"; -import { Button } from "@/app/components/ui/button"; // Correct import for Button +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; // Correct import for Button import { Card, CardContent, CardHeader, CardTitle, -} from "@/app/components/ui/card"; -import { Progress } from "@/app/components/ui/progress"; +} from "@/components/ui/card"; +import { Progress } from "@/components/ui/progress"; import { Table, TableBody, @@ -15,7 +15,7 @@ import { TableHead, TableHeader, TableRow, -} from "@/app/components/ui/table"; +} from "@/components/ui/table"; const KinerjaDivisi = () => { // Sample data for division performance @@ -87,7 +87,7 @@ const KinerjaDivisi = () => {
- Total Divisi + Total Divisi
{ - + Rata-rata Pencapaian
@@ -141,7 +141,7 @@ const KinerjaDivisi = () => { - + Divisi Melebihi Target
@@ -170,19 +170,19 @@ const KinerjaDivisi = () => { - Detail Kinerja Divisi + Detail Kinerja Divisi - Nama Divisi - Target (%) - Pencapaian (%) - Status - Proyek Aktif - Anggaran - Terakhir Diperbarui + Nama Divisi + Target (%) + Pencapaian (%) + Status + Proyek Aktif + Anggaran + Terakhir Diperbarui @@ -236,9 +236,8 @@ const KinerjaDivisi = () => {
- Grafik Pencapaian Divisi - - + Grafik Pencapaian Divisi +

Grafik pencapaian akan ditampilkan di sini @@ -249,9 +248,8 @@ const KinerjaDivisi = () => { - Distribusi Anggaran Divisi - - + Distribusi Anggaran Divisi +

Diagram distribusi anggaran akan ditampilkan di sini diff --git a/src/app/components/pengaduan-layanan-publik.tsx b/src/components/pengaduan-layanan-publik.tsx similarity index 97% rename from src/app/components/pengaduan-layanan-publik.tsx rename to src/components/pengaduan-layanan-publik.tsx index 287a002..96fc23c 100644 --- a/src/app/components/pengaduan-layanan-publik.tsx +++ b/src/components/pengaduan-layanan-publik.tsx @@ -1,15 +1,15 @@ import type React from "react"; import { useState } from "react"; -import { Badge } from "@/app/components/ui/badge"; -import { Button } from "@/app/components/ui/button"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle, -} from "@/app/components/ui/card"; -import { Input } from "@/app/components/ui/input"; -import { Select } from "@/app/components/ui/select"; +} from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import { Select } from "@/components/ui/select"; import { Table, TableBody, @@ -17,8 +17,8 @@ import { TableHead, TableHeader, TableRow, -} from "@/app/components/ui/table"; -import { Textarea } from "@/app/components/ui/textarea"; +} from "@/components/ui/table"; +import { Textarea } from "@/components/ui/textarea"; const PengaduanLayananPublik = () => { const [activeTab, setActiveTab] = useState<"complaints" | "services">( diff --git a/src/app/components/sidebar.tsx b/src/components/sidebar.tsx similarity index 97% rename from src/app/components/sidebar.tsx rename to src/components/sidebar.tsx index df08a63..6539654 100644 --- a/src/app/components/sidebar.tsx +++ b/src/components/sidebar.tsx @@ -23,7 +23,7 @@ export function Sidebar({ className }: SidebarProps) { { name: "Beranda", path: "/dashboard" }, { name: "Kinerja Divisi", path: "/dashboard/kinerja-divisi" }, { name: "Pengaduan & Layanan Publik", path: "/dashboard/pengaduan-layanan-publik" }, - { name: "Jenna Analytic", path: "/dashboard/analytic" }, + { name: "Jenna Analytic", path: "/dashboard/jenna-analytic" }, { name: "Demografi & Kependudukan", path: "/dashboard/demografi" }, { name: "Keuangan & Anggaran", path: "/dashboard/keuangan" }, { name: "Bumdes & UMKM Desa", path: "/dashboard/bumdes" }, diff --git a/src/app/components/ui/accordion.tsx b/src/components/ui/accordion.tsx similarity index 100% rename from src/app/components/ui/accordion.tsx rename to src/components/ui/accordion.tsx diff --git a/src/app/components/ui/alert-dialog.tsx b/src/components/ui/alert-dialog.tsx similarity index 100% rename from src/app/components/ui/alert-dialog.tsx rename to src/components/ui/alert-dialog.tsx diff --git a/src/app/components/ui/alert.tsx b/src/components/ui/alert.tsx similarity index 100% rename from src/app/components/ui/alert.tsx rename to src/components/ui/alert.tsx diff --git a/src/app/components/ui/aspect-ratio.tsx b/src/components/ui/aspect-ratio.tsx similarity index 100% rename from src/app/components/ui/aspect-ratio.tsx rename to src/components/ui/aspect-ratio.tsx diff --git a/src/app/components/ui/avatar.tsx b/src/components/ui/avatar.tsx similarity index 100% rename from src/app/components/ui/avatar.tsx rename to src/components/ui/avatar.tsx diff --git a/src/app/components/ui/badge.tsx b/src/components/ui/badge.tsx similarity index 100% rename from src/app/components/ui/badge.tsx rename to src/components/ui/badge.tsx diff --git a/src/app/components/ui/breadcrumb.tsx b/src/components/ui/breadcrumb.tsx similarity index 100% rename from src/app/components/ui/breadcrumb.tsx rename to src/components/ui/breadcrumb.tsx diff --git a/src/app/components/ui/button.tsx b/src/components/ui/button.tsx similarity index 100% rename from src/app/components/ui/button.tsx rename to src/components/ui/button.tsx diff --git a/src/app/components/ui/calendar.tsx b/src/components/ui/calendar.tsx similarity index 100% rename from src/app/components/ui/calendar.tsx rename to src/components/ui/calendar.tsx diff --git a/src/app/components/ui/card.tsx b/src/components/ui/card.tsx similarity index 100% rename from src/app/components/ui/card.tsx rename to src/components/ui/card.tsx diff --git a/src/app/components/ui/carousel.tsx b/src/components/ui/carousel.tsx similarity index 100% rename from src/app/components/ui/carousel.tsx rename to src/components/ui/carousel.tsx diff --git a/src/app/components/ui/chart.tsx b/src/components/ui/chart.tsx similarity index 100% rename from src/app/components/ui/chart.tsx rename to src/components/ui/chart.tsx diff --git a/src/app/components/ui/checkbox.tsx b/src/components/ui/checkbox.tsx similarity index 100% rename from src/app/components/ui/checkbox.tsx rename to src/components/ui/checkbox.tsx diff --git a/src/app/components/ui/collapsible.tsx b/src/components/ui/collapsible.tsx similarity index 100% rename from src/app/components/ui/collapsible.tsx rename to src/components/ui/collapsible.tsx diff --git a/src/app/components/ui/command.tsx b/src/components/ui/command.tsx similarity index 100% rename from src/app/components/ui/command.tsx rename to src/components/ui/command.tsx diff --git a/src/app/components/ui/dialog.tsx b/src/components/ui/dialog.tsx similarity index 100% rename from src/app/components/ui/dialog.tsx rename to src/components/ui/dialog.tsx diff --git a/src/app/components/ui/drawer.tsx b/src/components/ui/drawer.tsx similarity index 100% rename from src/app/components/ui/drawer.tsx rename to src/components/ui/drawer.tsx diff --git a/src/app/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx similarity index 100% rename from src/app/components/ui/dropdown-menu.tsx rename to src/components/ui/dropdown-menu.tsx diff --git a/src/app/components/ui/form.tsx b/src/components/ui/form.tsx similarity index 100% rename from src/app/components/ui/form.tsx rename to src/components/ui/form.tsx diff --git a/src/app/components/ui/hover-card.tsx b/src/components/ui/hover-card.tsx similarity index 100% rename from src/app/components/ui/hover-card.tsx rename to src/components/ui/hover-card.tsx diff --git a/src/app/components/ui/input-otp.tsx b/src/components/ui/input-otp.tsx similarity index 100% rename from src/app/components/ui/input-otp.tsx rename to src/components/ui/input-otp.tsx diff --git a/src/app/components/ui/input.tsx b/src/components/ui/input.tsx similarity index 100% rename from src/app/components/ui/input.tsx rename to src/components/ui/input.tsx diff --git a/src/app/components/ui/label.tsx b/src/components/ui/label.tsx similarity index 100% rename from src/app/components/ui/label.tsx rename to src/components/ui/label.tsx diff --git a/src/app/components/ui/menubar.tsx b/src/components/ui/menubar.tsx similarity index 100% rename from src/app/components/ui/menubar.tsx rename to src/components/ui/menubar.tsx diff --git a/src/app/components/ui/navigation-menu.tsx b/src/components/ui/navigation-menu.tsx similarity index 100% rename from src/app/components/ui/navigation-menu.tsx rename to src/components/ui/navigation-menu.tsx diff --git a/src/app/components/ui/pagination.tsx b/src/components/ui/pagination.tsx similarity index 100% rename from src/app/components/ui/pagination.tsx rename to src/components/ui/pagination.tsx diff --git a/src/app/components/ui/popover.tsx b/src/components/ui/popover.tsx similarity index 100% rename from src/app/components/ui/popover.tsx rename to src/components/ui/popover.tsx diff --git a/src/app/components/ui/progress.tsx b/src/components/ui/progress.tsx similarity index 100% rename from src/app/components/ui/progress.tsx rename to src/components/ui/progress.tsx diff --git a/src/app/components/ui/radio-group.tsx b/src/components/ui/radio-group.tsx similarity index 100% rename from src/app/components/ui/radio-group.tsx rename to src/components/ui/radio-group.tsx diff --git a/src/app/components/ui/resizable.tsx b/src/components/ui/resizable.tsx similarity index 100% rename from src/app/components/ui/resizable.tsx rename to src/components/ui/resizable.tsx diff --git a/src/app/components/ui/scroll-area.tsx b/src/components/ui/scroll-area.tsx similarity index 100% rename from src/app/components/ui/scroll-area.tsx rename to src/components/ui/scroll-area.tsx diff --git a/src/app/components/ui/select.tsx b/src/components/ui/select.tsx similarity index 100% rename from src/app/components/ui/select.tsx rename to src/components/ui/select.tsx diff --git a/src/app/components/ui/separator.tsx b/src/components/ui/separator.tsx similarity index 100% rename from src/app/components/ui/separator.tsx rename to src/components/ui/separator.tsx diff --git a/src/app/components/ui/sheet.tsx b/src/components/ui/sheet.tsx similarity index 100% rename from src/app/components/ui/sheet.tsx rename to src/components/ui/sheet.tsx diff --git a/src/app/components/ui/sidebar.tsx b/src/components/ui/sidebar.tsx similarity index 100% rename from src/app/components/ui/sidebar.tsx rename to src/components/ui/sidebar.tsx diff --git a/src/app/components/ui/skeleton.tsx b/src/components/ui/skeleton.tsx similarity index 100% rename from src/app/components/ui/skeleton.tsx rename to src/components/ui/skeleton.tsx diff --git a/src/app/components/ui/slider.tsx b/src/components/ui/slider.tsx similarity index 100% rename from src/app/components/ui/slider.tsx rename to src/components/ui/slider.tsx diff --git a/src/app/components/ui/sonner.tsx b/src/components/ui/sonner.tsx similarity index 100% rename from src/app/components/ui/sonner.tsx rename to src/components/ui/sonner.tsx diff --git a/src/app/components/ui/switch.tsx b/src/components/ui/switch.tsx similarity index 100% rename from src/app/components/ui/switch.tsx rename to src/components/ui/switch.tsx diff --git a/src/app/components/ui/table.tsx b/src/components/ui/table.tsx similarity index 100% rename from src/app/components/ui/table.tsx rename to src/components/ui/table.tsx diff --git a/src/app/components/ui/tabs.tsx b/src/components/ui/tabs.tsx similarity index 100% rename from src/app/components/ui/tabs.tsx rename to src/components/ui/tabs.tsx diff --git a/src/app/components/ui/textarea.tsx b/src/components/ui/textarea.tsx similarity index 100% rename from src/app/components/ui/textarea.tsx rename to src/components/ui/textarea.tsx diff --git a/src/app/components/ui/toggle-group.tsx b/src/components/ui/toggle-group.tsx similarity index 100% rename from src/app/components/ui/toggle-group.tsx rename to src/components/ui/toggle-group.tsx diff --git a/src/app/components/ui/toggle.tsx b/src/components/ui/toggle.tsx similarity index 100% rename from src/app/components/ui/toggle.tsx rename to src/components/ui/toggle.tsx diff --git a/src/app/components/ui/tooltip.tsx b/src/components/ui/tooltip.tsx similarity index 100% rename from src/app/components/ui/tooltip.tsx rename to src/components/ui/tooltip.tsx diff --git a/src/app/components/ui/use-mobile.ts b/src/components/ui/use-mobile.ts similarity index 100% rename from src/app/components/ui/use-mobile.ts rename to src/components/ui/use-mobile.ts diff --git a/src/app/components/ui/utils.ts b/src/components/ui/utils.ts similarity index 100% rename from src/app/components/ui/utils.ts rename to src/components/ui/utils.ts diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index f51cfd6..a295175 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -22,6 +22,7 @@ import { Route as UsersIdRouteImport } from './routes/users/$id' import { Route as ProfileEditRouteImport } from './routes/profile/edit' import { Route as DashboardPengaduanLayananPublikRouteImport } from './routes/dashboard/pengaduan-layanan-publik' import { Route as DashboardKinerjaDivisiRouteImport } from './routes/dashboard/kinerja-divisi' +import { Route as DashboardJennaAnalyticRouteImport } from './routes/dashboard/jenna-analytic' import { Route as AdminUsersRouteImport } from './routes/admin/users' import { Route as AdminSettingsRouteImport } from './routes/admin/settings' import { Route as AdminApikeyRouteImport } from './routes/admin/apikey' @@ -92,6 +93,11 @@ const DashboardKinerjaDivisiRoute = DashboardKinerjaDivisiRouteImport.update({ path: '/kinerja-divisi', getParentRoute: () => DashboardRouteRoute, } as any) +const DashboardJennaAnalyticRoute = DashboardJennaAnalyticRouteImport.update({ + id: '/jenna-analytic', + path: '/jenna-analytic', + getParentRoute: () => DashboardRouteRoute, +} as any) const AdminUsersRoute = AdminUsersRouteImport.update({ id: '/users', path: '/users', @@ -117,6 +123,7 @@ export interface FileRoutesByFullPath { '/admin/apikey': typeof AdminApikeyRoute '/admin/settings': typeof AdminSettingsRoute '/admin/users': typeof AdminUsersRoute + '/dashboard/jenna-analytic': typeof DashboardJennaAnalyticRoute '/dashboard/kinerja-divisi': typeof DashboardKinerjaDivisiRoute '/dashboard/pengaduan-layanan-publik': typeof DashboardPengaduanLayananPublikRoute '/profile/edit': typeof ProfileEditRoute @@ -133,6 +140,7 @@ export interface FileRoutesByTo { '/admin/apikey': typeof AdminApikeyRoute '/admin/settings': typeof AdminSettingsRoute '/admin/users': typeof AdminUsersRoute + '/dashboard/jenna-analytic': typeof DashboardJennaAnalyticRoute '/dashboard/kinerja-divisi': typeof DashboardKinerjaDivisiRoute '/dashboard/pengaduan-layanan-publik': typeof DashboardPengaduanLayananPublikRoute '/profile/edit': typeof ProfileEditRoute @@ -152,6 +160,7 @@ export interface FileRoutesById { '/admin/apikey': typeof AdminApikeyRoute '/admin/settings': typeof AdminSettingsRoute '/admin/users': typeof AdminUsersRoute + '/dashboard/jenna-analytic': typeof DashboardJennaAnalyticRoute '/dashboard/kinerja-divisi': typeof DashboardKinerjaDivisiRoute '/dashboard/pengaduan-layanan-publik': typeof DashboardPengaduanLayananPublikRoute '/profile/edit': typeof ProfileEditRoute @@ -172,6 +181,7 @@ export interface FileRouteTypes { | '/admin/apikey' | '/admin/settings' | '/admin/users' + | '/dashboard/jenna-analytic' | '/dashboard/kinerja-divisi' | '/dashboard/pengaduan-layanan-publik' | '/profile/edit' @@ -188,6 +198,7 @@ export interface FileRouteTypes { | '/admin/apikey' | '/admin/settings' | '/admin/users' + | '/dashboard/jenna-analytic' | '/dashboard/kinerja-divisi' | '/dashboard/pengaduan-layanan-publik' | '/profile/edit' @@ -206,6 +217,7 @@ export interface FileRouteTypes { | '/admin/apikey' | '/admin/settings' | '/admin/users' + | '/dashboard/jenna-analytic' | '/dashboard/kinerja-divisi' | '/dashboard/pengaduan-layanan-publik' | '/profile/edit' @@ -321,6 +333,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof DashboardKinerjaDivisiRouteImport parentRoute: typeof DashboardRouteRoute } + '/dashboard/jenna-analytic': { + id: '/dashboard/jenna-analytic' + path: '/jenna-analytic' + fullPath: '/dashboard/jenna-analytic' + preLoaderRoute: typeof DashboardJennaAnalyticRouteImport + parentRoute: typeof DashboardRouteRoute + } '/admin/users': { id: '/admin/users' path: '/users' @@ -364,12 +383,14 @@ const AdminRouteRouteWithChildren = AdminRouteRoute._addFileChildren( ) interface DashboardRouteRouteChildren { + DashboardJennaAnalyticRoute: typeof DashboardJennaAnalyticRoute DashboardKinerjaDivisiRoute: typeof DashboardKinerjaDivisiRoute DashboardPengaduanLayananPublikRoute: typeof DashboardPengaduanLayananPublikRoute DashboardIndexRoute: typeof DashboardIndexRoute } const DashboardRouteRouteChildren: DashboardRouteRouteChildren = { + DashboardJennaAnalyticRoute: DashboardJennaAnalyticRoute, DashboardKinerjaDivisiRoute: DashboardKinerjaDivisiRoute, DashboardPengaduanLayananPublikRoute: DashboardPengaduanLayananPublikRoute, DashboardIndexRoute: DashboardIndexRoute, diff --git a/src/routes/dashboard/index.ts b/src/routes/dashboard/index.ts index 2df09ef..b565d53 100644 --- a/src/routes/dashboard/index.ts +++ b/src/routes/dashboard/index.ts @@ -1,5 +1,5 @@ import { createFileRoute } from "@tanstack/react-router"; -import { DashboardContent } from "../../app/components/dashboard-content"; +import { DashboardContent } from "@/components/dashboard-content"; export const Route = createFileRoute("/dashboard/")({ component: DashboardContent, }); diff --git a/src/routes/dashboard/jenna-analytic.ts b/src/routes/dashboard/jenna-analytic.ts new file mode 100644 index 0000000..1cd3ac0 --- /dev/null +++ b/src/routes/dashboard/jenna-analytic.ts @@ -0,0 +1,6 @@ +import { createFileRoute } from '@tanstack/react-router' +import JennaAnalytic from '@/components/jenna-analytic' + +export const Route = createFileRoute('/dashboard/jenna-analytic')({ + component: JennaAnalytic, +}) diff --git a/src/routes/dashboard/kinerja-divisi.ts b/src/routes/dashboard/kinerja-divisi.ts index 426e817..703d9f3 100644 --- a/src/routes/dashboard/kinerja-divisi.ts +++ b/src/routes/dashboard/kinerja-divisi.ts @@ -1,5 +1,5 @@ import { createFileRoute } from "@tanstack/react-router"; -import KinerjaDivisi from "../../app/components/kinerja-divisi"; +import KinerjaDivisi from "@/components/kinerja-divisi"; export const Route = createFileRoute("/dashboard/kinerja-divisi")({ component: KinerjaDivisi, }); diff --git a/src/routes/dashboard/pengaduan-layanan-publik.ts b/src/routes/dashboard/pengaduan-layanan-publik.ts index a08e622..49cce46 100644 --- a/src/routes/dashboard/pengaduan-layanan-publik.ts +++ b/src/routes/dashboard/pengaduan-layanan-publik.ts @@ -1,5 +1,5 @@ import { createFileRoute } from "@tanstack/react-router"; -import PengaduanLayananPublik from "../../app/components/pengaduan-layanan-publik"; +import PengaduanLayananPublik from "@/components/pengaduan-layanan-publik"; export const Route = createFileRoute("/dashboard/pengaduan-layanan-publik")({ component: PengaduanLayananPublik, }); diff --git a/src/routes/dashboard/route.tsx b/src/routes/dashboard/route.tsx index 482556f..f3046e4 100644 --- a/src/routes/dashboard/route.tsx +++ b/src/routes/dashboard/route.tsx @@ -1,6 +1,6 @@ import { createFileRoute, Outlet } from "@tanstack/react-router"; -import { Header } from "@/app/components/header"; -import { Sidebar } from "@/app/components/sidebar"; +import { Header } from "@/components/header"; +import { Sidebar } from "@/components/sidebar"; import { AppShell, Burger, Group } from "@mantine/core"; import { useDisclosure } from "@mantine/hooks";