yazid138 3 éve
szülő
commit
8a458af50e

+ 9 - 0
actions/pelanggaran.js

@@ -0,0 +1,9 @@
+export const getPelanggaran = async () => {
+	try {
+		const res = await fetch("http://localhost:5000/pelanggaran");
+		return await res.json();
+	} catch (error) {
+		console.log("error", error);
+		return false;
+	}
+};

+ 0 - 10
actions/pelaporan.js

@@ -10,13 +10,3 @@ export const getPelaporan = async (query = {}) => {
 		return false;
 	}
 };
-
-// export const getPelaporanJadwal = async () => {
-// 	try {
-// 		const res = await fetch("http://localhost:5000/pelaporan?penjadwalan=true");
-// 		return await res.json();
-// 	} catch (error) {
-// 		console.log("error", error);
-// 		return false;
-// 	}
-// };

+ 121 - 77
components/Layout/Menu.js

@@ -1,81 +1,125 @@
 const Menu = [
-    {
-        heading: 'Main Navigation',
-        translate: 'sidebar.heading.HEADER'
-    },
-    {
-        name: 'Perbaikan & Keberatan',
-        path: '/app/pt.sanksi',
-        icon : 'icon-grid',
-        translate: 'sidebar.nav.USERVIEW'
-    },
-    {
-        name: 'Login',
-        path: '/login',
-        icon: 'icon-login',
-        translate: 'sidebar.nav.LOGIN'
-    },
-    {
-        name: 'Pelaporan',
-        path: '/app/pelaporan',
-        icon: 'icon-notebook',
-        translate: 'sidebar.nav.PELAPORAN'
-    },
-    {
-        name: 'Penjadwalan Evaluasi',
-        path: '/app/penjadwalan',
-        icon: 'icon-notebook',
-        translate: 'sidebar.nav.PENJADWALAN'
-    },
-    {
-        name: 'Pemeriksaan',
-        path: '/app/pemeriksaan',
-        icon: 'icon-notebook',
-        translate: 'sidebar.nav.PEMERIKSAAN'
-    },
-    {
-        name: 'Sanksi',
-        path: '/app/sanksi',
-        icon: 'icon-notebook',
-        translate: 'sidebar.nav.SANKSI'
-    },
-    // {
-    //     name: 'Project',
-    //     path: '/app/projects',
-    //     icon: 'icon-notebook',
-    //     translate: 'sidebar.nav.PROJECT'
-    // },
-    // {
-    //     name: 'Project Detail',
-    //     path: '/app/projectdetails',
-    //     icon: 'icon-note',
-    //     translate: 'sidebar.nav.PROJECTDETAIL'
-    // },
-    {
-        name: 'Pencarian',
-        path: '/app/search',
-        icon: 'icon-note',
-        translate: 'sidebar.nav.SEARCH'
-    },
-    {
-        name: 'FAQ',
-        path: '/app/faq',
-        //icon: 'icon-notebook',
-        translate: 'sidebar.nav.FAQ'
-    },
-    // {
-    //     name: 'Todo',
-    //     path: '/app/calendar',
-    //     //icon: 'icon-notebook',
-    //     translate: 'sidebar.nav.TODO'
-    // },
-    {
-        name: 'User List',
-        path: '/app/userlist',
-        //icon: 'icon-notebook',
-        translate: 'sidebar.nav.USERLIST'
-    }
+	{
+		heading: "Main Navigation",
+		translate: "sidebar.heading.HEADER",
+	},
+	{
+		name: "Perbaikan & Keberatan",
+		path: "/app/pt.sanksi",
+		icon: "icon-grid",
+		translate: "sidebar.nav.USERVIEW",
+	},
+	{
+		name: "Login",
+		path: "/login",
+		icon: "icon-login",
+		translate: "sidebar.nav.LOGIN",
+	},
+	{
+		name: "Pelaporan",
+		path: "/app/pelaporan",
+		icon: "icon-notebook",
+		translate: "sidebar.nav.PELAPORAN",
+	},
+	{
+		name: "Penjadwalan Evaluasi",
+		path: "/app/penjadwalan",
+		icon: "icon-notebook",
+		translate: "sidebar.nav.PENJADWALAN",
+	},
+	{
+		name: "Pemeriksaan",
+		path: "/app/pemeriksaan",
+		icon: "icon-notebook",
+		translate: "sidebar.nav.PEMERIKSAAN",
+	},
+	{
+		name: "Sanksi",
+		path: "/app/sanksi",
+		icon: "icon-notebook",
+		translate: "sidebar.nav.SANKSI",
+	},
+	{
+		name: "Pencarian",
+		path: "/app/search",
+		icon: "icon-note",
+		translate: "sidebar.nav.SEARCH",
+	},
+	{
+		name: "Perguruan Tinggi",
+		icon: "icon-graduation",
+		translate: "sidebar.nav.DASHBOARD",
+		submenu: [
+			{
+				name: "Pemantauan",
+				path: "/dashboard/dashboardv1",
+			},
+			{
+				name: "1.a Permohonan Keberatan",
+				path: "/dashboard/dashboardv1",
+			},
+			{
+				name: "1.b Jawaban atas permohonan keberatan",
+				path: "/dashboard/dashboardv1",
+			},
+			{
+				name: "1.c Jawaban atas permohonan banding",
+				path: "/dashboard/dashboardv1",
+			},
+			{
+				name: "Dokumen Perbaikan",
+				path: "/dashboard/dashboardv2",
+			},
+			{
+				name: "Permohonan Pencabutan Sanksi",
+				path: "/dashboard/dashboardv3",
+			},
+			{
+				name: "Jawaban Permohonan Pencabutan Sanksi",
+				path: "/dashboard/dashboardv3",
+			},
+		],
+	},
+	{
+		name: "Bukan PT",
+		icon: "icon-user",
+		translate: "sidebar.nav.DASHBOARD",
+		submenu: [
+			{
+				name: "Pemantauan",
+				path: "/dashboard/dashboardv1",
+			},
+			{
+				name: "Keberatan",
+				path: "/dashboard/dashboardv2",
+			},
+			{
+				name: "Banding",
+				path: "/dashboard/dashboardv3",
+			},
+			{
+				name: "Pemantauan Perbaikan",
+				path: "/dashboard/dashboardv3",
+			},
+			{
+				name: "Pencabutan Sanksi",
+				path: "/dashboard/dashboardv3",
+			},
+		],
+	},
+	// {
+	// 	name: "FAQ",
+	// 	path: "/app/faq",
+	// 	icon: "icon-notebook",
+	// 	translate: "sidebar.nav.FAQ",
+	// },
+	// {
+	// 	name: "User List",
+	// 	path: "/app/userlist",
+	// 	icon: "icon-notebook",
+	// 	translate: "sidebar.nav.USERLIST",
+	// },
 ];
 
 export default Menu;
-``
+``;

+ 0 - 675
pages/app/pelaporan.new.js

@@ -1,675 +0,0 @@
-import React, { Component } from "react";
-import Router from "next/router";
-import { connect } from "react-redux";
-import { listPelaporan, createPelaporan } from "../../store/actions/pelaporan";
-
-import ContentWrapper from "@/components/Layout/ContentWrapper";
-import Select from "react-select";
-import {
-	Row,
-	Col,
-	Card,
-	CardHeader,
-	CardBody,
-	FormGroup,
-	FormFeedback,
-	FormText,
-	Label,
-	InputGroup,
-	InputGroupAddon,
-	InputGroupButtonDropdown,
-	InputGroupText,
-	Input,
-	Button,
-	DropdownToggle,
-	DropdownMenu,
-	CustomInput,
-	DropdownItem,
-} from "reactstrap";
-
-const styleHeaderText = {
-	color: "brown",
-};
-
-let Dropzone = null;
-class DropzoneWrapper extends Component {
-	state = {
-		isClient: false,
-	};
-	componentDidMount = () => {
-		Dropzone = require("react-dropzone").default;
-		this.setState({ isClient: true });
-	};
-	render() {
-		return Dropzone ? <Dropzone {...this.props}>{this.props.children}</Dropzone> : null;
-	}
-}
-
-const selectInstanceId = 1;
-const tbljenisPelanggaran = [
-	{
-		idPelanggaran: 0,
-		Pelanggaran: "Tidak Ada",
-		Sangsi: "Tanpa Sangsi",
-		KeteranganSangsi: "-",
-		LevelSangsi: 0,
-		LabelSangsi: "Tidak ada",
-		checked: false,
-		TMTBulan: 0,
-	},
-	{
-		idPelanggaran: 1,
-		Pelanggaran: "Pemimpin perguruan tinggi tidak melindungi dan memfasilitasi pelaksanaan kebebasan akademik,kebebasan mimbar akademik, dan otonomi keilmuan di perguruan tinggi",
-		Sangsi: "Peringatan Tertulis",
-		KeteranganSangsi: "-",
-		LevelSangsi: 1,
-		LabelSangsi: "Ringan",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 2,
-		Pelanggaran: "Perguruan tinggi tidak memuat mata kuliah agama,Pancasila, kewarganegaraan, dan bahasa Indonesia dalam kurikulumnya",
-		Sangsi: "Peringatan Tertulis",
-		KeteranganSangsi: "-",
-		LevelSangsi: 1,
-		LabelSangsi: "Ringan",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 3,
-		Pelanggaran: "Perguruan tinggi tidak menggunakan bahasa Indonesia sebagai bahasa pengantar utama",
-		Sangsi: "Peringatan Tertulis",
-		KeteranganSangsi: "-",
-		LevelSangsi: 1,
-		LabelSangsi: "Ringan",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 4,
-		Pelanggaran:
-			"Perguruan tinggi tidak menyebarluaskan hasil penelitian dengan cara diseminarkan, dipublikasikan, dan/atau dipatenkan, kecuali hasil penelitian yang bersifat rahasia, mengganggu, dan/atau membahayakan kepentingan umum",
-		Sangsi: "Peringatan Tertulis",
-		KeteranganSangsi: "",
-		LevelSangsi: 1,
-		LabelSangsi: "Ringan",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 5,
-		Pelanggaran: "PTN tidak menerima calon Mahasiswa yang telah memenuhi persyaratan akademik dan lolos seleksi penerimaan Mahasiswa secara nasional",
-		Sangsi: "Peringatan Tertulis",
-		KeteranganSangsi: "",
-		LevelSangsi: 1,
-		LabelSangsi: "Ringan",
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 6,
-		Pelanggaran:
-			"PTN tidak mencari dan menjaring calon Mahasiswa yang memiliki potensi akademik tinggi, tetapi kurang mampu secara ekonomi dan calon Mahasiswa dari daerah terdepan, terluar, dan tertinggal untuk diterima paling sedikit 20% (dua puluh persen) dari seluruh Mahasiswa baru yang diterima dan tersebar pada semua Program Studi",
-		Sangsi: "Peringatan Tertulis",
-		KeteranganSangsi: "",
-		LevelSangsi: 1,
-		LabelSangsi: "Ringan",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 7,
-		Pelanggaran: "Perguruan tinggi tidak memenuhi hak Mahasiswa yang kurang mampu secara ekonomi untuk dapat menyelesaikan studinya sesuai dengan peraturan akademik",
-		Sangsi: "Peringatan Tertulis",
-		KeteranganSangsi: "",
-		LevelSangsi: 1,
-		LabelSangsi: "Ringan",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 8,
-		Pelanggaran: "Perguruan tinggi memberi gelar yang tidak menggunakan bahasa Indonesia",
-		Sangsi: "Peringatan Tertulis",
-		KeteranganSangsi: "",
-		LevelSangsi: 1,
-		LabelSangsi: "Ringan",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 9,
-		Pelanggaran: "Pemimpin perguruan tinggi tidak melindungi dan memfasilitasi pengelolaan di bidang non akademik",
-		Sangsi: "Peringatan Tertulis",
-		KeteranganSangsi: "",
-		LevelSangsi: 1,
-		LabelSangsi: "Ringan",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 10,
-		Pelanggaran: "Perguruan tinggi tidak mengumumkan ringkasan laporan tahunan kepada masyarakat",
-		Sangsi: "Peringatan Tertulis",
-		KeteranganSangsi: "",
-		LevelSangsi: 1,
-		LabelSangsi: "Ringan",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 11,
-		Pelanggaran: "Perguruan tinggi memiliki Dosen tetap kurang dari 5 (lima) orang untuk setiap Program Studi",
-		Sangsi: "Peringatan Tertulis",
-		KeteranganSangsi: "",
-		LevelSangsi: 1,
-		LabelSangsi: "Ringan",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 12,
-		Pelanggaran: "Perguruan tinggi tidak memenuh  nisbah Dosen dan Mahasiswa sesuai dengan ketentuan peraturan perundang-undangan",
-		Sangsi: "Peringatan Tertulis",
-		KeteranganSangsi: "",
-		LevelSangsi: 1,
-		LabelSangsi: "Ringan",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 13,
-		Pelanggaran: "Perguruan tinggi tidak melakukan pelaporan secara berkala ke pangkalan data Pendidikan Tinggi",
-		Sangsi: "Peringatan Tertulis",
-		KeteranganSangsi: "",
-		LevelSangsi: 1,
-		LabelSangsi: "Ringan",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 14,
-		Pelanggaran: "Program sarjana memiliki Dosen yang tidak berkualifikasi akademik minimum lulusan program magister atau sederajat",
-		Sangsi: "Penghentian sementara bantuan biaya pendidikan dari pemerintahan pusat",
-		KeteranganSangsi: "Berupa penundaan pemberian bantuan keuangan, hibah, dan/atau bentuk bantuan lain bagi perguruan tinggi",
-		LevelSangsi: 2,
-		LabelSangsi: "Sedang",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 15,
-		Pelanggaran: "Program magister memiliki Dosen yang tidak berkualifikasi akademik lulusan program doktor atau sederajat",
-		Sangsi: "Penghentian sementara kegiatan penyelenggaraan pendidikan",
-		KeteranganSangsi: "Penghentian sementara penerimaan Mahasiswa baru",
-		LevelSangsi: 2,
-		LabelSangsi: "Sedang",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 16,
-		Pelanggaran: "Program doktor memiliki Dosen yang tidak berkualifikasi akademik lulusan program doktor atau sederajat",
-		Sangsi: "Penghentian sementara kegiatan penyelenggaraan pendidikan",
-		KeteranganSangsi: "Penundaan proses usul pembukaan Program Studi baru",
-		LevelSangsi: 2,
-		LabelSangsi: "Sedang",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 17,
-		Pelanggaran: "Program diploma memiliki Dosen yang tidak berkualifikasi akademik minimum lulusan program magister atau sederajat",
-		Sangsi: "Penghentian sementara kegiatan penyelenggaraan pendidikan",
-		KeteranganSangsi: "Penundaan pelaksanaan akreditasi",
-		LevelSangsi: 2,
-		LabelSangsi: "Sedang",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 18,
-		Pelanggaran: "Program magister terapan memiliki Dosen yang tidak berkualifikasi akademik lulusan program doktor atau sederajat",
-		Sangsi: "Penghentian sementara kegiatan penyelenggaraan pendidikan",
-		KeteranganSangsi: "Penundaan pelaksanaan akreditasi",
-		LevelSangsi: 2,
-		LabelSangsi: "Sedang",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 19,
-		Pelanggaran: "Program doktor terapan memiliki Dosen yang tidak berkualifikasi akademik lulusan program doktor atau sederajat",
-		Sangsi: "Penghentian sementara kegiatan penyelenggaraan pendidikan",
-		KeteranganSangsi: "Penundaan pelaksanaan akreditasi",
-		LevelSangsi: 2,
-		LabelSangsi: "Sedang",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 20,
-		Pelanggaran: "Program profesi memiliki Dosen yang tidak berkualifikasi akademik minimum lulusan profesi dan/atau lulusan program magister atau sederajat dengan pengalaman kerja paling singkat 2 (dua) tahun",
-		Sangsi: "Penghentian sementara kegiatan penyelenggaraan pendidikan",
-		KeteranganSangsi: "Penundaan pelaksanaan akreditasi",
-		LevelSangsi: 2,
-		LabelSangsi: "Sedang",
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 21,
-		Pelanggaran: "Program spesialis memiliki Dosen yang tidak berkualifikasi akademik minimum lulusan program spesialis dan/atau lulusan program doktor atau sederajat dengan pengalaman kerja paling singkat 2 (dua) tahun",
-		Sangsi: "Penghentian sementara kegiatan penyelenggaraan pendidikan",
-		KeteranganSangsi: "Penundaan pelaksanaan akreditasi",
-		LevelSangsi: 2,
-		LabelSangsi: "Sedang",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 22,
-		Pelanggaran: "Perguruan tinggi tidak mencabut gelar akademik, gelar vokasi, atau gelar profesi apabila karya ilmiah yang digunakan untuk memperoleh gelar akademik, gelar vokasi, atau gelar profesi terbukti merupakan hasil plagiat",
-		Sangsi: "Penghentian sementara kegiatan penyelenggaraan pendidikan",
-		KeteranganSangsi: "Penundaan pelaksanaan akreditasi",
-		LevelSangsi: 2,
-		LabelSangsi: "Sedang",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 23,
-		Pelanggaran: "Perguruan tinggi tidak menyediakan, memfasilitasi, memiliki Sumber Belajar sesuai dengan Program Studi yang dikembangkan",
-		Sangsi: "Penghentian sementara kegiatan penyelenggaraan pendidikan",
-		KeteranganSangsi: "Penundaan pelaksanaan akreditasi",
-		LevelSangsi: 2,
-		LabelSangsi: "Sedang",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 24,
-		Pelanggaran: "Perguruan tinggi tidak memiliki statuta",
-		Sangsi: "Penghentian sementara kegiatan penyelenggaraan pendidikan",
-		KeteranganSangsi: "Penundaan pelaksanaan akreditasi",
-		LevelSangsi: 2,
-		LabelSangsi: "Sedang",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 25,
-		Pelanggaran: "Perguruan tinggi tidak memiliki panduan/prosedur peralihan dan perolehan satuan kredit semester serta rekognisi pembelajaran lampau",
-		Sangsi: "Penghentian sementara kegiatan penyelenggaraan pendidikan",
-		KeteranganSangsi: "Penundaan pelaksanaan akreditasi",
-		LevelSangsi: 2,
-		LabelSangsi: "Sedang",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 26,
-		Pelanggaran: "Perguruan tinggi melaporkan data yang tidak valid ke PDDIKTI",
-		Sangsi: "Penghentian sementara kegiatan penyelenggaraan pendidikan",
-		KeteranganSangsi: "Penundaan pelaksanaan akreditasi",
-		LevelSangsi: 2,
-		LabelSangsi: "Sedang",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 27,
-		Pelanggaran: "Perguruan tinggi yang menyelenggarakan kegiatan akademik yang tidak sesuai dengan seluruh Standar Nasional Pendidikan Tinggi",
-		Sangsi: "Penghentian sementara kegiatan penyelenggaraan pendidikan",
-		KeteranganSangsi: "Penundaan pelaksanaan akreditasi",
-		LevelSangsi: 2,
-		LabelSangsi: "Sedang",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 28,
-		Pelanggaran: "Badan Penyelenggara tidak memberikan gaji pokok serta tunjangan kepada Dosen dan tenaga kependidikan sesuai dengan ketentuan peraturan perundang-undangan",
-		Sangsi: "Penghentian sementara kegiatan penyelenggaraan pendidikan",
-		KeteranganSangsi: "Penundaan pelaksanaan akreditasi",
-		LevelSangsi: 2,
-		LabelSangsi: "Sedang",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 29,
-		Pelanggaran: "Perguruan tinggi dan/atau Program Studi yang tidak terakreditasi mengeluarkan gelar akademik, gelar vokasi, dan/atau gelar profesi",
-		Sangsi: "Penghentian pembinaan",
-		KeteranganSangsi: "Penghentian bantuan keuangan, hibah, dan/atau bentuk bantuan lain yang diperuntukkan bagi perguruan tinggi",
-		LevelSangsi: 3,
-		LabelSangsi: "Berat",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 30,
-		Pelanggaran: "Perguruan tinggi dan/atau Program Studi memberikan ijazah, gelar akademik, gelar vokasi, dan/atau gelar profesi kepada orang yang tidak berhak",
-		Sangsi: "Penghentian pembinaan",
-		KeteranganSangsi: "Penghentian layanan Pemerintah Pusat bagi perguruan tinggi",
-		LevelSangsi: 3,
-		LabelSangsi: "Berat",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 31,
-		Pelanggaran: "Perguruan tinggi tidak mengusulkan akreditasi ulang Program Studi sebagaimana ditentukan dalam peraturan perundang-undangan",
-		Sangsi: "Penghentian pembinaan",
-		KeteranganSangsi: "Penghentian penerimaan Mahasiswa baru",
-		LevelSangsi: 3,
-		LabelSangsi: "Berat",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 32,
-		Pelanggaran: "Perguruan tinggi lembaga negara lain yang menyelenggarakan pendidikan di wilayah Negara Kesatuan Republik Indonesia yang tidak sesuai dengan ketentuan peraturan perundang-undangan",
-		Sangsi: "Penghentian pembinaan",
-		KeteranganSangsi: "Larangan melakukan wisuda",
-		LevelSangsi: 3,
-		LabelSangsi: "Berat",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 33,
-		Pelanggaran: "Perguruan tinggi melakukan penerimaan Mahasiswa baru dengan tujuan komersial",
-		Sangsi: "Penghentian pembinaan",
-		KeteranganSangsi: "Penghentian proses usul pembukaan Program Studi baru",
-		LevelSangsi: 3,
-		LabelSangsi: "Berat",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 34,
-		Pelanggaran: "Pengelolaan perguruan tinggi tidak berprinsip nirlaba",
-		Sangsi: "Penghentian pembinaan",
-		KeteranganSangsi: "Penarikan Dosen Pegawai Negeri Sipil yang dipekerjakan",
-		LevelSangsi: 3,
-		LabelSangsi: "Berat",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 35,
-		Pelanggaran: "Perguruan tinggi dan/atau Badan Penyelenggara melakukan perubahan nama perguruan tinggi, nama dan/atau bentuk Badan Penyelenggara, dan/atau lokasi Kampus Utama PTS tanpa izin dari Menteri",
-		Sangsi: "Pencabutan izin Program Studi",
-		KeteranganSangsi: "",
-		LevelSangsi: 3,
-		LabelSangsi: "Berat",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 36,
-		Pelanggaran: "Perguruan tinggi menyelenggarakan Program Studi tanpa izin dari Menteri",
-		Sangsi: "Pembubaran PTN atau pencabutan izin PTS",
-		KeteranganSangsi: "",
-		LevelSangsi: 3,
-		LabelSangsi: "Berat",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 37,
-		Pelanggaran: "Perguruan tinggi menyelenggarakan PJJ tanpa izin dari Menteri",
-		Sangsi: "Pembubaran PTN atau pencabutan izin PTS",
-		KeteranganSangsi: "",
-		LevelSangsi: 3,
-		LabelSangsi: "Berat",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 38,
-		Pelanggaran: "Perguruan tinggi dan/atau Program Studi tidak lagi memenuhi syarat pendirian perguruan tinggi dan/atau pembukaan Program Studi",
-		Sangsi: "Pembubaran PTN atau pencabutan izin PTS",
-		KeteranganSangsi: "",
-		LevelSangsi: 3,
-		LabelSangsi: "Berat",
-		checked: false,
-		TMTBulan: 6,
-	},
-	{
-		idPelanggaran: 39,
-		Pelanggaran: "Terjadi sengketa",
-		Sangsi: "Pembubaran PTN atau pencabutan izin PTS",
-		KeteranganSangsi: "",
-		LevelSangsi: 3,
-		LabelSangsi: "Berat",
-		checked: false,
-		TMTBulan: 6,
-	},
-];
-
-const selectJenisPelangaran = tbljenisPelanggaran.map((e) => {
-	return { value: e.idPelanggaran, label: e.Pelanggaran, className: "State-ACT" };
-});
-
-class FormStandard extends Component {
-	constructor(props) {
-		super(props);
-		this.state = {
-			dropdownOpen: false,
-			splitButtonOpen: false,
-			selectedOptionMulti: [],
-			stat: "Waiting to add files..",
-			pelaporanNumber: Math.floor(Date.now() * Math.random()),
-			keteranganLaporan: "",
-			files: [],
-		};
-	}
-
-	static getInitialProps({ query }) {
-		return { query };
-	}
-
-	setKeteranganPelaporan = (e) => {
-		this.setState({ keteranganLaporan: e.target.value });
-	};
-
-	toggleDropDown = () => {
-		this.setState({
-			dropdownOpen: !this.state.dropdownOpen,
-		});
-	};
-
-	toggleSplit = () => {
-		this.setState({
-			splitButtonOpen: !this.state.splitButtonOpen,
-		});
-	};
-
-	handleChangeSelectMulti = (selectedOptionMulti) => {
-		this.setState({ selectedOptionMulti });
-	};
-
-	onDrop = (files) => {
-		this.setState({
-			files: files.map((file) =>
-				Object.assign(file, {
-					preview: URL.createObjectURL(file),
-				})
-			),
-			stat: "Added " + files.length + " file(s)",
-		});
-	};
-
-	uploadFiles = (e) => {
-		e.preventDefault();
-		e.stopPropagation();
-		this.setState({
-			stat: this.state.files.length ? "Dropzone ready to upload " + this.state.files.length + " file(s)" : "No files added.",
-		});
-	};
-
-	clearFiles = (e) => {
-		e.preventDefault();
-		e.stopPropagation();
-		this.setState({
-			stat: this.state.files.length ? this.state.files.length + " file(s) cleared." : "No files to clear.",
-		});
-		this.setState({
-			files: [],
-		});
-	};
-
-	onSubmit = async (e) => {
-		e.preventDefault();
-		const formdata = new FormData();
-		formdata.append("number", this.state.pelaporanNumber);
-		formdata.append("pt_id", this.props.query.ptId);
-		formdata.append("description", this.state.keteranganLaporan);
-		formdata.append("pelanggaran_id", this.state.selectedOptionMulti.map((e) => e.value).join());
-		if (this.state.files.length > 0) {
-			this.state.files.forEach((e) => {
-				formdata.append("files", e);
-			});
-		}
-
-		await this.props.dispatch(createPelaporan(formdata));
-		this.props.dispatch(listPelaporan());
-		if (this.props.pelaporanCreate.success) {
-			this.props.dispatch({ type: "PELAPORAN_CREATE_RESET" });
-			Router.push({
-				pathname: "/app/pelaporan",
-			});
-		}
-	};
-
-	render() {
-		const { selectedOptionMulti, files } = this.state;
-
-		const thumbs = files.map((file, index) => (
-			<Col md={3} key={index}>
-				<img className="img-fluid mb-2" src={file.preview} alt="Item" />
-			</Col>
-		));
-		return (
-			<ContentWrapper unwrap>
-				<div className="bg-cover" style={{ backgroundImage: "url(/static/img/profile-bg.png)" }}>
-					<div className="p-4 text-center" style={styleHeaderText}>
-						<img className="img-thumbnail rounded-circle thumb128" src="/static/img/univ-avatar.png" alt="Avatar" />
-						<h3 className="m-0">Universitas Satyagama</h3>
-						<p>0742/O/1990</p>
-						<p>Jalan Kamal Raya No 2-A Cengkareng</p>
-					</div>
-				</div>
-				<div className="p-3">
-					<div className="content-heading">
-						<div>
-							Pelaporan Baru
-							<small>Form pembuatan laporan baru v.0.1</small>
-						</div>
-					</div>
-					<Row>
-						<Col xl="9">
-							{/* START card */}
-							<Card className="card-default">
-								<CardHeader>
-									<label>Informasi Laporan</label>
-								</CardHeader>
-								<CardBody>
-									<form className="form-horizontal" method="get" action="/" onSubmit={this.onSubmit}>
-										{/* <fieldset> */}
-										<FormGroup row>
-											<label className="col-md-2 col-form-label">Nomor Pelaporan</label>
-											<div className="col-md-10">
-												<Input type="text" disabled value={this.state.pelaporanNumber} />
-												<span className="form-text">Nomor pelaporan akan digenerate otomatis dari sistem</span>
-											</div>
-										</FormGroup>
-										{/* </fieldset> */}
-										<FormGroup row>
-											<label className="col-md-2 col-form-label">Jenis Pelanggaran</label>
-											<div className="col-md-10">
-												<Select instanceId={selectInstanceId + 1} isMulti value={selectedOptionMulti} onChange={this.handleChangeSelectMulti} options={selectJenisPelangaran} required />
-												<span className="form-text">Pilih Jenis Pelanggaran</span>
-											</div>
-										</FormGroup>
-										<FormGroup row>
-											<label className="col-md-2 col-form-label">Keterangan Laporan</label>
-											<div className="col-md-10">
-												<Input type="textarea" value={this.state.keteranganLaporan} onChange={this.setKeteranganPelaporan} required />
-												{/* <textarea class="form-control" id="inputContact6" row="3">Some nice Street, 1234</textarea> */}
-												<span className="form-text">Deskripsi pelaporan minimum karakter 50 maksimum 200 karakter</span>
-											</div>
-										</FormGroup>
-										<FormGroup row>
-											<label className="col-md-2 col-form-label">Upload File Pendukung</label>
-											<div className="col-md-10">
-												{/* <Input type="file" multiple name="files" className="custom-file-input" /> */}
-												{/* <CustomInput type="file" multiple id="files" onChange={this.filesHandler} /> */}
-												{/* <span className="form-text">Multiple files upload</span> */}
-												<DropzoneWrapper className="" onDrop={this.onDrop}>
-													{({ getRootProps, getInputProps, isDragActive }) => {
-														return (
-															<div {...getRootProps()} className={"dropzone card p-3 " + (isDragActive ? "dropzone-drag-active" : "")}>
-																<input {...getInputProps()} />
-																<div className="dropzone-previews flex">
-																	{this.state.files.length > 0 ? <Row>{thumbs}</Row> : <div className="text-center dz-default dz-message">Drop files here to upload</div>}
-																</div>
-																<div className="d-flex align-items-center">
-																	<small className="ml-auto">
-																		<button type="button" className="btn btn-link" onClick={this.clearFiles}>
-																			Clear files
-																		</button>
-																	</small>
-																</div>
-															</div>
-														);
-													}}
-												</DropzoneWrapper>
-											</div>
-										</FormGroup>
-										<FormGroup row>
-											<div className="col-xl-10">
-												<button className="btn btn-sm btn-primary" type="submit">
-													Submit Laporan
-												</button>
-											</div>
-										</FormGroup>
-									</form>
-								</CardBody>
-							</Card>
-							{/* END card */}
-						</Col>
-						<Col xl="3">
-							<div className="card card-default">
-								<div className="card-body">
-									<div className="text-center">
-										<h3 className="mt-0">Universitas Satyagama</h3>
-										<p>0742/O/1990</p>
-									</div>
-									<hr />
-									<ul className="list-unstyled px-4">
-										<li>
-											<em className="fa fa-globe fa-fw mr-3"></em>www.satyagama.ac.id
-										</li>
-										<li>
-											<em className="fa fa-graduation-cap fa-fw mr-3"></em>Status Pelanggaran : Tidak Ada
-										</li>
-									</ul>
-								</div>
-							</div>
-						</Col>
-					</Row>
-				</div>
-			</ContentWrapper>
-		);
-	}
-}
-
-const mapStateToProps = (state) => ({
-	pelaporanCreate: state.pelaporanCreate,
-});
-// const mapDispatchToProps = (dispatch) => ({ pelaporanCreate: (data) => dispatch(listPelaporan(data)) });
-
-export default connect(mapStateToProps)(FormStandard);

+ 0 - 321
pages/app/pelaporan.search.js

@@ -1,321 +0,0 @@
-import React, { Component } from 'react';
-import Router from 'next/router'
-import ContentWrapper from '@/components/Layout/ContentWrapper';
-import { Row, Col, Button, Table, Pagination, PaginationItem, PaginationLink } from 'reactstrap';
-// React Slider
-import Slider from 'rc-slider';
-import 'rc-slider/assets/index.css';
-// React Select
-import Select from 'react-select';
-// DateTimePicker
-import Datetime from 'react-datetime';
-import 'react-datetime/css/react-datetime.css';
-
-
-import https from 'https';
-
-
-
-import CardTool from '@/components/Common/CardTool'
-
-import dummyData from './PT-ID.json';
-
-var pembina = [];
-
-
-class Search extends Component {
-
-    
-
-    static async getInitialProps(ctx) {
-
-        pembina = [];
-        const httpsAgent = new https.Agent({
-            rejectUnauthorized: false,
-          });
-        
-        //API down 
-        //  const res = await fetch('https://api.kemdikbud.go.id:8243/pddikti/1.2/lembaga-non-sp', { 
-        //     method: 'get', 
-        //     headers: new Headers({
-        //       'Authorization': 'Bearer 5b62f743-eef2-3370-8c66-6951b2e9c2c5', 
-        //       'Accept': 'application/json'
-        //     }),
-        //     agent: httpsAgent
-        //   }
-        //  )
-
-        //API down 
-        //const jsonPembina = await res.json();
-          const jsonPembina = [
-              
-                { id: 'ABEAE958-4F20-40EF-B145-B8014EC98D8F', nama: 'Badan Intelijen Negara', singkatan: 'BIN' }
-
-            ]
-
-        //jsonPembina = JSON.parse(jsonPembina);
-        // id: "ABEAE958-4F20-40EF-B145-B8014EC98D8F",nama: "Badan Intelijen Negara",singkatan: "BIN"
-        // { value: 'australian-capital-territory', label: 'Australian Capital Territory', className: 'State-ACT' },
-
-
-
-        var numrows = jsonPembina.length;
-
-        for (var i = 0; i < numrows; i++) {
-            pembina.push({value:jsonPembina[i].id, label:jsonPembina[i].nama, className: 'State-'+jsonPembina[i].singkatan});
-        }
-
-        console.log('pembina : ', pembina);
-
-        
-        //return { data: json }
-      }
-
-    state = {
-        selectedOptionMulti: [],
-        data: []
-    }
-
-
-    handleChangeSelectMulti = (selectedOptionMulti) => {
-        this.setState({ selectedOptionMulti });
-    }
-
-    renderInputGroup = props => {
-        return (
-            <div className="input-group date">
-                <input className="form-control" {...props} />
-                <span className="input-group-append input-group-addon">
-                    <span className="input-group-text fas fa-calendar-alt"></span>
-                </span>
-            </div>
-        )
-    }
-
-    
-    
-
-
-    handleClick = (e, PT_ID) => {
-        //router = useRouter();
-        const query = { ptId: PT_ID };
-        //    '/app/profile'
-        e.preventDefault();
-        Router.push(
-            {
-                pathname: '/app/pelaporan.new',
-                query: { ptId: PT_ID }
-            }
-        );
-    }
-
-    fetchData = async () => {
-        var qPembina = "";
-        //console.log('this.state.selectedOptionMulti.value : ', this.state.selectedOptionMulti.value);
-        if (this.state.selectedOptionMulti.value !== undefined ){
-            qPembina = '&pembina='+this.state.selectedOptionMulti.value;
-        }
-
-        //console.log('qpembina : ', qPembina);
-        const searchValue = 'q='+document.getElementById('searchInput').value;
-
-        const httpsAgent = new https.Agent({
-            rejectUnauthorized: false,
-          });
-        
-          //console.log('post agent : ');
-
-
-         //const res = await fetch('https://api.kemdikbud.go.id:8243/pddikti/1.2/pt/707C3895-B546-4DA5-A6A7-EFE7461A7C7E', { 
-
-        //API Down
-        //  const res = await fetch('https://api.kemdikbud.go.id:8243/pddikti/1.2/pt?'+searchValue+qPembina, { 
-        //     method: 'get', 
-        //     headers: new Headers({
-        //       'Authorization': 'Bearer 5b62f743-eef2-3370-8c66-6951b2e9c2c5', 
-        //       'Accept': 'application/json'
-        //     }),
-        //     agent: httpsAgent
-        //   }
-        //  )
-         
-        //API Down
-        //const jsonData = await res.json();
-        const jsonData = dummyData;
-
-
-        this.setState({ data: jsonData });
-        console.log('jsonData : ', jsonData);
-        //Get unique for filter by pembina
-        // const uniquePembina = [
-        //     new Set(jsonData.map(
-        //         item => item.pembina.nama
-        //     ))
-        // ]
-
-
-    };
-
-
-    handleApplyClick = () => {
-        console.log('selectedOptionMulti : ',this.state.selectedOptionMulti);
-        //const dataTables = this.fetchData().jsonData;
-        this.fetchData();
-        //console.log('this.state.data :', this.state.data);
-        if (this.state.data.length > 0){
-            this.renderTableData();
-        }
-    }
-
-    handleSearchClick = () => {
-
-        //const dataTables = this.fetchData().jsonData;
-        this.fetchData();
-        //console.log('this.state.data :', this.state.data);
-        if (this.state.data.length > 0){
-            this.renderTableData();
-        }
-    }
-
-    renderTableData() {
-        //const dataTable = this.props.data;
-        //if (dataTable === true ) {
-
-
-            return this.state.data.map((pt,index) => {
-            return (
-                    <tr>
-                        <td>
-                            <label>{index+1}</label>
-                        </td>
-                        <td>
-                            <div className="media align-items-center">
-                                <a className="mr-3" href="">
-                                    <img className="img-fluid rounded thumb64" src="/static/img/dummy-search.png" alt="Dummy"/>
-                                </a>
-                                <div className="media-body d-flex">
-                                    <div>
-                                        <h4 className="m-0">{pt.nama}</h4>
-                                        <small className="text-muted">{pt.sk_pendirian} - {pt.website} - {pt.email}</small>
-                                        <p>{pt.alamat.jalan}</p>
-                                    </div>
-                                    <div className="ml-auto">
-                                        <Button color="info" size="sm" onClick={(e) => this.handleClick(e, pt.id)}>Buat Laporan</Button>
-                                    </div>
-                                </div>
-                            </div>
-                        </td>
-                    </tr>
-            )
-            })
-        //}
-     }
-
-    render() {
-        // used for react select
-        const { selectedOptionMulti } = this.state;
-
-        
-
-        return (
-            <ContentWrapper>
-                <div className="content-heading">
-                    <div>Pelaporan
-                        <small>Pilih Perguruan Tinggi</small>
-                    </div>
-                </div>
-                <Row>
-                    <Col lg="9">
-                        <div className="form-group mb-4">
-                            <input className="form-control mb-2" type="text" id='searchInput' placeholder="Pencarian Nama Perguruan Tinggi"/>
-                            <div className="d-flex">
-                                <button className="btn btn-secondary" type="button" onClick={(e) => this.handleSearchClick()}>Search</button>
-                                <div className="ml-auto">
-                                    {/* <label className="c-checkbox">
-                                        <input id="inlineCheckbox10" type="checkbox" defaultValue="option1"/>
-                                        <span className="fa fa-check"></span>Nama Perguruan Tinggi</label> */}
-                                    {/* <label className="c-checkbox">
-                                        <input id="inlineCheckbox20" type="checkbox" defaultValue="option2"/>
-                                        <span className="fa fa-check"></span>Pembina</label> */}
-                                    {/* <label className="c-checkbox">
-                                        <input id="inlineCheckbox30" type="checkbox" defaultValue="option3"/>
-                                        <span className="fa fa-check"></span>Apps</label> */}
-                                </div>
-                            </div>
-                        </div>
-                        {/* START card */}
-                        <div className="card card-default">
-                            <div className="card-header">
-                                {/* <CardTool refresh onRefresh={(_,done) => setTimeout(done,2000)}/> */}
-                                Search Results
-                            </div>
-                            {/* START table-responsive */}
-                            <Table striped bordered hover>
-                                <thead>
-                                    <tr>
-                                        {/* <th data-check-all="" className="wd-xxs">
-                                            <div className="checkbox c-checkbox">
-                                                <label className="m-0">
-                                                    <input type="checkbox"/>
-                                                    <span className="fa fa-check"></span>
-                                                </label>
-                                            </div>
-                                        </th> */}
-                                        <th>No. </th>
-                                        <th>Description</th>
-                                    </tr>
-                                </thead>
-                                <tbody>
-                                    {this.renderTableData()}
-
-                                </tbody>
-                            </Table>
-                            {/* END table-responsive */}
-                            <div className="card-footer">
-                                <div className="d-flex">
-                                    {/* <button className="btn btn-sm btn-secondary">Clear</button> */}
-                                    {/* <nav className="ml-auto">
-                                        <Pagination size="sm">
-                                            <PaginationItem active>
-                                                <PaginationLink>1</PaginationLink>
-                                            </PaginationItem>
-                                            <PaginationItem>
-                                                <PaginationLink>2</PaginationLink>
-                                            </PaginationItem>
-                                            <PaginationItem>
-                                                <PaginationLink>3</PaginationLink>
-                                            </PaginationItem>
-                                            <PaginationItem>
-                                                <PaginationLink next>»</PaginationLink>
-                                            </PaginationItem>
-                                        </Pagination>
-                                    </nav> */}
-                                </div>
-                            </div>
-                        </div>
-                        {/* END card */}
-                    </Col>
-                    <Col lg="3">
-                        <h3 className="m-0 pb-3">Filters</h3>
-                        <div className="form-group mb-4">
-                            <label className="col-form-label mb-2">by Pembina</label>
-                            <br/>
-                            <Select
-                                name="multi-select-name"
-                                multi
-                                simpleValue
-                                value={selectedOptionMulti}
-                                onChange={this.handleChangeSelectMulti}
-                                options={pembina}
-                            />
-                        </div>
-                        <Button color="secondary" size="lg" onClick={(e) => this.handleApplyClick()}>Apply</Button>
-                    </Col>
-                </Row>
-            </ContentWrapper>
-            );
-    }
-
-}
-
-export default Search;

+ 157 - 0
pages/app/pelaporan/detail.js

@@ -0,0 +1,157 @@
+import React, { Component } from "react";
+import Router from "next/router";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import { Row, Col, Progress } from "reactstrap";
+import { getPelaporan } from "../../../actions/pelaporan";
+
+import Sparkline from "@/components/Common/Sparklines";
+import Datatable from "@/components/Tables/Datatable";
+import moment from "moment";
+
+class PelaporanDetail extends Component {
+	constructor(props) {
+		super(props);
+	}
+
+	render() {
+		const { pelaporan } = this.props;
+		return (
+			<ContentWrapper>
+				<div className="content-heading">Pelaporan</div>
+				<Row>
+					<Col lg="4">
+						<div className="card b">
+							<div className="card-body bb">
+								<p>Overvall progress</p>
+								<div className="d-flex align-items-center mb-2">
+									<div className="w-100">
+										<Progress className="progress-xs m0" color="info" value={20} />
+									</div>
+									<div className="ml-auto">
+										<div className="col wd-xxs text-right">
+											<div className="text-bold text-muted">20%</div>
+										</div>
+									</div>
+								</div>
+							</div>
+							<div className="card-body">
+								<p>Metrics</p>
+								<div className="row text-center">
+									<div className="col-6 col-lg-6 col-xl-6">
+										<Sparkline
+											values={[20, 80]}
+											options={{
+												type: "pie",
+												height: "50",
+												sliceColors: ["#edf1f2", "#23b7e5"],
+											}}
+											className="sparkline"
+										/>
+										<p className="mt-3">Open Case</p>
+									</div>
+									<div className="col-6 col-lg-6 col-xl-6">
+										<Sparkline
+											values={[80, 20]}
+											options={{
+												type: "pie",
+												height: "50",
+												sliceColors: ["#edf1f2", "#27c24c"],
+											}}
+											className="sparkline"
+										/>
+										<p className="mt-3">Close Case</p>
+									</div>
+								</div>
+							</div>
+							<table className="table bb">
+								<tbody>
+									<tr>
+										<td>
+											<strong>Open Case</strong>
+										</td>
+										<td>80</td>
+									</tr>
+									<tr>
+										<td>
+											<strong>Close Case</strong>
+										</td>
+										<td>20</td>
+									</tr>
+									<tr>
+										<td>
+											<strong>Performance</strong>
+										</td>
+										<td>
+											<em className="far fa-smile fa-lg text-warning"></em>
+										</td>
+									</tr>
+									<tr>
+										<td>
+											<strong>Last Case Closed</strong>
+										</td>
+										<td>BI:1107 - 12/01/2016</td>
+									</tr>
+								</tbody>
+							</table>
+						</div>
+					</Col>
+					<Col lg="8">
+						<div className="mb-3 d-flex">
+							<div>
+								<button className="btn btn-sm btn-info" type="button" onClick={(e) => this.newReportClick(e)}>
+									Laporan Baru
+								</button>
+							</div>
+						</div>
+						<div className="card b">
+							<div className="card-body">
+								<Datatable options={{ responsive: true }}>
+									<table className="table w-100">
+										<thead>
+											<tr>
+												<th>#ID</th>
+												<th>Description</th>
+												<th>Created</th>
+												<th>Status</th>
+											</tr>
+										</thead>
+										<tbody>
+											{pelaporan.data.map((value) => {
+												return (
+													<tr key={value._id}>
+														<td>BI:{value._number}</td>
+														<td className="text-nowrap">
+															<div className="media align-items-center">
+																<a className="mr-3" href="">
+																	<img className="img-fluid rounded thumb64" src="/static/img/dummy-search.png" alt="Dummy" />
+																</a>
+																<div className="media-body d-flex">
+																	<div>
+																		<h4 className="m-0">Universitas Satyagama</h4>
+																		<small className="text-muted">0742/O/1990 - www.satyagama.ac.id - info@satyagama.ac.id</small>
+																		<p>Jalan Kamal Raya No 2-A Cengkareng</p>
+																		<p> </p>
+																	</div>
+																</div>
+															</div>
+														</td>
+														<td>{moment(value.createdAt).fromNow()}</td>
+														<td>
+															<div className="inline wd-xxs badge badge-success">open</div>
+														</td>
+													</tr>
+												);
+											})}
+										</tbody>
+									</table>
+								</Datatable>
+							</div>
+						</div>
+					</Col>
+				</Row>
+			</ContentWrapper>
+		);
+	}
+}
+
+export default PelaporanDetail;

+ 2 - 3
pages/app/pelaporan.js → pages/app/pelaporan/index.js

@@ -2,7 +2,7 @@ import React, { Component } from "react";
 import Router from "next/router";
 import ContentWrapper from "@/components/Layout/ContentWrapper";
 import { Row, Col, Progress } from "reactstrap";
-import { getPelaporan } from "../../actions/pelaporan";
+import { getPelaporan } from "../../../actions/pelaporan";
 
 import Sparkline from "@/components/Common/Sparklines";
 import Datatable from "@/components/Tables/Datatable";
@@ -21,13 +21,12 @@ class Pelaporan extends Component {
 	newReportClick = (e) => {
 		e.preventDefault();
 		Router.push({
-			pathname: "/app/pelaporan.search",
+			pathname: "/app/pelaporan/search",
 		});
 	};
 
 	render() {
 		const { pelaporan } = this.props;
-		console.log(pelaporan);
 		return (
 			<ContentWrapper>
 				<div className="content-heading">Pelaporan</div>

+ 267 - 0
pages/app/pelaporan/new.js

@@ -0,0 +1,267 @@
+import React, { Component } from "react";
+import Router from "next/router";
+import { connect } from "react-redux";
+import { listPelaporan, createPelaporan } from "../../../store/actions/pelaporan";
+import { getPelanggaran } from "../../../actions/pelanggaran";
+
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import Select from "react-select";
+import {
+	Row,
+	Col,
+	Card,
+	CardHeader,
+	CardBody,
+	FormGroup,
+	FormFeedback,
+	FormText,
+	Label,
+	InputGroup,
+	InputGroupAddon,
+	InputGroupButtonDropdown,
+	InputGroupText,
+	Input,
+	Button,
+	DropdownToggle,
+	DropdownMenu,
+	CustomInput,
+	DropdownItem,
+} from "reactstrap";
+
+const styleHeaderText = {
+	color: "brown",
+};
+
+let Dropzone = null;
+class DropzoneWrapper extends Component {
+	state = {
+		isClient: false,
+	};
+	componentDidMount = () => {
+		Dropzone = require("react-dropzone").default;
+		this.setState({ isClient: true });
+	};
+	render() {
+		return Dropzone ? <Dropzone {...this.props}>{this.props.children}</Dropzone> : null;
+	}
+}
+
+const selectInstanceId = 1;
+
+class FormStandard extends Component {
+	constructor(props) {
+		super(props);
+		this.state = {
+			dropdownOpen: false,
+			splitButtonOpen: false,
+			selectedOptionMulti: [],
+			stat: "Waiting to add files..",
+			pelaporanNumber: Math.floor(Date.now() * Math.random()),
+			keteranganLaporan: "",
+			files: [],
+		};
+	}
+
+	static getInitialProps = async ({ query }) => {
+		const pelanggaran = await getPelanggaran();
+		return { query, pelanggaran };
+	};
+
+	optionsJenisPelanggaran = () => {
+		return this.props.pelanggaran.data.map((e) => ({ value: e._id, label: e.Pelanggaran, className: "State-ACT" }));
+	};
+
+	setKeteranganPelaporan = (e) => {
+		this.setState({ keteranganLaporan: e.target.value });
+	};
+
+	toggleDropDown = () => {
+		this.setState({
+			dropdownOpen: !this.state.dropdownOpen,
+		});
+	};
+
+	toggleSplit = () => {
+		this.setState({
+			splitButtonOpen: !this.state.splitButtonOpen,
+		});
+	};
+
+	handleChangeSelectMulti = (selectedOptionMulti) => {
+		this.setState({ selectedOptionMulti });
+	};
+
+	onDrop = (files) => {
+		this.setState({
+			files: files.map((file) =>
+				Object.assign(file, {
+					preview: URL.createObjectURL(file),
+				})
+			),
+			stat: "Added " + files.length + " file(s)",
+		});
+	};
+
+	uploadFiles = (e) => {
+		e.preventDefault();
+		e.stopPropagation();
+		this.setState({
+			stat: this.state.files.length ? "Dropzone ready to upload " + this.state.files.length + " file(s)" : "No files added.",
+		});
+	};
+
+	clearFiles = (e) => {
+		e.preventDefault();
+		e.stopPropagation();
+		this.setState({
+			stat: this.state.files.length ? this.state.files.length + " file(s) cleared." : "No files to clear.",
+		});
+		this.setState({
+			files: [],
+		});
+	};
+
+	onSubmit = async (e) => {
+		e.preventDefault();
+		const formdata = new FormData();
+		formdata.append("number", this.state.pelaporanNumber);
+		formdata.append("pt_id", this.props.query.ptId);
+		formdata.append("description", this.state.keteranganLaporan);
+		formdata.append("pelanggaran_id", this.state.selectedOptionMulti.map((e) => e.value).join());
+		if (this.state.files.length > 0) {
+			this.state.files.forEach((e) => {
+				formdata.append("files", e);
+			});
+		}
+
+		await this.props.dispatch(createPelaporan(formdata));
+		this.props.dispatch(listPelaporan());
+		if (this.props.pelaporanCreate.success) {
+			this.props.dispatch({ type: "PELAPORAN_CREATE_RESET" });
+			Router.push({
+				pathname: "/app/pelaporan",
+			});
+		}
+	};
+
+	render() {
+		const { selectedOptionMulti, files } = this.state;
+
+		const thumbs = files.map((file, index) => (
+			<Col md={3} key={index}>
+				<img className="img-fluid mb-2" src={file.preview} alt="Item" />
+			</Col>
+		));
+		return (
+			<ContentWrapper unwrap>
+				<div className="bg-cover" style={{ backgroundImage: "url(/static/img/profile-bg.png)" }}>
+					<div className="p-4 text-center" style={styleHeaderText}>
+						<img className="img-thumbnail rounded-circle thumb128" src="/static/img/univ-avatar.png" alt="Avatar" />
+						<h3 className="m-0">Universitas Satyagama</h3>
+						<p>0742/O/1990</p>
+						<p>Jalan Kamal Raya No 2-A Cengkareng</p>
+					</div>
+				</div>
+				<div className="p-3">
+					<div className="content-heading">
+						<div>
+							Pelaporan Baru
+							<small>Form pembuatan laporan baru v.0.1</small>
+						</div>
+					</div>
+					<Row>
+						<Col xl="9">
+							<Card className="card-default">
+								<CardHeader>
+									<label>Informasi Laporan</label>
+								</CardHeader>
+								<CardBody>
+									<form className="form-horizontal" method="get" action="/" onSubmit={this.onSubmit}>
+										<FormGroup row>
+											<label className="col-md-2 col-form-label">Nomor Pelaporan</label>
+											<div className="col-md-10">
+												<Input type="text" disabled value={this.state.pelaporanNumber} />
+												<span className="form-text">Nomor pelaporan akan digenerate otomatis dari sistem</span>
+											</div>
+										</FormGroup>
+										<FormGroup row>
+											<label className="col-md-2 col-form-label">Jenis Pelanggaran</label>
+											<div className="col-md-10">
+												<Select instanceId={selectInstanceId + 1} isMulti value={selectedOptionMulti} onChange={this.handleChangeSelectMulti} options={this.optionsJenisPelanggaran()} required />
+												<span className="form-text">Pilih Jenis Pelanggaran</span>
+											</div>
+										</FormGroup>
+										<FormGroup row>
+											<label className="col-md-2 col-form-label">Keterangan Laporan</label>
+											<div className="col-md-10">
+												<Input type="textarea" value={this.state.keteranganLaporan} onChange={this.setKeteranganPelaporan} required />
+												<span className="form-text">Deskripsi pelaporan minimum karakter 50 maksimum 200 karakter</span>
+											</div>
+										</FormGroup>
+										<FormGroup row>
+											<label className="col-md-2 col-form-label">Upload File Pendukung</label>
+											<div className="col-md-10">
+												<DropzoneWrapper className="" onDrop={this.onDrop}>
+													{({ getRootProps, getInputProps, isDragActive }) => {
+														return (
+															<div {...getRootProps()} className={"dropzone card p-3 " + (isDragActive ? "dropzone-drag-active" : "")}>
+																<input {...getInputProps()} />
+																<div className="dropzone-previews flex">
+																	{this.state.files.length > 0 ? <Row>{thumbs}</Row> : <div className="text-center dz-default dz-message">Drop files here to upload</div>}
+																</div>
+																<div className="d-flex align-items-center">
+																	<small className="ml-auto">
+																		<button type="button" className="btn btn-link" onClick={this.clearFiles}>
+																			Clear files
+																		</button>
+																	</small>
+																</div>
+															</div>
+														);
+													}}
+												</DropzoneWrapper>
+											</div>
+										</FormGroup>
+										<FormGroup row>
+											<div className="col-xl-10">
+												<button className="btn btn-sm btn-primary" type="submit">
+													Submit Laporan
+												</button>
+											</div>
+										</FormGroup>
+									</form>
+								</CardBody>
+							</Card>
+							{/* END card */}
+						</Col>
+						<Col xl="3">
+							<div className="card card-default">
+								<div className="card-body">
+									<div className="text-center">
+										<h3 className="mt-0">Universitas Satyagama</h3>
+										<p>0742/O/1990</p>
+									</div>
+									<hr />
+									<ul className="list-unstyled px-4">
+										<li>
+											<em className="fa fa-globe fa-fw mr-3"></em>www.satyagama.ac.id
+										</li>
+										<li>
+											<em className="fa fa-graduation-cap fa-fw mr-3"></em>Status Pelanggaran : Tidak Ada
+										</li>
+									</ul>
+								</div>
+							</div>
+						</Col>
+					</Row>
+				</div>
+			</ContentWrapper>
+		);
+	}
+}
+
+const mapStateToProps = (state) => ({
+	pelaporanCreate: state.pelaporanCreate,
+});
+
+export default connect(mapStateToProps)(FormStandard);

+ 0 - 0
pages/app/pelaporan_bak.js → pages/app/pelaporan/pelaporan_bak.js


+ 187 - 0
pages/app/pelaporan/search.js

@@ -0,0 +1,187 @@
+import React, { Component } from "react";
+import Router from "next/router";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import { Row, Col, Button, Table, Pagination, PaginationItem, PaginationLink } from "reactstrap";
+// React Slider
+import Slider from "rc-slider";
+import "rc-slider/assets/index.css";
+// React Select
+import Select from "react-select";
+// DateTimePicker
+import Datetime from "react-datetime";
+import "react-datetime/css/react-datetime.css";
+
+import https from "https";
+
+import CardTool from "@/components/Common/CardTool";
+
+import dummyData from "../PT-ID.json";
+
+var pembina = [];
+
+class Search extends Component {
+	static async getInitialProps(ctx) {
+		pembina = [];
+		const httpsAgent = new https.Agent({
+			rejectUnauthorized: false,
+		});
+
+		const jsonPembina = [{ id: "ABEAE958-4F20-40EF-B145-B8014EC98D8F", nama: "Badan Intelijen Negara", singkatan: "BIN" }];
+		var numrows = jsonPembina.length;
+
+		for (var i = 0; i < numrows; i++) {
+			pembina.push({ value: jsonPembina[i].id, label: jsonPembina[i].nama, className: "State-" + jsonPembina[i].singkatan });
+		}
+	}
+
+	state = {
+		selectedOptionMulti: [],
+		data: [],
+	};
+
+	handleChangeSelectMulti = (selectedOptionMulti) => {
+		this.setState({ selectedOptionMulti });
+	};
+
+	renderInputGroup = (props) => {
+		return (
+			<div className="input-group date">
+				<input className="form-control" {...props} />
+				<span className="input-group-append input-group-addon">
+					<span className="input-group-text fas fa-calendar-alt"></span>
+				</span>
+			</div>
+		);
+	};
+
+	handleClick = (e, PT_ID) => {
+		const query = { ptId: PT_ID };
+		e.preventDefault();
+		Router.push({
+			pathname: "/app/pelaporan/new",
+			query: { ptId: PT_ID },
+		});
+	};
+
+	fetchData = async () => {
+		var qPembina = "";
+		if (this.state.selectedOptionMulti.value !== undefined) {
+			qPembina = "&pembina=" + this.state.selectedOptionMulti.value;
+		}
+
+		const searchValue = "q=" + document.getElementById("searchInput").value;
+
+		const httpsAgent = new https.Agent({
+			rejectUnauthorized: false,
+		});
+		const jsonData = dummyData;
+
+		this.setState({ data: jsonData });
+		console.log("jsonData : ", jsonData);
+	};
+
+	handleApplyClick = () => {
+		console.log("selectedOptionMulti : ", this.state.selectedOptionMulti);
+		this.fetchData();
+		if (this.state.data.length > 0) {
+			this.renderTableData();
+		}
+	};
+
+	handleSearchClick = () => {
+		this.fetchData();
+		if (this.state.data.length > 0) {
+			this.renderTableData();
+		}
+	};
+
+	renderTableData() {
+		return this.state.data.map((pt, index) => {
+			return (
+				<tr>
+					<td>
+						<label>{index + 1}</label>
+					</td>
+					<td>
+						<div className="media align-items-center">
+							<a className="mr-3" href="">
+								<img className="img-fluid rounded thumb64" src="/static/img/dummy-search.png" alt="Dummy" />
+							</a>
+							<div className="media-body d-flex">
+								<div>
+									<h4 className="m-0">{pt.nama}</h4>
+									<small className="text-muted">
+										{pt.sk_pendirian} - {pt.website} - {pt.email}
+									</small>
+									<p>{pt.alamat.jalan}</p>
+								</div>
+								<div className="ml-auto">
+									<Button color="info" size="sm" onClick={(e) => this.handleClick(e, pt.id)}>
+										Buat Laporan
+									</Button>
+								</div>
+							</div>
+						</div>
+					</td>
+				</tr>
+			);
+		});
+		//}
+	}
+
+	render() {
+		const { selectedOptionMulti } = this.state;
+
+		return (
+			<ContentWrapper>
+				<div className="content-heading">
+					<div>
+						Pelaporan
+						<small>Pilih Perguruan Tinggi</small>
+					</div>
+				</div>
+				<Row>
+					<Col lg="9">
+						<div className="form-group mb-4">
+							<input className="form-control mb-2" type="text" id="searchInput" placeholder="Pencarian Nama Perguruan Tinggi" />
+							<div className="d-flex">
+								<button className="btn btn-secondary" type="button" onClick={(e) => this.handleSearchClick()}>
+									Search
+								</button>
+								<div className="ml-auto"></div>
+							</div>
+						</div>
+						<div className="card card-default">
+							<div className="card-header">Search Results</div>
+							<Table striped bordered hover>
+								<thead>
+									<tr>
+										<th>No. </th>
+										<th>Description</th>
+									</tr>
+								</thead>
+								<tbody>{this.renderTableData()}</tbody>
+							</Table>
+							<div className="card-footer">
+								<div className="d-flex"></div>
+							</div>
+						</div>
+					</Col>
+					<Col lg="3">
+						<h3 className="m-0 pb-3">Filters</h3>
+						<div className="form-group mb-4">
+							<label className="col-form-label mb-2">by Pembina</label>
+							<br />
+							<Select name="multi-select-name" isMulti simpleValue value={selectedOptionMulti} onChange={this.handleChangeSelectMulti} options={pembina} />
+						</div>
+						<Button color="secondary" size="lg" onClick={(e) => this.handleApplyClick()}>
+							Apply
+						</Button>
+					</Col>
+				</Row>
+			</ContentWrapper>
+		);
+	}
+}
+
+export default Search;

+ 2 - 2
pages/app/pemeriksaan.js → pages/app/pemeriksaan/index.js

@@ -2,7 +2,7 @@ import React, { Component } from "react";
 import Router from "next/router";
 import ContentWrapper from "@/components/Layout/ContentWrapper";
 import { Row, Col, Progress, Button } from "reactstrap";
-import { getPelaporan } from "../../actions/pelaporan";
+import { getPelaporan } from "../../../actions/pelaporan";
 
 import Sparkline from "@/components/Common/Sparklines";
 import Scrollable from "@/components/Common/Scrollable";
@@ -22,7 +22,7 @@ class BugTracker extends Component {
 	newProcessClick = (e, PT_ID, number) => {
 		e.preventDefault();
 		Router.push({
-			pathname: "/app/pemeriksaan.new",
+			pathname: "/app/pemeriksaan/new",
 			query: { ptId: PT_ID, number: number },
 		});
 	};

+ 1 - 1
pages/app/pemeriksaan.new.js → pages/app/pemeriksaan/new.js

@@ -2,7 +2,7 @@ import React, { Component } from "react";
 import Router from "next/router";
 import ContentWrapper from "@/components/Layout/ContentWrapper";
 import Datetime from "react-datetime";
-import { insetPemeriksaan } from "../../actions/pemeriksaan";
+import { insetPemeriksaan } from "../../../actions/pemeriksaan";
 import "react-datetime/css/react-datetime.css";
 import {
 	Row,

+ 2 - 2
pages/app/penjadwalan.js → pages/app/penjadwalan/index.js

@@ -2,7 +2,7 @@ import React, { Component } from "react";
 import Router from "next/router";
 import ContentWrapper from "@/components/Layout/ContentWrapper";
 import { Row, Col, Progress, Button } from "reactstrap";
-import { getPelaporan } from "../../actions/pelaporan";
+import { getPelaporan } from "../../../actions/pelaporan";
 
 import Sparkline from "@/components/Common/Sparklines";
 import Scrollable from "@/components/Common/Scrollable";
@@ -22,7 +22,7 @@ class BugTracker extends Component {
 	newProcessClick = (e, PT_ID, number) => {
 		e.preventDefault();
 		Router.push({
-			pathname: "/app/penjadwalan.todo",
+			pathname: "/app/penjadwalan/todo",
 			query: { ptId: PT_ID, number: number },
 		});
 	};

+ 1 - 1
pages/app/penjadwalan.todo.js → pages/app/penjadwalan/todo.js

@@ -3,7 +3,7 @@ import { useRouter } from "next/router";
 import dynamic from "next/dynamic";
 
 // https://github.com/fullcalendar/fullcalendar-react/issues/17
-const DynamicCalendar = dynamic(() => import("../../components/Extras/calendar.view.js"), {
+const DynamicCalendar = dynamic(() => import("../../../components/Extras/calendar.view.js"), {
 	ssr: false,
 });