Refactor New Ui Bumdes 02

This commit is contained in:
2026-03-25 10:32:31 +08:00
parent 84b96ca3be
commit 71a305cd4b
14 changed files with 302 additions and 89 deletions

View File

@@ -9,11 +9,18 @@ import {
Title, Title,
useMantineColorScheme, useMantineColorScheme,
} from "@mantine/core"; } from "@mantine/core";
import { IconUserShield } from "@tabler/icons-react"; import {
IconLayoutSidebarLeftCollapse,
IconUserShield,
} from "@tabler/icons-react";
import { useLocation, useNavigate } from "@tanstack/react-router"; import { useLocation, useNavigate } from "@tanstack/react-router";
import { Bell, Moon, Sun, User as UserIcon } from "lucide-react"; // Renamed User to UserIcon to avoid conflict with Mantine's User component if it exists import { Bell, Moon, Sun, User as UserIcon } from "lucide-react";
export function Header() { interface HeaderProps {
onSidebarToggle?: () => void;
}
export function Header({ onSidebarToggle }: HeaderProps) {
const location = useLocation(); const location = useLocation();
const { colorScheme, toggleColorScheme } = useMantineColorScheme(); const { colorScheme, toggleColorScheme } = useMantineColorScheme();
const dark = colorScheme === "dark"; const dark = colorScheme === "dark";
@@ -56,9 +63,24 @@ export function Header() {
return ( return (
<Group justify="space-between" w="100%"> <Group justify="space-between" w="100%">
{/* Title */} {/* Title */}
<Title order={3} c={"white"}> <Group gap="md">
<ActionIcon
onClick={onSidebarToggle}
variant="subtle"
size="lg"
radius="xl"
visibleFrom="sm"
aria-label="Toggle sidebar"
>
<IconLayoutSidebarLeftCollapse
color="white"
style={{ width: "70%", height: "70%" }}
/>
</ActionIcon>
{/* <Title order={3} c={"white"}>
{getPageTitle()} {getPageTitle()}
</Title> </Title> */}
</Group>
{/* Right Section */} {/* Right Section */}
<Group gap="md"> <Group gap="md">

View File

@@ -1,19 +1,18 @@
import { import {
Badge, Avatar,
Card, Card,
Grid, Grid,
GridCol, GridCol,
Group, Group,
Stack, Stack,
Text, Text,
useMantineColorScheme, useMantineColorScheme
} from "@mantine/core"; } from "@mantine/core";
import { import {
IconBuildingStore,
IconCategory, IconCategory,
IconCurrency,
IconCurrencyDollar, IconCurrencyDollar,
IconUsers, IconTrendingUp,
IconUsers
} from "@tabler/icons-react"; } from "@tabler/icons-react";
interface KpiCardProps { interface KpiCardProps {
@@ -22,9 +21,10 @@ interface KpiCardProps {
subtitle?: string; subtitle?: string;
icon: React.ReactNode; icon: React.ReactNode;
color: string; color: string;
backgroundColor: string;
} }
const KpiCard = ({ title, value, subtitle, icon, color }: KpiCardProps) => { const KpiCard = ({ title, value, subtitle, icon, color, backgroundColor }: KpiCardProps) => {
const { colorScheme } = useMantineColorScheme(); const { colorScheme } = useMantineColorScheme();
const dark = colorScheme === "dark"; const dark = colorScheme === "dark";
@@ -64,10 +64,10 @@ const KpiCard = ({ title, value, subtitle, icon, color }: KpiCardProps) => {
</Text> </Text>
)} )}
</Stack> </Stack>
<Badge <Avatar
variant="light"
color={color} color={color}
p={10} bg={backgroundColor}
size={40}
radius="xl" radius="xl"
style={{ style={{
display: "flex", display: "flex",
@@ -76,7 +76,7 @@ const KpiCard = ({ title, value, subtitle, icon, color }: KpiCardProps) => {
}} }}
> >
{icon} {icon}
</Badge> </Avatar>
</Group> </Group>
</Card> </Card>
); );
@@ -106,29 +106,33 @@ export const SummaryCards = ({ data }: SummaryCardsProps) => {
title: "UMKM Aktif", title: "UMKM Aktif",
value: displayData.umkmAktif, value: displayData.umkmAktif,
subtitle: "Beroperasi", subtitle: "Beroperasi",
icon: <IconCurrencyDollar size={20} />, icon: <IconCurrencyDollar size={25} />,
color: "darmasaba-blue", color: "white",
backgroundColor: "#1E3A5F"
}, },
{ {
title: "UMKM Terdaftar", title: "UMKM Terdaftar",
value: displayData.umkmTerdaftar, value: displayData.umkmTerdaftar,
subtitle: "Total registrasi", subtitle: "Total registrasi",
icon: <IconBuildingStore size={20} />, icon: <IconUsers size={25} />,
color: "darmasaba-success", color: "white",
backgroundColor: "#1E3A5F"
}, },
{ {
title: "Omzet", title: "Omzet",
value: displayData.omzet, value: displayData.omzet,
subtitle: "Omzet BUMDes per bulan", subtitle: "Omzet BUMDes per bulan",
icon: <IconCurrency size={20} />, icon: <IconTrendingUp size={25} />,
color: "darmasaba-warning", color: "white",
backgroundColor: "#1E3A5F"
}, },
{ {
title: "UMKM Terbanyak", title: "UMKM Terbanyak",
value: displayData.kategoriTerbanyak.count, value: displayData.kategoriTerbanyak.count,
subtitle: `Kategori ${displayData.kategoriTerbanyak.name}`, subtitle: `Kategori ${displayData.kategoriTerbanyak.name}`,
icon: <IconCategory size={20} />, icon: <IconTrendingUp size={25} />,
color: "darmasaba-danger", color: "white",
backgroundColor: "#1E3A5F"
}, },
]; ];

View File

@@ -0,0 +1,25 @@
import { useDisclosure } from "@mantine/hooks";
export function useSidebarFullscreen() {
const [opened, { toggle: toggleMobile }] = useDisclosure();
const [sidebarCollapsed, setSidebarCollapsed] = useDisclosure(false);
const toggleSidebar = () => {
setSidebarCollapsed.toggle();
};
const handleMainClick = () => {
if (!sidebarCollapsed) {
toggleSidebar();
}
};
return {
opened,
toggleMobile,
sidebarCollapsed,
toggleSidebar,
handleMainClick,
isCollapsed: sidebarCollapsed,
};
}

View File

@@ -1,16 +1,22 @@
import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core"; import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core";
import { useDisclosure } from "@mantine/hooks";
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from "@tanstack/react-router";
import { Header } from "@/components/header"; import { Header } from "@/components/header";
import HelpPage from "@/components/help-page"; import HelpPage from "@/components/help-page";
import { Sidebar } from "@/components/sidebar"; import { Sidebar } from "@/components/sidebar";
import { useSidebarFullscreen } from "@/hooks/use-sidebar-fullscreen";
export const Route = createFileRoute("/bantuan")({ export const Route = createFileRoute("/bantuan")({
component: BantuanRoute, component: BantuanRoute,
}); });
function BantuanRoute() { function BantuanRoute() {
const [opened, { toggle }] = useDisclosure(); const {
opened,
toggleMobile,
sidebarCollapsed,
toggleSidebar,
handleMainClick,
} = useSidebarFullscreen();
const { colorScheme } = useMantineColorScheme(); const { colorScheme } = useMantineColorScheme();
const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E"; const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E";
const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white"; const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white";
@@ -22,14 +28,19 @@ function BantuanRoute() {
navbar={{ navbar={{
width: 300, width: 300,
breakpoint: "sm", breakpoint: "sm",
collapsed: { mobile: !opened }, collapsed: { mobile: !opened, desktop: sidebarCollapsed },
}} }}
padding="md" padding="md"
> >
<AppShell.Header bg={headerBgColor}> <AppShell.Header bg={headerBgColor}>
<Group h="100%" px="md"> <Group h="100%" px="md">
<Burger opened={opened} onClick={toggle} hiddenFrom="sm" size="sm" /> <Burger
<Header /> opened={opened}
onClick={toggleMobile}
hiddenFrom="sm"
size="sm"
/>
<Header onSidebarToggle={toggleSidebar} />
</Group> </Group>
</AppShell.Header> </AppShell.Header>
@@ -43,7 +54,11 @@ function BantuanRoute() {
</div> </div>
</AppShell.Navbar> </AppShell.Navbar>
<AppShell.Main bg={mainBgColor}> <AppShell.Main
bg={mainBgColor}
onClick={handleMainClick}
style={{ cursor: sidebarCollapsed ? "default" : "pointer" }}
>
<HelpPage /> <HelpPage />
</AppShell.Main> </AppShell.Main>
</AppShell> </AppShell>

View File

@@ -1,16 +1,22 @@
import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core"; import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core";
import { useDisclosure } from "@mantine/hooks";
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from "@tanstack/react-router";
import BumdesPage from "@/components/bumdes-page"; import BumdesPage from "@/components/bumdes-page";
import { Header } from "@/components/header"; import { Header } from "@/components/header";
import { Sidebar } from "@/components/sidebar"; import { Sidebar } from "@/components/sidebar";
import { useSidebarFullscreen } from "@/hooks/use-sidebar-fullscreen";
export const Route = createFileRoute("/bumdes")({ export const Route = createFileRoute("/bumdes")({
component: BumdesRoute, component: BumdesRoute,
}); });
function BumdesRoute() { function BumdesRoute() {
const [opened, { toggle }] = useDisclosure(); const {
opened,
toggleMobile,
sidebarCollapsed,
toggleSidebar,
handleMainClick,
} = useSidebarFullscreen();
const { colorScheme } = useMantineColorScheme(); const { colorScheme } = useMantineColorScheme();
const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E"; const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E";
const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white"; const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white";
@@ -22,14 +28,19 @@ function BumdesRoute() {
navbar={{ navbar={{
width: 300, width: 300,
breakpoint: "sm", breakpoint: "sm",
collapsed: { mobile: !opened }, collapsed: { mobile: !opened, desktop: sidebarCollapsed },
}} }}
padding="md" padding="md"
> >
<AppShell.Header bg={headerBgColor}> <AppShell.Header bg={headerBgColor}>
<Group h="100%" px="md"> <Group h="100%" px="md">
<Burger opened={opened} onClick={toggle} hiddenFrom="sm" size="sm" /> <Burger
<Header /> opened={opened}
onClick={toggleMobile}
hiddenFrom="sm"
size="sm"
/>
<Header onSidebarToggle={toggleSidebar} />
</Group> </Group>
</AppShell.Header> </AppShell.Header>
@@ -43,7 +54,11 @@ function BumdesRoute() {
</div> </div>
</AppShell.Navbar> </AppShell.Navbar>
<AppShell.Main bg={mainBgColor}> <AppShell.Main
bg={mainBgColor}
onClick={handleMainClick}
style={{ cursor: sidebarCollapsed ? "default" : "pointer" }}
>
<BumdesPage /> <BumdesPage />
</AppShell.Main> </AppShell.Main>
</AppShell> </AppShell>

View File

@@ -1,8 +1,8 @@
import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core"; import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core";
import { useDisclosure } from "@mantine/hooks";
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from "@tanstack/react-router";
import { Header } from "@/components/header"; import { Header } from "@/components/header";
import { Sidebar } from "@/components/sidebar"; import { Sidebar } from "@/components/sidebar";
import { useSidebarFullscreen } from "@/hooks/use-sidebar-fullscreen";
import DemografiPekerjaan from "../components/demografi-pekerjaan"; import DemografiPekerjaan from "../components/demografi-pekerjaan";
export const Route = createFileRoute("/demografi-pekerjaan")({ export const Route = createFileRoute("/demografi-pekerjaan")({
@@ -10,7 +10,13 @@ export const Route = createFileRoute("/demografi-pekerjaan")({
}); });
function DemografiPekerjaanPage() { function DemografiPekerjaanPage() {
const [opened, { toggle }] = useDisclosure(); const {
opened,
toggleMobile,
sidebarCollapsed,
toggleSidebar,
handleMainClick,
} = useSidebarFullscreen();
const { colorScheme } = useMantineColorScheme(); const { colorScheme } = useMantineColorScheme();
const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E"; const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E";
const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white"; const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white";
@@ -22,14 +28,19 @@ function DemografiPekerjaanPage() {
navbar={{ navbar={{
width: 300, width: 300,
breakpoint: "sm", breakpoint: "sm",
collapsed: { mobile: !opened }, collapsed: { mobile: !opened, desktop: sidebarCollapsed },
}} }}
padding="md" padding="md"
> >
<AppShell.Header bg={headerBgColor}> <AppShell.Header bg={headerBgColor}>
<Group h="100%" px="md"> <Group h="100%" px="md">
<Burger opened={opened} onClick={toggle} hiddenFrom="sm" size="sm" /> <Burger
<Header /> opened={opened}
onClick={toggleMobile}
hiddenFrom="sm"
size="sm"
/>
<Header onSidebarToggle={toggleSidebar} />
</Group> </Group>
</AppShell.Header> </AppShell.Header>
@@ -43,7 +54,11 @@ function DemografiPekerjaanPage() {
</div> </div>
</AppShell.Navbar> </AppShell.Navbar>
<AppShell.Main bg={mainBgColor}> <AppShell.Main
bg={mainBgColor}
onClick={handleMainClick}
style={{ cursor: sidebarCollapsed ? "default" : "pointer" }}
>
<DemografiPekerjaan /> <DemografiPekerjaan />
</AppShell.Main> </AppShell.Main>
</AppShell> </AppShell>

View File

@@ -11,25 +11,32 @@ export const Route = createFileRoute("/")({
function DashboardPage() { function DashboardPage() {
const [opened, { toggle }] = useDisclosure(); const [opened, { toggle }] = useDisclosure();
const [sidebarCollapsed, setSidebarCollapsed] = useDisclosure(false);
const { colorScheme } = useMantineColorScheme(); const { colorScheme } = useMantineColorScheme();
const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E"; const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E";
const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white"; const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white";
const mainBgColor = colorScheme === "dark" ? "#11192D" : "#edf3f8ff"; const mainBgColor = colorScheme === "dark" ? "#11192D" : "#edf3f8ff";
const handleMainClick = () => {
if (!sidebarCollapsed) {
setSidebarCollapsed.toggle();
}
};
return ( return (
<AppShell <AppShell
header={{ height: 60 }} header={{ height: 60 }}
navbar={{ navbar={{
width: 300, width: 300,
breakpoint: "sm", breakpoint: "sm",
collapsed: { mobile: !opened }, collapsed: { mobile: !opened, desktop: sidebarCollapsed },
}} }}
padding="md" padding="md"
> >
<AppShell.Header bg={headerBgColor}> <AppShell.Header bg={headerBgColor}>
<Group h="100%" px="md"> <Group h="100%" px="md">
<Burger opened={opened} onClick={toggle} hiddenFrom="sm" size="sm" /> <Burger opened={opened} onClick={toggle} hiddenFrom="sm" size="sm" />
<Header /> <Header onSidebarToggle={setSidebarCollapsed.toggle} />
</Group> </Group>
</AppShell.Header> </AppShell.Header>
@@ -43,7 +50,11 @@ function DashboardPage() {
</div> </div>
</AppShell.Navbar> </AppShell.Navbar>
<AppShell.Main bg={mainBgColor}> <AppShell.Main
bg={mainBgColor}
onClick={handleMainClick}
style={{ cursor: sidebarCollapsed ? "default" : "pointer" }}
>
<DashboardContent /> <DashboardContent />
</AppShell.Main> </AppShell.Main>
</AppShell> </AppShell>

View File

@@ -1,16 +1,22 @@
import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core"; import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core";
import { useDisclosure } from "@mantine/hooks";
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from "@tanstack/react-router";
import { Header } from "@/components/header"; import { Header } from "@/components/header";
import JennaAnalytic from "@/components/jenna-analytic"; import JennaAnalytic from "@/components/jenna-analytic";
import { Sidebar } from "@/components/sidebar"; import { Sidebar } from "@/components/sidebar";
import { useSidebarFullscreen } from "@/hooks/use-sidebar-fullscreen";
export const Route = createFileRoute("/jenna-analytic")({ export const Route = createFileRoute("/jenna-analytic")({
component: JennaAnalyticPage, component: JennaAnalyticPage,
}); });
function JennaAnalyticPage() { function JennaAnalyticPage() {
const [opened, { toggle }] = useDisclosure(); const {
opened,
toggleMobile,
sidebarCollapsed,
toggleSidebar,
handleMainClick,
} = useSidebarFullscreen();
const { colorScheme } = useMantineColorScheme(); const { colorScheme } = useMantineColorScheme();
const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E"; const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E";
const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white"; const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white";
@@ -22,14 +28,19 @@ function JennaAnalyticPage() {
navbar={{ navbar={{
width: 300, width: 300,
breakpoint: "sm", breakpoint: "sm",
collapsed: { mobile: !opened }, collapsed: { mobile: !opened, desktop: sidebarCollapsed },
}} }}
padding="md" padding="md"
> >
<AppShell.Header bg={headerBgColor}> <AppShell.Header bg={headerBgColor}>
<Group h="100%" px="md"> <Group h="100%" px="md">
<Burger opened={opened} onClick={toggle} hiddenFrom="sm" size="sm" /> <Burger
<Header /> opened={opened}
onClick={toggleMobile}
hiddenFrom="sm"
size="sm"
/>
<Header onSidebarToggle={toggleSidebar} />
</Group> </Group>
</AppShell.Header> </AppShell.Header>
@@ -43,7 +54,11 @@ function JennaAnalyticPage() {
</div> </div>
</AppShell.Navbar> </AppShell.Navbar>
<AppShell.Main bg={mainBgColor}> <AppShell.Main
bg={mainBgColor}
onClick={handleMainClick}
style={{ cursor: sidebarCollapsed ? "default" : "pointer" }}
>
<JennaAnalytic /> <JennaAnalytic />
</AppShell.Main> </AppShell.Main>
</AppShell> </AppShell>

View File

@@ -1,16 +1,22 @@
import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core"; import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core";
import { useDisclosure } from "@mantine/hooks";
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from "@tanstack/react-router";
import { Header } from "@/components/header"; import { Header } from "@/components/header";
import KeamananPage from "@/components/keamanan-page"; import KeamananPage from "@/components/keamanan-page";
import { Sidebar } from "@/components/sidebar"; import { Sidebar } from "@/components/sidebar";
import { useSidebarFullscreen } from "@/hooks/use-sidebar-fullscreen";
export const Route = createFileRoute("/keamanan")({ export const Route = createFileRoute("/keamanan")({
component: KeamananRoute, component: KeamananRoute,
}); });
function KeamananRoute() { function KeamananRoute() {
const [opened, { toggle }] = useDisclosure(); const {
opened,
toggleMobile,
sidebarCollapsed,
toggleSidebar,
handleMainClick,
} = useSidebarFullscreen();
const { colorScheme } = useMantineColorScheme(); const { colorScheme } = useMantineColorScheme();
const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E"; const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E";
const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white"; const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white";
@@ -22,14 +28,19 @@ function KeamananRoute() {
navbar={{ navbar={{
width: 300, width: 300,
breakpoint: "sm", breakpoint: "sm",
collapsed: { mobile: !opened }, collapsed: { mobile: !opened, desktop: sidebarCollapsed },
}} }}
padding="md" padding="md"
> >
<AppShell.Header bg={headerBgColor}> <AppShell.Header bg={headerBgColor}>
<Group h="100%" px="md"> <Group h="100%" px="md">
<Burger opened={opened} onClick={toggle} hiddenFrom="sm" size="sm" /> <Burger
<Header /> opened={opened}
onClick={toggleMobile}
hiddenFrom="sm"
size="sm"
/>
<Header onSidebarToggle={toggleSidebar} />
</Group> </Group>
</AppShell.Header> </AppShell.Header>
@@ -43,7 +54,11 @@ function KeamananRoute() {
</div> </div>
</AppShell.Navbar> </AppShell.Navbar>
<AppShell.Main bg={mainBgColor}> <AppShell.Main
bg={mainBgColor}
onClick={handleMainClick}
style={{ cursor: sidebarCollapsed ? "default" : "pointer" }}
>
<KeamananPage /> <KeamananPage />
</AppShell.Main> </AppShell.Main>
</AppShell> </AppShell>

View File

@@ -1,16 +1,22 @@
import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core"; import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core";
import { useDisclosure } from "@mantine/hooks";
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from "@tanstack/react-router";
import { Header } from "@/components/header"; import { Header } from "@/components/header";
import KeuanganAnggaran from "@/components/keuangan-anggaran"; import KeuanganAnggaran from "@/components/keuangan-anggaran";
import { Sidebar } from "@/components/sidebar"; import { Sidebar } from "@/components/sidebar";
import { useSidebarFullscreen } from "@/hooks/use-sidebar-fullscreen";
export const Route = createFileRoute("/keuangan-anggaran")({ export const Route = createFileRoute("/keuangan-anggaran")({
component: KeuanganAnggaranPage, component: KeuanganAnggaranPage,
}); });
function KeuanganAnggaranPage() { function KeuanganAnggaranPage() {
const [opened, { toggle }] = useDisclosure(); const {
opened,
toggleMobile,
sidebarCollapsed,
toggleSidebar,
handleMainClick,
} = useSidebarFullscreen();
const { colorScheme } = useMantineColorScheme(); const { colorScheme } = useMantineColorScheme();
const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E"; const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E";
const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white"; const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white";
@@ -22,14 +28,19 @@ function KeuanganAnggaranPage() {
navbar={{ navbar={{
width: 300, width: 300,
breakpoint: "sm", breakpoint: "sm",
collapsed: { mobile: !opened }, collapsed: { mobile: !opened, desktop: sidebarCollapsed },
}} }}
padding="md" padding="md"
> >
<AppShell.Header bg={headerBgColor}> <AppShell.Header bg={headerBgColor}>
<Group h="100%" px="md"> <Group h="100%" px="md">
<Burger opened={opened} onClick={toggle} hiddenFrom="sm" size="sm" /> <Burger
<Header /> opened={opened}
onClick={toggleMobile}
hiddenFrom="sm"
size="sm"
/>
<Header onSidebarToggle={toggleSidebar} />
</Group> </Group>
</AppShell.Header> </AppShell.Header>
@@ -43,7 +54,11 @@ function KeuanganAnggaranPage() {
</div> </div>
</AppShell.Navbar> </AppShell.Navbar>
<AppShell.Main bg={mainBgColor}> <AppShell.Main
bg={mainBgColor}
onClick={handleMainClick}
style={{ cursor: sidebarCollapsed ? "default" : "pointer" }}
>
<KeuanganAnggaran /> <KeuanganAnggaran />
</AppShell.Main> </AppShell.Main>
</AppShell> </AppShell>

View File

@@ -1,16 +1,22 @@
import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core"; import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core";
import { useDisclosure } from "@mantine/hooks";
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from "@tanstack/react-router";
import { Header } from "@/components/header"; import { Header } from "@/components/header";
import KinerjaDivisi from "@/components/kinerja-divisi"; import KinerjaDivisi from "@/components/kinerja-divisi";
import { Sidebar } from "@/components/sidebar"; import { Sidebar } from "@/components/sidebar";
import { useSidebarFullscreen } from "@/hooks/use-sidebar-fullscreen";
export const Route = createFileRoute("/kinerja-divisi")({ export const Route = createFileRoute("/kinerja-divisi")({
component: KinerjaDivisiPage, component: KinerjaDivisiPage,
}); });
function KinerjaDivisiPage() { function KinerjaDivisiPage() {
const [opened, { toggle }] = useDisclosure(); const {
opened,
toggleMobile,
sidebarCollapsed,
toggleSidebar,
handleMainClick,
} = useSidebarFullscreen();
const { colorScheme } = useMantineColorScheme(); const { colorScheme } = useMantineColorScheme();
const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E"; const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E";
const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white"; const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white";
@@ -22,14 +28,19 @@ function KinerjaDivisiPage() {
navbar={{ navbar={{
width: 300, width: 300,
breakpoint: "sm", breakpoint: "sm",
collapsed: { mobile: !opened }, collapsed: { mobile: !opened, desktop: sidebarCollapsed },
}} }}
padding="md" padding="md"
> >
<AppShell.Header bg={headerBgColor}> <AppShell.Header bg={headerBgColor}>
<Group h="100%" px="md"> <Group h="100%" px="md">
<Burger opened={opened} onClick={toggle} hiddenFrom="sm" size="sm" /> <Burger
<Header /> opened={opened}
onClick={toggleMobile}
hiddenFrom="sm"
size="sm"
/>
<Header onSidebarToggle={toggleSidebar} />
</Group> </Group>
</AppShell.Header> </AppShell.Header>
@@ -43,7 +54,11 @@ function KinerjaDivisiPage() {
</div> </div>
</AppShell.Navbar> </AppShell.Navbar>
<AppShell.Main bg={mainBgColor}> <AppShell.Main
bg={mainBgColor}
onClick={handleMainClick}
style={{ cursor: sidebarCollapsed ? "default" : "pointer" }}
>
<KinerjaDivisi /> <KinerjaDivisi />
</AppShell.Main> </AppShell.Main>
</AppShell> </AppShell>

View File

@@ -1,16 +1,22 @@
import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core"; import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core";
import { useDisclosure } from "@mantine/hooks";
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from "@tanstack/react-router";
import { Header } from "@/components/header"; import { Header } from "@/components/header";
import PengaduanLayananPublik from "@/components/pengaduan-layanan-publik"; import PengaduanLayananPublik from "@/components/pengaduan-layanan-publik";
import { Sidebar } from "@/components/sidebar"; import { Sidebar } from "@/components/sidebar";
import { useSidebarFullscreen } from "@/hooks/use-sidebar-fullscreen";
export const Route = createFileRoute("/pengaduan-layanan-publik")({ export const Route = createFileRoute("/pengaduan-layanan-publik")({
component: PengaduanLayananPublikPage, component: PengaduanLayananPublikPage,
}); });
function PengaduanLayananPublikPage() { function PengaduanLayananPublikPage() {
const [opened, { toggle }] = useDisclosure(); const {
opened,
toggleMobile,
sidebarCollapsed,
toggleSidebar,
handleMainClick,
} = useSidebarFullscreen();
const { colorScheme } = useMantineColorScheme(); const { colorScheme } = useMantineColorScheme();
const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E"; const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E";
const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white"; const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white";
@@ -22,14 +28,19 @@ function PengaduanLayananPublikPage() {
navbar={{ navbar={{
width: 300, width: 300,
breakpoint: "sm", breakpoint: "sm",
collapsed: { mobile: !opened }, collapsed: { mobile: !opened, desktop: sidebarCollapsed },
}} }}
padding="md" padding="md"
> >
<AppShell.Header bg={headerBgColor}> <AppShell.Header bg={headerBgColor}>
<Group h="100%" px="md"> <Group h="100%" px="md">
<Burger opened={opened} onClick={toggle} hiddenFrom="sm" size="sm" /> <Burger
<Header /> opened={opened}
onClick={toggleMobile}
hiddenFrom="sm"
size="sm"
/>
<Header onSidebarToggle={toggleSidebar} />
</Group> </Group>
</AppShell.Header> </AppShell.Header>
@@ -43,7 +54,11 @@ function PengaduanLayananPublikPage() {
</div> </div>
</AppShell.Navbar> </AppShell.Navbar>
<AppShell.Main bg={mainBgColor}> <AppShell.Main
bg={mainBgColor}
onClick={handleMainClick}
style={{ cursor: sidebarCollapsed ? "default" : "pointer" }}
>
<PengaduanLayananPublik /> <PengaduanLayananPublik />
</AppShell.Main> </AppShell.Main>
</AppShell> </AppShell>

View File

@@ -1,5 +1,5 @@
import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core"; import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core";
import { useDisclosure, useMediaQuery } from "@mantine/hooks"; import { useMediaQuery } from "@mantine/hooks";
import { import {
createFileRoute, createFileRoute,
Outlet, Outlet,
@@ -8,13 +8,20 @@ import {
import { useEffect } from "react"; import { useEffect } from "react";
import { Header } from "@/components/header"; import { Header } from "@/components/header";
import { Sidebar } from "@/components/sidebar"; import { Sidebar } from "@/components/sidebar";
import { useSidebarFullscreen } from "@/hooks/use-sidebar-fullscreen";
export const Route = createFileRoute("/pengaturan")({ export const Route = createFileRoute("/pengaturan")({
component: PengaturanLayout, component: PengaturanLayout,
}); });
function PengaturanLayout() { function PengaturanLayout() {
const [opened, { toggle, close }] = useDisclosure(); const {
opened,
toggleMobile,
sidebarCollapsed,
toggleSidebar,
handleMainClick,
} = useSidebarFullscreen();
const { colorScheme } = useMantineColorScheme(); const { colorScheme } = useMantineColorScheme();
const isMobile = useMediaQuery("(max-width: 48em)"); const isMobile = useMediaQuery("(max-width: 48em)");
@@ -27,9 +34,9 @@ function PengaturanLayout() {
// Auto close navbar on route change (mobile only) // Auto close navbar on route change (mobile only)
useEffect(() => { useEffect(() => {
if (isMobile && opened) { if (isMobile && opened) {
close(); toggleMobile();
} }
}, [routerState.location.pathname, isMobile, opened, close]); }, [routerState.location.pathname, isMobile, opened, toggleMobile]);
return ( return (
<AppShell <AppShell
@@ -37,14 +44,19 @@ function PengaturanLayout() {
navbar={{ navbar={{
width: 300, width: 300,
breakpoint: "sm", breakpoint: "sm",
collapsed: { mobile: !opened }, collapsed: { mobile: !opened, desktop: sidebarCollapsed },
}} }}
padding="md" padding="md"
> >
<AppShell.Header bg={headerBgColor}> <AppShell.Header bg={headerBgColor}>
<Group h="100%" px="lg" align="center" wrap="nowrap"> <Group h="100%" px="lg" align="center" wrap="nowrap">
<Burger opened={opened} onClick={toggle} hiddenFrom="sm" size="sm" /> <Burger
<Header /> opened={opened}
onClick={toggleMobile}
hiddenFrom="sm"
size="sm"
/>
<Header onSidebarToggle={toggleSidebar} />
</Group> </Group>
</AppShell.Header> </AppShell.Header>
@@ -58,7 +70,11 @@ function PengaturanLayout() {
</div> </div>
</AppShell.Navbar> </AppShell.Navbar>
<AppShell.Main bg={mainBgColor}> <AppShell.Main
bg={mainBgColor}
onClick={handleMainClick}
style={{ cursor: sidebarCollapsed ? "default" : "pointer" }}
>
<div className="p-2"> <div className="p-2">
<Outlet /> <Outlet />
</div> </div>

View File

@@ -1,16 +1,22 @@
import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core"; import { AppShell, Burger, Group, useMantineColorScheme } from "@mantine/core";
import { useDisclosure } from "@mantine/hooks";
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from "@tanstack/react-router";
import { Header } from "@/components/header"; import { Header } from "@/components/header";
import { Sidebar } from "@/components/sidebar"; import { Sidebar } from "@/components/sidebar";
import SosialPage from "@/components/sosial-page"; import SosialPage from "@/components/sosial-page";
import { useSidebarFullscreen } from "@/hooks/use-sidebar-fullscreen";
export const Route = createFileRoute("/sosial")({ export const Route = createFileRoute("/sosial")({
component: SosialRoute, component: SosialRoute,
}); });
function SosialRoute() { function SosialRoute() {
const [opened, { toggle }] = useDisclosure(); const {
opened,
toggleMobile,
sidebarCollapsed,
toggleSidebar,
handleMainClick,
} = useSidebarFullscreen();
const { colorScheme } = useMantineColorScheme(); const { colorScheme } = useMantineColorScheme();
const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E"; const headerBgColor = colorScheme === "dark" ? "#11192D" : "#19355E";
const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white"; const navbarBgColor = colorScheme === "dark" ? "#11192D" : "white";
@@ -22,14 +28,19 @@ function SosialRoute() {
navbar={{ navbar={{
width: 300, width: 300,
breakpoint: "sm", breakpoint: "sm",
collapsed: { mobile: !opened }, collapsed: { mobile: !opened, desktop: sidebarCollapsed },
}} }}
padding="md" padding="md"
> >
<AppShell.Header bg={headerBgColor}> <AppShell.Header bg={headerBgColor}>
<Group h="100%" px="md"> <Group h="100%" px="md">
<Burger opened={opened} onClick={toggle} hiddenFrom="sm" size="sm" /> <Burger
<Header /> opened={opened}
onClick={toggleMobile}
hiddenFrom="sm"
size="sm"
/>
<Header onSidebarToggle={toggleSidebar} />
</Group> </Group>
</AppShell.Header> </AppShell.Header>
@@ -43,7 +54,11 @@ function SosialRoute() {
</div> </div>
</AppShell.Navbar> </AppShell.Navbar>
<AppShell.Main bg={mainBgColor}> <AppShell.Main
bg={mainBgColor}
onClick={handleMainClick}
style={{ cursor: sidebarCollapsed ? "default" : "pointer" }}
>
<SosialPage /> <SosialPage />
</AppShell.Main> </AppShell.Main>
</AppShell> </AppShell>