amalia/02-des-25 #55
@@ -21,7 +21,7 @@ export default function DashboardCountData() {
|
|||||||
label="Pengaduan Hari Ini"
|
label="Pengaduan Hari Ini"
|
||||||
value={String(data?.data?.pengaduan?.today)}
|
value={String(data?.data?.pengaduan?.today)}
|
||||||
change={String(data?.data?.pengaduan?.kenaikan) + "%"}
|
change={String(data?.data?.pengaduan?.kenaikan) + "%"}
|
||||||
color={(data?.data?.pengaduan?.kenaikan || 0) > 0 ? "teal" : "gray"}
|
color={"gray"}
|
||||||
/>
|
/>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
<Grid.Col span={{ base: 12, sm: 6, md: 4 }}>
|
<Grid.Col span={{ base: 12, sm: 6, md: 4 }}>
|
||||||
@@ -30,7 +30,7 @@ export default function DashboardCountData() {
|
|||||||
label="Pengajuan Surat Hari Ini"
|
label="Pengajuan Surat Hari Ini"
|
||||||
value={String(data?.data?.pelayanan?.today)}
|
value={String(data?.data?.pelayanan?.today)}
|
||||||
change={String(data?.data?.pelayanan?.kenaikan) + "%"}
|
change={String(data?.data?.pelayanan?.kenaikan) + "%"}
|
||||||
color={(data?.data?.pelayanan?.kenaikan || 0) > 0 ? "teal" : "gray"}
|
color="gray"
|
||||||
/>
|
/>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
<Grid.Col span={{ base: 12, sm: 6, md: 4 }}>
|
<Grid.Col span={{ base: 12, sm: 6, md: 4 }}>
|
||||||
|
|||||||
@@ -6,8 +6,10 @@ import {
|
|||||||
Container,
|
Container,
|
||||||
Divider,
|
Divider,
|
||||||
Flex,
|
Flex,
|
||||||
|
Grid,
|
||||||
Group,
|
Group,
|
||||||
Input,
|
Input,
|
||||||
|
Pagination,
|
||||||
Stack,
|
Stack,
|
||||||
Tabs,
|
Tabs,
|
||||||
Text,
|
Text,
|
||||||
@@ -113,22 +115,26 @@ type StatusKey =
|
|||||||
function ListPelayananSurat({ status }: { status: StatusKey }) {
|
function ListPelayananSurat({ status }: { status: StatusKey }) {
|
||||||
const [page, setPage] = useState(1);
|
const [page, setPage] = useState(1);
|
||||||
const [value, setValue] = useState("");
|
const [value, setValue] = useState("");
|
||||||
const { data, mutate, isLoading } = useSwr("/", async () => {
|
const { data, mutate, isLoading } = useSwr("/", async () =>
|
||||||
const res = await apiFetch.api.pelayanan.list.get({
|
apiFetch.api.pelayanan.list.get({
|
||||||
query: {
|
query: {
|
||||||
status,
|
status,
|
||||||
search: value,
|
search: value,
|
||||||
take: "",
|
take: "",
|
||||||
page: "",
|
page: page.toString(),
|
||||||
},
|
},
|
||||||
});
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
useShallowEffect(() => {
|
||||||
|
setPage(1);
|
||||||
|
mutate();
|
||||||
|
}, [status, value]);
|
||||||
|
|
||||||
return Array.isArray(res?.data) ? res.data : []; // ⬅ paksa return array
|
|
||||||
});
|
|
||||||
|
|
||||||
useShallowEffect(() => {
|
useShallowEffect(() => {
|
||||||
mutate();
|
mutate();
|
||||||
}, [status, value]);
|
}, [page]);
|
||||||
|
|
||||||
|
|
||||||
useShallowEffect(() => {
|
useShallowEffect(() => {
|
||||||
@@ -155,11 +161,17 @@ function ListPelayananSurat({ status }: { status: StatusKey }) {
|
|||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
|
|
||||||
const list = data || [];
|
const list = data?.data?.data || [];
|
||||||
|
const total = data?.data?.total || 0;
|
||||||
|
const totalPage = data?.data?.totalPages || 1;
|
||||||
|
const pageSize = data?.data?.pageSize || 10;
|
||||||
|
const pageNow = data?.data?.page || 1;
|
||||||
|
const toDate = (d: any) => new Date(d);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Stack gap="xl">
|
<Stack gap="xl">
|
||||||
<Group grow>
|
<Grid>
|
||||||
|
<Grid.Col span={10}>
|
||||||
<Input
|
<Input
|
||||||
value={value}
|
value={value}
|
||||||
placeholder="Cari pengajuan..."
|
placeholder="Cari pengajuan..."
|
||||||
@@ -174,7 +186,14 @@ function ListPelayananSurat({ status }: { status: StatusKey }) {
|
|||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
</Grid.Col>
|
||||||
|
<Grid.Col span={2}>
|
||||||
|
<Group justify="space-between" grow>
|
||||||
|
<Text size="sm">{`${pageSize * (page - 1) + 1} – ${Math.min(total, pageSize * page)} of ${total}`}</Text>
|
||||||
|
<Pagination total={totalPage} value={page} onChange={setPage} withPages={false} />
|
||||||
</Group>
|
</Group>
|
||||||
|
</Grid.Col>
|
||||||
|
</Grid>
|
||||||
{Array.isArray(list) && list?.length === 0 ? (
|
{Array.isArray(list) && list?.length === 0 ? (
|
||||||
<Flex justify="center" align="center" py={"xl"}>
|
<Flex justify="center" align="center" py={"xl"}>
|
||||||
<Stack gap={4} align="center">
|
<Stack gap={4} align="center">
|
||||||
@@ -214,7 +233,7 @@ function ListPelayananSurat({ status }: { status: StatusKey }) {
|
|||||||
#{v.noPengajuan}
|
#{v.noPengajuan}
|
||||||
</Title>
|
</Title>
|
||||||
<Text size="sm" c="dimmed">
|
<Text size="sm" c="dimmed">
|
||||||
{v.updatedAt}
|
{String(v.updatedAt)}
|
||||||
</Text>
|
</Text>
|
||||||
</Group>
|
</Group>
|
||||||
</Flex>
|
</Flex>
|
||||||
@@ -247,7 +266,7 @@ function ListPelayananSurat({ status }: { status: StatusKey }) {
|
|||||||
Tanggal Ajuan
|
Tanggal Ajuan
|
||||||
</Text>
|
</Text>
|
||||||
</Group>
|
</Group>
|
||||||
<Text size="md">{v.createdAt}</Text>
|
<Text size="md">{toDate(v.createdAt).toLocaleDateString("id-ID", { day: "numeric", month: "long", year: "numeric" })}</Text>
|
||||||
</Flex>
|
</Flex>
|
||||||
<Flex direction={"column"} justify="flex-start">
|
<Flex direction={"column"} justify="flex-start">
|
||||||
<Group gap="xs">
|
<Group gap="xs">
|
||||||
|
|||||||
@@ -6,8 +6,10 @@ import {
|
|||||||
Container,
|
Container,
|
||||||
Divider,
|
Divider,
|
||||||
Flex,
|
Flex,
|
||||||
|
Grid,
|
||||||
Group,
|
Group,
|
||||||
Input,
|
Input,
|
||||||
|
Pagination,
|
||||||
Stack,
|
Stack,
|
||||||
Tabs,
|
Tabs,
|
||||||
Text,
|
Text,
|
||||||
@@ -124,22 +126,25 @@ function ListPengaduan({ status }: { status: StatusKey }) {
|
|||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const [page, setPage] = useState(1);
|
const [page, setPage] = useState(1);
|
||||||
const [value, setValue] = useState("");
|
const [value, setValue] = useState("");
|
||||||
const { data, mutate, isLoading } = useSwr("/", async () => {
|
const { data, mutate, isLoading } = useSwr("/", async () =>
|
||||||
const res = await apiFetch.api.pengaduan.list.get({
|
apiFetch.api.pengaduan.list.get({
|
||||||
query: {
|
query: {
|
||||||
status,
|
status,
|
||||||
search: value,
|
search: value,
|
||||||
take: "",
|
take: "",
|
||||||
page: "",
|
page: page.toString(),
|
||||||
},
|
},
|
||||||
});
|
})
|
||||||
|
);
|
||||||
|
|
||||||
return Array.isArray(res?.data) ? res.data : []; // ⬅ paksa return array
|
useShallowEffect(() => {
|
||||||
});
|
setPage(1);
|
||||||
|
mutate();
|
||||||
|
}, [status, value]);
|
||||||
|
|
||||||
useShallowEffect(() => {
|
useShallowEffect(() => {
|
||||||
mutate();
|
mutate();
|
||||||
}, [status, value]);
|
}, [page]);
|
||||||
|
|
||||||
useShallowEffect(() => {
|
useShallowEffect(() => {
|
||||||
const unsubscribe = subscribe(state, () => mutate());
|
const unsubscribe = subscribe(state, () => mutate());
|
||||||
@@ -163,11 +168,18 @@ function ListPengaduan({ status }: { status: StatusKey }) {
|
|||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
|
|
||||||
const list = data || [];
|
const list = data?.data?.data || [];
|
||||||
|
const total = data?.data?.total || 0;
|
||||||
|
const totalPage = data?.data?.totalPages || 1;
|
||||||
|
const pageSize = data?.data?.pageSize || 10;
|
||||||
|
const pageNow = data?.data?.page || 1;
|
||||||
|
const toDate = (d: any) => new Date(d);
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Stack gap="xl">
|
<Stack gap="xl">
|
||||||
<Group grow>
|
<Grid>
|
||||||
|
<Grid.Col span={10}>
|
||||||
<Input
|
<Input
|
||||||
value={value}
|
value={value}
|
||||||
placeholder="Cari pengaduan..."
|
placeholder="Cari pengaduan..."
|
||||||
@@ -182,12 +194,15 @@ function ListPengaduan({ status }: { status: StatusKey }) {
|
|||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
{/* <Group justify="flex-end">
|
</Grid.Col>
|
||||||
<Text size="sm">Menampilkan {Number(data?.data?.length) * (page - 1) + 1} – {Math.min(10, Number(data?.data?.length) * page)} dari {Number(data?.data?.length)}</Text>
|
<Grid.Col span={2}>
|
||||||
<Pagination total={Number(data?.data?.length)} value={page} onChange={setPage} withPages={false} />
|
<Group justify="space-between" grow>
|
||||||
</Group> */}
|
<Text size="sm">{`${pageSize * (page - 1) + 1} – ${Math.min(total, pageSize * page)} of ${total}`}</Text>
|
||||||
|
<Pagination total={totalPage} value={page} onChange={setPage} withPages={false} />
|
||||||
</Group>
|
</Group>
|
||||||
{list.length === 0 ? (
|
</Grid.Col>
|
||||||
|
</Grid>
|
||||||
|
{Array.isArray(list) && list.length === 0 ? (
|
||||||
<Flex justify="center" align="center" py={"xl"}>
|
<Flex justify="center" align="center" py={"xl"}>
|
||||||
<Stack gap={4} align="center">
|
<Stack gap={4} align="center">
|
||||||
<IconFileSad size={32} color="gray" />
|
<IconFileSad size={32} color="gray" />
|
||||||
@@ -224,7 +239,7 @@ function ListPengaduan({ status }: { status: StatusKey }) {
|
|||||||
#{v.noPengaduan}
|
#{v.noPengaduan}
|
||||||
</Title>
|
</Title>
|
||||||
<Text size="sm" c="dimmed">
|
<Text size="sm" c="dimmed">
|
||||||
{v.updatedAt}
|
{String(v.updatedAt)}
|
||||||
</Text>
|
</Text>
|
||||||
</Group>
|
</Group>
|
||||||
</Flex>
|
</Flex>
|
||||||
@@ -257,7 +272,7 @@ function ListPengaduan({ status }: { status: StatusKey }) {
|
|||||||
Tanggal Aduan
|
Tanggal Aduan
|
||||||
</Text>
|
</Text>
|
||||||
</Group>
|
</Group>
|
||||||
<Text size="md">{v.createdAt}</Text>
|
<Text size="md">{toDate(v.createdAt).toLocaleDateString("id-ID", { day: "numeric", month: "long", year: "numeric" })}</Text>
|
||||||
</Flex>
|
</Flex>
|
||||||
<Flex direction={"column"} justify="flex-start">
|
<Flex direction={"column"} justify="flex-start">
|
||||||
<Group gap="xs">
|
<Group gap="xs">
|
||||||
|
|||||||
@@ -581,6 +581,14 @@ const PelayananRoute = new Elysia({
|
|||||||
mode: "insensitive"
|
mode: "insensitive"
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Warga: {
|
||||||
|
name: {
|
||||||
|
contains: search ?? "",
|
||||||
|
mode: "insensitive"
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -592,6 +600,11 @@ const PelayananRoute = new Elysia({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const totalData = await prisma.pelayananAjuan.count({
|
||||||
|
where
|
||||||
|
});
|
||||||
|
|
||||||
const data = await prisma.pelayananAjuan.findMany({
|
const data = await prisma.pelayananAjuan.findMany({
|
||||||
skip,
|
skip,
|
||||||
take: !take ? 10 : Number(take),
|
take: !take ? 10 : Number(take),
|
||||||
@@ -625,12 +638,20 @@ const PelayananRoute = new Elysia({
|
|||||||
category: item.CategoryPelayanan.name,
|
category: item.CategoryPelayanan.name,
|
||||||
warga: item.Warga.name,
|
warga: item.Warga.name,
|
||||||
status: item.status,
|
status: item.status,
|
||||||
createdAt: item.createdAt.toLocaleDateString("id-ID", { day: "numeric", month: "long", year: "numeric" }),
|
createdAt: item.createdAt.toISOString(),
|
||||||
updatedAt: 'terakhir diperbarui ' + getLastUpdated(item.updatedAt),
|
updatedAt: 'terakhir diperbarui ' + getLastUpdated(item.updatedAt),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
return dataFix
|
const dataReturn = {
|
||||||
|
data: dataFix,
|
||||||
|
total: totalData,
|
||||||
|
page: Number(page) || 1,
|
||||||
|
pageSize: !take ? 10 : Number(take),
|
||||||
|
totalPages: Math.ceil(totalData / (!take ? 10 : Number(take)))
|
||||||
|
}
|
||||||
|
|
||||||
|
return dataReturn
|
||||||
}, {
|
}, {
|
||||||
query: t.Object({
|
query: t.Object({
|
||||||
take: t.String({ optional: true }),
|
take: t.String({ optional: true }),
|
||||||
|
|||||||
@@ -646,6 +646,10 @@ const PengaduanRoute = new Elysia({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const totalData = await prisma.pengaduan.count({
|
||||||
|
where
|
||||||
|
});
|
||||||
|
|
||||||
const data = await prisma.pengaduan.findMany({
|
const data = await prisma.pengaduan.findMany({
|
||||||
skip,
|
skip,
|
||||||
take: !take ? 10 : Number(take),
|
take: !take ? 10 : Number(take),
|
||||||
@@ -683,12 +687,20 @@ const PengaduanRoute = new Elysia({
|
|||||||
detail: item.detail,
|
detail: item.detail,
|
||||||
status: item.status,
|
status: item.status,
|
||||||
location: item.location,
|
location: item.location,
|
||||||
createdAt: item.createdAt.toLocaleDateString("id-ID", { day: "numeric", month: "long", year: "numeric" }),
|
createdAt: item.createdAt.toISOString(),
|
||||||
updatedAt: 'terakhir diperbarui ' + getLastUpdated(item.updatedAt),
|
updatedAt: 'terakhir diperbarui ' + getLastUpdated(item.updatedAt),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
return dataFix
|
const dataReturn = {
|
||||||
|
data: dataFix,
|
||||||
|
total: totalData,
|
||||||
|
page: Number(page) || 1,
|
||||||
|
pageSize: !take ? 10 : Number(take),
|
||||||
|
totalPages: Math.ceil(totalData / (!take ? 10 : Number(take)))
|
||||||
|
}
|
||||||
|
|
||||||
|
return dataReturn
|
||||||
}, {
|
}, {
|
||||||
query: t.Object({
|
query: t.Object({
|
||||||
take: t.String({ optional: true }),
|
take: t.String({ optional: true }),
|
||||||
@@ -790,8 +802,6 @@ const PengaduanRoute = new Elysia({
|
|||||||
description: "Tool untuk delete file Seafile",
|
description: "Tool untuk delete file Seafile",
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
export default PengaduanRoute
|
export default PengaduanRoute
|
||||||
|
|||||||
Reference in New Issue
Block a user