Compare commits
7 Commits
nico/6-may
...
nico/20-ma
| Author | SHA1 | Date | |
|---|---|---|---|
| cab86eb02f | |||
| d1e39ae7f9 | |||
| d3a43c72ab | |||
| f5d68d4982 | |||
| 2844132ea0 | |||
| e5889ca903 | |||
| 8a34a122d0 |
BIN
foldergambar/desa/name.png
Normal file
BIN
foldergambar/desa/name.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 MiB |
BIN
foldergambar/desa/ppid/profile-ppid/name.png
Normal file
BIN
foldergambar/desa/ppid/profile-ppid/name.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 922 KiB |
@@ -16,6 +16,7 @@
|
|||||||
"@cubejs-client/core": "^0.31.0",
|
"@cubejs-client/core": "^0.31.0",
|
||||||
"@elysiajs/cors": "^1.2.0",
|
"@elysiajs/cors": "^1.2.0",
|
||||||
"@elysiajs/eden": "^1.2.0",
|
"@elysiajs/eden": "^1.2.0",
|
||||||
|
"@elysiajs/static": "^1.3.0",
|
||||||
"@elysiajs/stream": "^1.1.0",
|
"@elysiajs/stream": "^1.1.0",
|
||||||
"@elysiajs/swagger": "^1.2.0",
|
"@elysiajs/swagger": "^1.2.0",
|
||||||
"@mantine/carousel": "^7.16.2",
|
"@mantine/carousel": "^7.16.2",
|
||||||
@@ -47,14 +48,16 @@
|
|||||||
"elysia": "^1.2.12",
|
"elysia": "^1.2.12",
|
||||||
"embla-carousel-autoplay": "^8.5.2",
|
"embla-carousel-autoplay": "^8.5.2",
|
||||||
"embla-carousel-react": "^7.1.0",
|
"embla-carousel-react": "^7.1.0",
|
||||||
|
"form-data": "^4.0.2",
|
||||||
"framer-motion": "^12.4.1",
|
"framer-motion": "^12.4.1",
|
||||||
"get-port": "^7.1.0",
|
"get-port": "^7.1.0",
|
||||||
"jotai": "^2.12.3",
|
"jotai": "^2.12.3",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"motion": "^12.4.1",
|
"motion": "^12.4.1",
|
||||||
"nanoid": "^5.1.0",
|
"nanoid": "^5.1.5",
|
||||||
"next": "15.1.6",
|
"next": "15.1.6",
|
||||||
"next-view-transitions": "^0.3.4",
|
"next-view-transitions": "^0.3.4",
|
||||||
|
"node-fetch": "^3.3.2",
|
||||||
"p-limit": "^6.2.0",
|
"p-limit": "^6.2.0",
|
||||||
"prisma": "^6.3.1",
|
"prisma": "^6.3.1",
|
||||||
"react": "^19.0.0",
|
"react": "^19.0.0",
|
||||||
@@ -64,6 +67,7 @@
|
|||||||
"readdirp": "^4.1.1",
|
"readdirp": "^4.1.1",
|
||||||
"recharts": "^2.15.3",
|
"recharts": "^2.15.3",
|
||||||
"swr": "^2.3.2",
|
"swr": "^2.3.2",
|
||||||
|
"uuid": "^11.1.0",
|
||||||
"valtio": "^2.1.3",
|
"valtio": "^2.1.3",
|
||||||
"zod": "^3.24.3"
|
"zod": "^3.24.3"
|
||||||
},
|
},
|
||||||
|
|||||||
9
prisma/data/desa/profile/profil_perbekel.json
Normal file
9
prisma/data/desa/profile/profil_perbekel.json
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "1",
|
||||||
|
"biodata": "<p>I.B Surya Prabhawa Manuaba, S.H., M.H., adalah Perbekel Darmasaba periode 2021-2027, seorang advokat, pendiri Mantra Legal Consultants & Advocates, serta aktif di bidang musik dan akademis. Dia menempuh pendidikan hukum di Universitas Udayana dan Universitas Mahasaraswati Denpasar serta memiliki pengalaman luas di berbagai organisasi dan kepemimpinan.</p>",
|
||||||
|
"pengalaman": "<ul><li>2021 - 2027: Perbekel Desa Darmasaba</li><li>2015 - Sekarang: Founder & Managing Director Mantra Legal Consultants & Advocates</li><li>2020 - Sekarang: Founder Ugawa Record Music Studio</li><li>2010 - 2016: Dosen Fakultas Hukum Universitas Mahasaraswati Denpasar</li></ul>",
|
||||||
|
"pengalamanOrganisasi": "<ul> <li>1996 – 1997: Ketua OSIS SMP Negeri 1 Abiansemal</li><li>1999 – 2000: Ketua OSIS SMA Negeri 1 Mengwi</li> <li>2008 – 2009: Ketua BEM Universitas Mahasaraswati Denpasar</li> <li>2008 – 2010: Ketua Sekaa Taruna Sila Dharma, Banjar Tengah, Desa Adat Tegal, Darmasaba</li> <li>2020 – Sekarang: Pengurus Young Lawyer Committee Peradi Denpasar</li> <li>2021 – Sekarang: Dewan Kehormatan Himpunan Pengusaha Muda Indonesia (HIPMI) Badung</li> <li>2023 – 2028: Komite Tetap Advokasi – Bidang Hukum dan Regulasi Kamar Dagang dan Industri Badung</li> </ul>",
|
||||||
|
"programUnggulan": "<h3>Pemberdayaan Ekonomi dan UMKM</h3> <ul> <li>Pelatihan dan pendampingan UMKM lokal</li> <li>Program bantuan modal usaha bagi pelaku usaha kecil</li><li>Digitalisasi UMKM untuk meningkatkan pemasaran produk lokal</li></ul>"
|
||||||
|
}
|
||||||
|
]
|
||||||
11
prisma/data/desa/profile/profile_desa.json
Normal file
11
prisma/data/desa/profile/profile_desa.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "1",
|
||||||
|
"sejarah" : "<p>Asal – usul nama Darmasaba tertuang dalam lontar Usada Bali. Seperti di tulis dalam monografi Desa Darmasaba tahun 1980 silam, nama Darmasaba berkaitan dengan keturunan Danghyang Nirarta diceritakan, Sang kawi-wiku asal Daha (Jawa Timur) itu memiliki cucu bernama Ida Pedanda Sakti Manuaba yang tigggal di Desa Kendran Tegalalang Gianyar. Merasa tidak disenangi sang ayah, Ida Pedanda Sakti Manuaba pergi mengembara bersama dua orang pengiringnya. Pengembaraan sang pendeta sampai di pura Sarin Buana di Jimbaran. Saat mengadakan semedi di tempat ini sang pendeta melihat sinar api. Yang sangat jauh di utara. Timbul keinginan Ida Pedanda Manuaba untuk mengunjungi tempat itu. Sampailah sang Pedanda di pura Batan Bila Peguyangan. Disini Ida Pedanda Manuaba singgah menghadap Ida Pedanda Budha yang tinggal disana. Selanjutnya, kedua pendeta bersama-sama menuju arah utara dan singgah di Taman Cang Ana, sebuah taman milik Arya Lanang Blusung. Di tempat ini kedua pendeta bersama-sama melaksanakan semedi dan menetap untuk sementara waktu.</p>",
|
||||||
|
"visi" : "<p>Mewujudkan Desa Darmasaba yang sejahtera, unggul, religius, berbudaya, dan aman dengan berlandaskan Tri Hita Karana</p>",
|
||||||
|
"misi" : "<ul><li>Memperkokoh kerukunan hidup masyarakat dalam jalinan adat, budaya, olahraga, dan agama.</li><li>Meningkatkan kualitas pelayanan publik dengan menerapkan teknologi informasi dan komunikasi terintegrasi.</li><li>Meningkatkan tata kelola pemerintah desa dengan menerapkan prinsip good governance dan good clean government.</li><li>Meningkatkan kualitas pendidikan, kesehatan, Keluarga Berencana serta pengelolaan kependudukan.</li><li>Memperkuat usaha mikro kecil dan menengah (UMKM) dan BUMDesa sebagai pilar ekonomi masyarakat.</li><li>Mewujudkan tatanan kehidupan bermasyarakat yang menjunjung tinggi penegakan hukum dan HAM.</li><li>Meningkatkan perlindungan dan pengelolaan terhadap sumber daya alam dan lingkungan hidup.</li><li>Memperkuat daya saing desa melalui peningkatan mutu sumber daya manusia dan infrastruktur desa berbasis potensi desa.</li><li>Meningkatkan sinergisitas potensi budaya, pertanian dalam arti luas dan pariwisata.</li></ul>",
|
||||||
|
"lambang" : "<ul><li>Memperkokoh kerukunan hidup masyarakat dalam jalinan adat, budaya, olahraga, dan agama.</li><li>Meningkatkan kualitas pelayanan publik dengan menerapkan teknologi informasi dan komunikasi terintegrasi.</li><li>Meningkatkan tata kelola pemerintah desa dengan menerapkan prinsip good governance dan good clean government.</li><li>Meningkatkan kualitas pendidikan, kesehatan, Keluarga Berencana serta pengelolaan kependudukan.</li><li>Memperkuat usaha mikro kecil dan menengah (UMKM) dan BUMDesa sebagai pilar ekonomi masyarakat.</li><li>Mewujudkan tatanan kehidupan bermasyarakat yang menjunjung tinggi penegakan hukum dan HAM.</li><li>Meningkatkan perlindungan dan pengelolaan terhadap sumber daya alam dan lingkungan hidup.</li><li>Memperkuat daya saing desa melalui peningkatan mutu sumber daya manusia dan infrastruktur desa berbasis potensi desa.</li><li>Meningkatkan sinergisitas potensi budaya, pertanian dalam arti luas dan pariwisata.</li><li>Memperkuat daya saing desa melalui peningkatan mutu sumber daya manusia dan infrastruktur desa berbasis potensi desa.</li><li>Meningkatkan sinergisitas potensi budaya, pertanian dalam arti luas dan pariwisata.</li></ul>",
|
||||||
|
"maskot" : "<p>Pudak adalah bunga dari tanaman sejenis pandan (Pandanaceae). Bentuk bunga ini tersusun dalam beberapa lapisan, terbungkus oleh kelopak warna putih (semacam daun lonjong) yang ujungnya meruncing.</p><p>Bunga Pudak berwarna kuning dan akan terlihat jika kelopak atau pelepahnya telah mekar. Kekhasan dari bunga pudak, yaitu mempunyai aroma wangi yang semerbak nan lembut (tidak menyengat), dan dapat menebar keharuman sepanjang pagi atau pun sore hari. Tanaman ini dapat tumbuh di sepanjang pantai, aliran sungai, di atas batu-batu karang, dan juga di tanah ladang.</p><p>Dalam Kamus Jawa Kuna- Indonesia kata “Pudak” berarti bunga pandan atau Pandanus Moschatus (Mardiwarsito: 1981: 442). Selain itu bunga pudak juga dapat disebut ketaka atau ketaki (Mardiwarsito, 1981: 276). Sedangkan kata “Sategal” berasal dari kata dasar “Tegal” yang berarti ladang (Mardiwarsito, 1981: 593). Jadi Pudak Sategal dapat diartikan sebagai satu ladang luas yang dipenuhi bunga pudak dan menabar keharuman.</p><p>Pada sebuah kesempatan, Ida Pedanda Putu Pemaron menjelaskan mengenai makna dari istilah Pudak Sategal dengan sebuah analogi bahwa, sekuntum bunga pudak memiliki aroma wangi atau keharuman yang sangat kuat, apalagi jika satu ladang penuh bunga pudak, maka dapat dipastikan aroma keharumannya akan membumbung menyebar ke segala penjuru (Wawancara, 18 Mei 2019 di Geria Putra Mandara Kenderan, Tegallalang). “Pudak” ialah sebuah bunga yang memiliki aroma wangi atau keharuman yang semerbak, lembut, dan khas.</p><p>Garapan Tari Maskot Desa Darmasaba Sekar Pudak diwujudkan ke dalam bentuk tari kreasi yang ditarikan secara berkelompok dengan jumlah lima orang penari perempuan (putri).</p><p>Pemilihan penari perempuan dimaksudkan untuk mempresentasikan keindahan, keluwesan, dan keharuman dari bunga pudak. Sedangkan penetapan jumlah penari lima orang didasarkan atas pertimbangan kebutuhan koreografi agar dapat membentuk desain-desain komposisi lantai yang menarik dan dinamis, baik ketika ditarikan di area panggung yang luas atau pun area panggung yang kecil. Penyajian tari maskot ini dirancang dengan durasi waktu 9 menit.</p>",
|
||||||
|
"profilPerbekelId" : "1"
|
||||||
|
}
|
||||||
|
]
|
||||||
5
prisma/data/list-caraMemperolehInformasi.json
Normal file
5
prisma/data/list-caraMemperolehInformasi.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
[
|
||||||
|
{"name": "Melihat/Membaca/Mendengarkan/Mencatat"},
|
||||||
|
{"name": "Mendapatkan Salinan Informasi (Hardcopy)"},
|
||||||
|
{"name": "Mendapatkan Salinan Informasi (Softcopy)"}
|
||||||
|
]
|
||||||
5
prisma/data/list-caraMemperolehSalinanInformasi.json
Normal file
5
prisma/data/list-caraMemperolehSalinanInformasi.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
[
|
||||||
|
{ "name": "Mengambil Langsung" },
|
||||||
|
{ "name": "Dikirim Via Post" },
|
||||||
|
{ "name": "Dikirim Via Email" }
|
||||||
|
]
|
||||||
6
prisma/data/list-jenisInfromasi.json
Normal file
6
prisma/data/list-jenisInfromasi.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[
|
||||||
|
{ "name": "Keuangan Desa" },
|
||||||
|
{ "name": "Pembangunan Desa" },
|
||||||
|
{ "name": "Data Demografi" },
|
||||||
|
{ "name": "Lainnya" }
|
||||||
|
]
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "1",
|
||||||
|
"jenisInformasi": "Peraturan Desa",
|
||||||
|
"deskripsi": "Dokumen yang berisi kebijakan dan regulasi desa",
|
||||||
|
"tanggal": "15 Januari 2024"
|
||||||
|
}
|
||||||
|
]
|
||||||
7
prisma/data/ppid/dasar-hukum-ppid/dasarhukumPPID.json
Normal file
7
prisma/data/ppid/dasar-hukum-ppid/dasarhukumPPID.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "1",
|
||||||
|
"judul": "DASAR HUKUM PEMBENTUKAN PPID DESA DARMASABA",
|
||||||
|
"content" : "<ul><li>UU Nomor 14 Tahun 2008 tentang Keterbukaan Informasi Publik</li><li>PP Nomor 61 Tahun 2010 tentang Pelaksanaan UU 14 Tahun 2008 tentang Keterbukaan Informasi Publik</li><li>Permendagri Nomor 3 Tahun 2017 tentang Pedoman Pengelolaan Pelayanan Informasi dan Dokumentasi di Lingkungan Kemendagri dan Pemerintah Daerah</li><li>Peraturan Komisi Informasi Nomor 1 Tahun 2010 tentang Standar Layanan Informasi Publik</li><li>Peraturan Komisi Informasi Nomor 1 Tahun 2010 tentang Standar Layanan Informasi Publik</li><li>Peraturan Bupati Badung No. 42 Tahun 2017 tentang Pedoman Pengelolaan Pelayanan Informasi Publik dan Dokumentasi di Lingkungan Pemerintah Kabupaten Badung</li><li>Keputusan Bupati Badung Nomor 99/049/HK/2019 tentang Pengelola Layanan Informasi dan Dokumentasi Kabupaten Badung</li><li>Keputusan Perbekel Darmasaba Nomor 101 Tahun 2019 tentang Penetapan Pelaksana Teknis/Administrasi Pengelola Layanan Informasi Dan Dokumentasi di Desa Punggul</li><li>Peraturan Perbekel Darmasaba Nomor 12 Tahun 2019 tentang Pedoman Pengelolaan Pelayanan Informasi Publik dan Dokumentasi di Lingkungan Pemerintah Desa Darmasaba</li></ul>"
|
||||||
|
}
|
||||||
|
]
|
||||||
11
prisma/data/ppid/profile-ppid/profilePPid.json
Normal file
11
prisma/data/ppid/profile-ppid/profilePPid.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "1",
|
||||||
|
"name": "I.B Surya Prabhawa Manuaba, S.H., M.H.",
|
||||||
|
"biodata": "<p>I.B Surya Prabhawa Manuaba, S.H., M.H., adalah Perbekel Darmasaba periode 2021-2027, seorang advokat, pendiri Mantra Legal Consultants & Advocates, serta aktif di bidang musik dan akademis. Dia menempuh pendidikan hukum di Universitas Udayana dan Universitas Mahasaraswati Denpasar, serta memiliki pengalaman luas di berbagai organisasi dan kepemimpinan.</p>",
|
||||||
|
"riwayat": "<ul> <li>2021 - 2027: Perbekel Desa Darmasaba</li> <li>2015 - Sekarang: Founder & Managing Director Mantra Legal Consultants & Advocates</li> <li>2020 - Sekarang: Founder Ugawa Record Music Studio</li> <li>2010 - 2016: Dosen Fakultas Hukum Universitas Mahasaraswati Denpasar</li> </ul>",
|
||||||
|
"pengalaman": "<ul> <li>1996 – 1997: Ketua OSIS SMP Negeri 1 Abiansemal</li><li>1999 – 2000: Ketua OSIS SMA Negeri 1 Mengwi</li> <li>2008 – 2009: Ketua BEM Universitas Mahasaraswati Denpasar</li> <li>2008 – 2010: Ketua Sekaa Taruna Sila Dharma, Banjar Tengah, Desa Adat Tegal, Darmasaba</li> <li>2020 – Sekarang: Pengurus Young Lawyer Committee Peradi Denpasar</li> <li>2021 – Sekarang: Dewan Kehormatan Himpunan Pengusaha Muda Indonesia (HIPMI) Badung</li> <li>2023 – 2028: Komite Tetap Advokasi – Bidang Hukum dan Regulasi Kamar Dagang dan Industri Badung</li> </ul>",
|
||||||
|
"unggulan": "<h3>Pemberdayaan Ekonomi dan UMKM</h3> <ul> <li>Pelatihan dan pendampingan UMKM lokal</li> <li>Program bantuan modal usaha bagi pelaku usaha kecil</li><li>Digitalisasi UMKM untuk meningkatkan pemasaran produk lokal</li></ul>",
|
||||||
|
"imageUrl": "/assets/images/ppid/profile-ppid/perbekel.png"
|
||||||
|
}
|
||||||
|
]
|
||||||
8
prisma/data/ppid/visi-misi-ppid/visimisiPPID.json
Normal file
8
prisma/data/ppid/visi-misi-ppid/visimisiPPID.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "1",
|
||||||
|
"misi": "<ol><li>Meningkatkan pengelolaan dan pelayanan informasi yang berkualitas, benar dan bertanggung jawab.</li><li>Membangun dan mengembangkan sistem penyediaan dan layanan informasi.</li><li>Meningkatkan dan mengembangkan kompetensi dan kualitas SDM dalam bidang pelayanan informasi.</li><li>Mewujudkan keterbukaan informasi Pemerintah Desa Punggul dengan proses yang cepat, tepat, mudah dan sederhana.</li></ol>",
|
||||||
|
"visi": "Memberikan pelayanan informasi yanng transparan dan akuntabel untuk memenuhi hak pemohon informasi sesuai dengan ketentuan peraturan perundang-undangan yang berlaku."
|
||||||
|
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -48,6 +48,43 @@ model AppMenuChild {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//========================================= MENU PPID ========================================= //
|
//========================================= MENU PPID ========================================= //
|
||||||
|
// ========================================= VISI MISI PPID ========================================= //
|
||||||
|
model VisiMisiPPID {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
visi String @db.Text
|
||||||
|
misi String @db.Text
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
|
deletedAt DateTime @default(now())
|
||||||
|
isActive Boolean @default(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========================================= DASAR HUKUM PPID ========================================= //
|
||||||
|
model DasarHukumPPID {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
judul String @db.Text
|
||||||
|
content String @db.Text
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
|
deletedAt DateTime @default(now())
|
||||||
|
isActive Boolean @default(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========================================= PROFILE PPID ========================================= //
|
||||||
|
model ProfilePPID {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
name String @db.Text
|
||||||
|
biodata String @db.Text
|
||||||
|
riwayat String @db.Text
|
||||||
|
pengalaman String @db.Text
|
||||||
|
unggulan String @db.Text
|
||||||
|
imageUrl String?
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
|
deletedAt DateTime @default(now())
|
||||||
|
isActive Boolean @default(true)
|
||||||
|
}
|
||||||
|
|
||||||
// ========================================= DAFTAR INFORMASI PUBLIK ========================================= //
|
// ========================================= DAFTAR INFORMASI PUBLIK ========================================= //
|
||||||
model DaftarInformasiPublik {
|
model DaftarInformasiPublik {
|
||||||
id String @id @default(cuid())
|
id String @id @default(cuid())
|
||||||
@@ -61,7 +98,70 @@ model DaftarInformasiPublik {
|
|||||||
isActive Boolean @default(true)
|
isActive Boolean @default(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
//========================================= MENU PPID ========================================= //
|
//=========================================PERMOHONAN INFORMASI PUBLIK========================= //
|
||||||
|
model PermohonanInformasiPublik {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
nomor Int @default(autoincrement())
|
||||||
|
name String
|
||||||
|
nik String
|
||||||
|
notelp String
|
||||||
|
alamat String
|
||||||
|
email String
|
||||||
|
jenisInformasiDiminta JenisInformasiDiminta? @relation(fields: [jenisInformasiDimintaId], references: [id])
|
||||||
|
jenisInformasiDimintaId String?
|
||||||
|
caraMemperolehInformasi CaraMemperolehInformasi? @relation(fields: [caraMemperolehInformasiId], references: [id])
|
||||||
|
caraMemperolehInformasiId String?
|
||||||
|
caraMemperolehSalinanInformasi CaraMemperolehSalinanInformasi? @relation(fields: [caraMemperolehSalinanInformasiId], references: [id])
|
||||||
|
caraMemperolehSalinanInformasiId String?
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
|
deletedAt DateTime @default(now())
|
||||||
|
isActive Boolean @default(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
model JenisInformasiDiminta {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
name String @unique
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
|
deletedAt DateTime @default(now())
|
||||||
|
isActive Boolean @default(true)
|
||||||
|
PermohonanInformasiPublik PermohonanInformasiPublik[]
|
||||||
|
}
|
||||||
|
|
||||||
|
model CaraMemperolehInformasi {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
name String @unique
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
|
deletedAt DateTime @default(now())
|
||||||
|
isActive Boolean @default(true)
|
||||||
|
PermohonanInformasiPublik PermohonanInformasiPublik[]
|
||||||
|
}
|
||||||
|
|
||||||
|
model CaraMemperolehSalinanInformasi {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
name String @unique
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
|
deletedAt DateTime @default(now())
|
||||||
|
isActive Boolean @default(true)
|
||||||
|
PermohonanInformasiPublik PermohonanInformasiPublik[]
|
||||||
|
}
|
||||||
|
|
||||||
|
//=========================================PERMOHONAN INFORMASI KEBERATAN PUBLIK========================= //
|
||||||
|
model FormulirPermohonanKeberatan {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
name String
|
||||||
|
email String
|
||||||
|
notelp String
|
||||||
|
alasan String
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
|
deletedAt DateTime @default(now())
|
||||||
|
isActive Boolean @default(true)
|
||||||
|
}
|
||||||
|
|
||||||
// ========================================= IKM ========================================= //
|
// ========================================= IKM ========================================= //
|
||||||
model IndeksKepuasanMasyarakat {
|
model IndeksKepuasanMasyarakat {
|
||||||
id Int @id @default(autoincrement())
|
id Int @id @default(autoincrement())
|
||||||
@@ -108,6 +208,35 @@ model GrafikBerdasarkanUmur {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ========================================= MENU DESA ========================================= //
|
// ========================================= MENU DESA ========================================= //
|
||||||
|
// ========================================= PROFILE DESA ========================================= //
|
||||||
|
model ProfileDesa {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
sejarah String @db.Text
|
||||||
|
visi String @db.Text
|
||||||
|
misi String @db.Text
|
||||||
|
lambang String @db.Text
|
||||||
|
maskot String @db.Text
|
||||||
|
ProfilPerbekel ProfilPerbekel? @relation(fields: [profilPerbekelId], references: [id])
|
||||||
|
profilPerbekelId String?
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
|
deletedAt DateTime @default(now())
|
||||||
|
isActive Boolean @default(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
model ProfilPerbekel {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
biodata String @db.Text
|
||||||
|
pengalaman String @db.Text
|
||||||
|
pengalamanOrganisasi String @db.Text
|
||||||
|
programUnggulan String @db.Text
|
||||||
|
ProfileDesa ProfileDesa[]
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
|
deletedAt DateTime @default(now())
|
||||||
|
isActive Boolean @default(true)
|
||||||
|
}
|
||||||
|
|
||||||
// ========================================= BERITA ========================================= //
|
// ========================================= BERITA ========================================= //
|
||||||
model Berita {
|
model Berita {
|
||||||
id String @id @default(cuid())
|
id String @id @default(cuid())
|
||||||
@@ -453,3 +582,18 @@ model DoctorSign {
|
|||||||
deletedAt DateTime @default(now())
|
deletedAt DateTime @default(now())
|
||||||
isActive Boolean @default(true)
|
isActive Boolean @default(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// === BARU
|
||||||
|
|
||||||
|
model FileStorage {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
name String @unique
|
||||||
|
realName String
|
||||||
|
path String
|
||||||
|
mimeType String
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
|
deletedAt DateTime? // nullable agar bisa menandakan belum dihapus
|
||||||
|
isActive Boolean @default(true)
|
||||||
|
link String
|
||||||
|
}
|
||||||
|
|||||||
BIN
prisma/seed-images/perbekel.png
Normal file
BIN
prisma/seed-images/perbekel.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 275 KiB |
201
prisma/seed.ts
201
prisma/seed.ts
@@ -1,8 +1,21 @@
|
|||||||
|
import prisma from '@/lib/prisma'
|
||||||
|
import categoryPengumuman from './data/category-pengumuman.json'
|
||||||
|
import katagoryBerita from './data/katagory-berita.json'
|
||||||
|
import caraMemperolehInformasi from './data/list-caraMemperolehInformasi.json'
|
||||||
|
import caraMemperolehSalinanInformasi from './data/list-caraMemperolehSalinanInformasi.json'
|
||||||
|
import jenisInformasiDiminta from './data/list-jenisInfromasi.json'
|
||||||
import layanan from './data/list-layanan.json'
|
import layanan from './data/list-layanan.json'
|
||||||
import potensi from './data/list-potensi.json'
|
import potensi from './data/list-potensi.json'
|
||||||
import katagoryBerita from './data/katagory-berita.json'
|
import visiMisiPPID from './data/ppid/visi-misi-ppid/visimisiPPID.json'
|
||||||
import categoryPengumuman from './data/category-pengumuman.json'
|
import dasarHukumPPID from './data/ppid/dasar-hukum-ppid/dasarhukumPPID.json'
|
||||||
import prisma from '@/lib/prisma';
|
import profileDesa from './data/desa/profile/profile_desa.json'
|
||||||
|
import profilePerbekel from './data/desa/profile/profil_perbekel.json'
|
||||||
|
import profilePPID from './data/ppid/profile-ppid/profilePPid.json'
|
||||||
|
import path from 'path'
|
||||||
|
import fs from 'fs'
|
||||||
|
import { mkdir, writeFile } from 'fs/promises'
|
||||||
|
import { v4 as uuid } from 'uuid'
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
for (const l of layanan) {
|
for (const l of layanan) {
|
||||||
await prisma.layanan.upsert({
|
await prisma.layanan.upsert({
|
||||||
@@ -67,6 +80,188 @@ import prisma from '@/lib/prisma';
|
|||||||
}
|
}
|
||||||
|
|
||||||
console.log("category pengumuman success ...")
|
console.log("category pengumuman success ...")
|
||||||
|
|
||||||
|
for (const j of jenisInformasiDiminta) {
|
||||||
|
await prisma.jenisInformasiDiminta.upsert({
|
||||||
|
where: {
|
||||||
|
name: j.name
|
||||||
|
},
|
||||||
|
update: {
|
||||||
|
name: j.name
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
name: j.name
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
console.log("jenis informasi diminta success ...")
|
||||||
|
|
||||||
|
for (const c of caraMemperolehInformasi) {
|
||||||
|
await prisma.caraMemperolehInformasi.upsert({
|
||||||
|
where: {
|
||||||
|
name: c.name
|
||||||
|
},
|
||||||
|
update: {
|
||||||
|
name: c.name
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
name: c.name
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
console.log("cara memperoleh informasi success ...")
|
||||||
|
|
||||||
|
for (const c of caraMemperolehSalinanInformasi) {
|
||||||
|
await prisma.caraMemperolehSalinanInformasi.upsert({
|
||||||
|
where: {
|
||||||
|
name: c.name
|
||||||
|
},
|
||||||
|
update: {
|
||||||
|
name: c.name
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
name: c.name
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
console.log("cara memperoleh salinan informasi success ...")
|
||||||
|
|
||||||
|
const seedProfilePPID = async () => {
|
||||||
|
const targetDir = path.resolve("public", "assets", "images", "ppid", "profile-ppid")
|
||||||
|
await mkdir(targetDir, { recursive: true })
|
||||||
|
|
||||||
|
for (const c of profilePPID) {
|
||||||
|
let finalImageUrl = c.imageUrl
|
||||||
|
|
||||||
|
// kalau imageUrl diawali dengan "/assets/images", artinya kita harus copy file dari seed-images
|
||||||
|
if (c.imageUrl.startsWith("/assets/images/")) {
|
||||||
|
const filename = path.basename(c.imageUrl) // misal "perbekel.png"
|
||||||
|
const seedImagePath = path.resolve("prisma", "seed-images", filename)
|
||||||
|
|
||||||
|
// Buat nama baru yang unik agar tidak bentrok
|
||||||
|
const targetFilename = `${uuid()}_${filename}`
|
||||||
|
const targetPath = path.join(targetDir, targetFilename)
|
||||||
|
|
||||||
|
// Salin file dari prisma/seed-images ke public/
|
||||||
|
const buffer = fs.readFileSync(seedImagePath)
|
||||||
|
await writeFile(targetPath, buffer)
|
||||||
|
|
||||||
|
finalImageUrl = `/assets/images/ppid/profile-ppid/${targetFilename}`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Upsert ke database
|
||||||
|
await prisma.profilePPID.upsert({
|
||||||
|
where: { id: c.id },
|
||||||
|
update: {
|
||||||
|
name: c.name,
|
||||||
|
biodata: c.biodata,
|
||||||
|
riwayat: c.riwayat,
|
||||||
|
pengalaman: c.pengalaman,
|
||||||
|
unggulan: c.unggulan,
|
||||||
|
imageUrl: finalImageUrl,
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: c.id,
|
||||||
|
name: c.name,
|
||||||
|
biodata: c.biodata,
|
||||||
|
riwayat: c.riwayat,
|
||||||
|
pengalaman: c.pengalaman,
|
||||||
|
unggulan: c.unggulan,
|
||||||
|
imageUrl: finalImageUrl,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("✅ profilePPID seeded from JSON with image copying")
|
||||||
|
}
|
||||||
|
|
||||||
|
await seedProfilePPID()
|
||||||
|
|
||||||
|
|
||||||
|
for (const v of visiMisiPPID) {
|
||||||
|
await prisma.visiMisiPPID.upsert({
|
||||||
|
where: {
|
||||||
|
id: v.id,
|
||||||
|
},
|
||||||
|
update: {
|
||||||
|
misi: v.misi,
|
||||||
|
visi: v.visi
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: v.id,
|
||||||
|
misi: v.misi,
|
||||||
|
visi: v.visi
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
console.log("visi misi PPID success ...")
|
||||||
|
|
||||||
|
for (const v of dasarHukumPPID) {
|
||||||
|
await prisma.dasarHukumPPID.upsert({
|
||||||
|
where: {
|
||||||
|
id: v.id,
|
||||||
|
},
|
||||||
|
update: {
|
||||||
|
judul: v.judul,
|
||||||
|
content: v.content
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: v.id,
|
||||||
|
judul: v.judul,
|
||||||
|
content: v.content
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
console.log("dasar hukum PPID success ...")
|
||||||
|
|
||||||
|
for (const v of profileDesa) {
|
||||||
|
await prisma.profileDesa.upsert({
|
||||||
|
where: {
|
||||||
|
id: v.id,
|
||||||
|
},
|
||||||
|
update: {
|
||||||
|
sejarah: v.sejarah,
|
||||||
|
visi: v.visi,
|
||||||
|
misi: v.misi,
|
||||||
|
lambang: v.lambang,
|
||||||
|
maskot: v.maskot,
|
||||||
|
profilPerbekelId: v.profilPerbekelId
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: v.id,
|
||||||
|
sejarah: v.sejarah,
|
||||||
|
visi: v.visi,
|
||||||
|
misi: v.misi,
|
||||||
|
lambang: v.lambang,
|
||||||
|
maskot: v.maskot,
|
||||||
|
profilPerbekelId: v.profilPerbekelId
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
console.log("profile desa success ...")
|
||||||
|
|
||||||
|
for (const v of profilePerbekel) {
|
||||||
|
await prisma.profilPerbekel.upsert({
|
||||||
|
where: {
|
||||||
|
id: v.id,
|
||||||
|
},
|
||||||
|
update: {
|
||||||
|
biodata: v.biodata,
|
||||||
|
pengalaman: v.pengalaman,
|
||||||
|
pengalamanOrganisasi: v.pengalamanOrganisasi,
|
||||||
|
programUnggulan: v.programUnggulan
|
||||||
|
},
|
||||||
|
create: {
|
||||||
|
id: v.id,
|
||||||
|
biodata: v.biodata,
|
||||||
|
pengalaman: v.pengalaman,
|
||||||
|
pengalamanOrganisasi: v.pengalamanOrganisasi,
|
||||||
|
programUnggulan: v.programUnggulan
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
console.log("profile perbekel success ...")
|
||||||
|
|
||||||
})().then(() => prisma.$disconnect()).catch((e) => {
|
})().then(() => prisma.$disconnect()).catch((e) => {
|
||||||
console.error(e)
|
console.error(e)
|
||||||
prisma.$disconnect()
|
prisma.$disconnect()
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 254 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 275 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 275 KiB |
@@ -87,4 +87,4 @@ const stateDashboardBerita = proxy({
|
|||||||
berita,
|
berita,
|
||||||
});
|
});
|
||||||
|
|
||||||
export default stateDashboardBerita;
|
export default stateDashboardBerita;
|
||||||
239
src/app/admin/(dashboard)/_state/desa/profile.ts
Normal file
239
src/app/admin/(dashboard)/_state/desa/profile.ts
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
import ApiFetch from "@/lib/api-fetch";
|
||||||
|
import { Prisma } from "@prisma/client";
|
||||||
|
import { toast } from "react-toastify";
|
||||||
|
import { proxy } from "valtio";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
/* Sejarah */
|
||||||
|
const templateFormSejarahForm = z.object({
|
||||||
|
sejarah: z.string().min(3, "Sejarah minimal 3 karakter"),
|
||||||
|
})
|
||||||
|
|
||||||
|
type SejarahForm = Prisma.ProfileDesaGetPayload<{
|
||||||
|
select: {
|
||||||
|
id: true;
|
||||||
|
sejarah: true;
|
||||||
|
}
|
||||||
|
}>
|
||||||
|
|
||||||
|
const Sejarah = proxy({
|
||||||
|
findById: {
|
||||||
|
data: null as SejarahForm | null,
|
||||||
|
loading: false,
|
||||||
|
initialize() {
|
||||||
|
Sejarah.findById.data = {
|
||||||
|
id: "",
|
||||||
|
sejarah: "",
|
||||||
|
} as SejarahForm;
|
||||||
|
},
|
||||||
|
async load(id: string) {
|
||||||
|
try {
|
||||||
|
Sejarah.findById.loading = true;
|
||||||
|
const res = await ApiFetch.api.desa.profile["find-by-id"].get({
|
||||||
|
query: { id },
|
||||||
|
});
|
||||||
|
if (res.status === 200) {
|
||||||
|
Sejarah.findById.data = {
|
||||||
|
id: id,
|
||||||
|
sejarah: res.data?.data?.sejarah ?? ""
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
toast.error("Gagal mengambil data sejarah");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error((error as Error).message);
|
||||||
|
toast.error("Terjadi kesalahan saat mengambil data sejarah");
|
||||||
|
} finally {
|
||||||
|
Sejarah.findById.loading = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
update: {
|
||||||
|
loading: false,
|
||||||
|
async save(data: SejarahForm) {
|
||||||
|
const cek = templateFormSejarahForm.safeParse(data);
|
||||||
|
if (!cek.success) {
|
||||||
|
const errors = cek.error.issues
|
||||||
|
.map((issue) => `${issue.path.join(".")}: ${issue.message}`)
|
||||||
|
.join(", ");
|
||||||
|
toast.error(`Form tidak valid: ${errors}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Sejarah.update.loading = true;
|
||||||
|
const res = await ApiFetch.api.desa.profile.sejarah["update"].post(data);
|
||||||
|
if (res.status === 200) {
|
||||||
|
toast.success("Berhasil update sejarah");
|
||||||
|
await Sejarah.findById.load(data.id);
|
||||||
|
} else {
|
||||||
|
toast.error("Gagal update sejarah");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error((error as Error).message);
|
||||||
|
toast.error("Terjadi kesalahan saat update sejarah");
|
||||||
|
} finally {
|
||||||
|
Sejarah.update.loading = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
/* Visi Misi Desa */
|
||||||
|
const templateFormVisiForm = z.object({
|
||||||
|
visi: z.string().min(3, "Visi minimal 3 karakter"),
|
||||||
|
misi: z.string().min(3, "Misi minimal 3 karakter")
|
||||||
|
})
|
||||||
|
|
||||||
|
type VisiMisiDesaForm = Prisma.ProfileDesaGetPayload<{
|
||||||
|
select: {
|
||||||
|
id: true;
|
||||||
|
visi: true;
|
||||||
|
misi: true;
|
||||||
|
}
|
||||||
|
}>
|
||||||
|
|
||||||
|
const VisiMisiDesa = proxy({
|
||||||
|
findById: {
|
||||||
|
data: null as VisiMisiDesaForm | null,
|
||||||
|
loading: false,
|
||||||
|
initialize() {
|
||||||
|
VisiMisiDesa.findById.data = {
|
||||||
|
id: "",
|
||||||
|
visi: "",
|
||||||
|
misi: ""
|
||||||
|
} as VisiMisiDesaForm;
|
||||||
|
},
|
||||||
|
async load(id: string) {
|
||||||
|
try {
|
||||||
|
VisiMisiDesa.findById.loading = true;
|
||||||
|
const res = await ApiFetch.api.desa.profile["find-by-id"].get({
|
||||||
|
query: { id },
|
||||||
|
});
|
||||||
|
if (res.status === 200) {
|
||||||
|
VisiMisiDesa.findById.data = {
|
||||||
|
id: id,
|
||||||
|
visi: res.data?.data?.visi ?? "",
|
||||||
|
misi: res.data?.data?.misi ?? ""
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
toast.error("Gagal mengambil data visi misi");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error((error as Error).message);
|
||||||
|
toast.error("Terjadi kesalahan saat mengambil data visi misi");
|
||||||
|
} finally {
|
||||||
|
VisiMisiDesa.findById.loading = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
update: {
|
||||||
|
loading: false,
|
||||||
|
async save(data: VisiMisiDesaForm) {
|
||||||
|
const cek = templateFormVisiForm.safeParse(data);
|
||||||
|
if (!cek.success) {
|
||||||
|
const errors = cek.error.issues
|
||||||
|
.map((issue) => `${issue.path.join(".")}: ${issue.message}`)
|
||||||
|
.join(", ");
|
||||||
|
toast.error(`Form tidak valid: ${errors}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
VisiMisiDesa.update.loading = true;
|
||||||
|
const res = await ApiFetch.api.desa.profile.visimisiDesa["update"].post(data);
|
||||||
|
if (res.status === 200) {
|
||||||
|
toast.success("Berhasil update visi misi");
|
||||||
|
await VisiMisiDesa.findById.load(data.id);
|
||||||
|
} else {
|
||||||
|
toast.error("Gagal update visi");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error((error as Error).message);
|
||||||
|
toast.error("Terjadi kesalahan saat update visi misi");
|
||||||
|
} finally {
|
||||||
|
VisiMisiDesa.update.loading = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
/* Lambang Desa */
|
||||||
|
const templateFormLambangDesaForm = z.object({
|
||||||
|
lambang: z.string().min(3, "Lambang minimal 3 karakter"),
|
||||||
|
})
|
||||||
|
|
||||||
|
type LambangDesaForm = Prisma.ProfileDesaGetPayload<{
|
||||||
|
select: {
|
||||||
|
id: true;
|
||||||
|
lambang: true;
|
||||||
|
}
|
||||||
|
}>
|
||||||
|
|
||||||
|
const LambangDesa = proxy({
|
||||||
|
findById: {
|
||||||
|
data: null as LambangDesaForm | null,
|
||||||
|
loading: false,
|
||||||
|
initialize() {
|
||||||
|
LambangDesa.findById.data = {
|
||||||
|
id: "",
|
||||||
|
lambang: "",
|
||||||
|
} as LambangDesaForm;
|
||||||
|
},
|
||||||
|
async load(id: string) {
|
||||||
|
try {
|
||||||
|
LambangDesa.findById.loading = true;
|
||||||
|
const res = await ApiFetch.api.desa.profile["find-by-id"].get({
|
||||||
|
query: { id },
|
||||||
|
});
|
||||||
|
if (res.status === 200) {
|
||||||
|
LambangDesa.findById.data = {
|
||||||
|
id: id,
|
||||||
|
lambang: res.data?.data?.lambang ?? ""
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
toast.error("Gagal mengambil data lambang desa");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error((error as Error).message);
|
||||||
|
toast.error("Terjadi kesalahan saat mengambil data lambang desa");
|
||||||
|
} finally {
|
||||||
|
LambangDesa.findById.loading = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
update: {
|
||||||
|
loading: false,
|
||||||
|
async save(data: LambangDesaForm) {
|
||||||
|
const cek = templateFormLambangDesaForm.safeParse(data);
|
||||||
|
if (!cek.success) {
|
||||||
|
const errors = cek.error.issues
|
||||||
|
.map((issue) => `${issue.path.join(".")}: ${issue.message}`)
|
||||||
|
.join(", ");
|
||||||
|
toast.error(`Form tidak valid: ${errors}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
LambangDesa.update.loading = true;
|
||||||
|
const res = await ApiFetch.api.desa.profile.lambangDesa["update"].post(data);
|
||||||
|
if (res.status === 200) {
|
||||||
|
toast.success("Berhasil update lambang desa");
|
||||||
|
await LambangDesa.findById.load(data.id);
|
||||||
|
} else {
|
||||||
|
toast.error("Gagal update lambang desa");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error((error as Error).message);
|
||||||
|
toast.error("Terjadi kesalahan saat update lambang desa");
|
||||||
|
} finally {
|
||||||
|
LambangDesa.update.loading = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const stateProfileDesa = {
|
||||||
|
Sejarah,
|
||||||
|
VisiMisiDesa,
|
||||||
|
LambangDesa,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export default stateProfileDesa;
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
import ApiFetch from "@/lib/api-fetch";
|
||||||
|
import { Prisma } from "@prisma/client";
|
||||||
|
import { toast } from "react-toastify";
|
||||||
|
import { proxy } from "valtio";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
const templateForm = z.object({
|
||||||
|
judul: z.string().min(3, "Judul minimal 3 karakter"),
|
||||||
|
content: z.string().min(3, "Content minimal 3 karakter"),
|
||||||
|
});
|
||||||
|
|
||||||
|
type DasarHukumForm = Prisma.DasarHukumPPIDGetPayload<{
|
||||||
|
select: {
|
||||||
|
id: true;
|
||||||
|
judul: true;
|
||||||
|
content: true;
|
||||||
|
};
|
||||||
|
}>;
|
||||||
|
|
||||||
|
const stateDasarHukumPPID = proxy({
|
||||||
|
findById: {
|
||||||
|
data: null as DasarHukumForm | null,
|
||||||
|
loading: false,
|
||||||
|
initialize() {
|
||||||
|
stateDasarHukumPPID.findById.data = {
|
||||||
|
id: '',
|
||||||
|
judul: '',
|
||||||
|
content: '',
|
||||||
|
} as DasarHukumForm;
|
||||||
|
},
|
||||||
|
async load(id: string) {
|
||||||
|
try {
|
||||||
|
stateDasarHukumPPID.findById.loading = true;
|
||||||
|
const res = await ApiFetch.api.ppid.dasarhukumppid["find-by-id"].get({
|
||||||
|
query: { id },
|
||||||
|
});
|
||||||
|
if (res.status === 200) {
|
||||||
|
stateDasarHukumPPID.findById.data = res.data?.data ?? null;
|
||||||
|
} else {
|
||||||
|
toast.error("Gagal mengambil data dasar hukum");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error((error as Error).message);
|
||||||
|
toast.error("Terjadi kesalahan saat mengambil data dasar hukum");
|
||||||
|
} finally {
|
||||||
|
stateDasarHukumPPID.findById.loading = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
update: {
|
||||||
|
loading: false,
|
||||||
|
async save(data: DasarHukumForm) {
|
||||||
|
const cek = templateForm.safeParse(data);
|
||||||
|
if (!cek.success) {
|
||||||
|
const errors = cek.error.issues
|
||||||
|
.map((issue) => `${issue.path.join(".")}: ${issue.message}`)
|
||||||
|
.join(", ");
|
||||||
|
toast.error(`Form tidak valid: ${errors}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
stateDasarHukumPPID.update.loading = true;
|
||||||
|
const res = await ApiFetch.api.ppid.dasarhukumppid["update"].post(data);
|
||||||
|
if (res.status === 200) {
|
||||||
|
toast.success("Data dasar hukum berhasil diubah");
|
||||||
|
await stateDasarHukumPPID.findById.load(data.id);
|
||||||
|
} else {
|
||||||
|
toast.error("Gagal mengubah data dasar hukum");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error((error as Error).message);
|
||||||
|
toast.error("Terjadi kesalahan saat mengubah data dasar hukum");
|
||||||
|
} finally {
|
||||||
|
stateDasarHukumPPID.update.loading = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default stateDasarHukumPPID;
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
import ApiFetch from "@/lib/api-fetch";
|
||||||
|
import { Prisma } from "@prisma/client";
|
||||||
|
import { toast } from "react-toastify";
|
||||||
|
import { proxy } from "valtio";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
const templateForm = z.object({
|
||||||
|
name: z.string().min(3, "Nama minimal 3 karakter"),
|
||||||
|
nik: z.string().min(3, "NIK minimal 3 karakter"),
|
||||||
|
notelp: z.string().min(3, "Nomor Telepon minimal 3 karakter"),
|
||||||
|
alamat: z.string().min(3, "Alamat minimal 3 karakter"),
|
||||||
|
email: z.string().min(3, "Email minimal 3 karakter"),
|
||||||
|
jenisInformasiDimintaId: z.string().nonempty(),
|
||||||
|
caraMemperolehInformasiId: z.string().nonempty(),
|
||||||
|
caraMemperolehSalinanInformasiId: z.string().nonempty(),
|
||||||
|
})
|
||||||
|
|
||||||
|
const jenisInformasiDiminta = proxy({
|
||||||
|
findMany: {
|
||||||
|
data: null as
|
||||||
|
| null
|
||||||
|
| Prisma.JenisInformasiDimintaGetPayload<{ omit: { isActive: true } }>[],
|
||||||
|
async load(){
|
||||||
|
const res = await ApiFetch.api.ppid.permohonaninformasipublik.jenisInformasi["find-many"].get();
|
||||||
|
if (res.status === 200) {
|
||||||
|
jenisInformasiDiminta.findMany.data = res.data?.data ?? [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const caraMemperolehInformasi = proxy({
|
||||||
|
findMany: {
|
||||||
|
data: null as
|
||||||
|
| null
|
||||||
|
| Prisma.CaraMemperolehInformasiGetPayload<{ omit: { isActive: true } }>[],
|
||||||
|
async load() {
|
||||||
|
const res = await ApiFetch.api.ppid.permohonaninformasipublik.memperolehInformasi["find-many"].get();
|
||||||
|
if (res.status === 200) {
|
||||||
|
caraMemperolehInformasi.findMany.data = res.data?.data ?? [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const caraMemperolehSalinanInformasi = proxy({
|
||||||
|
findMany: {
|
||||||
|
data: null as
|
||||||
|
| null
|
||||||
|
| Prisma.CaraMemperolehSalinanInformasiGetPayload<{ omit: { isActive: true } }>[],
|
||||||
|
async load() {
|
||||||
|
const res = await ApiFetch.api.ppid.permohonaninformasipublik.salinanInformasi["find-many"].get();
|
||||||
|
if (res.status === 200) {
|
||||||
|
caraMemperolehSalinanInformasi.findMany.data = res.data?.data ?? [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
console.log(caraMemperolehSalinanInformasi)
|
||||||
|
|
||||||
|
type PermohonanInformasiPublikForm = Prisma.PermohonanInformasiPublikGetPayload<{
|
||||||
|
select: {
|
||||||
|
name: true;
|
||||||
|
nik: true;
|
||||||
|
notelp: true;
|
||||||
|
alamat: true;
|
||||||
|
email: true;
|
||||||
|
jenisInformasiDimintaId: true;
|
||||||
|
caraMemperolehInformasiId: true;
|
||||||
|
caraMemperolehSalinanInformasiId: true;
|
||||||
|
};
|
||||||
|
}>;
|
||||||
|
|
||||||
|
const statepermohonanInformasiPublik = proxy({
|
||||||
|
create: {
|
||||||
|
form: {} as PermohonanInformasiPublikForm,
|
||||||
|
loading: false,
|
||||||
|
async create(){
|
||||||
|
const cek = templateForm.safeParse(statepermohonanInformasiPublik.create.form);
|
||||||
|
if(!cek.success) {
|
||||||
|
const err = `[${cek.error.issues
|
||||||
|
.map((v) => `${v.path.join(".")}`)
|
||||||
|
.join("\n")}] required`;
|
||||||
|
return toast.error(err);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
statepermohonanInformasiPublik.create.loading = true;
|
||||||
|
const res = await ApiFetch.api.ppid.permohonaninformasipublik["create"].post(statepermohonanInformasiPublik.create.form);
|
||||||
|
if (res.status === 200) {
|
||||||
|
statepermohonanInformasiPublik.findMany.load();
|
||||||
|
return toast.success("success create");
|
||||||
|
}
|
||||||
|
return toast.error("failed create");
|
||||||
|
} catch (error) {
|
||||||
|
console.log((error as Error).message);
|
||||||
|
} finally {
|
||||||
|
statepermohonanInformasiPublik.create.loading = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
findMany: {
|
||||||
|
data: null as
|
||||||
|
| Prisma.PermohonanInformasiPublikGetPayload<{ include: {
|
||||||
|
caraMemperolehSalinanInformasi: true,
|
||||||
|
jenisInformasiDiminta: true,
|
||||||
|
caraMemperolehInformasi: true,
|
||||||
|
} }>[]
|
||||||
|
| null,
|
||||||
|
async load() {
|
||||||
|
const res = await ApiFetch.api.ppid.permohonaninformasipublik["find-many"].get();
|
||||||
|
if (res.status === 200) {
|
||||||
|
statepermohonanInformasiPublik.findMany.data = res.data?.data ?? [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const statepermohonanInformasiPublikForm = proxy({
|
||||||
|
statepermohonanInformasiPublik,
|
||||||
|
jenisInformasiDiminta,
|
||||||
|
caraMemperolehInformasi,
|
||||||
|
caraMemperolehSalinanInformasi,
|
||||||
|
})
|
||||||
|
|
||||||
|
export default statepermohonanInformasiPublikForm;
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
import ApiFetch from "@/lib/api-fetch";
|
||||||
|
import { Prisma } from "@prisma/client";
|
||||||
|
import { toast } from "react-toastify";
|
||||||
|
import { proxy } from "valtio";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
const templateForm = z.object({
|
||||||
|
name: z.string().min(3, "Nama minimal 3 karakter"),
|
||||||
|
email: z.string().min(3, "Email minimal 3 karakter"),
|
||||||
|
notelp: z.string().min(3, "Nomor Telepon minimal 3 karakter"),
|
||||||
|
alasan: z.string().min(3, "Alasan minimal 3 karakter"),
|
||||||
|
})
|
||||||
|
|
||||||
|
type PermohonanKeberatanInformasiForm = Prisma.FormulirPermohonanKeberatanGetPayload<{
|
||||||
|
select: {
|
||||||
|
name: true;
|
||||||
|
email: true;
|
||||||
|
notelp: true;
|
||||||
|
alasan: true;
|
||||||
|
};
|
||||||
|
}>;
|
||||||
|
|
||||||
|
const permohonanKeberatanInformasi = proxy({
|
||||||
|
create: {
|
||||||
|
form: {} as PermohonanKeberatanInformasiForm,
|
||||||
|
loading: false,
|
||||||
|
async create(){
|
||||||
|
const cek = templateForm.safeParse(permohonanKeberatanInformasi.create.form);
|
||||||
|
if(!cek.success) {
|
||||||
|
const err = `[${cek.error.issues
|
||||||
|
.map((v) => `${v.path.join(".")}`)
|
||||||
|
.join("\n")}] required`;
|
||||||
|
return toast.error(err);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
permohonanKeberatanInformasi.create.loading = true;
|
||||||
|
const res = await ApiFetch.api.ppid.permohonankeberataninformasipublik["create"].post(permohonanKeberatanInformasi.create.form);
|
||||||
|
if (res.status === 200) {
|
||||||
|
permohonanKeberatanInformasi.findMany.load();
|
||||||
|
return toast.success("success create");
|
||||||
|
}
|
||||||
|
return toast.error("failed create");
|
||||||
|
} catch (error) {
|
||||||
|
console.log((error as Error).message);
|
||||||
|
} finally {
|
||||||
|
permohonanKeberatanInformasi.create.loading = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
findMany: {
|
||||||
|
data: null as
|
||||||
|
| Prisma.FormulirPermohonanKeberatanGetPayload<{omit: {isActive: true}}>[]
|
||||||
|
| null,
|
||||||
|
async load() {
|
||||||
|
const res = await ApiFetch.api.ppid.permohonankeberataninformasipublik["find-many"].get();
|
||||||
|
if (res.status === 200) {
|
||||||
|
permohonanKeberatanInformasi.findMany.data = res.data?.data ?? [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
export default permohonanKeberatanInformasi;
|
||||||
|
|
||||||
@@ -0,0 +1,172 @@
|
|||||||
|
import ApiFetch from "@/lib/api-fetch";
|
||||||
|
import { Prisma } from "@prisma/client";
|
||||||
|
import { toast } from "react-toastify";
|
||||||
|
import { proxy } from "valtio";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schema validasi form ProfilePPID menggunakan Zod.
|
||||||
|
*/
|
||||||
|
const templateForm = z.object({
|
||||||
|
name: z.string().min(3, "Nama minimal 3 karakter"),
|
||||||
|
biodata: z.string().min(3, "Biodata minimal 3 karakter"),
|
||||||
|
riwayat: z.string().min(3, "Riwayat minimal 3 karakter"),
|
||||||
|
pengalaman: z.string().min(3, "Pengalaman minimal 3 karakter"),
|
||||||
|
unggulan: z.string().min(3, "Unggulan minimal 3 karakter"),
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tipe data ProfilePPID yang digunakan dalam form dan API, berdasarkan Prisma schema.
|
||||||
|
*/
|
||||||
|
type ProfilePPIDForm = Prisma.ProfilePPIDGetPayload<{
|
||||||
|
select: {
|
||||||
|
id: true;
|
||||||
|
name: true;
|
||||||
|
biodata: true;
|
||||||
|
riwayat: true;
|
||||||
|
pengalaman: true;
|
||||||
|
unggulan: true;
|
||||||
|
imageUrl: true;
|
||||||
|
};
|
||||||
|
}>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* State utama ProfilePPID yang mencakup fitur:
|
||||||
|
* - Ambil data berdasarkan ID
|
||||||
|
* - Update data
|
||||||
|
* - Upload gambar
|
||||||
|
*/
|
||||||
|
const stateProfilePPID = proxy({
|
||||||
|
/**
|
||||||
|
* Bagian untuk ambil data berdasarkan ID
|
||||||
|
*/
|
||||||
|
findById: {
|
||||||
|
data: null as ProfilePPIDForm | null,
|
||||||
|
loading: false,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inisialisasi data kosong ke dalam state.
|
||||||
|
*/
|
||||||
|
initialize() {
|
||||||
|
stateProfilePPID.findById.data = {
|
||||||
|
id: '',
|
||||||
|
name: '',
|
||||||
|
biodata: '',
|
||||||
|
riwayat: '',
|
||||||
|
pengalaman: '',
|
||||||
|
unggulan: '',
|
||||||
|
imageUrl: ''
|
||||||
|
} as ProfilePPIDForm;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mengambil data profil berdasarkan ID.
|
||||||
|
* @param {string} id - ID dari profile yang ingin diambil.
|
||||||
|
*/
|
||||||
|
async load(id: string) {
|
||||||
|
try {
|
||||||
|
stateProfilePPID.findById.loading = true;
|
||||||
|
const res = await ApiFetch.api.ppid.profileppid["find-by-id"].get({
|
||||||
|
query: { id },
|
||||||
|
});
|
||||||
|
|
||||||
|
if (res.status === 200) {
|
||||||
|
stateProfilePPID.findById.data = res.data?.data ?? null;
|
||||||
|
} else {
|
||||||
|
toast.error("Gagal mengambil data profile");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error((error as Error).message);
|
||||||
|
toast.error("Terjadi kesalahan saat mengambil data profile");
|
||||||
|
} finally {
|
||||||
|
stateProfilePPID.findById.loading = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bagian untuk update data profile
|
||||||
|
*/
|
||||||
|
update: {
|
||||||
|
loading: false,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Melakukan validasi dan menyimpan perubahan data profile ke server.
|
||||||
|
* @param {ProfilePPIDForm} data - Data profil yang akan disimpan.
|
||||||
|
*/
|
||||||
|
async save(data: ProfilePPIDForm) {
|
||||||
|
const cek = templateForm.safeParse(data);
|
||||||
|
|
||||||
|
if (!cek.success) {
|
||||||
|
const errors = cek.error.issues
|
||||||
|
.map((issue) => `${issue.path.join(".")}: ${issue.message}`)
|
||||||
|
.join(", ");
|
||||||
|
toast.error(`Form tidak valid: ${errors}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
stateProfilePPID.update.loading = true;
|
||||||
|
const res = await ApiFetch.api.ppid.profileppid["update"].post(data);
|
||||||
|
|
||||||
|
if (res.status === 200) {
|
||||||
|
toast.success("Berhasil update profile");
|
||||||
|
await stateProfilePPID.findById.load(data.id);
|
||||||
|
} else {
|
||||||
|
toast.error("Gagal update profile");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error((error as Error).message);
|
||||||
|
toast.error("Terjadi kesalahan saat update profile");
|
||||||
|
} finally {
|
||||||
|
stateProfilePPID.update.loading = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bagian untuk upload gambar profil
|
||||||
|
*/
|
||||||
|
uploadImage: {
|
||||||
|
loading: false,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mengunggah gambar profil berdasarkan ID.
|
||||||
|
* @param {File} file - File gambar yang akan diunggah.
|
||||||
|
* @param {string} id - ID dari profil yang akan diperbarui gambarnya.
|
||||||
|
*/
|
||||||
|
async save(file: File, id: string) {
|
||||||
|
if (!file || !id) {
|
||||||
|
toast.error("File atau ID harus disertakan");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
stateProfilePPID.uploadImage.loading = true;
|
||||||
|
|
||||||
|
const form = new FormData();
|
||||||
|
form.append("file", file);
|
||||||
|
form.append("id", id);
|
||||||
|
|
||||||
|
const res = await ApiFetch.api.ppid.profileppid["edit-img"].post(form);
|
||||||
|
|
||||||
|
if (res.status === 200) {
|
||||||
|
toast.success("Berhasil mengunggah gambar");
|
||||||
|
await stateProfilePPID.findById.load(id);
|
||||||
|
} else {
|
||||||
|
toast.error("Gagal mengunggah gambar");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error((error as Error).message);
|
||||||
|
toast.error("Terjadi kesalahan saat mengunggah gambar");
|
||||||
|
} finally {
|
||||||
|
stateProfilePPID.uploadImage.loading = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ekspor state utama ProfilePPID untuk digunakan di komponen lain.
|
||||||
|
*/
|
||||||
|
export default stateProfilePPID;
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
import ApiFetch from "@/lib/api-fetch";
|
||||||
|
import { Prisma } from "@prisma/client";
|
||||||
|
import { toast } from "react-toastify";
|
||||||
|
import { proxy } from "valtio";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
const templateForm = z.object({
|
||||||
|
misi: z.string().min(3, "Misi minimal 3 karakter"),
|
||||||
|
visi: z.string().min(3, "Visi minimal 3 karakter"),
|
||||||
|
});
|
||||||
|
|
||||||
|
type VisiMisiPPIDForm = Prisma.VisiMisiPPIDGetPayload<{
|
||||||
|
select: {
|
||||||
|
id: true;
|
||||||
|
misi: true;
|
||||||
|
visi: true;
|
||||||
|
};
|
||||||
|
}>;
|
||||||
|
|
||||||
|
const stateVisiMisiPPID = proxy({
|
||||||
|
findById: {
|
||||||
|
data: null as VisiMisiPPIDForm | null,
|
||||||
|
loading: false,
|
||||||
|
initialize() {
|
||||||
|
stateVisiMisiPPID.findById.data = {
|
||||||
|
id: "",
|
||||||
|
misi: "",
|
||||||
|
visi: "",
|
||||||
|
} as VisiMisiPPIDForm;
|
||||||
|
},
|
||||||
|
async load(id: string) {
|
||||||
|
try {
|
||||||
|
stateVisiMisiPPID.findById.loading = true;
|
||||||
|
const res = await ApiFetch.api.ppid.visimisippid["find-by-id"].get({
|
||||||
|
query: { id },
|
||||||
|
});
|
||||||
|
if (res.status === 200) {
|
||||||
|
stateVisiMisiPPID.findById.data = res.data?.data ?? null;
|
||||||
|
} else {
|
||||||
|
toast.error("Gagal mengambil data visi misi");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error((error as Error).message);
|
||||||
|
toast.error("Terjadi kesalahan saat mengambil data visi misi");
|
||||||
|
} finally {
|
||||||
|
stateVisiMisiPPID.findById.loading = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
update: {
|
||||||
|
loading: false,
|
||||||
|
async save(data: VisiMisiPPIDForm) {
|
||||||
|
const cek = templateForm.safeParse(data);
|
||||||
|
if (!cek.success) {
|
||||||
|
const errors = cek.error.issues
|
||||||
|
.map((issue) => `${issue.path.join(".")}: ${issue.message}`)
|
||||||
|
.join(", ");
|
||||||
|
toast.error(`Form tidak valid: ${errors}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
stateVisiMisiPPID.update.loading = true;
|
||||||
|
const res = await ApiFetch.api.ppid.visimisippid["update"].post(data);
|
||||||
|
if (res.status === 200) {
|
||||||
|
toast.success("Berhasil update visi misi");
|
||||||
|
await stateVisiMisiPPID.findById.load(data.id);
|
||||||
|
} else {
|
||||||
|
toast.error("Gagal update visi misi");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error((error as Error).message);
|
||||||
|
toast.error("Terjadi kesalahan saat update visi misi");
|
||||||
|
} finally {
|
||||||
|
stateVisiMisiPPID.update.loading = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default stateVisiMisiPPID;
|
||||||
93
src/app/admin/(dashboard)/desa/_com/desaEditor.tsx
Normal file
93
src/app/admin/(dashboard)/desa/_com/desaEditor.tsx
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
'use client'
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Button, Stack } from '@mantine/core';
|
||||||
|
import { Link, RichTextEditor } from '@mantine/tiptap';
|
||||||
|
import Highlight from '@tiptap/extension-highlight';
|
||||||
|
import SubScript from '@tiptap/extension-subscript';
|
||||||
|
import Superscript from '@tiptap/extension-superscript';
|
||||||
|
import TextAlign from '@tiptap/extension-text-align';
|
||||||
|
import Underline from '@tiptap/extension-underline';
|
||||||
|
import { useEditor } from '@tiptap/react';
|
||||||
|
import StarterKit from '@tiptap/starter-kit';
|
||||||
|
|
||||||
|
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><sup /></sup> and <sub><sub /></sub> tags)</li><li>Ordered and bullet lists</li><li>Text align </li><li>And all <a href="https://tiptap.dev/extensions" target="_blank" rel="noopener noreferrer">other extensions</a></li></ul>';
|
||||||
|
|
||||||
|
export function DesaEditor({showSubmit = true} : {
|
||||||
|
showSubmit: boolean
|
||||||
|
}) {
|
||||||
|
const editor = useEditor({
|
||||||
|
extensions: [
|
||||||
|
StarterKit,
|
||||||
|
Underline,
|
||||||
|
Link,
|
||||||
|
Superscript,
|
||||||
|
SubScript,
|
||||||
|
Highlight,
|
||||||
|
TextAlign.configure({ types: ['heading', 'paragraph'] }),
|
||||||
|
],
|
||||||
|
immediatelyRender: false,
|
||||||
|
content,
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Stack>
|
||||||
|
<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>
|
||||||
|
{showSubmit && (
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
</Stack>
|
||||||
|
);
|
||||||
|
}
|
||||||
95
src/app/admin/(dashboard)/desa/_com/desaEditorText.tsx
Normal file
95
src/app/admin/(dashboard)/desa/_com/desaEditorText.tsx
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
'use client'
|
||||||
|
import { Button, Stack } from '@mantine/core';
|
||||||
|
import { Link, RichTextEditor } from '@mantine/tiptap';
|
||||||
|
import Highlight from '@tiptap/extension-highlight';
|
||||||
|
import SubScript from '@tiptap/extension-subscript';
|
||||||
|
import Superscript from '@tiptap/extension-superscript';
|
||||||
|
import TextAlign from '@tiptap/extension-text-align';
|
||||||
|
import Underline from '@tiptap/extension-underline';
|
||||||
|
import { useEditor } from '@tiptap/react';
|
||||||
|
import StarterKit from '@tiptap/starter-kit';
|
||||||
|
|
||||||
|
|
||||||
|
function DesaEditorText({ onSubmit, onChange, showSubmit = true, initialContent = '', }: {
|
||||||
|
onSubmit?: (val: string) => void,
|
||||||
|
onChange: (val: string) => void,
|
||||||
|
showSubmit?: boolean,
|
||||||
|
initialContent?: string }) {
|
||||||
|
const editor = useEditor({
|
||||||
|
extensions: [
|
||||||
|
StarterKit,
|
||||||
|
Underline,
|
||||||
|
Link,
|
||||||
|
Superscript,
|
||||||
|
SubScript,
|
||||||
|
Highlight,
|
||||||
|
TextAlign.configure({ types: ['heading', 'paragraph'] }),
|
||||||
|
],
|
||||||
|
immediatelyRender: false,
|
||||||
|
content: initialContent,
|
||||||
|
onUpdate : ({editor}) => {
|
||||||
|
onChange(editor.getHTML())
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Stack>
|
||||||
|
<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>
|
||||||
|
{showSubmit && (
|
||||||
|
<Button onClick={() => {
|
||||||
|
if (!editor) return
|
||||||
|
onSubmit?.(editor?.getHTML())
|
||||||
|
}}>Submit</Button>
|
||||||
|
)}
|
||||||
|
</Stack>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default DesaEditorText;
|
||||||
@@ -1,62 +1,75 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import { Center, Group, Select, SimpleGrid, Skeleton, Stack, Text, TextInput } from '@mantine/core';
|
import { Box, Center, Group, Paper, Select, SimpleGrid, Skeleton, Stack, Text, TextInput, Title } from '@mantine/core';
|
||||||
import { useShallowEffect } from '@mantine/hooks';
|
import { useShallowEffect } from '@mantine/hooks';
|
||||||
import { Prisma } from '@prisma/client';
|
import { Prisma } from '@prisma/client';
|
||||||
import { IconImageInPicture } from '@tabler/icons-react';
|
import { IconImageInPicture } from '@tabler/icons-react';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import stateDashboardBerita from '../../_state/desa/berita';
|
import stateDashboardBerita from '../../_state/desa/berita';
|
||||||
import { BeritaEditor } from './_com/BeritaEditor';
|
import { BeritaEditor } from './_com/BeritaEditor';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
|
||||||
function Page() {
|
function Page() {
|
||||||
return (
|
return (
|
||||||
<Stack>
|
<Box>
|
||||||
<SimpleGrid cols={2}>
|
<Title order={3}>Berita</Title>
|
||||||
<BeritaList />
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
<BeritaCreate />
|
<BeritaCreate />
|
||||||
|
<BeritaList />
|
||||||
</SimpleGrid>
|
</SimpleGrid>
|
||||||
</Stack>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function BeritaCreate() {
|
||||||
|
const beritaState = useProxy(stateDashboardBerita)
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<SelectCategory onChange={(val) => {
|
||||||
|
beritaState.berita.create.form.katagoryBeritaId = val.id
|
||||||
|
}} />
|
||||||
|
<TextInput onChange={(val) => {
|
||||||
|
beritaState.berita.create.form.judul = val.target.value
|
||||||
|
}} label={"Judul"} placeholder='masukkan judul' />
|
||||||
|
<TextInput onChange={(val) => {
|
||||||
|
beritaState.berita.create.form.deskripsi = val.target.value
|
||||||
|
}} label={"Deskripsi"} placeholder='masukkan deskripsi' />
|
||||||
|
<Center w={200} h={200} bg={"gray"}>
|
||||||
|
<IconImageInPicture />
|
||||||
|
</Center>
|
||||||
|
<BeritaEditor onSubmit={(val) => {
|
||||||
|
|
||||||
|
beritaState.berita.create.form.content = val
|
||||||
|
beritaState.berita.create.create()
|
||||||
|
}} />
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
function BeritaList() {
|
function BeritaList() {
|
||||||
const beritaState = useProxy(stateDashboardBerita)
|
const beritaState = useProxy(stateDashboardBerita)
|
||||||
useShallowEffect(() => {
|
useShallowEffect(() => {
|
||||||
beritaState.berita.findMany.load()
|
beritaState.berita.findMany.load()
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
if (!beritaState.berita.findMany.data) return <Stack>
|
if (!beritaState.berita.findMany.data) return <Stack py={10}>
|
||||||
{Array.from({ length: 10 }).map((v, k) => <Skeleton key={k} h={40} />)}
|
{Array.from({ length: 10 }).map((v, k) => <Skeleton key={k} h={40} />)}
|
||||||
</Stack>
|
</Stack>
|
||||||
return <Stack>
|
return (
|
||||||
<Text>News List</Text>
|
<Box py={10}>
|
||||||
{beritaState.berita.findMany.data?.map((item) => (
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<Text key={item.id}>{item.judul}</Text>
|
<Stack>
|
||||||
))}
|
<Text fz={"xl"} fw={"bold"}>List Berita</Text>
|
||||||
</Stack>
|
{beritaState.berita.findMany.data?.map((item) => (
|
||||||
}
|
<Text key={item.id}>{item.judul}</Text>
|
||||||
|
))}
|
||||||
function BeritaCreate() {
|
</Stack>
|
||||||
const beritaState = useProxy(stateDashboardBerita)
|
</Paper>
|
||||||
return <Stack gap={"md"}>
|
</Box>
|
||||||
<Text>Create Some News</Text>
|
)
|
||||||
<SelectCategory onChange={(val) => {
|
|
||||||
beritaState.berita.create.form.katagoryBeritaId = val.id
|
|
||||||
}} />
|
|
||||||
<TextInput onChange={(val) => {
|
|
||||||
beritaState.berita.create.form.judul = val.target.value
|
|
||||||
}} label={"Judul"} placeholder='masukkan judul' />
|
|
||||||
<TextInput onChange={(val) => {
|
|
||||||
beritaState.berita.create.form.deskripsi = val.target.value
|
|
||||||
}} label={"Deskripsi"} placeholder='masukkan deskripsi' />
|
|
||||||
<Center w={200} h={200} bg={"gray"}>
|
|
||||||
<IconImageInPicture />
|
|
||||||
</Center>
|
|
||||||
<BeritaEditor onSubmit={(val) => {
|
|
||||||
|
|
||||||
beritaState.berita.create.form.content = val
|
|
||||||
beritaState.berita.create.create()
|
|
||||||
}} />
|
|
||||||
</Stack>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function SelectCategory({ onChange }: {
|
function SelectCategory({ onChange }: {
|
||||||
@@ -74,7 +87,7 @@ function SelectCategory({ onChange }: {
|
|||||||
|
|
||||||
if (!beritaState.category.findMany.data) return <Skeleton h={40} />
|
if (!beritaState.category.findMany.data) return <Skeleton h={40} />
|
||||||
return <Group>
|
return <Group>
|
||||||
<Select placeholder='pilih katagori' label={"select katagori"} data={beritaState.category.findMany.data.map((item) => ({
|
<Select placeholder='pilih katagori' label={<Text fz={"sm"} fw={"bold"}>Pilih Kategori</Text>} data={beritaState.category.findMany.data.map((item) => ({
|
||||||
value: item.id,
|
value: item.id,
|
||||||
label: item.name
|
label: item.name
|
||||||
}))} onChange={(v) => {
|
}))} onChange={(v) => {
|
||||||
|
|||||||
@@ -1,11 +1,35 @@
|
|||||||
import React from 'react';
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core';
|
||||||
|
import { IconPhoto, IconVideo } from '@tabler/icons-react';
|
||||||
|
import Foto from './ui/foto/page';
|
||||||
|
import Video from './ui/video/page';
|
||||||
|
|
||||||
function Page() {
|
function Gallery() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<Box>
|
||||||
Gallery
|
<Stack gap={"xs"}>
|
||||||
</div>
|
<Title order={3}>Gallery</Title>
|
||||||
|
<Tabs color={colors['blue-button']} variant="pills" defaultValue="foto">
|
||||||
|
<TabsList p={"xs"} bg={"#BBC8E7FF"}>
|
||||||
|
<TabsTab value="foto" leftSection={<IconPhoto size={12} />}>
|
||||||
|
Foto
|
||||||
|
</TabsTab>
|
||||||
|
<TabsTab value="video" leftSection={<IconVideo size={12} />}>
|
||||||
|
Video
|
||||||
|
</TabsTab>
|
||||||
|
</TabsList>
|
||||||
|
|
||||||
|
<TabsPanel value="foto">
|
||||||
|
<Foto/>
|
||||||
|
</TabsPanel>
|
||||||
|
|
||||||
|
<TabsPanel value="video">
|
||||||
|
<Video/>
|
||||||
|
</TabsPanel>
|
||||||
|
</Tabs>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Page;
|
export default Gallery;
|
||||||
|
|||||||
17
src/app/admin/(dashboard)/desa/gallery/ui/foto/listPage.tsx
Normal file
17
src/app/admin/(dashboard)/desa/gallery/ui/foto/listPage.tsx
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Paper, Stack, Title } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
function ListFoto() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<Title order={3}>List Foto</Title>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ListFoto;
|
||||||
52
src/app/admin/(dashboard)/desa/gallery/ui/foto/page.tsx
Normal file
52
src/app/admin/(dashboard)/desa/gallery/ui/foto/page.tsx
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Button, Center, Group, Paper, SimpleGrid, Stack, Text, TextInput, Title } from '@mantine/core';
|
||||||
|
import { IconUpload } from '@tabler/icons-react';
|
||||||
|
import { DesaEditor } from '../../../_com/desaEditor';
|
||||||
|
import ListFoto from './listPage';
|
||||||
|
|
||||||
|
function Foto() {
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<Title order={3}>Foto</Title>
|
||||||
|
<TextInput
|
||||||
|
label={<Text fz={"sm"} fw={"bold"}>Tanggal Foto</Text>}
|
||||||
|
placeholder="2022-01-01"
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
label={<Text fz={"sm"} fw={"bold"}>Judul Foto</Text>}
|
||||||
|
placeholder="Judul Foto"
|
||||||
|
/>
|
||||||
|
<Text fz={"sm"} fw={"bold"}>Upload Foto</Text>
|
||||||
|
<Box bg={colors['BG-trans']} p={"md"}>
|
||||||
|
<Center>
|
||||||
|
<IconUpload size={52} color="var(--mantine-color-blue-6)" stroke={1.5} />
|
||||||
|
</Center>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
<Text fz={"sm"} fw={"bold"}>Deskripsi Foto</Text>
|
||||||
|
<DesaEditor
|
||||||
|
showSubmit={false}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Group>
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<ListFoto/>
|
||||||
|
</SimpleGrid>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Foto;
|
||||||
17
src/app/admin/(dashboard)/desa/gallery/ui/video/listPage.tsx
Normal file
17
src/app/admin/(dashboard)/desa/gallery/ui/video/listPage.tsx
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Paper, Stack, Title } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
function ListVideo() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<Title order={3}>List Video</Title>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ListVideo;
|
||||||
52
src/app/admin/(dashboard)/desa/gallery/ui/video/page.tsx
Normal file
52
src/app/admin/(dashboard)/desa/gallery/ui/video/page.tsx
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Button, Center, Group, Paper, SimpleGrid, Stack, Text, TextInput, Title } from '@mantine/core';
|
||||||
|
import { IconUpload } from '@tabler/icons-react';
|
||||||
|
import { DesaEditor } from '../../../_com/desaEditor';
|
||||||
|
import ListVideo from './listPage';
|
||||||
|
|
||||||
|
function Video() {
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<Title order={3}>Video</Title>
|
||||||
|
<TextInput
|
||||||
|
label={<Text fz={"sm"} fw={"bold"}>Tanggal Video</Text>}
|
||||||
|
placeholder="2022-01-01"
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
label={<Text fz={"sm"} fw={"bold"}>Judul Video</Text>}
|
||||||
|
placeholder="Judul Video"
|
||||||
|
/>
|
||||||
|
<Text fz={"sm"} fw={"bold"}>Upload Video</Text>
|
||||||
|
<Box bg={colors['BG-trans']} p={"md"}>
|
||||||
|
<Center>
|
||||||
|
<IconUpload size={52} color="var(--mantine-color-blue-6)" stroke={1.5} />
|
||||||
|
</Center>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
<Text fz={"sm"} fw={"bold"}>Deskripsi Video</Text>
|
||||||
|
<DesaEditor
|
||||||
|
showSubmit={false}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Group>
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<ListVideo/>
|
||||||
|
</SimpleGrid>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Video;
|
||||||
@@ -1,11 +1,48 @@
|
|||||||
import React from 'react';
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core';
|
||||||
|
import SuratKeterangan from './ui/surat_keterangan/page';
|
||||||
|
import PerizinanUsaha from './ui/perizinan_usaha/page';
|
||||||
|
import TelunjukSaktiDesa from './ui/telunjuk_sakti_desa/page';
|
||||||
|
import PendudukNonPermanent from './ui/penduduk_non_permanent/page';
|
||||||
|
|
||||||
function Page() {
|
function Page() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<Box py={10}>
|
||||||
Layanan
|
<Stack >
|
||||||
</div>
|
<Title order={3}>Layanan</Title>
|
||||||
|
<Tabs color={colors['blue-button']} variant='pills' defaultValue={"Pelayanan Surat Keterangan"}>
|
||||||
|
<TabsList p={"xs"} bg={"#BBC8E7FF"}>
|
||||||
|
<TabsTab value="Pelayanan Surat Keterangan">
|
||||||
|
Pelayanan Surat Keterangan
|
||||||
|
</TabsTab>
|
||||||
|
<TabsTab value="Pelayanan Perizinan Berusaha">
|
||||||
|
Pelayanan Perizinan Berusaha
|
||||||
|
</TabsTab>
|
||||||
|
<TabsTab value="Pelayanan Telunjuk Sakti Desa">
|
||||||
|
Pelayanan Telunjuk Sakti Desa
|
||||||
|
</TabsTab>
|
||||||
|
<TabsTab value="Pelayanan Penduduk Non-Permanent">
|
||||||
|
Pelayanan Penduduk Non-Permanent
|
||||||
|
</TabsTab>
|
||||||
|
</TabsList>
|
||||||
|
|
||||||
|
<TabsPanel value="Pelayanan Surat Keterangan">
|
||||||
|
<SuratKeterangan />
|
||||||
|
</TabsPanel>
|
||||||
|
<TabsPanel value="Pelayanan Perizinan Berusaha">
|
||||||
|
<PerizinanUsaha />
|
||||||
|
</TabsPanel>
|
||||||
|
<TabsPanel value="Pelayanan Telunjuk Sakti Desa">
|
||||||
|
<TelunjukSaktiDesa />
|
||||||
|
</TabsPanel>
|
||||||
|
<TabsPanel value="Pelayanan Penduduk Non-Permanent">
|
||||||
|
<PendudukNonPermanent />
|
||||||
|
</TabsPanel>
|
||||||
|
</Tabs>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Page;
|
export default Page;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Paper, Stack, Title } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
function ListPendudukNonPermanent() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>List Penduduk Non-Permanent</Title>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ListPendudukNonPermanent;
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, SimpleGrid, Paper, Stack, Title, Group, Button, Text } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
import { DesaEditor } from '../../../_com/desaEditor';
|
||||||
|
import ListPendudukNonPermanent from './listPage';
|
||||||
|
|
||||||
|
function PendudukNonPermanent() {
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>Penduduk Non-Permanent</Title>
|
||||||
|
<Text fw={"bold"}>Deskripsi Penduduk Non-Permanent</Text>
|
||||||
|
<DesaEditor showSubmit={false} />
|
||||||
|
<Group>
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<ListPendudukNonPermanent />
|
||||||
|
</SimpleGrid>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default PendudukNonPermanent;
|
||||||
|
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Paper, Stack, Title } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
function ListPerizinanUsaha() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<Title order={3}>List Perizinan Usaha</Title>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ListPerizinanUsaha;
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Button, Group, Paper, SimpleGrid, Stack, Text, Title } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
import ListPerizinanUsaha from './listPage';
|
||||||
|
import { DesaEditor } from '../../../_com/desaEditor';
|
||||||
|
|
||||||
|
function PerizinanUsaha() {
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<Title order={3}>Pelayanan Perizinan Usaha</Title>
|
||||||
|
<Box>
|
||||||
|
<Text fz={"sm"} fw={"bold"}>Deskripsi Perizinan Usaha</Text>
|
||||||
|
<DesaEditor
|
||||||
|
showSubmit={false}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Group>
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<ListPerizinanUsaha />
|
||||||
|
</SimpleGrid>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default PerizinanUsaha;
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Paper, Stack, Title } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
function ListSuratKeterangan() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>List Surat Keterangan</Title>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ListSuratKeterangan;
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, SimpleGrid, Paper, Stack, Title, Button, Group, TextInput, Text, Center, Flex } from '@mantine/core';
|
||||||
|
import { IconUpload } from '@tabler/icons-react';
|
||||||
|
import React from 'react';
|
||||||
|
import ListSuratKeterangan from './listPage';
|
||||||
|
|
||||||
|
function SuratKeterangan() {
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<Title order={3}>Pelayanan Surat Keterangan</Title>
|
||||||
|
<TextInput
|
||||||
|
label={<Text fz={"sm"} fw={"bold"}>Nama Surat Keterangan</Text>}
|
||||||
|
placeholder='masukkan nama surat keterangan'
|
||||||
|
/>
|
||||||
|
<Text fz={"sm"} fw={"bold"}>Upload Gambar Surat Keterangan</Text>
|
||||||
|
<Box bg={colors['BG-trans']} p={"md"}>
|
||||||
|
<Center>
|
||||||
|
<IconUpload size={52} color="var(--mantine-color-blue-6)" stroke={1.5} />
|
||||||
|
</Center>
|
||||||
|
</Box>
|
||||||
|
<Flex>
|
||||||
|
<Text fz={"xs"} c={"red"}>*</Text>
|
||||||
|
<Text fz={"xs"} c={"dimmed"} fw={"bold"}>Upload foto untuk konten surat keterangan</Text>
|
||||||
|
</Flex>
|
||||||
|
<Group>
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<ListSuratKeterangan />
|
||||||
|
</SimpleGrid>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default SuratKeterangan;
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Paper, Stack, Title } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
function ListTelunjukSaktiDesa() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>List Telunjuk Sakti Desa</Title>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ListTelunjukSaktiDesa;
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, SimpleGrid, Paper, Stack, Title, Group, Button, Text } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
import { DesaEditor } from '../../../_com/desaEditor';
|
||||||
|
import ListTelunjukSaktiDesa from './listPage';
|
||||||
|
|
||||||
|
function TelunjukSaktiDesa() {
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>Telunjuk Sakti Desa</Title>
|
||||||
|
<Box>
|
||||||
|
<Text fz={"sm"} fw={"bold"}>Deskripsi Telunjuk Sakti Desa</Text>
|
||||||
|
<DesaEditor showSubmit={false} />
|
||||||
|
</Box>
|
||||||
|
<Group>
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<ListTelunjukSaktiDesa />
|
||||||
|
</SimpleGrid>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default TelunjukSaktiDesa;
|
||||||
@@ -1,10 +1,33 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import Penghargaan from './ui/penghargaan/page';
|
||||||
|
import GambarPerhargaan from './ui/gambar_perhargaan/page';
|
||||||
|
|
||||||
function Page() {
|
function Page() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<Box py={10}>
|
||||||
Penghargaan
|
<Stack>
|
||||||
</div>
|
<Title order={3}>Penghargaan</Title>
|
||||||
|
<Tabs color={colors['blue-button']} variant='pills' defaultValue={"Penghargaan"}>
|
||||||
|
<TabsList p={"xs"} bg={"#BBC8E7FF"}>
|
||||||
|
<TabsTab value="Penghargaan">
|
||||||
|
Penghargaan
|
||||||
|
</TabsTab>
|
||||||
|
<TabsTab value="Gambar Penghargaan">
|
||||||
|
Gambar Penghargaan
|
||||||
|
</TabsTab>
|
||||||
|
</TabsList>
|
||||||
|
|
||||||
|
<TabsPanel value="Penghargaan">
|
||||||
|
<Penghargaan/>
|
||||||
|
</TabsPanel>
|
||||||
|
<TabsPanel value="Gambar Penghargaan">
|
||||||
|
<GambarPerhargaan/>
|
||||||
|
</TabsPanel>
|
||||||
|
</Tabs>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Paper, Stack, Title } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
function ListGambarPenghargaan() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>List Gambar Penghargaan</Title>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ListGambarPenghargaan;
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Paper, SimpleGrid, Stack, Title, Text, Group, Button, TextInput, Center } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
import { DesaEditor } from '../../../_com/desaEditor';
|
||||||
|
import ListGambarPenghargaan from './listPage';
|
||||||
|
import { IconUpload } from '@tabler/icons-react';
|
||||||
|
|
||||||
|
|
||||||
|
function GambarPerhargaan() {
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<Title order={3}>Tambah Gambar Penghargaan</Title>
|
||||||
|
<TextInput
|
||||||
|
label="Judul Gambar Penghargaan"
|
||||||
|
placeholder='masukkan judul gambar penghargaan'
|
||||||
|
/>
|
||||||
|
<Text fw={"bold"}>Deskripsi Gambar Penghargaan</Text>
|
||||||
|
<DesaEditor showSubmit={false} />
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"}>Upload Gambar Penghargaan</Text>
|
||||||
|
<Box bg={colors['BG-trans']} p={"md"}>
|
||||||
|
<Center>
|
||||||
|
<IconUpload size={52} color="var(--mantine-color-blue-6)" stroke={1.5} />
|
||||||
|
</Center>
|
||||||
|
</Box>
|
||||||
|
</Box>
|
||||||
|
<Group>
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<ListGambarPenghargaan />
|
||||||
|
</SimpleGrid>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default GambarPerhargaan;
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Paper, Stack, Title } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
function ListPenghargaan() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>List Penghargaan</Title>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ListPenghargaan;
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Button, Group, Paper, SimpleGrid, Stack, Text, Title } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
import { DesaEditor } from '../../../_com/desaEditor';
|
||||||
|
import ListPenghargaan from './listPage';
|
||||||
|
|
||||||
|
function Penghargaan() {
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<Stack>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<Title order={3}>Penghargaan</Title>
|
||||||
|
<Box>
|
||||||
|
<Text fz={"sm"} fw={"bold"}>Deskripsi Penghargaan</Text>
|
||||||
|
<DesaEditor
|
||||||
|
showSubmit={false}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Group>
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<ListPenghargaan/>
|
||||||
|
</SimpleGrid>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Penghargaan;
|
||||||
@@ -1,62 +1,75 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import { Group, Select, SimpleGrid, Skeleton, Stack, Text, TextInput } from '@mantine/core';
|
import { Box, Group, Paper, Select, SimpleGrid, Skeleton, Stack, Text, TextInput, Title } from '@mantine/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import stateDesaPengumuman from '../../_state/desa/pengumuman';
|
import stateDesaPengumuman from '../../_state/desa/pengumuman';
|
||||||
import { useShallowEffect } from '@mantine/hooks';
|
import { useShallowEffect } from '@mantine/hooks';
|
||||||
import { Prisma } from '@prisma/client';
|
import { Prisma } from '@prisma/client';
|
||||||
import { BeritaEditor } from '../berita/_com/BeritaEditor';
|
import { BeritaEditor } from '../berita/_com/BeritaEditor';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
|
||||||
function Page() {
|
function Page() {
|
||||||
return (
|
return (
|
||||||
<Stack>
|
<Box>
|
||||||
|
<Title order={3}>Pengumuman</Title>
|
||||||
<SimpleGrid cols={{
|
<SimpleGrid cols={{
|
||||||
base: 1, md: 2
|
base: 1, md: 2
|
||||||
}}>
|
}}>
|
||||||
<PengumumanList />
|
|
||||||
<PengumumanCreate />
|
<PengumumanCreate />
|
||||||
|
<PengumumanList />
|
||||||
</SimpleGrid>
|
</SimpleGrid>
|
||||||
</Stack>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function PengumumanCreate() {
|
||||||
|
const pengumumanState = useProxy(stateDesaPengumuman)
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<SelectCategory onChange={(val) => {
|
||||||
|
pengumumanState.pengumuman.create.form.categoryPengumumanId = val.id
|
||||||
|
}} />
|
||||||
|
<TextInput onChange={(val) => {
|
||||||
|
pengumumanState.pengumuman.create.form.judul = val.target.value
|
||||||
|
}} label={<Text fz={"sm"} fw={"bold"}>Judul</Text>} placeholder='masukkan judul' />
|
||||||
|
<TextInput onChange={(val) => {
|
||||||
|
pengumumanState.pengumuman.create.form.deskripsi = val.target.value
|
||||||
|
}} label={<Text fz={"sm"} fw={"bold"}>Deskripsi</Text>} placeholder='masukkan deskripsi' />
|
||||||
|
<BeritaEditor onSubmit={(val) => {
|
||||||
|
pengumumanState.pengumuman.create.form.content = val
|
||||||
|
pengumumanState.pengumuman.create.create()
|
||||||
|
}} />
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
function PengumumanList() {
|
function PengumumanList() {
|
||||||
const pengumumanState = useProxy(stateDesaPengumuman)
|
const pengumumanState = useProxy(stateDesaPengumuman)
|
||||||
useShallowEffect(() => {
|
useShallowEffect(() => {
|
||||||
pengumumanState.pengumuman.findMany.load()
|
pengumumanState.pengumuman.findMany.load()
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
if (!pengumumanState.pengumuman.findMany.data) return <Stack>
|
if (!pengumumanState.pengumuman.findMany.data) return <Stack py={10}>
|
||||||
{Array.from({ length: 10 }).map((v, k) => <Skeleton key={k} h={40} />)}
|
{Array.from({ length: 10 }).map((v, k) => <Skeleton key={k} h={40} />)}
|
||||||
</Stack>
|
</Stack>
|
||||||
return <Stack>
|
return (
|
||||||
<Text>Announcement List</Text>
|
<Box py={10}>
|
||||||
{pengumumanState.pengumuman.findMany.data?.map((item) => (
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<Text key={item.id}>{item.judul}</Text>
|
<Stack gap={"xs"}>
|
||||||
))}
|
<Text fz={"xl"} fw={"bold"}>List Pengumuman</Text>
|
||||||
</Stack>;
|
{pengumumanState.pengumuman.findMany.data?.map((item) => (
|
||||||
}
|
<Text key={item.id}>{item.judul}</Text>
|
||||||
|
))}
|
||||||
function PengumumanCreate() {
|
</Stack>
|
||||||
const pengumumanState = useProxy(stateDesaPengumuman)
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
)
|
||||||
return <Stack gap={"md"}>
|
|
||||||
<Text>Create Some Announcement</Text>
|
|
||||||
<SelectCategory onChange={(val) => {
|
|
||||||
pengumumanState.pengumuman.create.form.categoryPengumumanId = val.id
|
|
||||||
}} />
|
|
||||||
<TextInput onChange={(val) => {
|
|
||||||
pengumumanState.pengumuman.create.form.judul = val.target.value
|
|
||||||
}} label={"Judul"} placeholder='masukkan judul' />
|
|
||||||
<TextInput onChange={(val) => {
|
|
||||||
pengumumanState.pengumuman.create.form.deskripsi = val.target.value
|
|
||||||
}} label={"Deskripsi"} placeholder='masukkan deskripsi' />
|
|
||||||
<BeritaEditor onSubmit={(val) => {
|
|
||||||
pengumumanState.pengumuman.create.form.content = val
|
|
||||||
pengumumanState.pengumuman.create.create()
|
|
||||||
}} />
|
|
||||||
</Stack>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function SelectCategory({ onChange }: {
|
function SelectCategory({ onChange }: {
|
||||||
@@ -75,7 +88,7 @@ function SelectCategory({ onChange }: {
|
|||||||
if (!pengumumanState.category.findMany.data) return <Skeleton h={40} />
|
if (!pengumumanState.category.findMany.data) return <Skeleton h={40} />
|
||||||
return <Group>
|
return <Group>
|
||||||
{/* {JSON.stringify(pengumumanState.category.findMany.data)} */}
|
{/* {JSON.stringify(pengumumanState.category.findMany.data)} */}
|
||||||
<Select placeholder='pilih kategori' label={"select katagori"} data={pengumumanState.category.findMany.data.map((item) => ({
|
<Select placeholder='pilih kategori' label={<Text fz={"sm"} fw={"bold"}>Pilih Kategori</Text>} data={pengumumanState.category.findMany.data.map((item) => ({
|
||||||
value: item.id,
|
value: item.id,
|
||||||
label: item.name
|
label: item.name
|
||||||
}))} onChange={(v) => {
|
}))} onChange={(v) => {
|
||||||
|
|||||||
17
src/app/admin/(dashboard)/desa/potensi/listPage.tsx
Normal file
17
src/app/admin/(dashboard)/desa/potensi/listPage.tsx
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Paper, Stack, Title } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
function ListPotensi() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>List Potensi Desa</Title>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ListPotensi;
|
||||||
@@ -1,11 +1,40 @@
|
|||||||
import React from 'react';
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Button, Group, Paper, SimpleGrid, Stack, TextInput, Title } from '@mantine/core';
|
||||||
|
import ListPotensi from './listPage';
|
||||||
|
|
||||||
function Page() {
|
function Potensi() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<Box py={10}>
|
||||||
Potensi
|
<Stack gap={"xs"}>
|
||||||
</div>
|
<Title order={3}>Potensi Desa</Title>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<TextInput
|
||||||
|
label="Nama Potensi"
|
||||||
|
placeholder='masukkan nama potensi'
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
label="Kategori Potensi"
|
||||||
|
placeholder='masukkan kategori potensi'
|
||||||
|
/>
|
||||||
|
<Group>
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<ListPotensi />
|
||||||
|
</SimpleGrid>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Page;
|
export default Potensi;
|
||||||
|
|||||||
@@ -1,10 +1,52 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Stack, Title, Tabs, TabsList, TabsTab, TabsPanel } from '@mantine/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import SejarahDesa from './ui/sejarah_desa/page';
|
||||||
|
import VisiMisiDesa from './ui/visi_misi_desa/page';
|
||||||
|
import LambangDesa from './ui/lambang_desa/page';
|
||||||
|
import MaskotDesa from './ui/maskot_desa/page';
|
||||||
|
import ProfilePerbekel from './ui/profile_perbekel/page';
|
||||||
|
|
||||||
function Page() {
|
function Page() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<Stack >
|
||||||
Profile
|
<Title order={3}>Profile Desa</Title>
|
||||||
</div>
|
<Tabs color={colors['blue-button']} variant='pills' defaultValue={"Sejarah Desa"}>
|
||||||
|
<TabsList p={"xs"} bg={"#BBC8E7FF"}>
|
||||||
|
<TabsTab value="Sejarah Desa">
|
||||||
|
Sejarah Desa
|
||||||
|
</TabsTab>
|
||||||
|
<TabsTab value="Visi Misi Desa">
|
||||||
|
Visi Misi Desa
|
||||||
|
</TabsTab>
|
||||||
|
<TabsTab value="Lambang Desa">
|
||||||
|
Lambang Desa
|
||||||
|
</TabsTab>
|
||||||
|
<TabsTab value="Maskot Desa">
|
||||||
|
Maskot Desa
|
||||||
|
</TabsTab>
|
||||||
|
<TabsTab value="Profile Perbekel">
|
||||||
|
Profile Perbekel
|
||||||
|
</TabsTab>
|
||||||
|
</TabsList>
|
||||||
|
|
||||||
|
<TabsPanel value="Sejarah Desa">
|
||||||
|
<SejarahDesa/>
|
||||||
|
</TabsPanel>
|
||||||
|
<TabsPanel value="Visi Misi Desa">
|
||||||
|
<VisiMisiDesa/>
|
||||||
|
</TabsPanel>
|
||||||
|
<TabsPanel value="Lambang Desa">
|
||||||
|
<LambangDesa/>
|
||||||
|
</TabsPanel>
|
||||||
|
<TabsPanel value="Maskot Desa">
|
||||||
|
<MaskotDesa/>
|
||||||
|
</TabsPanel>
|
||||||
|
<TabsPanel value="Profile Perbekel">
|
||||||
|
<ProfilePerbekel/>
|
||||||
|
</TabsPanel>
|
||||||
|
</Tabs>
|
||||||
|
</Stack>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, SimpleGrid, Paper, Stack, Title, Group, Button, Text } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
import { DesaEditor } from '../../../_com/desaEditor';
|
||||||
|
|
||||||
|
function LambangDesa() {
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>Lambang Desa</Title>
|
||||||
|
<Text fw={"bold"}>Deskripsi Lambang Desa</Text>
|
||||||
|
<DesaEditor showSubmit={false} />
|
||||||
|
<Group>
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>List Lambang Desa</Title>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
</SimpleGrid>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default LambangDesa;
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, SimpleGrid, Paper, Stack, Title, Group, Button, Text } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
import { DesaEditor } from '../../../_com/desaEditor';
|
||||||
|
|
||||||
|
function MaskotDesa() {
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>Maskot Desa</Title>
|
||||||
|
<Text fw={"bold"}>Deskripsi Maskot Desa</Text>
|
||||||
|
<DesaEditor showSubmit={false} />
|
||||||
|
<Group>
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>List Maskot Desa</Title>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
</SimpleGrid>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default MaskotDesa;
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, SimpleGrid, Paper, Stack, Title, Group, Button, TextInput, Text } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
import { DesaEditor } from '../../../_com/desaEditor';
|
||||||
|
|
||||||
|
function ProfilePerbekel() {
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>Profil Perbekel</Title>
|
||||||
|
<TextInput
|
||||||
|
label="Nama Perbekel"
|
||||||
|
placeholder="masukkan nama perbekel"
|
||||||
|
/>
|
||||||
|
<Text fz={"sm"} fw={"bold"}>Biodata</Text>
|
||||||
|
<DesaEditor showSubmit={false} />
|
||||||
|
<Text fz={"sm"} fw={"bold"}>Pengalaman</Text>
|
||||||
|
<DesaEditor showSubmit={false} />
|
||||||
|
<Text fz={"sm"} fw={"bold"}>Pengalaman Organisasi</Text>
|
||||||
|
<DesaEditor showSubmit={false} />
|
||||||
|
<Text fz={"sm"} fw={"bold"}>Program Unggulan</Text>
|
||||||
|
<DesaEditor showSubmit={false} />
|
||||||
|
<Group>
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>List Profil Perbekel</Title>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
</SimpleGrid>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ProfilePerbekel;
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Paper, Stack, Title } from '@mantine/core';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
function ListPage() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>List Sejarah Desa</Title>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ListPage;
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
'use client'
|
||||||
|
import stateProfileDesa from '@/app/admin/(dashboard)/_state/desa/profile';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Button, Group, Paper, SimpleGrid, Stack, Text, Title } from '@mantine/core';
|
||||||
|
import { useProxy } from 'valtio/utils';
|
||||||
|
import DesaEditorText from '../../../_com/desaEditorText';
|
||||||
|
import ListPage from './listPage';
|
||||||
|
import { useShallowEffect } from '@mantine/hooks';
|
||||||
|
|
||||||
|
|
||||||
|
function SejarahDesa() {
|
||||||
|
const stateSejarah = useProxy(stateProfileDesa.Sejarah)
|
||||||
|
|
||||||
|
useShallowEffect(() => {
|
||||||
|
if (!stateSejarah.findById.data) {
|
||||||
|
stateSejarah.findById.initialize()
|
||||||
|
}
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
const submit = () => {
|
||||||
|
if (stateSejarah.findById.data?.id && stateSejarah.findById.data.sejarah) {
|
||||||
|
stateSejarah.update.save({
|
||||||
|
id: stateSejarah.findById.data.id,
|
||||||
|
sejarah: stateSejarah.findById.data.sejarah
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>Sejarah Desa</Title>
|
||||||
|
<Text fw={"bold"}>Deskripsi Sejarah Desa</Text>
|
||||||
|
<DesaEditorText
|
||||||
|
key={stateSejarah.findById.data?.id ?? 'new'}
|
||||||
|
showSubmit={false}
|
||||||
|
onChange={(val) => {
|
||||||
|
if (stateSejarah.findById.data) {
|
||||||
|
stateSejarah.findById.data.sejarah = val
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
initialContent={stateSejarah.findById.data?.sejarah ?? ""}
|
||||||
|
/>
|
||||||
|
<Group>
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
onClick={submit}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<ListPage />
|
||||||
|
</SimpleGrid>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default SejarahDesa;
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Button, Group, Paper, SimpleGrid, Stack, Text, Title } from '@mantine/core';
|
||||||
|
import { DesaEditor } from '../../../_com/desaEditor';
|
||||||
|
|
||||||
|
function VisiMisiDesa() {
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>Visi Desa</Title>
|
||||||
|
<Text fw={"bold"}>Deskripsi Visi Desa</Text>
|
||||||
|
<DesaEditor showSubmit={false} />
|
||||||
|
<Group>
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>List Visi Desa</Title>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
</SimpleGrid>
|
||||||
|
<SimpleGrid py={30} cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>Misi Desa</Title>
|
||||||
|
<Text fw={"bold"}>Deskripsi Misi Desa</Text>
|
||||||
|
<DesaEditor showSubmit={false}/>
|
||||||
|
<Group>
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Title order={3}>List Misi Desa</Title>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
</SimpleGrid>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default VisiMisiDesa;
|
||||||
93
src/app/admin/(dashboard)/keamanan/_com/keamananEditor.tsx
Normal file
93
src/app/admin/(dashboard)/keamanan/_com/keamananEditor.tsx
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
'use client'
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Button, Stack } from '@mantine/core';
|
||||||
|
import { Link, RichTextEditor } from '@mantine/tiptap';
|
||||||
|
import Highlight from '@tiptap/extension-highlight';
|
||||||
|
import SubScript from '@tiptap/extension-subscript';
|
||||||
|
import Superscript from '@tiptap/extension-superscript';
|
||||||
|
import TextAlign from '@tiptap/extension-text-align';
|
||||||
|
import Underline from '@tiptap/extension-underline';
|
||||||
|
import { useEditor } from '@tiptap/react';
|
||||||
|
import StarterKit from '@tiptap/starter-kit';
|
||||||
|
|
||||||
|
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><sup /></sup> and <sub><sub /></sub> tags)</li><li>Ordered and bullet lists</li><li>Text align </li><li>And all <a href="https://tiptap.dev/extensions" target="_blank" rel="noopener noreferrer">other extensions</a></li></ul>';
|
||||||
|
|
||||||
|
export function KeamananEditor({showSubmit = true} : {
|
||||||
|
showSubmit: boolean
|
||||||
|
}) {
|
||||||
|
const editor = useEditor({
|
||||||
|
extensions: [
|
||||||
|
StarterKit,
|
||||||
|
Underline,
|
||||||
|
Link,
|
||||||
|
Superscript,
|
||||||
|
SubScript,
|
||||||
|
Highlight,
|
||||||
|
TextAlign.configure({ types: ['heading', 'paragraph'] }),
|
||||||
|
],
|
||||||
|
immediatelyRender: false,
|
||||||
|
content,
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Stack>
|
||||||
|
<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>
|
||||||
|
{showSubmit && (
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
</Stack>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
'use client'
|
||||||
|
import { Button, Stack } from '@mantine/core';
|
||||||
|
import { Link, RichTextEditor } from '@mantine/tiptap';
|
||||||
|
import Highlight from '@tiptap/extension-highlight';
|
||||||
|
import SubScript from '@tiptap/extension-subscript';
|
||||||
|
import Superscript from '@tiptap/extension-superscript';
|
||||||
|
import TextAlign from '@tiptap/extension-text-align';
|
||||||
|
import Underline from '@tiptap/extension-underline';
|
||||||
|
import { useEditor } from '@tiptap/react';
|
||||||
|
import StarterKit from '@tiptap/starter-kit';
|
||||||
|
|
||||||
|
|
||||||
|
function KeamananEditorText({ onSubmit, onChange, showSubmit = true, initialContent = '', }: {
|
||||||
|
onSubmit?: (val: string) => void,
|
||||||
|
onChange: (val: string) => void,
|
||||||
|
showSubmit?: boolean,
|
||||||
|
initialContent?: string }) {
|
||||||
|
const editor = useEditor({
|
||||||
|
extensions: [
|
||||||
|
StarterKit,
|
||||||
|
Underline,
|
||||||
|
Link,
|
||||||
|
Superscript,
|
||||||
|
SubScript,
|
||||||
|
Highlight,
|
||||||
|
TextAlign.configure({ types: ['heading', 'paragraph'] }),
|
||||||
|
],
|
||||||
|
immediatelyRender: false,
|
||||||
|
content: initialContent,
|
||||||
|
onUpdate : ({editor}) => {
|
||||||
|
onChange(editor.getHTML())
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Stack>
|
||||||
|
<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>
|
||||||
|
{showSubmit && (
|
||||||
|
<Button onClick={() => {
|
||||||
|
if (!editor) return
|
||||||
|
onSubmit?.(editor?.getHTML())
|
||||||
|
}}>Submit</Button>
|
||||||
|
)}
|
||||||
|
</Stack>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default KeamananEditorText;
|
||||||
@@ -1,10 +1,35 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import CreateKeamananLingkungan from './ui/tambah_keamanan_lingkungan/page';
|
||||||
|
import ListKeamananLingkungan from './ui/list_keamanan_lingkungan/page';
|
||||||
|
|
||||||
|
|
||||||
function Page() {
|
function Page() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<Box>
|
||||||
keamanan-lingkungan-pecalang-patwal
|
<Stack gap={'xs'}>
|
||||||
</div>
|
<Title order={3}>Keamanan Lingkungan </Title>
|
||||||
|
<Tabs defaultValue="create" color={colors['blue-button']} variant='pills'>
|
||||||
|
<TabsList mb={10} bg={colors['BG-trans']} p={'xs'}>
|
||||||
|
<TabsTab value="create" >
|
||||||
|
Tambah Keamanan Lingkungan
|
||||||
|
</TabsTab>
|
||||||
|
<TabsTab value="list" >
|
||||||
|
List Keamanan Lingkungan
|
||||||
|
</TabsTab>
|
||||||
|
</TabsList>
|
||||||
|
|
||||||
|
<TabsPanel value="create">
|
||||||
|
<CreateKeamananLingkungan/>
|
||||||
|
</TabsPanel>
|
||||||
|
|
||||||
|
<TabsPanel value="list">
|
||||||
|
<ListKeamananLingkungan/>
|
||||||
|
</TabsPanel>
|
||||||
|
</Tabs>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
import { Box, Paper, Stack, Table, TableTbody, TableTh, TableThead, TableTr, Title } from '@mantine/core';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
function ListKeamananLingkungan() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'} radius={10}>
|
||||||
|
<Stack gap={'xs'}>
|
||||||
|
<Title order={3}>List Keamanan Lingkungan</Title>
|
||||||
|
<Box>
|
||||||
|
<Table striped withTableBorder withColumnBorders withRowBorders>
|
||||||
|
<TableThead>
|
||||||
|
<TableTr>
|
||||||
|
<TableTh>Image</TableTh>
|
||||||
|
<TableTh>Nama Keamanan Lingkungan</TableTh>
|
||||||
|
<TableTh>Deskripsi Keamanan Lingkungan</TableTh>
|
||||||
|
<TableTh>Aksi</TableTh>
|
||||||
|
<TableTh>Detail</TableTh>
|
||||||
|
</TableTr>
|
||||||
|
</TableThead>
|
||||||
|
<TableTbody>
|
||||||
|
|
||||||
|
</TableTbody>
|
||||||
|
</Table>
|
||||||
|
</Box>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ListKeamananLingkungan;
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Button, Group, Paper, SimpleGrid, Stack, Text, TextInput, Title } from '@mantine/core';
|
||||||
|
import { IconImageInPicture } from '@tabler/icons-react';
|
||||||
|
import React from 'react';
|
||||||
|
import { KeamananEditor } from '../../../_com/keamananEditor';
|
||||||
|
|
||||||
|
|
||||||
|
function KeamananLingkungan() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Stack gap={'xs'}>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<Title order={4}>Tambah Keamanan Lingkungan</Title>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"sm"}>Masukkan Image</Text>
|
||||||
|
<IconImageInPicture size={50} />
|
||||||
|
</Box>
|
||||||
|
<TextInput
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Nama Keamanan Lingkungan</Text>}
|
||||||
|
placeholder='Masukkan nama keamanan lingkungan'
|
||||||
|
/>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"sm"}>Deskripsi Keamanan Lingkungan</Text>
|
||||||
|
<KeamananEditor
|
||||||
|
showSubmit={false}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Group>
|
||||||
|
<Button bg={colors['blue-button']}>Submit</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
</SimpleGrid>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default KeamananLingkungan;
|
||||||
@@ -1,10 +1,35 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import CreatePolsekTerdekat from './ui/tambah_polsek_terdekat/page';
|
||||||
|
import ListPolsekTerdekat from './ui/list_polsek_terdekat/page';
|
||||||
|
|
||||||
|
|
||||||
function Page() {
|
function Page() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<Box>
|
||||||
polsek-terdekat
|
<Stack gap={'xs'}>
|
||||||
</div>
|
<Title order={3}>Polsek Terdekat</Title>
|
||||||
|
<Tabs defaultValue="create" color={colors['blue-button']} variant='pills'>
|
||||||
|
<TabsList mb={10} bg={colors['BG-trans']} p={'xs'}>
|
||||||
|
<TabsTab value="create" >
|
||||||
|
Tambah Polsek Terdekat
|
||||||
|
</TabsTab>
|
||||||
|
<TabsTab value="list" >
|
||||||
|
List Polsek Terdekat
|
||||||
|
</TabsTab>
|
||||||
|
</TabsList>
|
||||||
|
|
||||||
|
<TabsPanel value="create">
|
||||||
|
<CreatePolsekTerdekat/>
|
||||||
|
</TabsPanel>
|
||||||
|
|
||||||
|
<TabsPanel value="list">
|
||||||
|
<ListPolsekTerdekat/>
|
||||||
|
</TabsPanel>
|
||||||
|
</Tabs>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
import { Box, Paper, Stack, Table, TableTbody, TableTh, TableThead, TableTr, Title } from '@mantine/core';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
function ListPolsekTerdekat() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'} radius={10}>
|
||||||
|
<Stack gap={'xs'}>
|
||||||
|
<Title order={3}>List Polsek Terdekat</Title>
|
||||||
|
<Box>
|
||||||
|
<Table striped withTableBorder withColumnBorders withRowBorders>
|
||||||
|
<TableThead>
|
||||||
|
<TableTr>
|
||||||
|
<TableTh>Nama Polsek Terdekat</TableTh>
|
||||||
|
<TableTh>Jarak Polsek Terdekat</TableTh>
|
||||||
|
<TableTh>Alamat Polsek Terdekat</TableTh>
|
||||||
|
<TableTh>Nomor Telepon Polsek Terdekat</TableTh>
|
||||||
|
<TableTh>Jam Aktif</TableTh>
|
||||||
|
<TableTh>Deskripsi Polsek Terdekat</TableTh>
|
||||||
|
<TableTh>Aksi</TableTh>
|
||||||
|
<TableTh>Detail</TableTh>
|
||||||
|
</TableTr>
|
||||||
|
</TableThead>
|
||||||
|
<TableTbody>
|
||||||
|
|
||||||
|
</TableTbody>
|
||||||
|
</Table>
|
||||||
|
</Box>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ListPolsekTerdekat;
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Button, Group, Paper, SimpleGrid, Stack, Text, TextInput, Title } from '@mantine/core';
|
||||||
|
import { KeamananEditor } from '../../../_com/keamananEditor';
|
||||||
|
|
||||||
|
|
||||||
|
function CreatePolsekTerdekat() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Stack gap={'xs'}>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<Title order={4}>Tambah Polsek Terdekat</Title>
|
||||||
|
<TextInput
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Nama Polsek Terdekat</Text>}
|
||||||
|
placeholder='Masukkan nama polsek terdekat'
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Jarak Polsek Terdekat</Text>}
|
||||||
|
placeholder='Masukkan jarak polsek terdekat'
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Alamat Polsek Terdekat</Text>}
|
||||||
|
placeholder='Masukkan alamat polsek terdekat'
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Nomor Telepon Polsek Terdekat</Text>}
|
||||||
|
placeholder='Masukkan nomor telepon polsek terdekat'
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Jam Aktif</Text>}
|
||||||
|
placeholder='Masukkan jam aktif polsek terdekat'
|
||||||
|
/>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"sm"}>Deskripsi Polsek Terdekat</Text>
|
||||||
|
<KeamananEditor
|
||||||
|
showSubmit={false}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Group>
|
||||||
|
<Button bg={colors['blue-button']}>Submit</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
</SimpleGrid>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default CreatePolsekTerdekat;
|
||||||
93
src/app/admin/(dashboard)/kesehatan/_com/kesehatanEditor.tsx
Normal file
93
src/app/admin/(dashboard)/kesehatan/_com/kesehatanEditor.tsx
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
'use client'
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Button, Stack } from '@mantine/core';
|
||||||
|
import { Link, RichTextEditor } from '@mantine/tiptap';
|
||||||
|
import Highlight from '@tiptap/extension-highlight';
|
||||||
|
import SubScript from '@tiptap/extension-subscript';
|
||||||
|
import Superscript from '@tiptap/extension-superscript';
|
||||||
|
import TextAlign from '@tiptap/extension-text-align';
|
||||||
|
import Underline from '@tiptap/extension-underline';
|
||||||
|
import { useEditor } from '@tiptap/react';
|
||||||
|
import StarterKit from '@tiptap/starter-kit';
|
||||||
|
|
||||||
|
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><sup /></sup> and <sub><sub /></sub> tags)</li><li>Ordered and bullet lists</li><li>Text align </li><li>And all <a href="https://tiptap.dev/extensions" target="_blank" rel="noopener noreferrer">other extensions</a></li></ul>';
|
||||||
|
|
||||||
|
export function KesehatanEditor({showSubmit = true} : {
|
||||||
|
showSubmit: boolean
|
||||||
|
}) {
|
||||||
|
const editor = useEditor({
|
||||||
|
extensions: [
|
||||||
|
StarterKit,
|
||||||
|
Underline,
|
||||||
|
Link,
|
||||||
|
Superscript,
|
||||||
|
SubScript,
|
||||||
|
Highlight,
|
||||||
|
TextAlign.configure({ types: ['heading', 'paragraph'] }),
|
||||||
|
],
|
||||||
|
immediatelyRender: false,
|
||||||
|
content,
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Stack>
|
||||||
|
<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>
|
||||||
|
{showSubmit && (
|
||||||
|
<Button
|
||||||
|
mt={10}
|
||||||
|
bg={colors['blue-button']}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
</Stack>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
'use client'
|
||||||
|
import { Button, Stack } from '@mantine/core';
|
||||||
|
import { Link, RichTextEditor } from '@mantine/tiptap';
|
||||||
|
import Highlight from '@tiptap/extension-highlight';
|
||||||
|
import SubScript from '@tiptap/extension-subscript';
|
||||||
|
import Superscript from '@tiptap/extension-superscript';
|
||||||
|
import TextAlign from '@tiptap/extension-text-align';
|
||||||
|
import Underline from '@tiptap/extension-underline';
|
||||||
|
import { useEditor } from '@tiptap/react';
|
||||||
|
import StarterKit from '@tiptap/starter-kit';
|
||||||
|
|
||||||
|
|
||||||
|
function KesehatanEditorText({ onSubmit, onChange, showSubmit = true, initialContent = '', }: {
|
||||||
|
onSubmit?: (val: string) => void,
|
||||||
|
onChange: (val: string) => void,
|
||||||
|
showSubmit?: boolean,
|
||||||
|
initialContent?: string }) {
|
||||||
|
const editor = useEditor({
|
||||||
|
extensions: [
|
||||||
|
StarterKit,
|
||||||
|
Underline,
|
||||||
|
Link,
|
||||||
|
Superscript,
|
||||||
|
SubScript,
|
||||||
|
Highlight,
|
||||||
|
TextAlign.configure({ types: ['heading', 'paragraph'] }),
|
||||||
|
],
|
||||||
|
immediatelyRender: false,
|
||||||
|
content: initialContent,
|
||||||
|
onUpdate : ({editor}) => {
|
||||||
|
onChange(editor.getHTML())
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Stack>
|
||||||
|
<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>
|
||||||
|
{showSubmit && (
|
||||||
|
<Button onClick={() => {
|
||||||
|
if (!editor) return
|
||||||
|
onSubmit?.(editor?.getHTML())
|
||||||
|
}}>Submit</Button>
|
||||||
|
)}
|
||||||
|
</Stack>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default KesehatanEditorText;
|
||||||
@@ -1,21 +1,24 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import { Box, Text } from '@mantine/core';
|
import { Box, Paper, Text } from '@mantine/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan';
|
import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
|
||||||
function DoctorSignUI() {
|
function DoctorSignUI() {
|
||||||
const doctorSign = useProxy(stateArtikelKesehatan.doctorSign)
|
const doctorSign = useProxy(stateArtikelKesehatan.doctorSign)
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<Text fw={"bold"}>Kapan Harus ke Dokter</Text>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<KesehatanEditor
|
<Text fw={"bold"}>Kapan Harus ke Dokter</Text>
|
||||||
showSubmit={false}
|
<KesehatanEditor
|
||||||
onChange={(val) => {
|
showSubmit={false}
|
||||||
doctorSign.create.form.content = val
|
onChange={(val) => {
|
||||||
}}
|
doctorSign.create.form.content = val
|
||||||
/>
|
}}
|
||||||
|
/>
|
||||||
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +1,32 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import { Box, Text, TextInput } from '@mantine/core';
|
import { Box, Paper, Stack, Text, TextInput } from '@mantine/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan';
|
import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan';
|
||||||
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
|
||||||
function FirstAidUI() {
|
function FirstAidUI() {
|
||||||
const firstAidState = useProxy(stateArtikelKesehatan.firstAid)
|
const firstAidState = useProxy(stateArtikelKesehatan.firstAid)
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<TextInput
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
label={<Text fw={"bold"}>Title Pertolongan Pertama</Text>}
|
<Stack gap={"xs"}>
|
||||||
placeholder="Masukkan title"
|
<TextInput
|
||||||
onChange={(val) => {
|
label={<Text fw={"bold"}>Judul Pertolongan Pertama</Text>}
|
||||||
firstAidState.create.form.title = val.target.value
|
placeholder="Masukkan judul"
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
firstAidState.create.form.title = val.target.value
|
||||||
<KesehatanEditor
|
}}
|
||||||
showSubmit={false}
|
/>
|
||||||
onChange={(val) => {
|
<KesehatanEditor
|
||||||
firstAidState.create.form.content = val
|
showSubmit={false}
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
firstAidState.create.form.content = val
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,26 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import { Box, Text } from '@mantine/core';
|
import { Box, Paper, Stack, Text } from '@mantine/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
||||||
import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan';
|
import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
|
||||||
function IntoductionUI() {
|
function IntoductionUI() {
|
||||||
const introduction = useProxy(stateArtikelKesehatan.introduction)
|
const introduction = useProxy(stateArtikelKesehatan.introduction)
|
||||||
return (
|
return (
|
||||||
<Box py={10}>
|
<Box>
|
||||||
<Text fw={"bold"}>Pendahuluan</Text>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<KesehatanEditor
|
<Stack gap={"xs"}>
|
||||||
showSubmit={false}
|
<Text fw={"bold"}>Pendahuluan</Text>
|
||||||
onChange={(val) => {
|
<KesehatanEditor
|
||||||
introduction.create.form.content = val;
|
showSubmit={false}
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
introduction.create.form.content = val;
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,33 +1,38 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan';
|
import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan';
|
||||||
import { Box, Text, TextInput } from '@mantine/core';
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Paper, Stack, Text, TextInput } from '@mantine/core';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
|
|
||||||
function MythFactUI() {
|
function MythFactUI() {
|
||||||
const mythFact = useProxy(stateArtikelKesehatan.mythFact)
|
const mythFact = useProxy(stateArtikelKesehatan.mythFact)
|
||||||
return (
|
return (
|
||||||
<Box py={10}>
|
<Box>
|
||||||
<TextInput
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
label={<Text fw={"bold"}>Title Pertolongan Pertama Penyakit</Text>}
|
<Stack gap={"xs"}>
|
||||||
placeholder="Masukkan title"
|
<TextInput
|
||||||
onChange={(val) => {
|
label={<Text fw={"bold"}>Judul Pertolongan Pertama Penyakit</Text>}
|
||||||
mythFact.create.form.title = val.target.value
|
placeholder="Masukkan judul"
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
mythFact.create.form.title = val.target.value
|
||||||
<TextInput
|
}}
|
||||||
label={<Text fw={"bold"}>Mitos</Text>}
|
/>
|
||||||
placeholder="Masukkan mitos"
|
<TextInput
|
||||||
onChange={(val) => {
|
label={<Text fw={"bold"}>Mitos</Text>}
|
||||||
mythFact.create.form.mitos = val.target.value
|
placeholder="Masukkan mitos"
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
mythFact.create.form.mitos = val.target.value
|
||||||
<TextInput
|
}}
|
||||||
label={<Text fw={"bold"}>Fakta</Text>}
|
/>
|
||||||
placeholder="Masukkan fakta"
|
<TextInput
|
||||||
onChange={(val) => {
|
label={<Text fw={"bold"}>Fakta</Text>}
|
||||||
mythFact.create.form.fakta = val.target.value
|
placeholder="Masukkan fakta"
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
mythFact.create.form.fakta = val.target.value
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import { Box, Button, Center, SimpleGrid, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core';
|
import { Box, Button, Center, Group, Paper, SimpleGrid, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core';
|
||||||
import IntoductionUI from './introduction/page';
|
import IntoductionUI from './introduction/page';
|
||||||
import SymptomUI from './symptom/page';
|
import SymptomUI from './symptom/page';
|
||||||
import PreventionUI from './prevention/page';
|
import PreventionUI from './prevention/page';
|
||||||
@@ -39,19 +39,25 @@ function ArtikelKesehatan() {
|
|||||||
base: 1, md: 2
|
base: 1, md: 2
|
||||||
}}>
|
}}>
|
||||||
<Box >
|
<Box >
|
||||||
<Title order={3}>Artikel Kesehatan</Title>
|
<Stack gap={"xs"}>
|
||||||
<IntoductionUI />
|
<Title order={4}>Artikel Kesehatan</Title>
|
||||||
<SymptomUI />
|
<IntoductionUI />
|
||||||
<PreventionUI />
|
<SymptomUI />
|
||||||
<FirstAidUI />
|
<PreventionUI />
|
||||||
<MythFactUI />
|
<FirstAidUI />
|
||||||
<DoctorSignUI />
|
<MythFactUI />
|
||||||
<Button mt={10} onClick={submitAllForms}>Submit</Button>
|
<DoctorSignUI />
|
||||||
|
<Group>
|
||||||
|
<Button bg={colors['blue-button']} mt={10} onClick={submitAllForms}>Submit</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
<Box>
|
<Box>
|
||||||
<Title order={3}>List Artikel Kesehatan</Title>
|
<Stack gap={"xs"}>
|
||||||
<AllList />
|
<Title order={4}>Data Artikel Kesehatan</Title>
|
||||||
|
<AllList />
|
||||||
|
</Stack>
|
||||||
</Box>
|
</Box>
|
||||||
</SimpleGrid>
|
</SimpleGrid>
|
||||||
</Stack>
|
</Stack>
|
||||||
@@ -78,71 +84,88 @@ function AllList() {
|
|||||||
) return <Stack>
|
) return <Stack>
|
||||||
{Array.from({ length: 10 }).map((v, k) => <Skeleton key={k} h={40} />)}
|
{Array.from({ length: 10 }).map((v, k) => <Skeleton key={k} h={40} />)}
|
||||||
</Stack>
|
</Stack>
|
||||||
return <Stack>
|
return <Stack gap={"xs"}>
|
||||||
<Title order={4}>Intoduction</Title>
|
{/* Introduction */}
|
||||||
{listState.introduction.findMany.data?.map((item) => (
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<Box key={item.id}>
|
<Title order={4}>Pendahuluan</Title>
|
||||||
<Text dangerouslySetInnerHTML={{ __html: item.content }}></Text>
|
{listState.introduction.findMany.data?.map((item) => (
|
||||||
</Box>
|
<Box key={item.id}>
|
||||||
))}
|
<Text dangerouslySetInnerHTML={{ __html: item.content }}></Text>
|
||||||
|
</Box>
|
||||||
|
))}
|
||||||
|
</Paper>
|
||||||
{/* Symptom */}
|
{/* Symptom */}
|
||||||
{listState.symptom.findMany.data?.map((item) => (
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<Box key={item.id}>
|
<Title order={4}>Gejala Penyakit</Title>
|
||||||
<Title order={4}>{item.title}</Title>
|
{listState.symptom.findMany.data?.map((item) => (
|
||||||
<Text dangerouslySetInnerHTML={{ __html: item.content }}></Text>
|
<Box key={item.id}>
|
||||||
</Box>
|
<Title order={4}>{item.title}</Title>
|
||||||
))}
|
<Text dangerouslySetInnerHTML={{ __html: item.content }}></Text>
|
||||||
|
</Box>
|
||||||
|
))}
|
||||||
|
</Paper>
|
||||||
{/* Prevention */}
|
{/* Prevention */}
|
||||||
{listState.prevention.findMany.data?.map((item) => (
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<Box key={item.id}>
|
<Title order={4}>Pencegahan Penyakit</Title>
|
||||||
<Title order={4}>{item.title}</Title>
|
{listState.prevention.findMany.data?.map((item) => (
|
||||||
<Text dangerouslySetInnerHTML={{ __html: item.content }}></Text>
|
<Box key={item.id}>
|
||||||
</Box>
|
<Title order={4}>{item.title}</Title>
|
||||||
))}
|
<Text dangerouslySetInnerHTML={{ __html: item.content }}></Text>
|
||||||
|
</Box>
|
||||||
|
))}
|
||||||
|
</Paper>
|
||||||
{/* First Aid */}
|
{/* First Aid */}
|
||||||
{listState.firstAid.findMany.data?.map((item) => (
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<Box key={item.id}>
|
<Title order={4}>Pertolongan Pertama</Title>
|
||||||
<Title order={4}>{item.title}</Title>
|
{listState.firstAid.findMany.data?.map((item) => (
|
||||||
<Text dangerouslySetInnerHTML={{ __html: item.content }}></Text>
|
<Box key={item.id}>
|
||||||
</Box>
|
<Title order={4}>{item.title}</Title>
|
||||||
))}
|
<Text dangerouslySetInnerHTML={{ __html: item.content }}></Text>
|
||||||
|
</Box>
|
||||||
|
))}
|
||||||
|
</Paper>
|
||||||
{/* Myth Fact */}
|
{/* Myth Fact */}
|
||||||
{listState.mythFact.findMany.data?.map((item) => (
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<Box key={item.id}>
|
<Title order={4}>Mitos vs Fakta</Title>
|
||||||
<Title order={4}>{item.title}</Title>
|
{listState.mythFact.findMany.data?.map((item) => (
|
||||||
<Table
|
<Box key={item.id}>
|
||||||
striped
|
<Title order={4}>{item.title}</Title>
|
||||||
highlightOnHover
|
<Table
|
||||||
withTableBorder
|
striped
|
||||||
withColumnBorders
|
highlightOnHover
|
||||||
bg={colors['white-1']}
|
withTableBorder
|
||||||
>
|
withColumnBorders
|
||||||
<TableThead >
|
bg={colors['white-1']}
|
||||||
<TableTr >
|
>
|
||||||
<TableTh >
|
<TableThead >
|
||||||
<Center>Mitos</Center>
|
<TableTr >
|
||||||
</TableTh>
|
<TableTh >
|
||||||
<TableTh >
|
<Center>Mitos</Center>
|
||||||
<Center>Fakta</Center>
|
</TableTh>
|
||||||
</TableTh>
|
<TableTh >
|
||||||
</TableTr>
|
<Center>Fakta</Center>
|
||||||
</TableThead>
|
</TableTh>
|
||||||
<TableTbody >
|
</TableTr>
|
||||||
<TableTr>
|
</TableThead>
|
||||||
<TableTd ta="center">{item.mitos}</TableTd>
|
<TableTbody >
|
||||||
<TableTd ta="center">{item.fakta}</TableTd>
|
<TableTr>
|
||||||
</TableTr>
|
<TableTd ta="center">{item.mitos}</TableTd>
|
||||||
</TableTbody>
|
<TableTd ta="center">{item.fakta}</TableTd>
|
||||||
</Table>
|
</TableTr>
|
||||||
</Box>
|
</TableTbody>
|
||||||
))}
|
</Table>
|
||||||
|
</Box>
|
||||||
|
))}
|
||||||
|
</Paper>
|
||||||
{/* Doctor Sign */}
|
{/* Doctor Sign */}
|
||||||
<Title order={4}>Kapan Harus Ke Dokter?</Title>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
{listState.doctorSign.findMany.data?.map((item) => (
|
<Title order={4}>Kapan Harus Ke Dokter?</Title>
|
||||||
<Box key={item.id}>
|
{listState.doctorSign.findMany.data?.map((item) => (
|
||||||
<Text dangerouslySetInnerHTML={{ __html: item.content }}/>
|
<Box key={item.id}>
|
||||||
</Box>
|
<Text dangerouslySetInnerHTML={{ __html: item.content }} />
|
||||||
))}
|
</Box>
|
||||||
|
))}
|
||||||
|
</Paper>
|
||||||
</Stack>
|
</Stack>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,28 +1,33 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan';
|
import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan';
|
||||||
import { Box, Text, TextInput } from '@mantine/core';
|
import { Box, Paper, Stack, Text, TextInput } from '@mantine/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
|
||||||
function PreventionUI() {
|
function PreventionUI() {
|
||||||
const preventionState = useProxy(stateArtikelKesehatan.prevention)
|
const preventionState = useProxy(stateArtikelKesehatan.prevention)
|
||||||
return (
|
return (
|
||||||
<Box py={10}>
|
<Box>
|
||||||
<TextInput
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
mb={10}
|
<Stack gap={"xs"}>
|
||||||
label={<Text fw={"bold"}>Title Pencegahan Penyakit</Text>}
|
<TextInput
|
||||||
placeholder="Masukkan title"
|
mb={10}
|
||||||
onChange={(val) => {
|
label={<Text fw={"bold"}>Judul Pencegahan Penyakit</Text>}
|
||||||
preventionState.create.form.title = val.target.value
|
placeholder="Masukkan judul"
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
preventionState.create.form.title = val.target.value
|
||||||
<KesehatanEditor
|
}}
|
||||||
showSubmit={false}
|
/>
|
||||||
onChange={(val) => {
|
<KesehatanEditor
|
||||||
preventionState.create.form.content = val
|
showSubmit={false}
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
preventionState.create.form.content = val
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +1,32 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan';
|
import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan';
|
||||||
import { Box, Text, TextInput } from '@mantine/core';
|
import { Box, Paper, Stack, Text, TextInput } from '@mantine/core';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
|
||||||
function SymptomUI() {
|
function SymptomUI() {
|
||||||
const symptomState = useProxy(stateArtikelKesehatan.symptom)
|
const symptomState = useProxy(stateArtikelKesehatan.symptom)
|
||||||
return (
|
return (
|
||||||
<Box py={10}>
|
<Box>
|
||||||
<TextInput
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
mb={10}
|
<Stack gap={"xs"}>
|
||||||
label={<Text fw={"bold"}>Title Gejala Penyakit</Text>}
|
<TextInput
|
||||||
placeholder='masukkan title'
|
mb={10}
|
||||||
onChange={(val) => {
|
label={<Text fw={"bold"}>Judul Gejala Penyakit</Text>}
|
||||||
symptomState.create.form.title = val.target.value
|
placeholder='masukkan judul'
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
symptomState.create.form.title = val.target.value
|
||||||
<KesehatanEditor
|
}}
|
||||||
showSubmit={false}
|
/>
|
||||||
onChange={(val) => {
|
<KesehatanEditor
|
||||||
symptomState.create.form.content = val
|
showSubmit={false}
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
symptomState.create.form.content = val
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
import stateFasilitasKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/fasilitasKesehatan';
|
import stateFasilitasKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/fasilitasKesehatan';
|
||||||
import { Box, Text, TextInput } from '@mantine/core';
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Paper, Stack, Text, TextInput } from '@mantine/core';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
|
|
||||||
function DokterDanTenagaMedis() {
|
function DokterDanTenagaMedis() {
|
||||||
const dokterdantenagamedisState = useProxy(stateFasilitasKesehatan.dokterdantenagamedis)
|
const dokterdantenagamedisState = useProxy(stateFasilitasKesehatan.dokterdantenagamedis)
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<Text fw={"bold"}>Dokter & Tenaga Medis</Text>
|
<Paper bg={colors['white-1']} p={"md"}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<Text fw={"bold"}>Dokter & Tenaga Medis</Text>
|
||||||
<TextInput
|
<TextInput
|
||||||
label="Nama Dokter"
|
label="Nama Dokter"
|
||||||
placeholder='masukkan nama dokter'
|
placeholder='masukkan nama dokter'
|
||||||
@@ -29,6 +32,8 @@ function DokterDanTenagaMedis() {
|
|||||||
dokterdantenagamedisState.create.form.jadwal = val.target.value
|
dokterdantenagamedisState.create.form.jadwal = val.target.value
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,20 @@
|
|||||||
import stateFasilitasKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/fasilitasKesehatan';
|
import stateFasilitasKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/fasilitasKesehatan';
|
||||||
import { Box, Text } from '@mantine/core';
|
import { Box, Paper, Text } from '@mantine/core';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
|
||||||
function FasilitasPendukung() {
|
function FasilitasPendukung() {
|
||||||
const fasilitaspendukungState = useProxy(stateFasilitasKesehatan.fasilitaspendukung)
|
const fasilitaspendukungState = useProxy(stateFasilitasKesehatan.fasilitaspendukung)
|
||||||
return <Box>
|
return <Box>
|
||||||
<Text fw={"bold"}>Fasilitas Pendukung</Text>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<KesehatanEditor
|
<Text fw={"bold"}>Fasilitas Pendukung</Text>
|
||||||
|
<KesehatanEditor
|
||||||
showSubmit={false}
|
showSubmit={false}
|
||||||
onChange={(val) => {
|
onChange={(val) => {
|
||||||
fasilitaspendukungState.create.form.content = val;
|
fasilitaspendukungState.create.form.content = val;
|
||||||
}} />
|
}} />
|
||||||
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,35 +1,40 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import stateFasilitasKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/fasilitasKesehatan';
|
import stateFasilitasKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/fasilitasKesehatan';
|
||||||
import { Box, Text, TextInput } from '@mantine/core';
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Paper, Stack, Text, TextInput } from '@mantine/core';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
|
|
||||||
function InformasiUmum() {
|
function InformasiUmum() {
|
||||||
const infromasiState = useProxy(stateFasilitasKesehatan.informasiumum)
|
const infromasiState = useProxy(stateFasilitasKesehatan.informasiumum)
|
||||||
return<Box>
|
return <Box>
|
||||||
<Text fw={"bold"}>Informasi Umum</Text>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<TextInput
|
<Text fw={"bold"}>Informasi Umum</Text>
|
||||||
label="Fasilitas"
|
<Stack gap={"xs"}>
|
||||||
placeholder='masukkan nama fasilitas kesehatan'
|
<TextInput
|
||||||
onChange={(val) => {
|
label="Fasilitas"
|
||||||
infromasiState.create.form.fasilitas = val.target.value
|
placeholder='masukkan nama fasilitas kesehatan'
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
infromasiState.create.form.fasilitas = val.target.value
|
||||||
<TextInput
|
}}
|
||||||
label="Alamat"
|
/>
|
||||||
placeholder='masukkan alamat'
|
<TextInput
|
||||||
onChange={(val) => {
|
label="Alamat"
|
||||||
infromasiState.create.form.alamat = val.target.value
|
placeholder='masukkan alamat'
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
infromasiState.create.form.alamat = val.target.value
|
||||||
<TextInput
|
}}
|
||||||
mb={10}
|
/>
|
||||||
label="Jam Operasional"
|
<TextInput
|
||||||
placeholder='masukkan jam operasional'
|
mb={10}
|
||||||
onChange={(val) => {
|
label="Jam Operasional"
|
||||||
infromasiState.create.form.jamOperasional = val.target.value
|
placeholder='masukkan jam operasional'
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
infromasiState.create.form.jamOperasional = val.target.value
|
||||||
</Box>
|
}}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
}
|
}
|
||||||
|
|
||||||
export default InformasiUmum;
|
export default InformasiUmum;
|
||||||
|
|||||||
@@ -1,18 +1,21 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import stateFasilitasKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/fasilitasKesehatan';
|
import stateFasilitasKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/fasilitasKesehatan';
|
||||||
import { Box, Text } from '@mantine/core';
|
import { Box, Paper, Text } from '@mantine/core';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
|
||||||
function LayananUnggulan() {
|
function LayananUnggulan() {
|
||||||
const informasiumumState = useProxy(stateFasilitasKesehatan.layananunggulan)
|
const informasiumumState = useProxy(stateFasilitasKesehatan.layananunggulan)
|
||||||
return <Box>
|
return <Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<Text fw={"bold"}>Layanan Unggulan</Text>
|
<Text fw={"bold"}>Layanan Unggulan</Text>
|
||||||
<KesehatanEditor
|
<KesehatanEditor
|
||||||
showSubmit={false}
|
showSubmit={false}
|
||||||
onChange={(val) => {
|
onChange={(val) => {
|
||||||
informasiumumState.create.form.content = val;
|
informasiumumState.create.form.content = val;
|
||||||
}} />
|
}} />
|
||||||
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import stateFasilitasKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/fasilitasKesehatan';
|
import stateFasilitasKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/fasilitasKesehatan';
|
||||||
import colors from '@/con/colors';
|
import colors from '@/con/colors';
|
||||||
import { Box, Button, Center, SimpleGrid, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core';
|
import { Box, Button, Center, Paper, SimpleGrid, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core';
|
||||||
import { useShallowEffect } from '@mantine/hooks';
|
import { useShallowEffect } from '@mantine/hooks';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import DokterDanTenagaMedis from './dokterdantenagamedis/page';
|
import DokterDanTenagaMedis from './dokterdantenagamedis/page';
|
||||||
@@ -91,7 +91,7 @@ function FasilitasKesehatan() {
|
|||||||
}}>
|
}}>
|
||||||
<Box>
|
<Box>
|
||||||
<Stack gap={'xs'}>
|
<Stack gap={'xs'}>
|
||||||
<Title order={3}>Fasilitas Kesehatan</Title>
|
<Title order={4}>Tambah Fasilitas Kesehatan</Title>
|
||||||
{/* Informasi Umum */}
|
{/* Informasi Umum */}
|
||||||
<InformasiUmum />
|
<InformasiUmum />
|
||||||
{/* Layanan Unggulan */}
|
{/* Layanan Unggulan */}
|
||||||
@@ -110,7 +110,7 @@ function FasilitasKesehatan() {
|
|||||||
|
|
||||||
<Box>
|
<Box>
|
||||||
<Stack gap={"xs"}>
|
<Stack gap={"xs"}>
|
||||||
<Title order={3}>List Fasilitas Kesehatan</Title>
|
<Title order={4}>Data Fasilitas Kesehatan</Title>
|
||||||
<AllList />
|
<AllList />
|
||||||
</Stack>
|
</Stack>
|
||||||
</Box>
|
</Box>
|
||||||
@@ -141,100 +141,113 @@ function AllList() {
|
|||||||
{Array.from({ length: 10 }).map((v, k) => <Skeleton key={k} h={40} />)}
|
{Array.from({ length: 10 }).map((v, k) => <Skeleton key={k} h={40} />)}
|
||||||
</Stack>
|
</Stack>
|
||||||
return <Stack>
|
return <Stack>
|
||||||
<Title order={4}>Informasi Umum</Title>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
{allListState.informasiumum.findMany.data?.map((item) => (
|
<Title order={4}>Informasi Umum</Title>
|
||||||
<Box key={item.id}>
|
{allListState.informasiumum.findMany.data?.map((item) => (
|
||||||
|
<Box key={item.id}>
|
||||||
|
|
||||||
<Text>{item.fasilitas}</Text>
|
<Text>{item.fasilitas}</Text>
|
||||||
<Text>{item.alamat}</Text>
|
<Text>{item.alamat}</Text>
|
||||||
<Text>{item.jamOperasional}</Text>
|
<Text>{item.jamOperasional}</Text>
|
||||||
</Box>
|
</Box>
|
||||||
))}
|
))}
|
||||||
|
</Paper>
|
||||||
|
|
||||||
<Title order={4}>Layanan Unggulan</Title>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
{allListState.layananunggulan.findMany.data?.map((item) => (
|
<Title order={4}>Layanan Unggulan</Title>
|
||||||
<Box key={item.id}>
|
{allListState.layananunggulan.findMany.data?.map((item) => (
|
||||||
<Text dangerouslySetInnerHTML={{ __html: item.content }} />
|
<Box key={item.id}>
|
||||||
</Box>
|
<Text dangerouslySetInnerHTML={{ __html: item.content }} />
|
||||||
))}
|
</Box>
|
||||||
|
))}
|
||||||
|
</Paper>
|
||||||
|
|
||||||
|
|
||||||
<Title order={4}>Dokter & Tenaga Medis</Title>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Title order={4}>Dokter & Tenaga Medis</Title>
|
||||||
<Table
|
|
||||||
striped
|
<Table
|
||||||
highlightOnHover
|
striped
|
||||||
withTableBorder
|
highlightOnHover
|
||||||
withColumnBorders
|
withTableBorder
|
||||||
bg={colors['white-1']}
|
withColumnBorders
|
||||||
>
|
bg={colors['white-1']}
|
||||||
<TableThead >
|
>
|
||||||
<TableTr >
|
<TableThead >
|
||||||
<TableTh >
|
<TableTr >
|
||||||
<Center>Nama</Center>
|
<TableTh >
|
||||||
</TableTh>
|
<Center>Nama</Center>
|
||||||
<TableTh >
|
</TableTh>
|
||||||
<Center>Specialist</Center>
|
<TableTh >
|
||||||
</TableTh>
|
<Center>Specialist</Center>
|
||||||
<TableTh >
|
</TableTh>
|
||||||
<Center>Jadwal</Center>
|
<TableTh >
|
||||||
</TableTh>
|
<Center>Jadwal</Center>
|
||||||
</TableTr>
|
</TableTh>
|
||||||
</TableThead>
|
|
||||||
<TableTbody >
|
|
||||||
{allListState.dokterdantenagamedis.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>
|
</TableTr>
|
||||||
))}
|
</TableThead>
|
||||||
</TableTbody>
|
<TableTbody >
|
||||||
</Table>
|
{allListState.dokterdantenagamedis.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>
|
||||||
|
</Paper>
|
||||||
|
|
||||||
<Title order={4}>Fasilitas Pendukung</Title>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
{allListState.fasilitaspendukung.findMany.data?.map((item) => (
|
|
||||||
<Box key={item.id}>
|
|
||||||
<Text dangerouslySetInnerHTML={{ __html: item.content }} />
|
|
||||||
</Box>
|
|
||||||
))}
|
|
||||||
|
|
||||||
<Title order={4}>Tarif & Layanan</Title>
|
<Title order={4}>Fasilitas Pendukung</Title>
|
||||||
<Table
|
{allListState.fasilitaspendukung.findMany.data?.map((item) => (
|
||||||
suppressHydrationWarning
|
<Box key={item.id}>
|
||||||
striped
|
<Text dangerouslySetInnerHTML={{ __html: item.content }} />
|
||||||
highlightOnHover
|
</Box>
|
||||||
withTableBorder
|
))}
|
||||||
withColumnBorders
|
</Paper>
|
||||||
bg={colors['white-1']}
|
|
||||||
>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<TableThead>
|
<Title order={4}>Tarif & Layanan</Title>
|
||||||
<TableTr>
|
<Table
|
||||||
<TableTh>
|
suppressHydrationWarning
|
||||||
Layanan
|
striped
|
||||||
</TableTh>
|
highlightOnHover
|
||||||
<TableTh>
|
withTableBorder
|
||||||
Tarif
|
withColumnBorders
|
||||||
</TableTh>
|
bg={colors['white-1']}
|
||||||
</TableTr>
|
>
|
||||||
</TableThead>
|
<TableThead>
|
||||||
<TableTbody>
|
<TableTr>
|
||||||
{allListState.tarifdanlayanan.findMany.data?.map((item) => (
|
<TableTh>
|
||||||
<TableTr key={item.id}>
|
Layanan
|
||||||
<TableTd>{item.layanan}</TableTd>
|
</TableTh>
|
||||||
<TableTd>Rp.{item.tarif}</TableTd>
|
<TableTh>
|
||||||
|
Tarif
|
||||||
|
</TableTh>
|
||||||
</TableTr>
|
</TableTr>
|
||||||
))}
|
</TableThead>
|
||||||
</TableTbody>
|
<TableTbody>
|
||||||
</Table>
|
{allListState.tarifdanlayanan.findMany.data?.map((item) => (
|
||||||
|
<TableTr key={item.id}>
|
||||||
|
<TableTd>{item.layanan}</TableTd>
|
||||||
|
<TableTd>Rp.{item.tarif}</TableTd>
|
||||||
|
</TableTr>
|
||||||
|
))}
|
||||||
|
</TableTbody>
|
||||||
|
</Table>
|
||||||
|
</Paper>
|
||||||
|
|
||||||
<Title order={4}>Prosedur Pendaftaran</Title>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
{allListState.prosedurpendaftaran.findMany.data?.map((item) => (
|
|
||||||
<Box key={item.id}>
|
|
||||||
<Text dangerouslySetInnerHTML={{__html: item.content}}/>
|
|
||||||
</Box>
|
|
||||||
))}
|
|
||||||
|
|
||||||
|
<Title order={4}>Prosedur Pendaftaran</Title>
|
||||||
|
{allListState.prosedurpendaftaran.findMany.data?.map((item) => (
|
||||||
|
<Box key={item.id}>
|
||||||
|
<Text dangerouslySetInnerHTML={{ __html: item.content }} />
|
||||||
|
</Box>
|
||||||
|
))}
|
||||||
|
</Paper>
|
||||||
</Stack>
|
</Stack>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,19 +1,22 @@
|
|||||||
import stateFasilitasKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/fasilitasKesehatan';
|
import stateFasilitasKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/fasilitasKesehatan';
|
||||||
import { Box, Text } from '@mantine/core';
|
import { Box, Text, Paper } from '@mantine/core';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
|
||||||
function ProsedurPendaftaran() {
|
function ProsedurPendaftaran() {
|
||||||
const prosedurpendaftaranState = useProxy(stateFasilitasKesehatan.prosedurpendaftaran)
|
const prosedurpendaftaranState = useProxy(stateFasilitasKesehatan.prosedurpendaftaran)
|
||||||
return <Box>
|
return <Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<Text fw={"bold"}>Prosedur Pendaftaran</Text>
|
<Text fw={"bold"}>Prosedur Pendaftaran</Text>
|
||||||
<KesehatanEditor
|
<KesehatanEditor
|
||||||
showSubmit={false}
|
showSubmit={false}
|
||||||
onChange={(val) => {
|
onChange={(val) => {
|
||||||
prosedurpendaftaranState.create.form.content = val;
|
prosedurpendaftaranState.create.form.content = val;
|
||||||
}} />
|
}} />
|
||||||
</Box>
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default ProsedurPendaftaran;
|
export default ProsedurPendaftaran;
|
||||||
|
|||||||
@@ -1,27 +1,32 @@
|
|||||||
import stateFasilitasKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/fasilitasKesehatan';
|
import stateFasilitasKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/fasilitasKesehatan';
|
||||||
import { Box, Text, TextInput } from '@mantine/core';
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Paper, Stack, Text, TextInput } from '@mantine/core';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
|
|
||||||
function TarifDanLayanan() {
|
function TarifDanLayanan() {
|
||||||
const tarifdanlayanan = useProxy(stateFasilitasKesehatan.tarifdanlayanan)
|
const tarifdanlayanan = useProxy(stateFasilitasKesehatan.tarifdanlayanan)
|
||||||
return <Box>
|
return <Box>
|
||||||
<Text fw={"bold"}>Tarif & Layanan</Text>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<TextInput
|
<Text fw={"bold"}>Tarif & Layanan</Text>
|
||||||
label="Tarif"
|
<Stack gap={"xs"}>
|
||||||
placeholder='masukkan tarif'
|
<TextInput
|
||||||
onChange={(val) => {
|
label="Tarif"
|
||||||
tarifdanlayanan.create.form.tarif = val.target.value
|
placeholder='masukkan tarif'
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
tarifdanlayanan.create.form.tarif = val.target.value
|
||||||
<TextInput
|
}}
|
||||||
mb={10}
|
/>
|
||||||
label="Layanan"
|
<TextInput
|
||||||
placeholder='masukkan layanan'
|
mb={10}
|
||||||
onChange={(val) => {
|
label="Layanan"
|
||||||
tarifdanlayanan.create.form.layanan = val.target.value
|
placeholder='masukkan layanan'
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
tarifdanlayanan.create.form.layanan = val.target.value
|
||||||
</Box>
|
}}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
}
|
}
|
||||||
|
|
||||||
export default TarifDanLayanan;
|
export default TarifDanLayanan;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import stategrafikKepuasan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/grafikKepuasan';
|
import stategrafikKepuasan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/grafikKepuasan';
|
||||||
import colors from '@/con/colors';
|
import colors from '@/con/colors';
|
||||||
import { Box, Button, Group, Stack, TextInput, Title } from '@mantine/core';
|
import { Box, Button, Group, Paper, Skeleton, Stack, TextInput, Title } from '@mantine/core';
|
||||||
import { useMediaQuery, useShallowEffect } from '@mantine/hooks';
|
import { useMediaQuery, useShallowEffect } from '@mantine/hooks';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { Bar, BarChart, Legend, Tooltip, XAxis, YAxis } from 'recharts';
|
import { Bar, BarChart, Legend, Tooltip, XAxis, YAxis } from 'recharts';
|
||||||
@@ -35,54 +35,65 @@ function GrafikHasilKepuasan() {
|
|||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Stack gap={"xs"}>
|
<Stack py={10} gap={"xs"}>
|
||||||
<Title order={3}>Grafik Hasil Kepuasan</Title>
|
<Paper w={{ base: '100%', md: '50%' }} bg={colors['white-1']} p={'md'}>
|
||||||
<Box>
|
<Title order={4}>Tambah Grafik Hasil Kepuasan</Title>
|
||||||
<TextInput
|
<Stack gap={"xs"}>
|
||||||
w={{ base: '100%', md: '50%' }}
|
<TextInput
|
||||||
label="Label"
|
label="Label"
|
||||||
placeholder='Masukkan label yang diinginkan'
|
placeholder='Masukkan label yang diinginkan'
|
||||||
value={grafikkepuasan.create.form.label}
|
value={grafikkepuasan.create.form.label}
|
||||||
onChange={(val) => {
|
onChange={(val) => {
|
||||||
grafikkepuasan.create.form.label = val.currentTarget.value
|
grafikkepuasan.create.form.label = val.currentTarget.value
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<TextInput
|
<TextInput
|
||||||
w={{ base: '100%', md: '50%' }}
|
label="Jumlah Penderita"
|
||||||
label="Jumlah Penderita"
|
type='number'
|
||||||
type='number'
|
placeholder='Masukkan jumlah penderita'
|
||||||
placeholder='Masukkan jumlah penderita'
|
value={grafikkepuasan.create.form.jumlah}
|
||||||
value={grafikkepuasan.create.form.jumlah}
|
onChange={(val) => {
|
||||||
onChange={(val) => {
|
grafikkepuasan.create.form.jumlah = val.currentTarget.value
|
||||||
grafikkepuasan.create.form.jumlah = val.currentTarget.value
|
}}
|
||||||
}}
|
/>
|
||||||
/>
|
<Group>
|
||||||
</Box>
|
<Button bg={colors['blue-button']} mt={10}
|
||||||
<Group>
|
onClick={async () => {
|
||||||
<Button mt={10}
|
await grafikkepuasan.create.create();
|
||||||
onClick={async () => {
|
await grafikkepuasan.findMany.load();
|
||||||
await grafikkepuasan.create.create();
|
if (grafikkepuasan.findMany.data) {
|
||||||
await grafikkepuasan.findMany.load();
|
setChartData(grafikkepuasan.findMany.data);
|
||||||
if (grafikkepuasan.findMany.data) {
|
}
|
||||||
setChartData(grafikkepuasan.findMany.data);
|
}}
|
||||||
}
|
>Submit</Button>
|
||||||
}}
|
</Group>
|
||||||
>Submit</Button>
|
</Stack>
|
||||||
</Group>
|
</Paper>
|
||||||
<Box h={400} w={{ base: "100%", md: "80%" }}>
|
{!chartData ? (
|
||||||
<Title py={15} order={3}>Data Kelahiran & Kematian</Title>
|
<Box style={{ width: '100%', minWidth: 300, minHeight: 300 }}>
|
||||||
<BarChart
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
width={isMobile ? 450 : isTablet ? 600 : 900}
|
<Title py={15} order={4}>Data Hasil Kepuasan</Title>
|
||||||
height={380}
|
<Skeleton h={400} />
|
||||||
data={chartData}
|
</Paper>
|
||||||
>
|
</Box>
|
||||||
<XAxis dataKey="label" />
|
) : (
|
||||||
<YAxis />
|
<Box style={{ width: '100%', minWidth: 300, minHeight: 300 }}>
|
||||||
<Tooltip />
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<Legend />
|
<Title py={15} order={4}>Data Hasil Kepuasan</Title>
|
||||||
<Bar dataKey="jumlah" fill={colors['blue-button']} name="Jumlah" />
|
<BarChart
|
||||||
</BarChart>
|
width={isMobile ? 250 : isTablet ? 300 : 350}
|
||||||
</Box>
|
height={380}
|
||||||
|
data={chartData}
|
||||||
|
>
|
||||||
|
<XAxis dataKey="label" />
|
||||||
|
<YAxis />
|
||||||
|
<Tooltip />
|
||||||
|
<Legend />
|
||||||
|
<Bar dataKey="jumlah" fill={colors['blue-button']} name="Jumlah" />
|
||||||
|
</BarChart>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
)}
|
||||||
</Stack>
|
</Stack>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,24 @@
|
|||||||
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
|
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
|
||||||
import { Box, Text } from '@mantine/core';
|
import { Box, Paper, Stack, Text } from '@mantine/core';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
|
||||||
function DeskripsiKegiatan() {
|
function DeskripsiKegiatan() {
|
||||||
const deskripsiKegiatanState = useProxy(stateJadwalKegiatan.deskripsiKegiatan)
|
const deskripsiKegiatanState = useProxy(stateJadwalKegiatan.deskripsiKegiatan)
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<Text pt={10} fw={"bold"}>Deskripsi Kegiatan</Text>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<KesehatanEditor
|
<Stack gap={"xs"}>
|
||||||
showSubmit={false}
|
<Text pt={10} fw={"bold"}>Deskripsi Kegiatan</Text>
|
||||||
onChange={(val) => {
|
<KesehatanEditor
|
||||||
deskripsiKegiatanState.create.form.deskripsi = val
|
showSubmit={false}
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
deskripsiKegiatanState.create.form.deskripsi = val
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,24 @@
|
|||||||
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
|
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
|
||||||
import { Box, Text } from '@mantine/core';
|
import { Box, Paper, Stack, Text } from '@mantine/core';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
|
||||||
function DokumenYangDiperlukan() {
|
function DokumenYangDiperlukan() {
|
||||||
const dokumenDiperlukan = useProxy(stateJadwalKegiatan.dokumenjadwalkegiatan)
|
const dokumenDiperlukan = useProxy(stateJadwalKegiatan.dokumenjadwalkegiatan)
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<Text pt={10} fw={"bold"}>Dokumen Yang Diperlukan</Text>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<KesehatanEditor
|
<Stack gap={"xs"}>
|
||||||
showSubmit={false}
|
<Text pt={10} fw={"bold"}>Dokumen Yang Diperlukan</Text>
|
||||||
onChange={(val)=> {
|
<KesehatanEditor
|
||||||
dokumenDiperlukan.create.form.content = val;
|
showSubmit={false}
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
dokumenDiperlukan.create.form.content = val;
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
|
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
|
||||||
import { Box, Text, TextInput } from '@mantine/core';
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Paper, Stack, TextInput, Title } from '@mantine/core';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
|
|
||||||
function InformasiKegiatan() {
|
function InformasiKegiatan() {
|
||||||
const informasiKegiatanState = useProxy(stateJadwalKegiatan.informasiKegiatan)
|
const informasiKegiatanState = useProxy(stateJadwalKegiatan.informasiKegiatan)
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<Text pt={10} fw={"bold"}>Informasi Kegiatan</Text>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<Title order={4}>Informasi Kegiatan</Title>
|
||||||
<TextInput
|
<TextInput
|
||||||
label="Nama Kegiatan"
|
label="Nama Kegiatan"
|
||||||
placeholder="Masukkan nama kegiatan"
|
placeholder="Masukkan nama kegiatan"
|
||||||
@@ -35,6 +38,8 @@ function InformasiKegiatan() {
|
|||||||
informasiKegiatanState.create.form.lokasi = val.target.value
|
informasiKegiatanState.create.form.lokasi = val.target.value
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,24 @@
|
|||||||
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
|
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
|
||||||
import { Box, Text } from '@mantine/core';
|
import { Box, Paper, Stack, Text } from '@mantine/core';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
|
||||||
function LayananTersedia() {
|
function LayananTersedia() {
|
||||||
const layananTersediaState = useProxy(stateJadwalKegiatan.layanantersedia)
|
const layananTersediaState = useProxy(stateJadwalKegiatan.layanantersedia)
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<Text pt={10} fw={"bold"}>Layanan Yang Tersedia</Text>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<KesehatanEditor
|
<Stack gap={"xs"}>
|
||||||
showSubmit={false}
|
<Text pt={10} fw={"bold"}>Layanan Yang Tersedia</Text>
|
||||||
onChange={(val) => {
|
<KesehatanEditor
|
||||||
layananTersediaState.create.form.content = val;
|
showSubmit={false}
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
layananTersediaState.create.form.content = val;
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
|
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
|
||||||
import { Box, Button, SimpleGrid, Skeleton, Stack, Text, Title } from '@mantine/core';
|
import { Box, Button, Paper, SimpleGrid, Skeleton, Stack, Text, Title } from '@mantine/core';
|
||||||
import { useShallowEffect } from '@mantine/hooks';
|
import { useShallowEffect } from '@mantine/hooks';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import DeskripsiKegiatan from './deskripsi_kegiatan/page';
|
import DeskripsiKegiatan from './deskripsi_kegiatan/page';
|
||||||
@@ -9,6 +9,7 @@ import InformasiKegiatan from './informasi_kegiatan/page';
|
|||||||
import LayananTersedia from './layanan_yang_tersedia/page';
|
import LayananTersedia from './layanan_yang_tersedia/page';
|
||||||
import Pendaftaran from './pendaftaran/page';
|
import Pendaftaran from './pendaftaran/page';
|
||||||
import SyaratDanKetentuan from './syarat_dan_ketentuan/page';
|
import SyaratDanKetentuan from './syarat_dan_ketentuan/page';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
|
||||||
function JadwalKegiatan() {
|
function JadwalKegiatan() {
|
||||||
const allState = useProxy(stateJadwalKegiatan)
|
const allState = useProxy(stateJadwalKegiatan)
|
||||||
@@ -54,21 +55,25 @@ function JadwalKegiatan() {
|
|||||||
base: 1, md: 2
|
base: 1, md: 2
|
||||||
}}>
|
}}>
|
||||||
<Box>
|
<Box>
|
||||||
<Title order={3}>Jadwal Kegiatan</Title>
|
<Stack gap={"xs"}>
|
||||||
<InformasiKegiatan />
|
<Title order={4}>Tambah Jadwal Kegiatan</Title>
|
||||||
<DeskripsiKegiatan />
|
<InformasiKegiatan />
|
||||||
<LayananTersedia />
|
<DeskripsiKegiatan />
|
||||||
<SyaratDanKetentuan />
|
<LayananTersedia />
|
||||||
<DokumenYangDiperlukan />
|
<SyaratDanKetentuan />
|
||||||
<Pendaftaran />
|
<DokumenYangDiperlukan />
|
||||||
<Button mt={10} onClick={submitAllForms}>
|
<Pendaftaran />
|
||||||
Submit
|
<Button mt={10} onClick={submitAllForms}>
|
||||||
</Button>
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Stack>
|
||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
<Box>
|
<Box>
|
||||||
<Title order={3}>List Jadwal Kegiatan</Title>
|
<Stack gap={"xs"}>
|
||||||
<AllList />
|
<Title order={4}>Data Jadwal Kegiatan</Title>
|
||||||
|
<AllList />
|
||||||
|
</Stack>
|
||||||
</Box>
|
</Box>
|
||||||
</SimpleGrid>
|
</SimpleGrid>
|
||||||
</Stack>
|
</Stack>
|
||||||
@@ -103,68 +108,82 @@ function AllList() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<Stack>
|
<Stack gap={"xs"}>
|
||||||
<Title order={4}>Informasi Kegiatan</Title>
|
|
||||||
{allList.informasiKegiatan.findMany.data?.map((item) => {
|
|
||||||
return (
|
|
||||||
<Box key={item.id}>
|
|
||||||
<Text>{item.name}</Text>
|
|
||||||
<Text>{item.tanggal}</Text>
|
|
||||||
<Text>{item.waktu}</Text>
|
|
||||||
<Text>{item.lokasi}</Text>
|
|
||||||
</Box>
|
|
||||||
)
|
|
||||||
})}
|
|
||||||
|
|
||||||
<Title order={4}>Deskripsi Kegiatan</Title>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
{allList.deskripsiKegiatan.findMany.data?.map((item) => {
|
<Title order={4}>Informasi Kegiatan</Title>
|
||||||
return (
|
{allList.informasiKegiatan.findMany.data?.map((item) => {
|
||||||
<Box key={item.id}>
|
return (
|
||||||
<Text dangerouslySetInnerHTML={{ __html: item.deskripsi }} />
|
<Box key={item.id}>
|
||||||
</Box>
|
<Text>{item.name}</Text>
|
||||||
)
|
<Text>{item.tanggal}</Text>
|
||||||
})}
|
<Text>{item.waktu}</Text>
|
||||||
|
<Text>{item.lokasi}</Text>
|
||||||
|
</Box>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</Paper>
|
||||||
|
|
||||||
<Title order={4}>Layanan Yang Tersedia</Title>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
{allList.layanantersedia.findMany.data?.map((item) => {
|
|
||||||
return (
|
|
||||||
<Box key={item.id}>
|
|
||||||
<Text dangerouslySetInnerHTML={{ __html: item.content }} />
|
|
||||||
</Box>
|
|
||||||
)
|
|
||||||
})}
|
|
||||||
|
|
||||||
<Title order={4}>Syarat dan Ketentuan</Title>
|
<Title order={4}>Deskripsi Kegiatan</Title>
|
||||||
{allList.syaratketentuan.findMany.data?.map((item) => {
|
{allList.deskripsiKegiatan.findMany.data?.map((item) => {
|
||||||
return (
|
return (
|
||||||
<Box key={item.id}>
|
<Box key={item.id}>
|
||||||
<Text dangerouslySetInnerHTML={{ __html: item.content }} />
|
<Text dangerouslySetInnerHTML={{ __html: item.deskripsi }} />
|
||||||
</Box>
|
</Box>
|
||||||
)
|
)
|
||||||
})}
|
})}
|
||||||
|
</Paper>
|
||||||
|
|
||||||
<Title order={4}>Dokumen Yang Diperlukan</Title>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
{allList.dokumenjadwalkegiatan.findMany.data?.map((item) => {
|
<Title order={4}>Layanan Yang Tersedia</Title>
|
||||||
return (
|
{allList.layanantersedia.findMany.data?.map((item) => {
|
||||||
<Box key={item.id}>
|
return (
|
||||||
<Text dangerouslySetInnerHTML={{ __html: item.content }} />
|
<Box key={item.id}>
|
||||||
</Box>
|
<Text dangerouslySetInnerHTML={{ __html: item.content }} />
|
||||||
)
|
</Box>
|
||||||
})}
|
)
|
||||||
|
})}
|
||||||
|
</Paper>
|
||||||
|
|
||||||
<Title order={4}>Pendaftaran</Title>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
{allList.pendaftaranjadwal.findMany.data?.map((item) => {
|
<Title order={4}>Syarat dan Ketentuan</Title>
|
||||||
return (
|
{allList.syaratketentuan.findMany.data?.map((item) => {
|
||||||
<Box key={item.id}>
|
return (
|
||||||
<Text>{item.name}</Text>
|
<Box key={item.id}>
|
||||||
<Text>{item.tanggal}</Text>
|
<Text dangerouslySetInnerHTML={{ __html: item.content }} />
|
||||||
<Text>{item.namaOrangtua}</Text>
|
</Box>
|
||||||
<Text>{item.nomor}</Text>
|
)
|
||||||
<Text>{item.alamat}</Text>
|
})}
|
||||||
<Text>{item.catatan}</Text>
|
</Paper>
|
||||||
</Box>
|
|
||||||
)
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
})}
|
<Title order={4}>Dokumen Yang Diperlukan</Title>
|
||||||
|
{allList.dokumenjadwalkegiatan.findMany.data?.map((item) => {
|
||||||
|
return (
|
||||||
|
<Box key={item.id}>
|
||||||
|
<Text dangerouslySetInnerHTML={{ __html: item.content }} />
|
||||||
|
</Box>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</Paper>
|
||||||
|
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Title order={4}>Pendaftaran</Title>
|
||||||
|
{allList.pendaftaranjadwal.findMany.data?.map((item) => {
|
||||||
|
return (
|
||||||
|
<Box key={item.id}>
|
||||||
|
<Text>{item.name}</Text>
|
||||||
|
<Text>{item.tanggal}</Text>
|
||||||
|
<Text>{item.namaOrangtua}</Text>
|
||||||
|
<Text>{item.nomor}</Text>
|
||||||
|
<Text>{item.alamat}</Text>
|
||||||
|
<Text>{item.catatan}</Text>
|
||||||
|
</Box>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</Paper>
|
||||||
</Stack>
|
</Stack>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,56 +1,61 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
|
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
|
||||||
import { Box, Text, Textarea, TextInput } from '@mantine/core';
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Paper, Stack, Text, Textarea, TextInput } from '@mantine/core';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
|
|
||||||
function Pendaftaran() {
|
function Pendaftaran() {
|
||||||
const pendaftaran = useProxy(stateJadwalKegiatan.pendaftaranjadwal)
|
const pendaftaran = useProxy(stateJadwalKegiatan.pendaftaranjadwal)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<Text pt={10} fw={"bold"}>Pendaftaran</Text>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<TextInput
|
<Stack gap={"xs"}>
|
||||||
label='Nama Balita'
|
<Text pt={10} fw={"bold"}>Pendaftaran</Text>
|
||||||
placeholder='Masukkan nama balita'
|
<TextInput
|
||||||
onChange={(val) => {
|
label='Nama Balita'
|
||||||
pendaftaran.create.form.name = val.target.value
|
placeholder='Masukkan nama balita'
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
pendaftaran.create.form.name = val.target.value
|
||||||
<TextInput
|
}}
|
||||||
label='Tanggal'
|
/>
|
||||||
placeholder='Masukkan tanggal'
|
<TextInput
|
||||||
onChange={(val) => {
|
label='Tanggal'
|
||||||
pendaftaran.create.form.tanggal = val.target.value
|
placeholder='Masukkan tanggal'
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
pendaftaran.create.form.tanggal = val.target.value
|
||||||
<TextInput
|
}}
|
||||||
label='Nama Orang Tua / Wali'
|
/>
|
||||||
placeholder='Masukkan nama orang tua / wali'
|
<TextInput
|
||||||
onChange={(val) => {
|
label='Nama Orang Tua / Wali'
|
||||||
pendaftaran.create.form.namaOrangtua = val.target.value
|
placeholder='Masukkan nama orang tua / wali'
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
pendaftaran.create.form.namaOrangtua = val.target.value
|
||||||
<TextInput
|
}}
|
||||||
label='No. Telepon'
|
/>
|
||||||
placeholder='Masukkan no. telepon'
|
<TextInput
|
||||||
onChange={(val) => {
|
label='No. Telepon'
|
||||||
pendaftaran.create.form.nomor = val.target.value
|
placeholder='Masukkan no. telepon'
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
pendaftaran.create.form.nomor = val.target.value
|
||||||
<TextInput
|
}}
|
||||||
label='Alamat'
|
/>
|
||||||
placeholder='Masukkan alamat'
|
<TextInput
|
||||||
onChange={(val) => {
|
label='Alamat'
|
||||||
pendaftaran.create.form.alamat = val.target.value
|
placeholder='Masukkan alamat'
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
pendaftaran.create.form.alamat = val.target.value
|
||||||
<Textarea
|
}}
|
||||||
label='Catatan Khusus (Opsional)'
|
/>
|
||||||
placeholder='Masukkan catatan khusus'
|
<Textarea
|
||||||
onChange={(val) => {
|
label='Catatan Khusus (Opsional)'
|
||||||
pendaftaran.create.form.catatan = val.target.value
|
placeholder='Masukkan catatan khusus'
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
pendaftaran.create.form.catatan = val.target.value
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,24 @@
|
|||||||
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
|
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
|
||||||
import { Box, Text } from '@mantine/core';
|
import { Box, Paper, Stack, Text } from '@mantine/core';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
|
||||||
function SyaratDanKetentuan() {
|
function SyaratDanKetentuan() {
|
||||||
const syaratKetentuan = useProxy(stateJadwalKegiatan.syaratketentuan)
|
const syaratKetentuan = useProxy(stateJadwalKegiatan.syaratketentuan)
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<Text pt={10} fw={"bold"}>Syarat dan Ketentuan</Text>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<KesehatanEditor
|
<Stack gap={"xs"}>
|
||||||
showSubmit={false}
|
<Text pt={10} fw={"bold"}>Syarat dan Ketentuan</Text>
|
||||||
onChange={(val) => {
|
<KesehatanEditor
|
||||||
syaratKetentuan.create.form.content = val;
|
showSubmit={false}
|
||||||
}}
|
onChange={(val) => {
|
||||||
/>
|
syaratKetentuan.create.form.content = val;
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
'use client'
|
'use client'
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
import statePersentase from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/persentaseKelahiran';
|
import statePersentase from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/persentaseKelahiran';
|
||||||
import { Box, Button, Stack, TextInput, Title } from '@mantine/core';
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Button, Group, Paper, Skeleton, Stack, TextInput, Title } from '@mantine/core';
|
||||||
import { useMediaQuery, useShallowEffect } from '@mantine/hooks';
|
import { useMediaQuery, useShallowEffect } from '@mantine/hooks';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { Bar, BarChart, Legend, Tooltip, XAxis, YAxis } from 'recharts';
|
import { Bar, BarChart, Legend, Tooltip, XAxis, YAxis } from 'recharts';
|
||||||
@@ -32,76 +33,90 @@ function PersentaseDataKelahiranKematian() {
|
|||||||
<Stack py={10}>
|
<Stack py={10}>
|
||||||
{/* Form Input */}
|
{/* Form Input */}
|
||||||
<Box>
|
<Box>
|
||||||
<Title order={3}>Persentase Data Kelahiran & Kematian</Title>
|
<Paper w={{ base: '100%', md: '50%' }} bg={colors['white-1']} p={'md'}>
|
||||||
<TextInput
|
<Title order={4}>Tambah Persentase Data Kelahiran & Kematian</Title>
|
||||||
w={{ base: '100%', md: '50%' }}
|
<Stack gap={"xs"}>
|
||||||
label="Tahun"
|
<TextInput
|
||||||
type="number"
|
label="Tahun"
|
||||||
value={persentase.create.form.tahun}
|
type="number"
|
||||||
placeholder="Masukkan tahun"
|
value={persentase.create.form.tahun}
|
||||||
onChange={(val) => {
|
placeholder="Masukkan tahun"
|
||||||
persentase.create.form.tahun = val.currentTarget.value;
|
onChange={(val) => {
|
||||||
}}
|
persentase.create.form.tahun = val.currentTarget.value;
|
||||||
/>
|
}}
|
||||||
<TextInput
|
/>
|
||||||
w={{ base: '100%', md: '50%' }}
|
<TextInput
|
||||||
label="Kematian Kasar"
|
label="Kematian Kasar"
|
||||||
type="number"
|
type="number"
|
||||||
value={persentase.create.form.kematianKasar}
|
value={persentase.create.form.kematianKasar}
|
||||||
placeholder="Masukkan kematian kasar"
|
placeholder="Masukkan kematian kasar"
|
||||||
onChange={(val) => {
|
onChange={(val) => {
|
||||||
persentase.create.form.kematianKasar = val.currentTarget.value;
|
persentase.create.form.kematianKasar = val.currentTarget.value;
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<TextInput
|
<TextInput
|
||||||
w={{ base: '100%', md: '50%' }}
|
label="Kematian Bayi"
|
||||||
label="Kematian Bayi"
|
type="number"
|
||||||
type="number"
|
value={persentase.create.form.kematianBayi}
|
||||||
value={persentase.create.form.kematianBayi}
|
placeholder="Masukkan kematian bayi"
|
||||||
placeholder="Masukkan kematian bayi"
|
onChange={(val) => {
|
||||||
onChange={(val) => {
|
persentase.create.form.kematianBayi = val.currentTarget.value;
|
||||||
persentase.create.form.kematianBayi = val.currentTarget.value;
|
}}
|
||||||
}}
|
/>
|
||||||
/>
|
<TextInput
|
||||||
<TextInput
|
label="Kelahiran Kasar"
|
||||||
w={{ base: '100%', md: '50%' }}
|
type="number"
|
||||||
label="Kelahiran Kasar"
|
value={persentase.create.form.kelahiranKasar}
|
||||||
type="number"
|
placeholder="Masukkan kelahiran kasar"
|
||||||
value={persentase.create.form.kelahiranKasar}
|
onChange={(val) => {
|
||||||
placeholder="Masukkan kelahiran kasar"
|
persentase.create.form.kelahiranKasar = val.currentTarget.value;
|
||||||
onChange={(val) => {
|
}}
|
||||||
persentase.create.form.kelahiranKasar = val.currentTarget.value;
|
/>
|
||||||
}}
|
<Group>
|
||||||
/>
|
<Button
|
||||||
<Button
|
bg={colors['blue-button']}
|
||||||
mt={10}
|
mt={10}
|
||||||
onClick={async () => {
|
onClick={async () => {
|
||||||
await persentase.create.create();
|
await persentase.create.create();
|
||||||
await persentase.findMany.load();
|
await persentase.findMany.load();
|
||||||
if (persentase.findMany.data) {
|
if (persentase.findMany.data) {
|
||||||
setChartData(persentase.findMany.data);
|
setChartData(persentase.findMany.data);
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Submit
|
Submit
|
||||||
</Button>
|
</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
{/* Chart */}
|
{/* Chart */}
|
||||||
<Box style={{ width: '100%', minWidth: 300, height: 400, minHeight: 300 }}>
|
{!mounted && !chartData ? (
|
||||||
<Title pb={10} order={3}>Data Kelahiran & Kematian</Title>
|
<Box style={{ width: '100%', minWidth: 300, height: 400, minHeight: 300 }}>
|
||||||
{mounted && chartData.length > 0 && (
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<BarChart width={isMobile ? 450 : isTablet ? 600 : 900} height={380} data={chartData} >
|
<Title pb={10} order={3}>Data Kelahiran & Kematian</Title>
|
||||||
<XAxis dataKey="tahun" />
|
<Skeleton h={400} />
|
||||||
<YAxis />
|
</Paper>
|
||||||
<Tooltip />
|
</Box>
|
||||||
<Legend />
|
) : (
|
||||||
<Bar dataKey="kematianKasar" fill="#f03e3e" name="Kematian Kasar" />
|
<Box style={{ width: '100%', minWidth: 300, height: 400, minHeight: 300 }}>
|
||||||
<Bar dataKey="kematianBayi" fill="#ff922b" name="Kematian Bayi" />
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<Bar dataKey="kelahiranKasar" fill="#4dabf7" name="Kelahiran Kasar" />
|
<Title pb={10} order={4}>Data Kelahiran & Kematian</Title>
|
||||||
</BarChart>
|
{mounted && chartData.length > 0 && (
|
||||||
)}
|
<BarChart width={isMobile ? 450 : isTablet ? 500 : 550} height={350} data={chartData} >
|
||||||
</Box>
|
<XAxis dataKey="tahun" />
|
||||||
|
<YAxis />
|
||||||
|
<Tooltip />
|
||||||
|
<Legend />
|
||||||
|
<Bar dataKey="kematianKasar" fill="#f03e3e" name="Kematian Kasar" />
|
||||||
|
<Bar dataKey="kematianBayi" fill="#ff922b" name="Kematian Bayi" />
|
||||||
|
<Bar dataKey="kelahiranKasar" fill="#4dabf7" name="Kelahiran Kasar" />
|
||||||
|
</BarChart>
|
||||||
|
)}
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
)}
|
||||||
</Stack>
|
</Stack>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import colors from '@/con/colors';
|
import colors from '@/con/colors';
|
||||||
import { Stack, Tabs, TabsList, TabsPanel, TabsTab } from '@mantine/core';
|
import { Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core';
|
||||||
import ArtikelKesehatan from './_ui/artikel_kesehatan/page';
|
import ArtikelKesehatan from './_ui/artikel_kesehatan/page';
|
||||||
import FasilitasKesehatan from './_ui/fasilitas_kesehatan/page';
|
import FasilitasKesehatan from './_ui/fasilitas_kesehatan/page';
|
||||||
import GrafikHasilKepuasan from './_ui/grafik_hasil_kepuasan/page';
|
import GrafikHasilKepuasan from './_ui/grafik_hasil_kepuasan/page';
|
||||||
@@ -10,8 +10,9 @@ import PersentaseDataKelahiranKematian from './_ui/persentase_data_kelahiran_kem
|
|||||||
function Page() {
|
function Page() {
|
||||||
return (
|
return (
|
||||||
<Stack>
|
<Stack>
|
||||||
|
<Title order={3}>Data Kesehatan Warga</Title>
|
||||||
<Tabs color={colors['blue-button']} variant='pills' defaultValue={"Persentase Kelahiran & Kematian"}>
|
<Tabs color={colors['blue-button']} variant='pills' defaultValue={"Persentase Kelahiran & Kematian"}>
|
||||||
<TabsList >
|
<TabsList bg={colors['BG-trans']} p={'xs'}>
|
||||||
<TabsTab value="Persentase Kelahiran & Kematian">
|
<TabsTab value="Persentase Kelahiran & Kematian">
|
||||||
Persentase Kelahiran & Kematian
|
Persentase Kelahiran & Kematian
|
||||||
</TabsTab>
|
</TabsTab>
|
||||||
|
|||||||
@@ -1,10 +1,35 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import CreateInfoWabahPenyakit from './ui/tambah_wabah_penyakit/page';
|
||||||
|
import ListInfoWabahPenyakit from './ui/list_wabah_penyakit/page';
|
||||||
|
|
||||||
|
|
||||||
function Page() {
|
function Page() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<Box>
|
||||||
Wabah Penyakit
|
<Stack gap={'xs'}>
|
||||||
</div>
|
<Title order={3}>Info Wabah/Penyakit</Title>
|
||||||
|
<Tabs defaultValue="create" color={colors['blue-button']} variant='pills'>
|
||||||
|
<TabsList mb={10} bg={colors['BG-trans']} p={'xs'}>
|
||||||
|
<TabsTab value="create" >
|
||||||
|
Tambah Info Wabah/Penyakit
|
||||||
|
</TabsTab>
|
||||||
|
<TabsTab value="list" >
|
||||||
|
List Info Wabah/Penyakit
|
||||||
|
</TabsTab>
|
||||||
|
</TabsList>
|
||||||
|
|
||||||
|
<TabsPanel value="create">
|
||||||
|
<CreateInfoWabahPenyakit/>
|
||||||
|
</TabsPanel>
|
||||||
|
|
||||||
|
<TabsPanel value="list">
|
||||||
|
<ListInfoWabahPenyakit/>
|
||||||
|
</TabsPanel>
|
||||||
|
</Tabs>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
import { Box, Paper, Stack, Table, TableTbody, TableTh, TableThead, TableTr, Title } from '@mantine/core';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
function ListInfoWabahPenyakit() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'} radius={10}>
|
||||||
|
<Stack gap={'xs'}>
|
||||||
|
<Title order={3}>List Info Wabah/Penyakit</Title>
|
||||||
|
<Box>
|
||||||
|
<Table striped withTableBorder withColumnBorders withRowBorders>
|
||||||
|
<TableThead>
|
||||||
|
<TableTr>
|
||||||
|
<TableTh>Image</TableTh>
|
||||||
|
<TableTh>Nama Info Wabah/Penyakit</TableTh>
|
||||||
|
<TableTh>Deskripsi Info Wabah/Penyakit</TableTh>
|
||||||
|
<TableTh>Aksi</TableTh>
|
||||||
|
<TableTh>Detail</TableTh>
|
||||||
|
</TableTr>
|
||||||
|
</TableThead>
|
||||||
|
<TableTbody>
|
||||||
|
|
||||||
|
</TableTbody>
|
||||||
|
</Table>
|
||||||
|
</Box>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ListInfoWabahPenyakit;
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Button, Group, Paper, SimpleGrid, Stack, Text, TextInput, Title } from '@mantine/core';
|
||||||
|
import { IconImageInPicture } from '@tabler/icons-react';
|
||||||
|
import React from 'react';
|
||||||
|
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
||||||
|
|
||||||
|
function CreateInfoWabahPenyakit() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Stack gap={'xs'}>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<Title order={4}>Tambah Info Wabah/Penyakit</Title>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"sm"}>Masukkan Image</Text>
|
||||||
|
<IconImageInPicture size={50} />
|
||||||
|
</Box>
|
||||||
|
<TextInput
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Nama Info Wabah/Penyakit</Text>}
|
||||||
|
placeholder='Masukkan nama info wabah/penyakit'
|
||||||
|
/>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"sm"}>Deskripsi Info Wabah/Penyakit</Text>
|
||||||
|
<KesehatanEditor
|
||||||
|
showSubmit={false}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Group>
|
||||||
|
<Button bg={colors['blue-button']}>Submit</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
</SimpleGrid>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default CreateInfoWabahPenyakit;
|
||||||
@@ -1,10 +1,34 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import CreateKontakDarurat from './ui/tambah_kontak_darurat/page';
|
||||||
|
import ListKontakDarurat from './ui/list_kontak_darurat/page';
|
||||||
|
|
||||||
function Page() {
|
function Page() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<Box>
|
||||||
Kontak Darurat
|
<Stack gap={'xs'}>
|
||||||
</div>
|
<Title order={3}>Kontak Darurat</Title>
|
||||||
|
<Tabs defaultValue="create" color={colors['blue-button']} variant='pills'>
|
||||||
|
<TabsList mb={10} bg={colors['BG-trans']} p={'xs'}>
|
||||||
|
<TabsTab value="create" >
|
||||||
|
Tambah Kontak Darurat
|
||||||
|
</TabsTab>
|
||||||
|
<TabsTab value="list" >
|
||||||
|
List Kontak Darurat
|
||||||
|
</TabsTab>
|
||||||
|
</TabsList>
|
||||||
|
|
||||||
|
<TabsPanel value="create">
|
||||||
|
<CreateKontakDarurat />
|
||||||
|
</TabsPanel>
|
||||||
|
|
||||||
|
<TabsPanel value="list">
|
||||||
|
<ListKontakDarurat/>
|
||||||
|
</TabsPanel>
|
||||||
|
</Tabs>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
import { Box, Paper, Stack, Table, TableTbody, TableTh, TableThead, TableTr, Title } from '@mantine/core';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
function ListKontakDarurat() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'} radius={10}>
|
||||||
|
<Stack gap={'xs'}>
|
||||||
|
<Title order={3}>List Kontak Darurat</Title>
|
||||||
|
<Box>
|
||||||
|
<Table striped withTableBorder withColumnBorders withRowBorders>
|
||||||
|
<TableThead>
|
||||||
|
<TableTr>
|
||||||
|
<TableTh>Image</TableTh>
|
||||||
|
<TableTh>Nama Kontak Darurat</TableTh>
|
||||||
|
<TableTh>Deskripsi Kontak Darurat</TableTh>
|
||||||
|
<TableTh>Aksi</TableTh>
|
||||||
|
<TableTh>Detail</TableTh>
|
||||||
|
</TableTr>
|
||||||
|
</TableThead>
|
||||||
|
<TableTbody>
|
||||||
|
|
||||||
|
</TableTbody>
|
||||||
|
</Table>
|
||||||
|
</Box>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ListKontakDarurat;
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Button, Group, Paper, SimpleGrid, Stack, Text, TextInput, Title } from '@mantine/core';
|
||||||
|
import { IconImageInPicture } from '@tabler/icons-react';
|
||||||
|
import React from 'react';
|
||||||
|
import { KesehatanEditor } from '../../../_com/kesehatanEditor';
|
||||||
|
|
||||||
|
function CreateKontakDarurat() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Stack gap={'xs'}>
|
||||||
|
<SimpleGrid cols={{ base: 1, md: 2 }}>
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<Title order={4}>Tambah Kontak Darurat</Title>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"sm"}>Masukkan Image</Text>
|
||||||
|
<IconImageInPicture size={50} />
|
||||||
|
</Box>
|
||||||
|
<TextInput
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Nama Kontak Darurat</Text>}
|
||||||
|
placeholder='Masukkan nama kontak darurat'
|
||||||
|
/>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"sm"}>Deskripsi Kontak Darurat</Text>
|
||||||
|
<KesehatanEditor
|
||||||
|
showSubmit={false}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Group>
|
||||||
|
<Button bg={colors['blue-button']}>Submit</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
</SimpleGrid>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default CreateKontakDarurat;
|
||||||
@@ -1,10 +1,34 @@
|
|||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import CreatePenangananDarurat from './ui/tambah_penanganan_darurat/page';
|
||||||
|
import ListPenangananDarurat from './ui/list_penanganan_darurat/page';
|
||||||
|
|
||||||
function Page() {
|
function Page() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<Box>
|
||||||
Penanganan Darurat
|
<Stack gap={'xs'}>
|
||||||
</div>
|
<Title order={3}>Penanganan Darurat</Title>
|
||||||
|
<Tabs defaultValue="create" color={colors['blue-button']} variant='pills'>
|
||||||
|
<TabsList mb={10} bg={colors['BG-trans']} p={'xs'}>
|
||||||
|
<TabsTab value="create" >
|
||||||
|
Tambah Penanganan Darurat
|
||||||
|
</TabsTab>
|
||||||
|
<TabsTab value="list" >
|
||||||
|
List Penanganan Darurat
|
||||||
|
</TabsTab>
|
||||||
|
</TabsList>
|
||||||
|
|
||||||
|
<TabsPanel value="create">
|
||||||
|
<CreatePenangananDarurat/>
|
||||||
|
</TabsPanel>
|
||||||
|
|
||||||
|
<TabsPanel value="list">
|
||||||
|
<ListPenangananDarurat/>
|
||||||
|
</TabsPanel>
|
||||||
|
</Tabs>
|
||||||
|
</Stack>
|
||||||
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
import { Box, Paper, Stack, Table, TableTbody, TableTh, TableThead, TableTr, Title } from '@mantine/core';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
function ListPenangananDarurat() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'} radius={10}>
|
||||||
|
<Stack gap={'xs'}>
|
||||||
|
<Title order={3}>List Penanganan Darurat</Title>
|
||||||
|
<Box>
|
||||||
|
<Table striped withTableBorder withColumnBorders withRowBorders>
|
||||||
|
<TableThead>
|
||||||
|
<TableTr>
|
||||||
|
<TableTh>Image</TableTh>
|
||||||
|
<TableTh>Nama Penanganan Darurat</TableTh>
|
||||||
|
<TableTh>Deskripsi Penanganan Darurat</TableTh>
|
||||||
|
<TableTh>Aksi</TableTh>
|
||||||
|
<TableTh>Detail</TableTh>
|
||||||
|
</TableTr>
|
||||||
|
</TableThead>
|
||||||
|
<TableTbody>
|
||||||
|
|
||||||
|
</TableTbody>
|
||||||
|
</Table>
|
||||||
|
</Box>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ListPenangananDarurat;
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user