Create & Read Data :

* Menu Desa : Berita & Pengumuman
* Kesehatan : Data Kesehatan Warga => Fasilitas Kesehatan
This commit is contained in:
2025-04-25 10:24:52 +08:00
parent 9a6f8dc7f6
commit d575c9c792
47 changed files with 1840 additions and 46 deletions

View File

@@ -75,7 +75,6 @@ const berita = proxy({
| null,
async load() {
const res = await ApiFetch.api.desa.berita["find-many"].get();
console.log(res)
if (res.status === 200) {
berita.findMany.data = (res.data?.data as any) ?? [];
}

View File

@@ -0,0 +1,333 @@
import ApiFetch from "@/lib/api-fetch";
import { Prisma } from "@prisma/client";
import { toast } from "react-toastify";
import { proxy } from "valtio";
import { z } from "zod";
/* Informasi Umum */
const templateInformasiUmum = z.object({
fasilitas: z.string().min(3, "Fasilitas minimal 3 karakter"),
alamat: z.string().min(3, "Alamat minimal 3 karakter"),
jamOperasional: z.string().min(3, "Jam Operasional minimal 3 karakter"),
});
type InfromasiUmum = Prisma.InformasiUmumGetPayload<{
select: {
fasilitas: true;
alamat: true;
jamOperasional: true;
};
}>;
const informasiumum = proxy({
create: {
form: {} as InfromasiUmum,
loading: false,
async create() {
const cek = templateInformasiUmum.safeParse(informasiumum.create.form);
if (!cek.success) {
const err = `[${cek.error.issues
.map((v) => `${v.path.join(".")}`)
.join("\n")}] required`;
return toast.error(err);
}
try {
informasiumum.create.loading = true;
const res = await ApiFetch.api.kesehatan.informasiumum["create"].post(
informasiumum.create.form
);
if (res.status === 200) {
informasiumum.findMany.load();
return toast.success("success create");
}
return toast.error("failed create");
} catch (error) {
console.log((error as Error).message);
} finally {
informasiumum.create.loading = false;
}
},
},
findMany: {
data: null as
| Prisma.InformasiUmumGetPayload<{ omit: { isActive: true } }>[]
| null,
async load() {
const res = await ApiFetch.api.kesehatan.
informasiumum["find-many"].get();
if (res.status === 200) {
informasiumum.findMany.data = res.data?.data ?? [];
}
},
},
});
/* ======================================================================= */
/* Layanan Unggulan */
const templateLayananUnggulanForm = z.object({
content: z.string().min(3, "Content minimal 3 karakter"),
});
type LayananUnggulan = Prisma.LayananUnggulanGetPayload<{
select: {
content: true;
};
}>;
const layananunggulan = proxy({
create: {
form: {} as LayananUnggulan,
loading: false,
async create() {
const cek = templateLayananUnggulanForm.safeParse(layananunggulan.create.form);
if (!cek.success) {
const err = `[${cek.error.issues
.map((v) => `${v.path.join(".")}`)
.join("\n")}] required`;
return toast.error(err);
}
try {
layananunggulan.create.loading = true;
const res = await ApiFetch.api.kesehatan.layananunggulan["create"].post(
layananunggulan.create.form
);
if (res.status === 200) {
layananunggulan.findMany.load();
return toast.success("success create");
}
return toast.error("failed create");
} catch (error) {
console.log((error as Error).message);
} finally {
layananunggulan.create.loading = false;
}
},
},
findMany: {
data: null as
| Prisma.LayananUnggulanGetPayload<{ omit: { isActive: true } }>[]
| null,
async load() {
const res = await ApiFetch.api.kesehatan.
layananunggulan["find-many"].get();
if (res.status === 200) {
layananunggulan.findMany.data = res.data?.data ?? [];
}
},
},
})
/* ======================================================================= */
/* Dokter dan Tenaga Medis */
const templateDokterdanTenagaMedis = z.object({
name: z.string().min(3, "Name minimal 3 karakter"),
specialist: z.string().min(3, "Specialist minimal 3 karakter"),
jadwal: z.string().min(3, "Jadwal minimal 3 karakter"),
})
type DokterdanTenagaMedis = Prisma.DokterdanTenagaMedisGetPayload<{
select: {
name: true;
specialist: true;
jadwal: true;
};
}>;
const dokterdantenagamedis = proxy({
create: {
form: {} as DokterdanTenagaMedis,
loading: false,
async create() {
const cek = templateDokterdanTenagaMedis.safeParse(dokterdantenagamedis.create.form);
if (!cek.success) {
const err = `[${cek.error.issues
.map((v) => `${v.path.join(".")}`)
.join("\n")}] required`;
return toast.error(err);
}
try {
dokterdantenagamedis.create.loading = true;
const res = await ApiFetch.api.kesehatan.dokterdantenagamedis["create"].post(dokterdantenagamedis.create.form);
if (res.status === 200) {
dokterdantenagamedis.findMany.load();
return toast.success("success create");
}
return toast.error("failed create");
} catch (error) {
console.log((error as Error).message);
} finally {
dokterdantenagamedis.create.loading = false;
}
},
},
findMany: {
data: null as
| Prisma.DokterdanTenagaMedisGetPayload<{ omit: { isActive: true } }>[]
| null,
async load() {
const res = await ApiFetch.api.kesehatan.dokterdantenagamedis["find-many"].get();
if (res.status === 200) {
dokterdantenagamedis.findMany.data = res.data?.data ?? [];
}
},
},
})
/* ======================================================================= */
/* Fasilitas Pendukung */
const templateFasilitasPendukung = z.object({
content: z.string().min(3, "Content minimal 3 karakter"),
})
type FasilitasPendukung = Prisma.FasilitasPendukungGetPayload<{
select: {
content: true;
};
}>;
const fasilitaspendukung = proxy({
create: {
form: {} as FasilitasPendukung,
loading: false,
async create() {
const cek = templateFasilitasPendukung.safeParse(fasilitaspendukung.create.form);
if (!cek.success) {
const err = `[${cek.error.issues
.map((v) => `${v.path.join(".")}`)
.join("\n")}] required`;
return toast.error(err);
}
try {
fasilitaspendukung.create.loading = true;
const res = await ApiFetch.api.kesehatan.fasilitaspendukung["create"].post(fasilitaspendukung.create.form);
if (res.status === 200) {
fasilitaspendukung.findMany.load();
return toast.success("success create");
}
return toast.error("failed create");
} catch (error) {
console.log((error as Error).message);
} finally {
fasilitaspendukung.create.loading = false;
}
},
},
findMany: {
data: null as
| Prisma.FasilitasPendukungGetPayload<{ omit: { isActive: true } }>[]
| null,
async load() {
const res = await ApiFetch.api.kesehatan.
fasilitaspendukung["find-many"].get();
if (res.status === 200) {
fasilitaspendukung.findMany.data = res.data?.data ?? [];
}
},
},
})
/* ======================================================================= */
/* Tarif dan Layanan */
const templateTarifDanLayanan = z.object({
layanan: z.string().min(3, "Layanan minimal 3 karakter"),
tarif: z.string().min(3, "Tarif minimal 3 karakter"),
})
const tarifdanlayanan = proxy({
create: {
form: {} as Prisma.TarifDanLayananGetPayload<{ select: { layanan: true; tarif: true } }>,
loading: false,
async create() {
const cek = templateTarifDanLayanan.safeParse(tarifdanlayanan.create.form);
if (!cek.success) {
const err = `[${cek.error.issues
.map((v) => `${v.path.join(".")}`)
.join("\n")}] required`;
return toast.error(err);
}
try {
tarifdanlayanan.create.loading = true;
const res = await ApiFetch.api.kesehatan.tarifdanlayanan["create"].post(tarifdanlayanan.create.form);
if (res.status === 200) {
tarifdanlayanan.findMany.load();
return toast.success("success create");
}
return toast.error("failed create");
} catch (error) {
console.log((error as Error).message);
} finally {
tarifdanlayanan.create.loading = false;
}
},
},
findMany: {
data: null as
| Prisma.TarifDanLayananGetPayload<{ omit: { isActive: true } }>[]
| null,
async load() {
const res = await ApiFetch.api.kesehatan.
tarifdanlayanan["find-many"].get();
if (res.status === 200) {
tarifdanlayanan.findMany.data = res.data?.data ?? [];
}
},
},
})
/* ======================================================================= */
/* Prosedur Pendaftaran */
const templateProsedurPendaftaran = z.object({
content: z.string().min(3, "Content minimal 3 karakter"),
})
const prosedurpendaftaran = proxy({
create: {
form: {} as Prisma.ProsedurPendaftaranGetPayload<{ select: { content: true } }>,
loading: false,
async create() {
const cek = templateProsedurPendaftaran.safeParse(prosedurpendaftaran.create.form);
if (!cek.success) {
const err = `[${cek.error.issues
.map((v) => `${v.path.join(".")}`)
.join("\n")}] required`;
return toast.error(err);
}
try {
prosedurpendaftaran.create.loading = true;
const res = await ApiFetch.api.kesehatan.prosedurpendaftaran["create"].post(prosedurpendaftaran.create.form);
if (res.status === 200) {
prosedurpendaftaran.findMany.load();
return toast.success("success create");
}
return toast.error("failed create");
} catch (error) {
console.log((error as Error).message);
} finally {
prosedurpendaftaran.create.loading = false;
}
},
},
findMany: {
data: null as
| Prisma.ProsedurPendaftaranGetPayload<{ omit: { isActive: true } }>[]
| null,
async load() {
const res = await ApiFetch.api.kesehatan.
prosedurpendaftaran["find-many"].get();
if (res.status === 200) {
prosedurpendaftaran.findMany.data = res.data?.data ?? [];
}
},
},
})
const stateKesehatan = proxy({
informasiumum,
layananunggulan,
dokterdantenagamedis,
fasilitaspendukung,
tarifdanlayanan,
prosedurpendaftaran
})
export default stateKesehatan

View File

@@ -0,0 +1,79 @@
'use client'
import { RichTextEditor, Link } from '@mantine/tiptap';
import { useEditor } from '@tiptap/react';
import Highlight from '@tiptap/extension-highlight';
import StarterKit from '@tiptap/starter-kit';
import Underline from '@tiptap/extension-underline';
import TextAlign from '@tiptap/extension-text-align';
import Superscript from '@tiptap/extension-superscript';
import SubScript from '@tiptap/extension-subscript';
const content =
'<h2 style="text-align: center;">Welcome to Mantine rich text editor</h2><p><code>RichTextEditor</code> component focuses on usability and is designed to be as simple as possible to bring a familiar editing experience to regular users. <code>RichTextEditor</code> is based on <a href="https://tiptap.dev/" rel="noopener noreferrer" target="_blank">Tiptap.dev</a> and supports all of its features:</p><ul><li>General text formatting: <strong>bold</strong>, <em>italic</em>, <u>underline</u>, <s>strike-through</s> </li><li>Headings (h1-h6)</li><li>Sub and super scripts (<sup>&lt;sup /&gt;</sup> and <sub>&lt;sub /&gt;</sub> tags)</li><li>Ordered and bullet lists</li><li>Text align&nbsp;</li><li>And all <a href="https://tiptap.dev/extensions" target="_blank" rel="noopener noreferrer">other extensions</a></li></ul>';
function TextEditor() {
const editor = useEditor({
extensions: [
StarterKit,
Underline,
Link,
Superscript,
SubScript,
Highlight,
TextAlign.configure({ types: ['heading', 'paragraph'] }),
],
content,
});
return (
<RichTextEditor editor={editor}>
<RichTextEditor.Toolbar sticky stickyOffset={60}>
<RichTextEditor.ControlsGroup>
<RichTextEditor.Bold />
<RichTextEditor.Italic />
<RichTextEditor.Underline />
<RichTextEditor.Strikethrough />
<RichTextEditor.ClearFormatting />
<RichTextEditor.Highlight />
<RichTextEditor.Code />
</RichTextEditor.ControlsGroup>
<RichTextEditor.ControlsGroup>
<RichTextEditor.H1 />
<RichTextEditor.H2 />
<RichTextEditor.H3 />
<RichTextEditor.H4 />
</RichTextEditor.ControlsGroup>
<RichTextEditor.ControlsGroup>
<RichTextEditor.Blockquote />
<RichTextEditor.Hr />
<RichTextEditor.BulletList />
<RichTextEditor.OrderedList />
<RichTextEditor.Subscript />
<RichTextEditor.Superscript />
</RichTextEditor.ControlsGroup>
<RichTextEditor.ControlsGroup>
<RichTextEditor.Link />
<RichTextEditor.Unlink />
</RichTextEditor.ControlsGroup>
<RichTextEditor.ControlsGroup>
<RichTextEditor.AlignLeft />
<RichTextEditor.AlignCenter />
<RichTextEditor.AlignJustify />
<RichTextEditor.AlignRight />
</RichTextEditor.ControlsGroup>
<RichTextEditor.ControlsGroup>
<RichTextEditor.Undo />
<RichTextEditor.Redo />
</RichTextEditor.ControlsGroup>
</RichTextEditor.Toolbar>
<RichTextEditor.Content />
</RichTextEditor>
);
}
export default TextEditor

View File

@@ -0,0 +1,12 @@
import { Button } from '@mantine/core';
import React from 'react';
function ButtonSubmit() {
return (
<>
<Button onClick={() => {}}>Submit</Button>
</>
);
}
export default ButtonSubmit;

View File

@@ -0,0 +1,26 @@
import { Box, SimpleGrid, Stack, TextInput, Title } from '@mantine/core';
import React from 'react';
function ArtikelKesehatan() {
return (
<Stack>
<SimpleGrid cols={{
base: 1, md: 2
}}>
<Box>
<Title order={3}>Artikel Kesehatan</Title>
<TextInput
label="Jadwal"
placeholder='masukkan artikel kesehatan'
/>
</Box>
<Box>
<Title order={3}>List Artikel Kesehatan</Title>
</Box>
</SimpleGrid>
</Stack>
);
}
export default ArtikelKesehatan;

View File

@@ -0,0 +1,90 @@
import stateKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/kesehatan';
import colors from '@/con/colors';
import { Center, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core';
import { useShallowEffect } from '@mantine/hooks';
import _ from 'lodash';
import { useProxy } from 'valtio/utils';
function DokterdanTenagaMedisList() {
const kesehatanState = useProxy(stateKesehatan.dokterdantenagamedis);
useShallowEffect(() => {
kesehatanState.findMany.load();
}, []);
// Penanganan kasus ketika tidak ada data
if (_.isEmpty(kesehatanState.findMany.data)) {
return (
<Stack>
<Table
striped
highlightOnHover
withTableBorder
withColumnBorders
bg={colors['white-1']}
>
<TableThead>
<TableTr>
<TableTh>
<Center>Nama</Center>
</TableTh>
<TableTh>
<Center>Specialist</Center>
</TableTh>
<TableTh >
<Center>Jadwal</Center>
</TableTh>
</TableTr>
</TableThead>
<TableTbody >
<TableTr >
<TableTd colSpan={3}>
<Center>
<Text>Tidak ada data</Text>
</Center>
</TableTd>
</TableTr>
</TableTbody>
</Table>
</Stack>
);
}
return (
<Stack>
<Table
striped
highlightOnHover
withTableBorder
withColumnBorders
bg={colors['white-1']}
>
<TableThead >
<TableTr >
<TableTh >
<Center>Nama</Center>
</TableTh>
<TableTh >
<Center>Specialist</Center>
</TableTh>
<TableTh >
<Center>Jadwal</Center>
</TableTh>
</TableTr>
</TableThead>
<TableTbody >
{kesehatanState.findMany.data?.map((item) => (
<TableTr key={item.id}>
<TableTd ta="center">{item.name}</TableTd>
<TableTd ta="center">Specialist {item.specialist}</TableTd>
<TableTd ta="center">{item.jadwal}</TableTd>
</TableTr>
))}
</TableTbody>
</Table>
</Stack>
);
}
export default DokterdanTenagaMedisList;

View File

@@ -0,0 +1,41 @@
import stateKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/kesehatan';
import { Box, Button, Text, TextInput } from '@mantine/core';
import React from 'react';
import { useProxy } from 'valtio/utils';
function DokterDanTenagaMedis() {
const dokterdantenagamedisState = useProxy(stateKesehatan.dokterdantenagamedis)
return (
<Box>
<Text fw={"bold"}>Dokter & Tenaga Medis</Text>
<TextInput
label="Nama Dokter"
placeholder='masukkan nama dokter'
onChange={(val) => {
dokterdantenagamedisState.create.form.name = val.target.value
}}
/>
<TextInput
label="Specialist"
placeholder='masukkan specialist'
onChange={(val) => {
dokterdantenagamedisState.create.form.specialist = val.target.value
}}
/>
<TextInput
mb={10}
label="Jadwal"
placeholder='masukkan jadwal'
onChange={(val) => {
dokterdantenagamedisState.create.form.jadwal = val.target.value
}}
/>
<Button
onClick={() => {
dokterdantenagamedisState.create.create()
}}>Simpan</Button>
</Box>
);
}
export default DokterDanTenagaMedis;

View File

@@ -0,0 +1,21 @@
import { Box, Stack, Text } from '@mantine/core';
import React from 'react';
import { useProxy } from 'valtio/utils';
import stateKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/kesehatan';
import { useShallowEffect } from '@mantine/hooks';
function FasilitasPendukungList() {
const fasilitaspendukungState = useProxy(stateKesehatan.fasilitaspendukung)
useShallowEffect(() => {
fasilitaspendukungState.findMany.load()
}, [])
return <Stack>
{fasilitaspendukungState.findMany.data?.map((item) => (
<Box key={item.id}>
<Text dangerouslySetInnerHTML={{__html: item.content}}/>
</Box>
))}
</Stack>
}
export default FasilitasPendukungList;

View File

@@ -0,0 +1,18 @@
import stateKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/kesehatan';
import { BeritaEditor } from '@/app/admin/(dashboard)/desa/berita/_com/BeritaEditor';
import { Box, Text } from '@mantine/core';
import React from 'react';
import { useProxy } from 'valtio/utils';
function FasilitasPendukung() {
const fasilitaspendukungState = useProxy(stateKesehatan.fasilitaspendukung)
return <Box>
<Text fw={"bold"}>Fasilitas Pendukung</Text>
<BeritaEditor onSubmit={(val) => {
fasilitaspendukungState.create.form.content = val
fasilitaspendukungState.create.create()
}}/>
</Box>
}
export default FasilitasPendukung;

View File

@@ -0,0 +1,40 @@
'use client'
import stateKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/kesehatan';
import { Box, Button, Text, TextInput } from '@mantine/core';
import React from 'react';
import { useProxy } from 'valtio/utils';
function InformasiUmum() {
const infromasiState = useProxy(stateKesehatan)
return<Box>
<Text fw={"bold"}>Informasi Umum</Text>
<TextInput
label="Fasilitas"
placeholder='masukkan nama fasilitas kesehatan'
onChange={(val) => {
infromasiState.informasiumum.create.form.fasilitas = val.target.value
}}
/>
<TextInput
label="Alamat"
placeholder='masukkan alamat'
onChange={(val) => {
infromasiState.informasiumum.create.form.alamat = val.target.value
}}
/>
<TextInput
mb={10}
label="Jam Operasional"
placeholder='masukkan jam operasional'
onChange={(val) => {
infromasiState.informasiumum.create.form.jamOperasional = val.target.value
}}
/>
<Button
onClick={() => {
infromasiState.informasiumum.create.create()
}}>Simpan</Button>
</Box>
}
export default InformasiUmum;

View File

@@ -0,0 +1,24 @@
import stateKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/kesehatan';
import { Box, Skeleton, Stack, Text } from '@mantine/core';
import { useShallowEffect } from '@mantine/hooks';
import { useProxy } from 'valtio/utils';
function LayananUnggulanList() {
const layananunggulanstate = useProxy(stateKesehatan.layananunggulan)
useShallowEffect(() => {
layananunggulanstate.findMany.load()
}, [])
if (!layananunggulanstate.findMany.data) return <Stack>
{Array.from({ length: 10 }).map((v, k) => <Skeleton key={k} h={40} />)}
</Stack>
return <Stack>
{layananunggulanstate.findMany.data?.map((item) => (
<Box key={item.id}>
<Text dangerouslySetInnerHTML={{__html: item.content}}/>
</Box>
))}
</Stack>
}
export default LayananUnggulanList;

View File

@@ -0,0 +1,19 @@
'use client'
import { Box, Text } from '@mantine/core';
import { useProxy } from 'valtio/utils';
import stateKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/kesehatan';
import { BeritaEditor } from '@/app/admin/(dashboard)/desa/berita/_com/BeritaEditor';
function LayananUnggulan() {
const informasiumumState = useProxy(stateKesehatan.layananunggulan)
return <Box>
<Text fw={"bold"}>Layanan Unggulan</Text>
<BeritaEditor onSubmit={(val) => {
informasiumumState.create.form.content = val
informasiumumState.create.create()
}} />
</Box>
;
}
export default LayananUnggulan;

View File

@@ -0,0 +1,91 @@
"use client"
import stateKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/kesehatan';
import { Box, SimpleGrid, Skeleton, Stack, Text, Title } from '@mantine/core';
import { useShallowEffect } from '@mantine/hooks';
import { useProxy } from 'valtio/utils';
import DokterdanTenagaMedisList from './dokterdantenagamedis/listData';
import DokterDanTenagaMedis from './dokterdantenagamedis/page';
import FasilitasPendukungList from './fasilitas_pendukung/listData';
import FasilitasPendukung from './fasilitas_pendukung/page';
import InformasiUmum from './informasi_umum/page';
import LayananUnggulanList from './layanan_unggulan/layananUnggulanList';
import LayananUnggulan from './layanan_unggulan/page';
import ProsedurPendaftaran from './prosedurpendaftaran/page';
import TarifDanLayananList from './tarifdanlayanan/listData';
import TarifDanLayanan from './tarifdanlayanan/page';
import ListProsedurPendaftaran from './prosedurpendaftaran/listData';
function FasilitasKesehatan() {
return (
<Stack>
<SimpleGrid cols={{
base: 1, md: 2
}}>
<Box>
<Stack gap={'xs'}>
<Title order={3}>Fasilitas Kesehatan</Title>
{/* Informasi Umum */}
<InformasiUmum />
{/* Layanan Unggulan */}
<LayananUnggulan/>
{/* Dokter & Tenaga Medis */}
<DokterDanTenagaMedis/>
{/* Fasilitas Pendukung */}
<FasilitasPendukung/>
{/* Tarif & Layanan */}
<TarifDanLayanan/>
{/* Prosedur Pendaftaran */}
<ProsedurPendaftaran/>
</Stack>
</Box>
<Box>
<Stack gap={"xs"}>
<Title order={3}>List Fasilitas Kesehatan</Title>
<Title order={4}>Informasi Umum</Title>
<InformasiUmumList/>
<Title order={4}>Layanan Unggulan</Title>
<LayananUnggulanList/>
<Title order={4}>Dokter & Tenaga Medis</Title>
<DokterdanTenagaMedisList/>
<Title order={4}>Fasilitas Pendukung</Title>
<FasilitasPendukungList/>
<Title order={4}>Tarif & Layanan</Title>
<TarifDanLayananList/>
<Title order={4}>Prosedur Pendaftaran</Title>
<ListProsedurPendaftaran/>
</Stack>
</Box>
</SimpleGrid>
</Stack>
);
}
function InformasiUmumList(){
const infromasiState = useProxy(stateKesehatan)
useShallowEffect(() => {
infromasiState.informasiumum.findMany.load()
}, [])
if (!infromasiState.informasiumum.findMany.data) return <Stack>
{Array.from({ length: 10 }).map((v, k) => <Skeleton key={k} h={40} />)}
</Stack>
return <Stack>
{infromasiState.informasiumum.findMany.data?.map((item) => (
<Box key={item.id}>
<Text>{item.fasilitas}</Text>
<Text>{item.alamat}</Text>
<Text>{item.jamOperasional}</Text>
</Box>
))}
</Stack>
}
export default FasilitasKesehatan;

View File

@@ -0,0 +1,25 @@
import stateKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/kesehatan';
import { Box, Skeleton, Stack, Text } from '@mantine/core';
import { useShallowEffect } from '@mantine/hooks';
import { useProxy } from 'valtio/utils';
function ListProsedurPendaftaran() {
const prosedurpendaftaranState = useProxy(stateKesehatan.prosedurpendaftaran)
useShallowEffect(() => {
prosedurpendaftaranState.findMany.load()
}, [])
if (!prosedurpendaftaranState.findMany.data)return<Stack>
{Array.from({ length: 10 }).map((v, k) => <Skeleton key={k} h={40} />)}
</Stack>
return <Stack>
{prosedurpendaftaranState.findMany.data?.map((item) => (
<Box key={item.id}>
<Text dangerouslySetInnerHTML={{__html: item.content}}/>
</Box>
))}
</Stack>
}
export default ListProsedurPendaftaran;

View File

@@ -0,0 +1,18 @@
import { Box, Text } from '@mantine/core';
import { BeritaEditor } from '@/app/admin/(dashboard)/desa/berita/_com/BeritaEditor';
import stateKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/kesehatan';
import { useProxy } from 'valtio/utils';
function ProsedurPendaftaran() {
const prosedurpendaftaranState = useProxy(stateKesehatan.prosedurpendaftaran)
return <Box>
<Text fw={"bold"}>Prosedur Pendaftaran</Text>
<BeritaEditor onSubmit={(val) => {
prosedurpendaftaranState.create.form.content = val
prosedurpendaftaranState.create.create()
}} />
</Box>
}
export default ProsedurPendaftaran;

View File

@@ -0,0 +1,82 @@
import stateKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/kesehatan';
import colors from '@/con/colors';
import { Center, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core';
import { useShallowEffect } from '@mantine/hooks';
import _ from 'lodash';
import { useProxy } from 'valtio/utils';
function TarifDanLayananList() {
const tarifdanlayanan = useProxy(stateKesehatan.tarifdanlayanan)
useShallowEffect(() => {
tarifdanlayanan.findMany.load()
}, [])
if (_.isEmpty(tarifdanlayanan.findMany.data)) {
return (
<Stack>
<Table
striped
highlightOnHover
withTableBorder
withColumnBorders
bg={colors['white-1']}
>
<TableThead>
<TableTr>
<TableTh>
<Center>Nama</Center>
</TableTh>
<TableTh>
<Center>Specialist</Center>
</TableTh>
<TableTh >
<Center>Jadwal</Center>
</TableTh>
</TableTr>
</TableThead>
<TableTbody >
<TableTr >
<TableTd colSpan={3}>
<Center>
<Text>Tidak ada data</Text>
</Center>
</TableTd>
</TableTr>
</TableTbody>
</Table>
</Stack>
);
}
return <Stack>
<Table
suppressHydrationWarning
striped
highlightOnHover
withTableBorder
withColumnBorders
bg={colors['white-1']}
>
<TableThead>
<TableTr>
<TableTh>
Layanan
</TableTh>
<TableTh>
Tarif
</TableTh>
</TableTr>
</TableThead>
<TableTbody>
{tarifdanlayanan.findMany.data?.map((item) => (
<TableTr key={item.id}>
<TableTd>{item.layanan}</TableTd>
<TableTd>Rp.{item.tarif}</TableTd>
</TableTr>
))}
</TableTbody>
</Table>
</Stack>
}
export default TarifDanLayananList;

View File

@@ -0,0 +1,33 @@
import { Box, Button, Text, TextInput } from '@mantine/core';
import React from 'react';
import { useProxy } from 'valtio/utils';
import stateKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/kesehatan';
function TarifDanLayanan() {
const tarifdanlayanan = useProxy(stateKesehatan.tarifdanlayanan)
return <Box>
<Text fw={"bold"}>Tarif & Layanan</Text>
<TextInput
label="Tarif"
placeholder='masukkan tarif'
onChange={(val) => {
tarifdanlayanan.create.form.tarif = val.target.value
}}
/>
<TextInput
mb={10}
label="Layanan"
placeholder='masukkan layanan'
onChange={(val) => {
tarifdanlayanan.create.form.layanan = val.target.value
}}
/>
<Button
onClick={() => {
tarifdanlayanan.create.create()
}}
>Simpan</Button>
</Box>
}
export default TarifDanLayanan;

View File

@@ -0,0 +1,26 @@
import { Box, SimpleGrid, Stack, TextInput, Title } from '@mantine/core';
import React from 'react';
function JadwalKegiatan() {
return (
<Stack>
<SimpleGrid cols={{
base: 1, md: 2
}}>
<Box>
<Title order={3}>Jadwal Kegiatan</Title>
<TextInput
label="Jadwal"
placeholder='masukkan jadwal kegiatan'
/>
</Box>
<Box>
<Title order={3}>List Jadwal Kegiatan</Title>
</Box>
</SimpleGrid>
</Stack>
);
}
export default JadwalKegiatan;

View File

@@ -1,11 +1,18 @@
import React from 'react';
import { Stack } from '@mantine/core';
import ArtikelKesehatan from './_ui/artikel_kesehatan/page';
import FasilitasKesehatan from './_ui/fasilitas_kesehatan/page';
import JadwalKegiatan from './_ui/jadwal_kegiatan/page';
function Page() {
return (
<div>
Data Kesehatan Warga
</div>
<Stack>
<FasilitasKesehatan/>
<JadwalKegiatan/>
<ArtikelKesehatan/>
</Stack>
);
}
export default Page;
//Fasilitas Kesehatan Jadwal Kegiatan Artikel Kesehatan