Fix UI Admin Menu Landing Page & PPID

This commit is contained in:
2025-09-01 16:14:28 +08:00
parent 22ec8d942d
commit 7ae83788b4
74 changed files with 4312 additions and 2798 deletions

View File

@@ -1,13 +1,12 @@
'use client'
import colors from '@/con/colors';
import { ActionIcon, Box, Button, Center, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core';
import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title, Tooltip } from '@mantine/core';
import { useShallowEffect } from '@mantine/hooks';
import { IconDeviceImacCog, IconFile, IconSearch } from '@tabler/icons-react';
import { IconDeviceImacCog, IconFile, IconPlus, IconSearch } from '@tabler/icons-react';
import { useRouter } from 'next/navigation';
import { useState } from 'react';
import { useProxy } from 'valtio/utils';
import HeaderSearch from '../../_com/header';
import JudulList from '../../_com/judulList';
import apbdes from '../../_state/landing-page/apbdes';
@@ -17,7 +16,7 @@ function APBDes() {
<Box>
<HeaderSearch
title='APBDes'
placeholder='pencarian'
placeholder='Cari APBDes...'
searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
@@ -48,73 +47,102 @@ function ListAPBDes({ search }: { search: string }) {
if (loading || !data) {
return (
<Stack py={10}>
<Skeleton h={500} />
<Skeleton height={600} radius="md" />
</Stack>
)
);
}
return (
<Box py={10}>
<Paper bg={colors['white-1']} p={'md'}>
<Stack>
<JudulList
title='List APBDes'
href='/admin/landing-page/APBDes/create'
/>
<Box style={{ overflowX: 'auto' }}>
<Table striped withRowBorders withTableBorder style={{ minWidth: '700px' }}>
<TableThead>
<TableTr>
<TableTh>Nama APBDes</TableTh>
<TableTh>Jumlah APBDes</TableTh>
<TableTh>Document</TableTh>
<TableTh>Detail</TableTh>
</TableTr>
</TableThead>
<TableTbody>
{filteredData.map((item) => (
<Paper withBorder bg={colors['white-1']} p="lg" shadow="md" radius="md">
<Group justify="space-between" mb="md">
<Title order={4}>Daftar APBDes</Title>
<Tooltip label="Tambah APBDes" withArrow>
<Button
leftSection={<IconPlus size={18} />}
color="blue"
variant="light"
onClick={() => router.push('/admin/landing-page/APBDes/create')}
>
Tambah Baru
</Button>
</Tooltip>
</Group>
<Box style={{ overflowX: 'auto' }}>
<Table highlightOnHover>
<TableThead>
<TableTr>
<TableTh style={{ width: '30%' }}>Nama APBDes</TableTh>
<TableTh style={{ width: '25%' }}>Jumlah</TableTh>
<TableTh style={{ width: '25%' }}>Dokumen</TableTh>
<TableTh style={{ width: '20%' }}>Aksi</TableTh>
</TableTr>
</TableThead>
<TableTbody>
{filteredData.length > 0 ? (
filteredData.map((item) => (
<TableTr key={item.id}>
<TableTd>
<Box w={100}>
<Text truncate="end" fz={"sm"}>{item.name}</Text>
</Box>
<Text fw={500} truncate="end">{item.name}</Text>
</TableTd>
<TableTd>
<Text truncate="end" fz={"sm"}>Rp. {item.jumlah}</Text>
<Text>Rp. {item.jumlah}</Text>
</TableTd>
<TableTd>
{item.file?.link ? (
<ActionIcon
<Button
component="a"
href={item.file.link}
target="_blank"
rel="noopener noreferrer"
variant='transparent'
variant="light"
leftSection={<IconFile size={18} />}
size="sm"
>
<IconFile size={25} color={colors['blue-button']} />
</ActionIcon>
Lihat Dokumen
</Button>
) : (
<Text>Tidak ada dokumen tersedia</Text>
<Text c="dimmed" fz="sm">Tidak ada dokumen</Text>
)}
</TableTd>
<TableTd>
<Button onClick={() => router.push(`/admin/landing-page/APBDes/${item.id}`)}>
<IconDeviceImacCog size={25} />
<Button
variant="light"
color="blue"
onClick={() => router.push(`/admin/landing-page/APBDes/${item.id}`)}
fullWidth
>
<IconDeviceImacCog size={20} />
<Text ml={5}>Detail</Text>
</Button>
</TableTd>
</TableTr>
))}
</TableTbody>
</Table>
</Box>
</Stack>
))
) : (
<TableTr>
<TableTd colSpan={4}>
<Center py={20}>
<Text color="dimmed">Tidak ada data APBDes yang cocok</Text>
</Center>
</TableTd>
</TableTr>
)}
</TableTbody>
</Table>
</Box>
</Paper>
<Center>
<Center mt="md">
<Pagination
value={page}
onChange={(newPage) => load(newPage)}
onChange={(newPage) => {
load(newPage, 10);
window.scrollTo({ top: 0, behavior: 'smooth' });
}}
total={totalPages}
my={"md"}
color="blue"
radius="md"
/>
</Center>
</Box>