Add Fitur Search Di setiap menu

This commit is contained in:
2025-07-08 00:30:55 +08:00
parent 2725c2c064
commit 7e95d5fbb4
38 changed files with 792 additions and 182 deletions

View File

@@ -1,22 +1,37 @@
import React from 'react'; import React from 'react';
import { Grid, GridCol, Paper, TextInput, Title } from '@mantine/core'; import { Grid, GridCol, Paper, TextInput, Title } from '@mantine/core';
import { IconSearch } from '@tabler/icons-react'; // Sesuaikan jika kamu pakai icon lain import { IconSearch } from '@tabler/icons-react';
import colors from '@/con/colors'; import colors from '@/con/colors';
type HeaderSearchProps = {
title: string;
placeholder?: string;
searchIcon?: React.ReactNode;
value?: string;
onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
};
const HeaderSearch = ({ title = "", placeholder = "pencarian", searchIcon = <IconSearch size={20} /> }: { title: string, placeholder?: string, searchIcon?: React.ReactNode }) => { const HeaderSearch = ({
title = "",
placeholder = "pencarian",
searchIcon = <IconSearch size={20} />,
value,
onChange,
}: HeaderSearchProps) => {
return ( return (
<Grid> <Grid>
<GridCol span={{ base: 12, md: 9 }}> <GridCol span={{ base: 12, md: 9 }}>
<Title order={3}>{title}</Title> <Title order={3}>{title}</Title>
</GridCol> </GridCol>
<GridCol span={{ base: 12, md: 3 }}> <GridCol span={{ base: 12, md: 3 }}>
<Paper radius={"lg"} bg={colors['white-1']}> <Paper radius="lg" bg={colors['white-1']}>
<TextInput <TextInput
radius="lg" radius="lg"
placeholder={placeholder} placeholder={placeholder}
leftSection={searchIcon} leftSection={searchIcon}
w="100%" w="100%"
value={value}
onChange={onChange}
/> />
</Paper> </Paper>
</GridCol> </GridCol>
@@ -24,4 +39,4 @@ const HeaderSearch = ({ title = "", placeholder = "pencarian", searchIcon = <Ico
); );
}; };
export default HeaderSearch; export default HeaderSearch;

View File

@@ -1,43 +1,47 @@
'use client' 'use client'
import colors from '@/con/colors'; import colors from '@/con/colors';
import { Box, Button, Grid, GridCol, Image, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, TextInput, Title } from '@mantine/core'; import { Box, Button, Grid, GridCol, Image, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import { IconCircleDashedPlus, IconDeviceImacCog, IconSearch } from '@tabler/icons-react'; import { IconCircleDashedPlus, IconDeviceImacCog, IconSearch } from '@tabler/icons-react';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
import { useState } from 'react';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import HeaderSearch from '../../_com/header';
import stateDashboardBerita from '../../_state/desa/berita'; import stateDashboardBerita from '../../_state/desa/berita';
function Page() { function Berita() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<Grid> <HeaderSearch
<GridCol span={{ base: 12, md: 9 }}> title='Berita'
<Title order={3}>Berita</Title> placeholder='pencarian'
</GridCol> searchIcon={<IconSearch size={20} />}
<GridCol span={{ base: 12, md: 3 }}> value={search}
<Paper radius={"lg"} bg={colors['white-1']}> onChange={(e) => setSearch(e.currentTarget.value)}
<TextInput />
radius={"lg"} <ListBerita search={search} />
placeholder='pencarian'
leftSection={<IconSearch size={20} />}
/>
</Paper>
</GridCol>
</Grid>
<BeritaList />
</Box> </Box>
); );
} }
function BeritaList() { function ListBerita({ search }: { search: string }) {
const beritaState = useProxy(stateDashboardBerita) const beritaState = useProxy(stateDashboardBerita)
const router = useRouter()
useShallowEffect(() => { useShallowEffect(() => {
beritaState.berita.findMany.load() beritaState.berita.findMany.load()
}, []) }, [])
const router = useRouter() const filteredData = (beritaState.berita.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.judul.toLowerCase().includes(keyword) ||
item.kategoriBerita?.name.toLowerCase().includes(keyword)
);
});
if (!beritaState.berita.findMany.data) { if (!beritaState.berita.findMany.data) {
return ( return (
@@ -62,7 +66,7 @@ function BeritaList() {
</GridCol> </GridCol>
</Grid> </Grid>
<Box style={{ overflowX: "auto" }}> <Box style={{ overflowX: "auto" }}>
<Table striped withRowBorders withTableBorder style={{ minWidth: '700px' }}> <Table striped withRowBorders withTableBorder style={{ minWidth: '700px' }}>
<TableThead> <TableThead>
<TableTr> <TableTr>
<TableTh w={250}>Judul</TableTh> <TableTh w={250}>Judul</TableTh>
@@ -73,7 +77,7 @@ function BeritaList() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody > <TableTbody >
{beritaState.berita.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd > <TableTd >
<Box w={100}> <Box w={100}>
@@ -101,4 +105,4 @@ function BeritaList() {
) )
} }
export default Page; export default Berita;

View File

@@ -7,8 +7,26 @@ import JudulListTab from '../../../_com/jusulListTab';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import stateGallery from '../../../_state/desa/gallery'; import stateGallery from '../../../_state/desa/gallery';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import HeaderSearch from '../../../_com/header';
import { useState } from 'react';
function Foto() { function Foto() {
const [search, setSearch] = useState("");
return (
<Box>
<HeaderSearch
title='Posisi Organisasi'
placeholder='pencarian'
searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/>
<ListFoto search={search} />
</Box>
);
}
function ListFoto({ search }: { search: string }) {
const fotoState = useProxy(stateGallery.foto) const fotoState = useProxy(stateGallery.foto)
const router = useRouter(); const router = useRouter();
@@ -16,6 +34,14 @@ function Foto() {
fotoState.findMany.load() fotoState.findMany.load()
}, []) }, [])
const filteredData = (fotoState.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.name.toLowerCase().includes(keyword) ||
item.deskripsi.toLowerCase().includes(keyword)
);
});
if (!fotoState.findMany.data) { if (!fotoState.findMany.data) {
return ( return (
<Box py={10}> <Box py={10}>
@@ -43,7 +69,7 @@ function Foto() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{fotoState.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.name}</TableTd> <TableTd>{item.name}</TableTd>
<TableTd>{new Date(item.createdAt).toDateString()}</TableTd> <TableTd>{new Date(item.createdAt).toDateString()}</TableTd>

View File

@@ -7,8 +7,26 @@ import JudulListTab from '../../../_com/jusulListTab';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import stateGallery from '../../../_state/desa/gallery'; import stateGallery from '../../../_state/desa/gallery';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import HeaderSearch from '../../../_com/header';
import { useState } from 'react';
function Video() { function Video() {
const [search, setSearch] = useState("");
return (
<Box>
<HeaderSearch
title='Posisi Organisasi'
placeholder='pencarian'
searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/>
<ListVideo search={search} />
</Box>
);
}
function ListVideo({ search }: { search: string }) {
const videoState = useProxy(stateGallery.video) const videoState = useProxy(stateGallery.video)
const router = useRouter(); const router = useRouter();
@@ -16,6 +34,14 @@ function Video() {
videoState.findMany.load() videoState.findMany.load()
}, []) }, [])
const filteredData = (videoState.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.name.toLowerCase().includes(keyword) ||
item.deskripsi.toLowerCase().includes(keyword)
);
});
if (!videoState.findMany.data) { if (!videoState.findMany.data) {
return ( return (
<Box py={10}> <Box py={10}>
@@ -43,7 +69,7 @@ function Video() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{videoState.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.name}</TableTd> <TableTd>{item.name}</TableTd>
<TableTd>{new Date(item.createdAt).toDateString()}</TableTd> <TableTd>{new Date(item.createdAt).toDateString()}</TableTd>

View File

@@ -7,8 +7,26 @@ import { useProxy } from 'valtio/utils';
import stateLayananDesa from '../../../_state/desa/layananDesa'; import stateLayananDesa from '../../../_state/desa/layananDesa';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
import { useState } from 'react';
import HeaderSearch from '../../../_com/header';
function SuratKeterangan() { function SuratKeterangan() {
const [search, setSearch] = useState("");
return (
<Box>
<HeaderSearch
title='Posisi Organisasi'
placeholder='pencarian'
searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/>
<ListSuratKeterangan search={search} />
</Box>
);
}
function ListSuratKeterangan({ search }: { search: string }) {
const suratKeteranganState = useProxy(stateLayananDesa.suratKeterangan) const suratKeteranganState = useProxy(stateLayananDesa.suratKeterangan)
const router = useRouter() const router = useRouter()
@@ -16,6 +34,14 @@ function SuratKeterangan() {
suratKeteranganState.findMany.load() suratKeteranganState.findMany.load()
}, []) }, [])
const filteredData = (suratKeteranganState.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.name.toLowerCase().includes(keyword) ||
item.deskripsi.toLowerCase().includes(keyword)
);
});
if (!suratKeteranganState.findMany.data) { if (!suratKeteranganState.findMany.data) {
return ( return (
<Stack py={10}> <Stack py={10}>
@@ -43,7 +69,7 @@ function SuratKeterangan() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{suratKeteranganState.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.name}</TableTd> <TableTd>{item.name}</TableTd>
<TableTd> <TableTd>

View File

@@ -7,8 +7,26 @@ import { useProxy } from 'valtio/utils';
import stateLayananDesa from '../../../_state/desa/layananDesa'; import stateLayananDesa from '../../../_state/desa/layananDesa';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
import { useState } from 'react';
import HeaderSearch from '../../../_com/header';
function PelayananTelunjukSakti() { function PelayananTelunjukSakti() {
const [search, setSearch] = useState("");
return (
<Box>
<HeaderSearch
title='Posisi Organisasi'
placeholder='pencarian'
searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/>
<ListPelayananTelunjukSakti search={search} />
</Box>
);
}
function ListPelayananTelunjukSakti({ search }: { search: string }) {
const telunjukSaktiState = useProxy(stateLayananDesa.pelayananTelunjukSaktiDesa) const telunjukSaktiState = useProxy(stateLayananDesa.pelayananTelunjukSaktiDesa)
const router = useRouter() const router = useRouter()
@@ -16,6 +34,14 @@ function PelayananTelunjukSakti() {
telunjukSaktiState.findMany.load() telunjukSaktiState.findMany.load()
}, []) }, [])
const filteredData = (telunjukSaktiState.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.name.toLowerCase().includes(keyword) ||
item.deskripsi.toLowerCase().includes(keyword)
);
});
if (!telunjukSaktiState.findMany.data) { if (!telunjukSaktiState.findMany.data) {
return ( return (
<Stack py={10}> <Stack py={10}>
@@ -42,7 +68,7 @@ function PelayananTelunjukSakti() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{telunjukSaktiState.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.name}</TableTd> <TableTd>{item.name}</TableTd>
<TableTd><Text truncate="end" fz={"sm"} dangerouslySetInnerHTML={{ __html: item.deskripsi }} /></TableTd> <TableTd><Text truncate="end" fz={"sm"} dangerouslySetInnerHTML={{ __html: item.deskripsi }} /></TableTd>

View File

@@ -7,14 +7,40 @@ import { IconDeviceImac, IconSearch } from '@tabler/icons-react';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import JudulListTab from '../../_com/jusulListTab'; import JudulListTab from '../../_com/jusulListTab';
import { useState } from 'react';
import HeaderSearch from '../../_com/header';
function Penghargaan() { function Penghargaan() {
const [search, setSearch] = useState("");
return (
<Box>
<HeaderSearch
title='Posisi Organisasi'
placeholder='pencarian'
searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/>
<ListPenghargaan search={search} />
</Box>
);
}
function ListPenghargaan({ search }: { search: string }) {
const state = useProxy(penghargaanState) const state = useProxy(penghargaanState)
const router = useRouter() const router = useRouter()
useShallowEffect(() => { useShallowEffect(() => {
state.findMany.load() state.findMany.load()
}, []) }, [])
const filteredData = (state.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.name.toLowerCase().includes(keyword) ||
item.deskripsi.toLowerCase().includes(keyword)
);
});
if (!state.findMany.data) { if (!state.findMany.data) {
return( return(
<Stack py={10}> <Stack py={10}>
@@ -41,7 +67,7 @@ function Penghargaan() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{state.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.name}</TableTd> <TableTd>{item.name}</TableTd>
<TableTd> <TableTd>

View File

@@ -11,21 +11,25 @@ import { ModalKonfirmasiHapus } from '../../_com/modalKonfirmasiHapus';
import { useState } from 'react'; import { useState } from 'react';
function Page() { function Pengumuman() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Pengumuman' title='Posisi Organisasi'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<PengumumanList /> <ListPengumuman search={search} />
</Box> </Box>
); );
} }
function PengumumanList() { function ListPengumuman({ search }: { search: string }) {
const pengumumanState = useProxy(stateDesaPengumuman) const pengumumanState = useProxy(stateDesaPengumuman)
const router = useRouter()
const [modalHapus, setModalHapus] = useState(false) const [modalHapus, setModalHapus] = useState(false)
const [selectedId, setSelectedId] = useState<string | null>(null) const [selectedId, setSelectedId] = useState<string | null>(null)
@@ -33,7 +37,6 @@ function PengumumanList() {
pengumumanState.pengumuman.findMany.load() pengumumanState.pengumuman.findMany.load()
}, []) }, [])
const router = useRouter()
const handleHapus = () => { const handleHapus = () => {
if (selectedId) { if (selectedId) {
@@ -43,6 +46,14 @@ function PengumumanList() {
} }
} }
const filteredData = (pengumumanState.pengumuman.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.judul.toLowerCase().includes(keyword) ||
item.CategoryPengumuman?.name.toLowerCase().includes(keyword)
);
});
if (!pengumumanState.pengumuman.findMany.data) { if (!pengumumanState.pengumuman.findMany.data) {
return ( return (
<Stack py={10}> <Stack py={10}>
@@ -76,7 +87,7 @@ function PengumumanList() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody > <TableTbody >
{pengumumanState.pengumuman.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd > <TableTd >
<Box w={100}> <Box w={100}>
@@ -108,4 +119,4 @@ function PengumumanList() {
) )
} }
export default Page; export default Pengumuman;

View File

@@ -9,29 +9,40 @@ import { useProxy } from 'valtio/utils';
import HeaderSearch from '../../_com/header'; import HeaderSearch from '../../_com/header';
import JudulList from '../../_com/judulList'; import JudulList from '../../_com/judulList';
import potensiDesaState from '../../_state/desa/potensi'; import potensiDesaState from '../../_state/desa/potensi';
import { useState } from 'react';
function Potensi() { function Potensi() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Potensi Desa' title='Posisi Organisasi'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListPotensi /> <ListPotensi search={search} />
</Box> </Box>
); );
} }
function ListPotensi() { function ListPotensi({ search }: { search: string }) {
const potensiState = useProxy(potensiDesaState) const potensiState = useProxy(potensiDesaState)
const router = useRouter()
useShallowEffect(() => { useShallowEffect(() => {
potensiState.findMany.load() potensiState.findMany.load()
}, []) }, [])
const router = useRouter() const filteredData = (potensiState.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.name.toLowerCase().includes(keyword) ||
item.kategori.toLowerCase().includes(keyword)
);
});
if (!potensiState.findMany.data) { if (!potensiState.findMany.data) {
return ( return (
@@ -60,7 +71,7 @@ function ListPotensi() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{potensiState.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd> <TableTd>
<Box w={100}> <Box w={100}>

View File

@@ -8,21 +8,25 @@ import { useRouter } from 'next/navigation';
import lowonganKerjaState from '../../_state/ekonomi/lowongan-kerja'; import lowonganKerjaState from '../../_state/ekonomi/lowongan-kerja';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import { useState } from 'react';
function LowonganKerjaLokal() { function LowonganKerjaLokal() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Lowongan Kerja Lokal' title='Lowongan Kerja Lokal'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListLowonganKerjaLokal/> <ListLowonganKerjaLokal search={search} />
</Box> </Box>
); );
} }
function ListLowonganKerjaLokal() { function ListLowonganKerjaLokal({ search }: { search: string }) {
const lowonganState = useProxy(lowonganKerjaState) const lowonganState = useProxy(lowonganKerjaState)
const router = useRouter(); const router = useRouter();
@@ -30,6 +34,15 @@ function ListLowonganKerjaLokal() {
lowonganState.findMany.load(); lowonganState.findMany.load();
}, []) }, [])
const filteredData = (lowonganState.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.posisi.toLowerCase().includes(keyword) ||
item.namaPerusahaan.toLowerCase().includes(keyword) ||
item.lokasi.toLowerCase().includes(keyword)
);
});
if (!lowonganState.findMany.data) { if (!lowonganState.findMany.data) {
return ( return (
<Stack py={10}> <Stack py={10}>
@@ -54,7 +67,7 @@ function ListLowonganKerjaLokal() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{lowonganState.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.posisi}</TableTd> <TableTd>{item.posisi}</TableTd>
<TableTd>{item.namaPerusahaan}</TableTd> <TableTd>{item.namaPerusahaan}</TableTd>

View File

@@ -11,20 +11,24 @@ import JudulList from '../../../_com/judulList';
import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus';
import pasarDesaState from '../../../_state/ekonomi/pasar-desa/pasar-desa'; import pasarDesaState from '../../../_state/ekonomi/pasar-desa/pasar-desa';
function PasarDesa() { function PasarDesa() {
const [search, setSearch] = useState("")
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Kategori Produk' title='Kategori Produk'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListPasarDesa /> <ListPasarDesa search={search} />
</Box> </Box>
); );
} }
function ListPasarDesa() { function ListPasarDesa({ search }: { search: string }) {
const statePasar = useProxy(pasarDesaState.kategoriProduk) const statePasar = useProxy(pasarDesaState.kategoriProduk)
const [modalHapus, setModalHapus] = useState(false) const [modalHapus, setModalHapus] = useState(false)
const [selectedId, setSelectedId] = useState<string | null>(null) const [selectedId, setSelectedId] = useState<string | null>(null)
@@ -43,6 +47,13 @@ function ListPasarDesa() {
} }
} }
const filteredData = (statePasar.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.nama.toLowerCase().includes(keyword)
);
});
if (!statePasar.findMany.data) { if (!statePasar.findMany.data) {
return ( return (
<Stack py={10}> <Stack py={10}>
@@ -67,11 +78,11 @@ function ListPasarDesa() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{statePasar.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.nama}</TableTd> <TableTd>{item.nama}</TableTd>
<TableTd> <TableTd>
<Button onClick={() => router.push(`/admin/ekonomi/pasar-desa/kategori-produk/${item.id}`)}> <Button color="green" onClick={() => router.push(`/admin/ekonomi/pasar-desa/kategori-produk/${item.id}`)}>
<IconEdit size={20} /> <IconEdit size={20} />
</Button> </Button>
</TableTd> </TableTd>

View File

@@ -8,21 +8,25 @@ import { useProxy } from 'valtio/utils';
import HeaderSearch from '../../../_com/header'; import HeaderSearch from '../../../_com/header';
import JudulList from '../../../_com/judulList'; import JudulList from '../../../_com/judulList';
import pasarDesaState from '../../../_state/ekonomi/pasar-desa/pasar-desa'; import pasarDesaState from '../../../_state/ekonomi/pasar-desa/pasar-desa';
import { useState } from 'react';
function PasarDesa() { function PasarDesa() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Produk Pasar Desa' title='Produk Pasar Desa'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListPasarDesa /> <ListPasarDesa search={search} />
</Box> </Box>
); );
} }
function ListPasarDesa() { function ListPasarDesa({ search }: { search: string }) {
const statePasar = useProxy(pasarDesaState.pasarDesa) const statePasar = useProxy(pasarDesaState.pasarDesa)
const router = useRouter(); const router = useRouter();
@@ -30,6 +34,16 @@ function ListPasarDesa() {
statePasar.findMany.load() statePasar.findMany.load()
}, []) }, [])
const filteredData = (statePasar.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.nama.toLowerCase().includes(keyword) ||
item.harga.toString().toLowerCase().includes(keyword) ||
item.rating.toString().toLowerCase().includes(keyword) ||
item.alamatUsaha.toLowerCase().includes(keyword)
);
});
if (!statePasar.findMany.data) { if (!statePasar.findMany.data) {
return ( return (
<Stack py={10}> <Stack py={10}>
@@ -56,7 +70,7 @@ function ListPasarDesa() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{statePasar.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.nama}</TableTd> <TableTd>{item.nama}</TableTd>
<TableTd>Rp.{item.harga}</TableTd> <TableTd>Rp.{item.harga}</TableTd>

View File

@@ -13,19 +13,22 @@ import { useEffect, useState } from 'react';
import { CartesianGrid, Legend, Line, LineChart, Tooltip, XAxis, YAxis } from 'recharts'; import { CartesianGrid, Legend, Line, LineChart, Tooltip, XAxis, YAxis } from 'recharts';
function ProgramKemiskinan() { function ProgramKemiskinan() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Program Kemiskinan' title='Program Kemiskinan'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListProgramKemiskinan /> <ListProgramKemiskinan search={search}/>
</Box> </Box>
); );
} }
function ListProgramKemiskinan() { function ListProgramKemiskinan({ search }: { search: string }) {
const programState = useProxy(programKemiskinanState) const programState = useProxy(programKemiskinanState)
const router = useRouter(); const router = useRouter();
const [lineChart, setLineChart] = useState<any[]>([]); const [lineChart, setLineChart] = useState<any[]>([]);
@@ -51,6 +54,15 @@ function ListProgramKemiskinan() {
} }
}, [programState.findMany.data]) }, [programState.findMany.data])
const filteredData = (programState.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.nama.toLowerCase().includes(keyword) ||
item.deskripsi.toLowerCase().includes(keyword) ||
item.statistik?.tahun.toString().includes(keyword)
);
});
if (!programState.findMany.data) { if (!programState.findMany.data) {
return ( return (
<Stack py={10}> <Stack py={10}>
@@ -75,7 +87,7 @@ function ListProgramKemiskinan() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{programState.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.nama}</TableTd> <TableTd>{item.nama}</TableTd>
<TableTd> <TableTd>

View File

@@ -12,44 +12,58 @@ import { useState } from 'react';
import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus';
function HubunganOrganisasi() { function HubunganOrganisasi() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Hubungan Organisasi' title='Hubungan Organisasi'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListHubunganOrganisasi /> <ListHubunganOrganisasi search={search} />
</Box> </Box>
); );
} }
function ListHubunganOrganisasi() {
function ListHubunganOrganisasi({ search }: { search: string }) {
const stateOrganisasi = useProxy(strukturorganisasiState.hubunganOrganisasi); const stateOrganisasi = useProxy(strukturorganisasiState.hubunganOrganisasi);
const [modalHapus, setModalHapus] = useState(false) const [modalHapus, setModalHapus] = useState(false);
const [selectedId, setSelectedId] = useState<string | null>(null) const [selectedId, setSelectedId] = useState<string | null>(null);
// const params = useParams() const router = useRouter();
const router = useRouter()
useShallowEffect(() => { useShallowEffect(() => {
stateOrganisasi.findMany.load() stateOrganisasi.findMany.load();
}, []) }, []);
const handleHapus = () => { const handleHapus = () => {
if (selectedId) { if (selectedId) {
stateOrganisasi.delete.byId(selectedId) stateOrganisasi.delete.byId(selectedId);
setModalHapus(false) setModalHapus(false);
setSelectedId(null) setSelectedId(null);
} }
} };
const filteredData = (stateOrganisasi.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.atasan?.namaLengkap?.toLowerCase().includes(keyword) ||
item.bawahan?.namaLengkap?.toLowerCase().includes(keyword) ||
item.tipe?.toLowerCase().includes(keyword)
);
});
if (!stateOrganisasi.findMany.data) { if (!stateOrganisasi.findMany.data) {
return ( return (
<Stack py={10}> <Stack py={10}>
<Skeleton h={500} /> <Skeleton h={500} />
</Stack> </Stack>
) );
} }
return ( return (
<Box py={10}> <Box py={10}>
<Paper bg={colors['white-1']} p={'md'}> <Paper bg={colors['white-1']} p={'md'}>
@@ -68,34 +82,40 @@ function ListHubunganOrganisasi() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{([...stateOrganisasi.findMany.data || []] {filteredData
.sort((a, b) => { .sort((a, b) =>
return a.atasan?.namaLengkap.localeCompare(b.atasan?.namaLengkap); // kalau status sama, urut nama a.atasan?.namaLengkap.localeCompare(b.atasan?.namaLengkap)
}) // Aktif di atas )
).map((item) => ( .map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.atasan?.namaLengkap}</TableTd> <TableTd>{item.atasan?.namaLengkap}</TableTd>
<TableTd>{item.bawahan?.namaLengkap}</TableTd> <TableTd>{item.bawahan?.namaLengkap}</TableTd>
<TableTd>{item.tipe}</TableTd> <TableTd>{item.tipe}</TableTd>
<TableTd> <TableTd>
<Button bg={"green"} onClick={() => router.push(`/admin/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/hubungan-organisasi/${item.id}`)}> <Button
<IconEdit size={25} /> bg="green"
</Button> onClick={() => router.push(`/admin/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/hubungan-organisasi/${item.id}`)}
</TableTd> >
<TableTd> <IconEdit size={25} />
<Button color="red" onClick={() => { </Button>
setSelectedId(item.id) </TableTd>
setModalHapus(true) <TableTd>
}}> <Button
<IconTrash size={20} /> color="red"
</Button> onClick={() => {
</TableTd> setSelectedId(item.id);
</TableTr> setModalHapus(true);
))} }}
>
<IconTrash size={20} />
</Button>
</TableTd>
</TableTr>
))}
</TableTbody> </TableTbody>
</Table> </Table>
</Paper> </Paper>
{/* Modal Konfirmasi Hapus */}
<ModalKonfirmasiHapus <ModalKonfirmasiHapus
opened={modalHapus} opened={modalHapus}
onClose={() => setModalHapus(false)} onClose={() => setModalHapus(false)}
@@ -106,4 +126,5 @@ function ListHubunganOrganisasi() {
); );
} }
export default HubunganOrganisasi; export default HubunganOrganisasi;

View File

@@ -8,21 +8,25 @@ import { useProxy } from 'valtio/utils';
import HeaderSearch from '../../../_com/header'; import HeaderSearch from '../../../_com/header';
import JudulList from '../../../_com/judulList'; import JudulList from '../../../_com/judulList';
import strukturorganisasiState from '../../../_state/ekonomi/struktur-organisasi/struktur-organisasi'; import strukturorganisasiState from '../../../_state/ekonomi/struktur-organisasi/struktur-organisasi';
import { useState } from 'react';
function Pegawai() { function Pegawai() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Pegawai' title='Pegawai'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListPegawai /> <ListPegawai search={search} />
</Box> </Box>
); );
} }
function ListPegawai() { function ListPegawai({ search }: { search: string }) {
const stateOrganisasi = useProxy(strukturorganisasiState.pegawai); const stateOrganisasi = useProxy(strukturorganisasiState.pegawai);
const router = useRouter(); const router = useRouter();
@@ -59,8 +63,15 @@ function ListPegawai() {
}; };
}, []); }, []);
// Log render cycle const filteredData = (stateOrganisasi.findMany.data || []).filter(item => {
console.log('Rendering with data:', stateOrganisasi.findMany.data); const keyword = search.toLowerCase();
return (
item.namaLengkap?.toLowerCase().includes(keyword) ||
item.gelarAkademik?.toLowerCase().includes(keyword) ||
item.telepon?.toLowerCase().includes(keyword) ||
item.posisi?.nama?.toLowerCase().includes(keyword)
);
});
// Handle loading state // Handle loading state
if (stateOrganisasi.findMany.data === null) { if (stateOrganisasi.findMany.data === null) {
@@ -107,7 +118,7 @@ function ListPegawai() {
console.log('Rendering table with items:', stateOrganisasi.findMany.data); console.log('Rendering table with items:', stateOrganisasi.findMany.data);
return null; return null;
})()} })()}
{([...stateOrganisasi.findMany.data || []] {([...filteredData]
.sort((a, b) => { .sort((a, b) => {
if (a.isActive === b.isActive) { if (a.isActive === b.isActive) {
return a.namaLengkap.localeCompare(b.namaLengkap); // kalau status sama, urut nama return a.namaLengkap.localeCompare(b.namaLengkap); // kalau status sama, urut nama

View File

@@ -6,25 +6,28 @@ import { useRouter } from 'next/navigation';
import HeaderSearch from '../../../_com/header'; import HeaderSearch from '../../../_com/header';
import JudulList from '../../../_com/judulList'; import JudulList from '../../../_com/judulList';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import { useState } from 'react';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus';
import strukturorganisasiState from '../../../_state/ekonomi/struktur-organisasi/struktur-organisasi'; import strukturorganisasiState from '../../../_state/ekonomi/struktur-organisasi/struktur-organisasi';
import { useState } from 'react';
function PosisiOrganisasi() { function PosisiOrganisasi() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Posisi Organisasi' title='Posisi Organisasi'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListPosisiOrganisasi /> <ListPosisiOrganisasi search={search} />
</Box> </Box>
); );
} }
function ListPosisiOrganisasi() { function ListPosisiOrganisasi({ search }: { search: string }) {
const stateOrganisasi = useProxy(strukturorganisasiState.posisiOrganisasi) const stateOrganisasi = useProxy(strukturorganisasiState.posisiOrganisasi)
const router = useRouter(); const router = useRouter();
const [modalHapus, setModalHapus] = useState(false) const [modalHapus, setModalHapus] = useState(false)
@@ -42,6 +45,15 @@ function ListPosisiOrganisasi() {
} }
} }
const filteredData = (stateOrganisasi.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.nama?.toLowerCase().includes(keyword) ||
item.deskripsi?.toLowerCase().includes(keyword) ||
item.hierarki?.toString().toLowerCase().includes(keyword)
);
});
if (!stateOrganisasi.findMany.data) { if (!stateOrganisasi.findMany.data) {
return ( return (
<Stack py={10}> <Stack py={10}>
@@ -68,7 +80,7 @@ function ListPosisiOrganisasi() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{stateOrganisasi.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.nama}</TableTd> <TableTd>{item.nama}</TableTd>
<TableTd> <TableTd>

View File

@@ -8,21 +8,25 @@ import { useRouter } from 'next/navigation';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import keamananLingkunganState from '../../_state/keamanan/keamanan-lingkungan'; import keamananLingkunganState from '../../_state/keamanan/keamanan-lingkungan';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import { useState } from 'react';
function KeamananLingkungan() { function KeamananLingkungan() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Keamanan Lingkungan' title='Keamanan Lingkungan'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListKeamananLingkungan /> <ListKeamananLingkungan search={search}/>
</Box> </Box>
); );
} }
function ListKeamananLingkungan() { function ListKeamananLingkungan({ search }: { search: string }) {
const keamananState = useProxy(keamananLingkunganState) const keamananState = useProxy(keamananLingkunganState)
const router = useRouter(); const router = useRouter();
@@ -30,6 +34,14 @@ function ListKeamananLingkungan() {
keamananState.findMany.load() keamananState.findMany.load()
}, []) }, [])
const filteredData = (keamananState.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.name.toLowerCase().includes(keyword) ||
item.deskripsi.toLowerCase().includes(keyword)
);
});
if (!keamananState.findMany.data) { if (!keamananState.findMany.data) {
return ( return (
<Stack py={10}> <Stack py={10}>
@@ -53,7 +65,7 @@ function ListKeamananLingkungan() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{keamananState.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.name}</TableTd> <TableTd>{item.name}</TableTd>
<TableTd> <TableTd>

View File

@@ -8,21 +8,25 @@ import { useRouter } from 'next/navigation';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import kontakDaruratKeamananState from '../../_state/keamanan/kontak-darurat-keamanan'; import kontakDaruratKeamananState from '../../_state/keamanan/kontak-darurat-keamanan';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import { useState } from 'react';
function KontakDaurat() { function KontakDaurat() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Kontak Darurat' title='Kontak Darurat'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListKontakDaurat/> <ListKontakDaurat search={search}/>
</Box> </Box>
); );
} }
function ListKontakDaurat() { function ListKontakDaurat({ search }: { search: string }) {
const kontakState = useProxy(kontakDaruratKeamananState) const kontakState = useProxy(kontakDaruratKeamananState)
const router = useRouter(); const router = useRouter();
@@ -30,6 +34,15 @@ function ListKontakDaurat() {
kontakState.findMany.load() kontakState.findMany.load()
}, []) }, [])
const filteredData = (kontakState.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.nama.toLowerCase().includes(keyword) ||
item.kontakItems[0].nama.toLowerCase().includes(keyword) ||
item.kontakItems[0].nomorTelepon.toLowerCase().includes(keyword)
);
});
if (!kontakState.findMany.data) { if (!kontakState.findMany.data) {
return ( return (
<Stack py={10}> <Stack py={10}>
@@ -54,7 +67,7 @@ function ListKontakDaurat() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{kontakState.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.nama}</TableTd> <TableTd>{item.nama}</TableTd>
<TableTd>{item.kontakItems[0].nama}</TableTd> <TableTd>{item.kontakItems[0].nama}</TableTd>

View File

@@ -8,21 +8,25 @@ import { useRouter } from 'next/navigation';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import laporanPublikState from '../../_state/keamanan/laporan-publik'; import laporanPublikState from '../../_state/keamanan/laporan-publik';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import { useState } from 'react';
function LaporanPublik() { function LaporanPublik() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Laporan Publik' title='Laporan Publik'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListLaporanPublik/> <ListLaporanPublik search={search}/>
</Box> </Box>
); );
} }
function ListLaporanPublik() { function ListLaporanPublik({ search }: { search: string }) {
const stateLaporan = useProxy(laporanPublikState) const stateLaporan = useProxy(laporanPublikState)
const router = useRouter(); const router = useRouter();
@@ -30,6 +34,15 @@ function ListLaporanPublik() {
stateLaporan.findMany.load() stateLaporan.findMany.load()
}, []) }, [])
const filteredData = (stateLaporan.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.judul.toLowerCase().includes(keyword) ||
item.status.toLowerCase().includes(keyword) ||
item.kronologi?.toLowerCase().includes(keyword)
);
});
if (!stateLaporan.findMany.data) { if (!stateLaporan.findMany.data) {
return ( return (
<Stack py={10}> <Stack py={10}>
@@ -55,7 +68,7 @@ function ListLaporanPublik() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{stateLaporan.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.judul}</TableTd> <TableTd>{item.judul}</TableTd>
<TableTd>{new Date(item.tanggalWaktu).toLocaleDateString('id-ID')}</TableTd> <TableTd>{new Date(item.tanggalWaktu).toLocaleDateString('id-ID')}</TableTd>

View File

@@ -8,21 +8,25 @@ import { useRouter } from 'next/navigation';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import pencegahanKriminalitasState from '../../_state/keamanan/pencegahan-kriminalitas'; import pencegahanKriminalitasState from '../../_state/keamanan/pencegahan-kriminalitas';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import { useState } from 'react';
function PencegahanKriminalitas() { function PencegahanKriminalitas() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Pencegahan Kriminalitas' title='Pencegahan Kriminalitas'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListPencegahanKriminalitas/> <ListPencegahanKriminalitas search={search}/>
</Box> </Box>
); );
} }
function ListPencegahanKriminalitas() { function ListPencegahanKriminalitas({ search }: { search: string }) {
const kriminalitasState = useProxy(pencegahanKriminalitasState) const kriminalitasState = useProxy(pencegahanKriminalitasState)
const router = useRouter(); const router = useRouter();
@@ -30,6 +34,15 @@ function ListPencegahanKriminalitas() {
kriminalitasState.findMany.load() kriminalitasState.findMany.load()
}, []) }, [])
const filteredData = (kriminalitasState.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.programKeamanan.nama.toLowerCase().includes(keyword) ||
item.programKeamanan.slug.toLowerCase().includes(keyword) ||
item.programKeamanan.deskripsi?.toLowerCase().includes(keyword)
);
});
if (!kriminalitasState.findMany.data) { if (!kriminalitasState.findMany.data) {
return ( return (
<Box py={10}> <Box py={10}>
@@ -55,7 +68,7 @@ function ListPencegahanKriminalitas() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{kriminalitasState.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.programKeamanan.nama}</TableTd> <TableTd>{item.programKeamanan.nama}</TableTd>
<TableTd>{item.programKeamanan.slug}</TableTd> <TableTd>{item.programKeamanan.slug}</TableTd>

View File

@@ -8,21 +8,25 @@ import { useProxy } from 'valtio/utils';
import HeaderSearch from '../../_com/header'; import HeaderSearch from '../../_com/header';
import JudulList from '../../_com/judulList'; import JudulList from '../../_com/judulList';
import polsekTerdekat from '../../_state/keamanan/polsek-terdekat'; import polsekTerdekat from '../../_state/keamanan/polsek-terdekat';
import { useState } from 'react';
function PolsekTerdekat() { function PolsekTerdekat() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Polsek Terdekat' title='Polsek Terdekat'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListPolsekTerdekat/> <ListPolsekTerdekat search={search}/>
</Box> </Box>
); );
} }
function ListPolsekTerdekat() { function ListPolsekTerdekat({ search }: { search: string }) {
const polsekState = useProxy(polsekTerdekat) const polsekState = useProxy(polsekTerdekat)
const router = useRouter(); const router = useRouter();
@@ -30,6 +34,15 @@ function ListPolsekTerdekat() {
polsekState.findMany.load() polsekState.findMany.load()
}, []) }, [])
const filteredData = (polsekState.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.nama.toLowerCase().includes(keyword) ||
item.jarakKeDesa.toLowerCase().includes(keyword) ||
item.alamat.toLowerCase().includes(keyword)
);
});
if (!polsekState.findMany.data) { if (!polsekState.findMany.data) {
return ( return (
<Stack py={10}> <Stack py={10}>
@@ -54,7 +67,7 @@ function ListPolsekTerdekat() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{polsekState.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.nama}</TableTd> <TableTd>{item.nama}</TableTd>
<TableTd>{item.jarakKeDesa}</TableTd> <TableTd>{item.jarakKeDesa}</TableTd>

View File

@@ -8,21 +8,25 @@ import { useRouter } from 'next/navigation';
import tipsKeamananState from '../../_state/keamanan/tips-keamanan'; import tipsKeamananState from '../../_state/keamanan/tips-keamanan';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import { useState } from 'react';
function TipsKeamanan() { function TipsKeamanan() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Tips Keamanan' title='Tips Keamanan'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListTipsKeamanan/> <ListTipsKeamanan search={search}/>
</Box> </Box>
); );
} }
function ListTipsKeamanan() { function ListTipsKeamanan({ search }: { search: string }) {
const stateKeamanan = useProxy(tipsKeamananState) const stateKeamanan = useProxy(tipsKeamananState)
const router = useRouter(); const router = useRouter();
@@ -30,6 +34,14 @@ function ListTipsKeamanan() {
stateKeamanan.findMany.load() stateKeamanan.findMany.load()
}, []) }, [])
const filteredData = (stateKeamanan.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.judul.toLowerCase().includes(keyword) ||
item.deskripsi.toLowerCase().includes(keyword)
);
});
if (!stateKeamanan.findMany.data) { if (!stateKeamanan.findMany.data) {
return ( return (
<Stack py={10}> <Stack py={10}>
@@ -53,7 +65,7 @@ function ListTipsKeamanan() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{stateKeamanan.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.judul}</TableTd> <TableTd>{item.judul}</TableTd>
<TableTd> <TableTd>

View File

@@ -8,22 +8,26 @@ import { useProxy } from 'valtio/utils';
import HeaderSearch from '../../../_com/header'; import HeaderSearch from '../../../_com/header';
import JudulList from '../../../_com/judulList'; import JudulList from '../../../_com/judulList';
import artikelKesehatanState from '../../../_state/kesehatan/data_kesehatan_warga/artikelKesehatan'; import artikelKesehatanState from '../../../_state/kesehatan/data_kesehatan_warga/artikelKesehatan';
import { useState } from 'react';
function ArtikelKesehatan() { function ArtikelKesehatan() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Artikel Kesehatan' title='Artikel Kesehatan'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListArtikelKesehatan/> <ListArtikelKesehatan search={search}/>
</Box> </Box>
); );
} }
function ListArtikelKesehatan() { function ListArtikelKesehatan({ search }: { search: string }) {
const stateArtikelKesehatan = useProxy(artikelKesehatanState) const stateArtikelKesehatan = useProxy(artikelKesehatanState)
const router = useRouter(); const router = useRouter();
@@ -31,6 +35,14 @@ function ListArtikelKesehatan() {
stateArtikelKesehatan.findMany.load() stateArtikelKesehatan.findMany.load()
}, []) }, [])
const filteredData = (stateArtikelKesehatan.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.title.toLowerCase().includes(keyword) ||
item.content.toLowerCase().includes(keyword)
);
});
if (!stateArtikelKesehatan.findMany.data) { if (!stateArtikelKesehatan.findMany.data) {
return ( return (
<Box py={10}> <Box py={10}>
@@ -56,7 +68,7 @@ function ListArtikelKesehatan() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{stateArtikelKesehatan.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.title}</TableTd> <TableTd>{item.title}</TableTd>
<TableTd>{item.content}</TableTd> <TableTd>{item.content}</TableTd>

View File

@@ -8,22 +8,26 @@ import { useProxy } from 'valtio/utils';
import fasilitasKesehatanState from '../../../_state/kesehatan/data_kesehatan_warga/fasilitasKesehatan'; import fasilitasKesehatanState from '../../../_state/kesehatan/data_kesehatan_warga/fasilitasKesehatan';
import HeaderSearch from '../../../_com/header'; import HeaderSearch from '../../../_com/header';
import JudulList from '../../../_com/judulList'; import JudulList from '../../../_com/judulList';
import { useState } from 'react';
function FasilitasKesehatan() { function FasilitasKesehatan() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Fasilitas Kesehatan' title='Fasilitas Kesehatan'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListFasilitasKesehatan/> <ListFasilitasKesehatan search={search}/>
</Box> </Box>
); );
} }
function ListFasilitasKesehatan() { function ListFasilitasKesehatan({ search }: { search: string }) {
const stateFasilitasKesehatan = useProxy(fasilitasKesehatanState) const stateFasilitasKesehatan = useProxy(fasilitasKesehatanState)
const router = useRouter(); const router = useRouter();
@@ -31,6 +35,15 @@ function ListFasilitasKesehatan() {
stateFasilitasKesehatan.findMany.load() stateFasilitasKesehatan.findMany.load()
}, []) }, [])
const filteredData = (stateFasilitasKesehatan.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.name.toLowerCase().includes(keyword) ||
item.informasiumum.alamat.toLowerCase().includes(keyword) ||
item.informasiumum.jamOperasional.toLowerCase().includes(keyword)
);
});
if (!stateFasilitasKesehatan.findMany.data) { if (!stateFasilitasKesehatan.findMany.data) {
return ( return (
<Box py={10}> <Box py={10}>
@@ -57,7 +70,7 @@ function ListFasilitasKesehatan() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{stateFasilitasKesehatan.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.name}</TableTd> <TableTd>{item.name}</TableTd>
<TableTd>{item.informasiumum.alamat}</TableTd> <TableTd>{item.informasiumum.alamat}</TableTd>

View File

@@ -10,8 +10,24 @@ import { useProxy } from 'valtio/utils';
import JudulListTab from '../../../_com/jusulListTab'; import JudulListTab from '../../../_com/jusulListTab';
import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus';
import grafikkepuasan from '../../../_state/kesehatan/data_kesehatan_warga/grafikKepuasan'; import grafikkepuasan from '../../../_state/kesehatan/data_kesehatan_warga/grafikKepuasan';
import HeaderSearch from '../../../_com/header';
function GrafikHasilKepuasanMasyarakat() { function GrafikHasilKepuasanMasyarakat() {
const [search, setSearch] = useState("");
return (
<Box>
<HeaderSearch
title='Grafik Hasil Kepuasan Masyarakat'
placeholder='pencarian'
searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/>
<ListGrafikHasilKepuasanMasyarakat search={search} />
</Box>
);
}
function ListGrafikHasilKepuasanMasyarakat({ search }: { search: string }) {
type PDKMGrafik = { type PDKMGrafik = {
id: string; id: string;
label: string; label: string;
@@ -52,6 +68,14 @@ function GrafikHasilKepuasanMasyarakat() {
} }
}, [stateGrafikKepuasan.findMany.data]); }, [stateGrafikKepuasan.findMany.data]);
const filteredData = (stateGrafikKepuasan.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.label.toLowerCase().includes(keyword) ||
item.jumlah.toString().toLowerCase().includes(keyword)
);
});
if (!stateGrafikKepuasan.findMany.data) { if (!stateGrafikKepuasan.findMany.data) {
return ( return (
<Stack> <Stack>
@@ -81,7 +105,7 @@ function GrafikHasilKepuasanMasyarakat() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{stateGrafikKepuasan.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.label}</TableTd> <TableTd>{item.label}</TableTd>
<TableTd>{item.jumlah}</TableTd> <TableTd>{item.jumlah}</TableTd>

View File

@@ -8,21 +8,25 @@ import { useProxy } from 'valtio/utils';
import HeaderSearch from '../../../_com/header'; import HeaderSearch from '../../../_com/header';
import JudulList from '../../../_com/judulList'; import JudulList from '../../../_com/judulList';
import jadwalKegiatanState from '../../../_state/kesehatan/data_kesehatan_warga/jadwalKegiatan'; import jadwalKegiatanState from '../../../_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
import { useState } from 'react';
function JadwalKegiatan() { function JadwalKegiatan() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Jadwal Kegiatan' title='Jadwal Kegiatan'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListJadwalKegiatan/> <ListJadwalKegiatan search={search}/>
</Box> </Box>
); );
} }
function ListJadwalKegiatan() { function ListJadwalKegiatan({ search }: { search: string }) {
const stateJadwalKegiatan = useProxy(jadwalKegiatanState) const stateJadwalKegiatan = useProxy(jadwalKegiatanState)
const router = useRouter(); const router = useRouter();
@@ -30,6 +34,16 @@ function ListJadwalKegiatan() {
stateJadwalKegiatan.findMany.load() stateJadwalKegiatan.findMany.load()
}, []) }, [])
const filteredData = (stateJadwalKegiatan.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.informasijadwalkegiatan.name.toLowerCase().includes(keyword) ||
item.informasijadwalkegiatan.tanggal.toLowerCase().includes(keyword) ||
item.informasijadwalkegiatan.waktu.toLowerCase().includes(keyword) ||
item.informasijadwalkegiatan.lokasi.toLowerCase().includes(keyword)
);
});
if (!stateJadwalKegiatan.findMany.data) { if (!stateJadwalKegiatan.findMany.data) {
return ( return (
<Box py={10}> <Box py={10}>
@@ -57,7 +71,7 @@ function ListJadwalKegiatan() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{stateJadwalKegiatan.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.informasijadwalkegiatan.name}</TableTd> <TableTd>{item.informasijadwalkegiatan.name}</TableTd>
<TableTd>{item.informasijadwalkegiatan.tanggal}</TableTd> <TableTd>{item.informasijadwalkegiatan.tanggal}</TableTd>

View File

@@ -10,8 +10,24 @@ import { Bar, BarChart, Legend, Tooltip, XAxis, YAxis } from 'recharts';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import JudulListTab from '../../../_com/jusulListTab'; import JudulListTab from '../../../_com/jusulListTab';
import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus';
import HeaderSearch from '../../../_com/header';
function PersentaseDataKelahiranKematian() { function PersentaseDataKelahiranKematian() {
const [search, setSearch] = useState("");
return (
<Box>
<HeaderSearch
title='Persentase Data Kelahiran & Kematian'
placeholder='pencarian'
searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/>
<ListPersentaseDataKelahiranKematian search={search} />
</Box>
);
}
function ListPersentaseDataKelahiranKematian({ search }: { search: string }) {
type PDKMGrafik = { type PDKMGrafik = {
id: string; id: string;
tahun: string; tahun: string;
@@ -56,6 +72,16 @@ function PersentaseDataKelahiranKematian() {
} }
}, [statePersentase.findMany.data]); }, [statePersentase.findMany.data]);
const filteredData = (statePersentase.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.tahun.toLowerCase().includes(keyword) ||
item.kematianKasar.toString().toLowerCase().includes(keyword) ||
item.kematianBayi.toString().toLowerCase().includes(keyword) ||
item.kelahiranKasar.toString().toLowerCase().includes(keyword)
);
});
if (!statePersentase.findMany.data) { if (!statePersentase.findMany.data) {
return ( return (
<Stack> <Stack>
@@ -87,7 +113,7 @@ function PersentaseDataKelahiranKematian() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{statePersentase.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.tahun}</TableTd> <TableTd>{item.tahun}</TableTd>
<TableTd>{item.kematianKasar}</TableTd> <TableTd>{item.kematianKasar}</TableTd>

View File

@@ -8,21 +8,25 @@ import { useRouter } from 'next/navigation';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import infoWabahPenyakit from '../../_state/kesehatan/info-wabah-penyakit/infoWabahPenyakit'; import infoWabahPenyakit from '../../_state/kesehatan/info-wabah-penyakit/infoWabahPenyakit';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import { useState } from 'react';
function InfoWabahPenyakit() { function InfoWabahPenyakit() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Info Wabah Penyakit' title='Info Wabah Penyakit'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListInfoWabahPenyakit/> <ListInfoWabahPenyakit search={search}/>
</Box> </Box>
); );
} }
function ListInfoWabahPenyakit() { function ListInfoWabahPenyakit({ search }: { search: string }) {
const infoWabahPenyakitState = useProxy(infoWabahPenyakit) const infoWabahPenyakitState = useProxy(infoWabahPenyakit)
const router = useRouter() const router = useRouter()
@@ -30,6 +34,14 @@ function ListInfoWabahPenyakit() {
infoWabahPenyakitState.findMany.load() infoWabahPenyakitState.findMany.load()
}, []) }, [])
const filteredData = (infoWabahPenyakitState.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.name.toLowerCase().includes(keyword) ||
item.deskripsiSingkat.toLowerCase().includes(keyword)
);
});
if (!infoWabahPenyakitState.findMany.data) { if (!infoWabahPenyakitState.findMany.data) {
return ( return (
<Box py={10}> <Box py={10}>
@@ -56,7 +68,7 @@ function ListInfoWabahPenyakit() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{infoWabahPenyakitState.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd> <TableTd>
<Box w={100}> <Box w={100}>

View File

@@ -8,21 +8,25 @@ import { useRouter } from 'next/navigation';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import kontakDarurat from '../../_state/kesehatan/kontak-darurat/kontakDarurat'; import kontakDarurat from '../../_state/kesehatan/kontak-darurat/kontakDarurat';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import { useState } from 'react';
function KontakDarurat() { function KontakDarurat() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Kontak Darurat' title='Kontak Darurat'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListKontakDarurat /> <ListKontakDarurat search={search}/>
</Box> </Box>
); );
} }
function ListKontakDarurat() { function ListKontakDarurat({ search }: { search: string }) {
const kontakDaruratState = useProxy(kontakDarurat) const kontakDaruratState = useProxy(kontakDarurat)
const router = useRouter(); const router = useRouter();
@@ -30,6 +34,14 @@ function ListKontakDarurat() {
kontakDaruratState.findMany.load() kontakDaruratState.findMany.load()
}, []) }, [])
const filteredData = (kontakDaruratState.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.name.toLowerCase().includes(keyword) ||
item.deskripsi.toLowerCase().includes(keyword)
);
});
if (!kontakDaruratState.findMany.data) { if (!kontakDaruratState.findMany.data) {
return ( return (
<Box py={10}> <Box py={10}>
@@ -57,7 +69,7 @@ function ListKontakDarurat() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{kontakDaruratState.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd> <TableTd>
<Box w={100}> <Box w={100}>

View File

@@ -8,22 +8,25 @@ import { useRouter } from 'next/navigation';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import penangananDarurat from '../../_state/kesehatan/penanganan-darurat/penangananDarurat'; import penangananDarurat from '../../_state/kesehatan/penanganan-darurat/penangananDarurat';
import { useState } from 'react';
function PenangananDarurat() { function PenangananDarurat() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='PenangananDarurat' title='PenangananDarurat'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListPenangananDarurat/> <ListPenangananDarurat search={search}/>
</Box> </Box>
); );
} }
function ListPenangananDarurat() { function ListPenangananDarurat({ search }: { search: string }) {
const penangananDaruratState = useProxy(penangananDarurat) const penangananDaruratState = useProxy(penangananDarurat)
const router = useRouter(); const router = useRouter();
@@ -31,6 +34,14 @@ function ListPenangananDarurat() {
penangananDaruratState.findMany.load() penangananDaruratState.findMany.load()
}, []) }, [])
const filteredData = (penangananDaruratState.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.name.toLowerCase().includes(keyword) ||
item.deskripsi.toLowerCase().includes(keyword)
);
});
if (!penangananDaruratState.findMany.data) { if (!penangananDaruratState.findMany.data) {
return ( return (
<Box py={10}> <Box py={10}>
@@ -58,7 +69,7 @@ function ListPenangananDarurat() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{penangananDaruratState.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd> <TableTd>
<Box w={100}> <Box w={100}>

View File

@@ -8,21 +8,25 @@ import { useRouter } from 'next/navigation';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import posyandustate from '../../_state/kesehatan/posyandu/posyandu'; import posyandustate from '../../_state/kesehatan/posyandu/posyandu';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import { useState } from 'react';
function Posyandu() { function Posyandu() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Posyandu' title='Posyandu'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListPosyandu /> <ListPosyandu search={search} />
</Box> </Box>
); );
} }
function ListPosyandu() { function ListPosyandu({ search }: { search: string }) {
const statePosyandu = useProxy(posyandustate) const statePosyandu = useProxy(posyandustate)
const router = useRouter(); const router = useRouter();
@@ -30,6 +34,14 @@ function ListPosyandu() {
statePosyandu.findMany.load() statePosyandu.findMany.load()
}, []) }, [])
const filteredData = (statePosyandu.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.name.toLowerCase().includes(keyword) ||
item.nomor.toString().toLowerCase().includes(keyword)
);
});
if (!statePosyandu.findMany.data) { if (!statePosyandu.findMany.data) {
return ( return (
<Box py={10}> <Box py={10}>
@@ -56,7 +68,7 @@ function ListPosyandu() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{statePosyandu.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.name}</TableTd> <TableTd>{item.name}</TableTd>
<TableTd>{item.nomor}</TableTd> <TableTd>{item.nomor}</TableTd>

View File

@@ -8,21 +8,25 @@ import { useRouter } from 'next/navigation';
import programKesehatan from '../../_state/kesehatan/program-kesehatan/programKesehatan'; import programKesehatan from '../../_state/kesehatan/program-kesehatan/programKesehatan';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import { useState } from 'react';
function ProgramKesehatan() { function ProgramKesehatan() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Program Kesehatan' title='Program Kesehatan'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListProgramKesehatan /> <ListProgramKesehatan search={search}/>
</Box> </Box>
); );
} }
function ListProgramKesehatan() { function ListProgramKesehatan({ search }: { search: string }) {
const programKesehatanState = useProxy(programKesehatan) const programKesehatanState = useProxy(programKesehatan)
const router = useRouter() const router = useRouter()
@@ -30,6 +34,14 @@ function ListProgramKesehatan() {
programKesehatanState.findMany.load() programKesehatanState.findMany.load()
}, []) }, [])
const filteredData = (programKesehatanState.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.name.toLowerCase().includes(keyword) ||
item.deskripsiSingkat.toLowerCase().includes(keyword)
);
});
if (!programKesehatanState.findMany.data) { if (!programKesehatanState.findMany.data) {
return ( return (
<Box py={10}> <Box py={10}>
@@ -57,14 +69,16 @@ function ListProgramKesehatan() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{programKesehatanState.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd> <TableTd>
<Box w={100}> <Box w={100}>
<Text truncate="end" fz={"sm"}>{item.name}</Text> <Text truncate="end" fz={"sm"}>{item.name}</Text>
</Box> </Box>
</TableTd> </TableTd>
<TableTd>{item.deskripsiSingkat}</TableTd> <TableTd>
<Text truncate="end" fz={"sm"} dangerouslySetInnerHTML={{ __html: item.deskripsiSingkat }} />
</TableTd>
<TableTd> <TableTd>
<Image w={100} src={item.image?.link} alt="image" /> <Image w={100} src={item.image?.link} alt="image" />
</TableTd> </TableTd>

View File

@@ -8,21 +8,25 @@ import { useProxy } from 'valtio/utils';
import HeaderSearch from '../../_com/header'; import HeaderSearch from '../../_com/header';
import JudulList from '../../_com/judulList'; import JudulList from '../../_com/judulList';
import puskesmasState from '../../_state/kesehatan/puskesmas/puskesmas'; import puskesmasState from '../../_state/kesehatan/puskesmas/puskesmas';
import { useState } from 'react';
function Puskesmas() { function Puskesmas() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<HeaderSearch <HeaderSearch
title='Puskesmas' title='Puskesmas'
placeholder='pencarian' placeholder='pencarian'
searchIcon={<IconSearch size={20} />} searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/> />
<ListPuskesmas/> <ListPuskesmas search={search}/>
</Box> </Box>
); );
} }
function ListPuskesmas() { function ListPuskesmas({ search }: { search: string }) {
const statePuskesmas = useProxy(puskesmasState) const statePuskesmas = useProxy(puskesmasState)
const router = useRouter(); const router = useRouter();
@@ -30,6 +34,14 @@ function ListPuskesmas() {
statePuskesmas.findMany.load() statePuskesmas.findMany.load()
}, []) }, [])
const filteredData = (statePuskesmas.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.name.toLowerCase().includes(keyword) ||
item.alamat.toLowerCase().includes(keyword)
);
});
if (!statePuskesmas.findMany.data) { if (!statePuskesmas.findMany.data) {
return ( return (
<Box py={10}> <Box py={10}>
@@ -56,7 +68,7 @@ function ListPuskesmas() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{statePuskesmas.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.name}</TableTd> <TableTd>{item.name}</TableTd>
<TableTd>{item.alamat}</TableTd> <TableTd>{item.alamat}</TableTd>

View File

@@ -1,42 +1,46 @@
'use client' 'use client'
import colors from '@/con/colors'; import colors from '@/con/colors';
import { Box, Button, Grid, GridCol, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, TextInput, Title } from '@mantine/core'; import { Box, Button, Grid, GridCol, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core';
import { useShallowEffect } from '@mantine/hooks'; import { useShallowEffect } from '@mantine/hooks';
import { IconCircleDashedPlus, IconDeviceImacCog, IconSearch } from '@tabler/icons-react'; import { IconCircleDashedPlus, IconDeviceImacCog, IconSearch } from '@tabler/icons-react';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
import { useState } from 'react';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import HeaderSearch from '../../_com/header';
import daftarInformasiPublik from '../../_state/ppid/daftar_informasi_publik/daftarInformasiPublik'; import daftarInformasiPublik from '../../_state/ppid/daftar_informasi_publik/daftarInformasiPublik';
function Page() { function DaftarInformasiPublik() {
const [search, setSearch] = useState("");
return ( return (
<Box> <Box>
<Grid> <HeaderSearch
<GridCol span={{ base: 12, md: 9 }}> title='Posisi Organisasi'
<Title order={3}>Daftar Informasi Publik Desa Darmasaba</Title> placeholder='pencarian'
</GridCol> searchIcon={<IconSearch size={20} />}
<GridCol span={{ base: 12, md: 3 }}> value={search}
<Paper radius={"lg"} bg={colors['white-1']}> onChange={(e) => setSearch(e.currentTarget.value)}
<TextInput />
radius={"lg"} <ListDaftarInformasi search={search} />
placeholder='pencarian'
leftSection={<IconSearch size={20} />}
/>
</Paper>
</GridCol>
</Grid>
<ListDaftarInformasi />
</Box> </Box>
); );
} }
function ListDaftarInformasi() { function ListDaftarInformasi({ search }: { search: string }) {
const listData = useProxy(daftarInformasiPublik) const listData = useProxy(daftarInformasiPublik)
const router = useRouter()
useShallowEffect(() => { useShallowEffect(() => {
listData.findMany.load() listData.findMany.load()
}, []) }, [])
const router = useRouter()
const filteredData = (listData.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.jenisInformasi.toLowerCase().includes(keyword) ||
item.deskripsi.toLowerCase().includes(keyword)
);
});
if (!listData.findMany.data) { if (!listData.findMany.data) {
return ( return (
@@ -77,7 +81,7 @@ function ListDaftarInformasi() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{listData.findMany.data?.map((item, index) => ( {filteredData.map((item, index) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{index + 1}</TableTd> <TableTd>{index + 1}</TableTd>
<TableTd>{item.jenisInformasi}</TableTd> <TableTd>{item.jenisInformasi}</TableTd>
@@ -98,4 +102,4 @@ function ListDaftarInformasi() {
) )
} }
export default Page; export default DaftarInformasiPublik;

View File

@@ -11,8 +11,25 @@ import { Cell, Pie, PieChart } from 'recharts';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import JudulListTab from '../../../_com/jusulListTab'; import JudulListTab from '../../../_com/jusulListTab';
import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus';
import HeaderSearch from '../../../_com/header';
function GrafikBerdasarkanJenisKelamin() { function GrafikBerdasarkanJenisKelamin() {
const [search, setSearch] = useState("");
return (
<Box>
<HeaderSearch
title='Grafik Berdasarkan Jenis Kelamin Responden'
placeholder='pencarian'
searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/>
<ListGrafikBerdasarkanJenisKelamin search={search} />
</Box>
);
}
function ListGrafikBerdasarkanJenisKelamin({ search }: { search: string }) {
const stategrafikBerdasarkanJenisKelamin = useProxy(grafikBerdasarkanJenisKelamin) const stategrafikBerdasarkanJenisKelamin = useProxy(grafikBerdasarkanJenisKelamin)
const [donutData, setDonutData] = useState<any[]>([]); const [donutData, setDonutData] = useState<any[]>([]);
const [mounted, setMounted] = useState(false); const [mounted, setMounted] = useState(false);
@@ -46,6 +63,14 @@ function GrafikBerdasarkanJenisKelamin() {
} }
}, [stategrafikBerdasarkanJenisKelamin.findMany.data]) }, [stategrafikBerdasarkanJenisKelamin.findMany.data])
const filteredData = (stategrafikBerdasarkanJenisKelamin.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.laki.toString().toLowerCase().includes(keyword) ||
item.perempuan.toString().toLowerCase().includes(keyword)
);
});
if (!stategrafikBerdasarkanJenisKelamin.findMany.data) { if (!stategrafikBerdasarkanJenisKelamin.findMany.data) {
return ( return (
<Box> <Box>
@@ -74,14 +99,14 @@ function GrafikBerdasarkanJenisKelamin() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{stategrafikBerdasarkanJenisKelamin.findMany.data.length === 0 ? ( {filteredData.length === 0 ? (
<TableTr> <TableTr>
<TableTd colSpan={6}> <TableTd colSpan={6}>
<Text ta='center' c='dimmed'>Belum ada data grafik responden</Text> <Text ta='center' c='dimmed'>Belum ada data grafik responden</Text>
</TableTd> </TableTd>
</TableTr> </TableTr>
) : ( ) : (
stategrafikBerdasarkanJenisKelamin.findMany.data.map((item) => ( filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.laki}</TableTd> <TableTd>{item.laki}</TableTd>
<TableTd>{item.perempuan}</TableTd> <TableTd>{item.perempuan}</TableTd>

View File

@@ -11,9 +11,25 @@ import { useSnapshot } from 'valtio';
import JudulListTab from '../../../_com/jusulListTab'; import JudulListTab from '../../../_com/jusulListTab';
import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus';
import grafikBerdasarkanResponden from '../../../_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanResponden'; import grafikBerdasarkanResponden from '../../../_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanResponden';
import HeaderSearch from '../../../_com/header';
function GrafikBerdasarkanResponden() { function GrafikBerdasarkanResponden() {
const [search, setSearch] = useState("");
return (
<Box>
<HeaderSearch
title='Grafik Berdasarkan Pilihan Responden'
placeholder='pencarian'
searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/>
<ListGrafikBerdasarkanResponden search={search} />
</Box>
);
}
function ListGrafikBerdasarkanResponden({ search }: { search: string }) {
const stategrafikBerdasarkanResponden = useSnapshot(grafikBerdasarkanResponden) const stategrafikBerdasarkanResponden = useSnapshot(grafikBerdasarkanResponden)
const [donutData, setDonutData] = useState<any[]>([]); const [donutData, setDonutData] = useState<any[]>([]);
const [mounted, setMounted] = useState(false); const [mounted, setMounted] = useState(false);
@@ -38,6 +54,16 @@ function GrafikBerdasarkanResponden() {
stategrafikBerdasarkanResponden.findMany.load() stategrafikBerdasarkanResponden.findMany.load()
}, []) }, [])
const filteredData = (stategrafikBerdasarkanResponden.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.sangatbaik.toString().toLowerCase().includes(keyword) ||
item.baik.toString().toLowerCase().includes(keyword) ||
item.kurangbaik.toString().toLowerCase().includes(keyword) ||
item.tidakbaik.toString().toLowerCase().includes(keyword)
);
});
useEffect(() => { useEffect(() => {
if (stategrafikBerdasarkanResponden.findMany.data) { if (stategrafikBerdasarkanResponden.findMany.data) {
const totalSangatBaik = stategrafikBerdasarkanResponden.findMany.data.reduce((acc: number, cur: any) => acc + Number(cur.sangatbaik || 0), 0); const totalSangatBaik = stategrafikBerdasarkanResponden.findMany.data.reduce((acc: number, cur: any) => acc + Number(cur.sangatbaik || 0), 0);
@@ -83,14 +109,14 @@ function GrafikBerdasarkanResponden() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{stategrafikBerdasarkanResponden.findMany.data.length === 0 ? ( {filteredData.length === 0 ? (
<TableTr> <TableTr>
<TableTd colSpan={6}> <TableTd colSpan={6}>
<Text ta='center' c='dimmed'>Belum ada data grafik responden</Text> <Text ta='center' c='dimmed'>Belum ada data grafik responden</Text>
</TableTd> </TableTd>
</TableTr> </TableTr>
) : ( ) : (
stategrafikBerdasarkanResponden.findMany.data.map((item) => ( filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.sangatbaik}</TableTd> <TableTd>{item.sangatbaik}</TableTd>
<TableTd>{item.baik}</TableTd> <TableTd>{item.baik}</TableTd>

View File

@@ -11,8 +11,25 @@ import { Cell, Pie, PieChart } from 'recharts';
import { useProxy } from 'valtio/utils'; import { useProxy } from 'valtio/utils';
import JudulListTab from '../../../_com/jusulListTab'; import JudulListTab from '../../../_com/jusulListTab';
import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus';
import HeaderSearch from '../../../_com/header';
function GrafikBerdasarakanUmur() { function GrafikBerdasarakanUmur() {
const [search, setSearch] = useState("");
return (
<Box>
<HeaderSearch
title='Grafik Berdasarkan Umur Responden'
placeholder='pencarian'
searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/>
<ListGrafikBerdasarakanUmur search={search} />
</Box>
);
}
function ListGrafikBerdasarakanUmur({ search }: { search: string }) {
const stategrafikBerdasarkanUmur = useProxy(grafikBerdasarkanUmur) const stategrafikBerdasarkanUmur = useProxy(grafikBerdasarkanUmur)
const [donutData, setDonutData] = useState<any[]>([]); const [donutData, setDonutData] = useState<any[]>([]);
const [mounted, setMounted] = useState(false); const [mounted, setMounted] = useState(false);
@@ -50,6 +67,16 @@ function GrafikBerdasarakanUmur() {
} }
}, [stategrafikBerdasarkanUmur.findMany.data]) }, [stategrafikBerdasarkanUmur.findMany.data])
const filteredData = (stategrafikBerdasarkanUmur.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.remaja.toString().toLowerCase().includes(keyword) ||
item.dewasa.toString().toLowerCase().includes(keyword) ||
item.orangtua.toString().toLowerCase().includes(keyword) ||
item.lansia.toString().toLowerCase().includes(keyword)
);
});
if (!stategrafikBerdasarkanUmur.findMany.data) { if (!stategrafikBerdasarkanUmur.findMany.data) {
return ( return (
<Box> <Box>
@@ -57,7 +84,7 @@ function GrafikBerdasarakanUmur() {
</Box> </Box>
) )
} }
return ( return (
<Box> <Box>
<Stack gap={"xs"}> <Stack gap={"xs"}>
@@ -80,14 +107,14 @@ function GrafikBerdasarakanUmur() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{stategrafikBerdasarkanUmur.findMany.data.length === 0 ? ( {filteredData.length === 0 ? (
<TableTr> <TableTr>
<TableTd colSpan={6}> <TableTd colSpan={6}>
<Text ta='center' c='dimmed'>Belum ada data grafik responden</Text> <Text ta='center' c='dimmed'>Belum ada data grafik responden</Text>
</TableTd> </TableTd>
</TableTr> </TableTr>
) : ( ) : (
stategrafikBerdasarkanUmur.findMany.data.map((item) => ( filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.remaja}</TableTd> <TableTd>{item.remaja}</TableTd>
<TableTd>{item.dewasa}</TableTd> <TableTd>{item.dewasa}</TableTd>

View File

@@ -10,9 +10,26 @@ import { Bar, BarChart, Legend, Tooltip, XAxis, YAxis } from 'recharts';
import { useSnapshot } from 'valtio'; import { useSnapshot } from 'valtio';
import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus';
import grafikHasilKepuasanMasyarakat from '../../../_state/ppid/indeks_kepuasan_masyarakat/grafikHasilKepuasan'; import grafikHasilKepuasanMasyarakat from '../../../_state/ppid/indeks_kepuasan_masyarakat/grafikHasilKepuasan';
import HeaderSearch from '../../../_com/header';
function GrafikHasilKepuasanMasyarakat() { function GrafikHasilKepuasanMasyarakat() {
const [search, setSearch] = useState("");
return (
<Box>
<HeaderSearch
title='Grafik Hasil Kepuasan Masyarakat'
placeholder='pencarian'
searchIcon={<IconSearch size={20} />}
value={search}
onChange={(e) => setSearch(e.currentTarget.value)}
/>
<ListGrafikHasilKepuasanMasyarakat search={search} />
</Box>
);
}
function ListGrafikHasilKepuasanMasyarakat({ search }: { search: string }) {
type IKMGrafik = { type IKMGrafik = {
id: string; id: string;
label: string; label: string;
@@ -58,6 +75,14 @@ function GrafikHasilKepuasanMasyarakat() {
} }
}, [stateGrafikHasilKepuasan.findMany.data]); }, [stateGrafikHasilKepuasan.findMany.data]);
const filteredData = (stateGrafikHasilKepuasan.findMany.data || []).filter(item => {
const keyword = search.toLowerCase();
return (
item.label.toLowerCase().includes(keyword) ||
item.kepuasan.toString().toLowerCase().includes(keyword)
);
});
if (!stateGrafikHasilKepuasan.findMany.data) { if (!stateGrafikHasilKepuasan.findMany.data) {
@@ -87,7 +112,7 @@ function GrafikHasilKepuasanMasyarakat() {
</TableTr> </TableTr>
</TableThead> </TableThead>
<TableTbody> <TableTbody>
{stateGrafikHasilKepuasan.findMany.data?.map((item) => ( {filteredData.map((item) => (
<TableTr key={item.id}> <TableTr key={item.id}>
<TableTd>{item.label}</TableTd> <TableTd>{item.label}</TableTd>
<TableTd>{item.kepuasan}</TableTd> <TableTd>{item.kepuasan}</TableTd>