andi 1 жил өмнө
parent
commit
bbbe066f08

+ 22 - 0
actions/public.js

@@ -15,6 +15,28 @@ export const addPesertaPleno = async (token, data) => {
         return false;
         return false;
     }
     }
 };
 };
+export const addDaftarHadirPeserta = async (token, data) => {
+    const getToken = await getCsrf();
+    const _csrf = getToken.token;
+    try {
+        const res = await axiosAPI.post(`/signature?_csrf=${_csrf}`, data, { headers: { Authorization: token } });
+        return res.data;
+    } catch (error) {
+        console.log("error", error.response.data);
+        return false;
+    }
+};
+export const getDaftarHadirPeserta = async (token, id, query = {}) => {
+	try {
+		let url = `/signature/${id}`;
+		const res = await axiosAPI.get(url, { headers: { Authorization: token } });
+		return res.data;
+	} catch (error) {
+		console.log("error", error);
+		return false;
+	}
+};
+
 export const getOneLaporanPublic = async (id, query = {}) => {
 export const getOneLaporanPublic = async (id, query = {}) => {
     try {
     try {
         let url = `public/laporan/${id}`;
         let url = `public/laporan/${id}`;

+ 3 - 0
components/Layout/Sidebar.js

@@ -157,6 +157,9 @@ class Sidebar extends Component {
 		if (ENV === "development") {
 		if (ENV === "development") {
 			this.menu = user.role.id === 2022 ? MenuPT : user.user_id === "28DB23AE-2976-47E0-9410-241A11EE1F88" ? MenuBypass : user.role.id === 2021 ? MenuLLDIKTI : user.role.id === 2024 ? MenuReadOnly : MenuPT;
 			this.menu = user.role.id === 2022 ? MenuPT : user.user_id === "28DB23AE-2976-47E0-9410-241A11EE1F88" ? MenuBypass : user.role.id === 2021 ? MenuLLDIKTI : user.role.id === 2024 ? MenuReadOnly : MenuPT;
 		}
 		}
+		if (ENV === "local") {
+			this.menu = user.role.id === 2022 ? MenuPT : user.user_id === "28DB23AE-2976-47E0-9410-241A11EE1F88" ? MenuBypass : user.role.id === 2021 ? MenuLLDIKTI : user.role.id === 2024 ? MenuReadOnly : MenuPT;
+		}
 		// if (ENV === "development") {
 		// if (ENV === "development") {
 		// 	this.menu = user.role.id === 2022 ? MenuPT : user.role.id === 2021 ? MenuLLDIKTI : user.role.id === 2024 ? MenuReadOnly : Menu;
 		// 	this.menu = user.role.id === 2022 ? MenuPT : user.role.id === 2021 ? MenuLLDIKTI : user.role.id === 2024 ? MenuReadOnly : Menu;
 		// }
 		// }

+ 3 - 2
components/PencabutanSanksi/Riwayat.js

@@ -14,7 +14,6 @@ function Riwayat({ data, role }) {
 			confirmButtonText: 'Oke'
 			confirmButtonText: 'Oke'
 		})
 		})
 	};
 	};
-	// console.log(data.map((e)=> e.dokumen))
 	return (
 	return (
 		<Card className="card-default">
 		<Card className="card-default">
 			<CardHeader>
 			<CardHeader>
@@ -22,7 +21,7 @@ function Riwayat({ data, role }) {
 			</CardHeader>
 			</CardHeader>
 			<CardBody>
 			<CardBody>
 				<Datatable options={{ responsive: true }}>
 				<Datatable options={{ responsive: true }}>
-					<table className="table table-striped my-4 w-100">
+					<table className="table table-striped my-4 w-100" data-order='[ [0, "asc"]]'>
 						<thead>
 						<thead>
 							<tr>
 							<tr>
 								<th>Tanggal</th>
 								<th>Tanggal</th>
@@ -35,7 +34,9 @@ function Riwayat({ data, role }) {
 						</thead>
 						</thead>
 						<tbody>
 						<tbody>
 							{data?.length
 							{data?.length
+							
 								? data.map((data, i) => (
 								? data.map((data, i) => (
+									
 								<tr>
 								<tr>
 									<td>{moment(data.createdAt).format("DD MMMM YYYY")}</td>
 									<td>{moment(data.createdAt).format("DD MMMM YYYY")}</td>
 									<td>{data.status}</td>
 									<td>{data.status}</td>

+ 1 - 1
components/PencabutanSanksi/RiwayatPerbaikan.js

@@ -21,7 +21,7 @@ function RiwayatPerbaikan({ data, role }) {
 			</CardHeader>
 			</CardHeader>
 			<CardBody>
 			<CardBody>
 				<Datatable options={{ responsive: true }}>
 				<Datatable options={{ responsive: true }}>
-					<table className="table table-striped my-4 w-100">
+					<table className="table table-striped my-4 w-100" data-order='[ [0, "asc"]]'>
 						<thead>
 						<thead>
 							<tr>
 							<tr>
 								<th>Tanggal</th>
 								<th>Tanggal</th>

+ 4 - 2
components/PerpanjanganSanksi/DetailSanksi.js

@@ -123,9 +123,11 @@ function DetailSanksi({ data, noTitle = false, role }) {
 						</Col>
 						</Col>
 					</FormGroup>
 					</FormGroup>
 					<FormGroup row>
 					<FormGroup row>
-						<Col md="4">Nomor Surat:</Col>
+						<Col md="4">Sanksi:</Col>
 						<Col md="8">
 						<Col md="8">
-							<strong>{data.pelanggaran.map((e) => e.sanksi)}</strong>
+							{/* <strong>{data.pelanggaran.map((e) => e.sanksi)}</strong> */}
+							{data?.pelanggaran && data.pelanggaran.map((e) => <li><strong>{e.sanksi}</strong> - {e.keterangan_sanksi}</li>)}
+
 						</Col>
 						</Col>
 					</FormGroup>
 					</FormGroup>
 					<FormGroup row>
 					<FormGroup row>

+ 5 - 1
components/PerpanjanganSanksi/InputTanggal.js

@@ -205,6 +205,10 @@ class InputTanggal extends Component {
                     >
                     >
                         {({ isSubmitting }) => (
                         {({ isSubmitting }) => (
                             <Form className="form-horizontal">
                             <Form className="form-horizontal">
+                                        <FormGroup row className="mt-3">
+                                    <label className="col-md-2 col-form-label">Sudah melakukan perpanjangan sanksi : </label>
+                                    <div className="col-md-10">{this.props.data?.riwayat_sanksi?.length}</div>
+                                    </FormGroup>
                                 <FormGroup row className="mt-3">
                                 <FormGroup row className="mt-3">
                                     <label className="col-md-2 col-form-label">Tanggal Perpanjangan Sanksi :</label>
                                     <label className="col-md-2 col-form-label">Tanggal Perpanjangan Sanksi :</label>
                                     <div className="col-md-6">
                                     <div className="col-md-6">
@@ -223,7 +227,7 @@ class InputTanggal extends Component {
                                                             }}
                                                             }}
                                                             closeOnSelect={true}
                                                             closeOnSelect={true}
                                                             isValidDate={(e) => {
                                                             isValidDate={(e) => {
-                                                                return e.isBefore(new Date())
+                                                                return e.isBefore(new Date(this.props.data.masa_berlaku.to_date).getTime() + 86400000)
                                                             }}
                                                             }}
 
 
                                                         />
                                                         />

+ 72 - 0
components/PerpanjanganSanksi/Riwayat.js

@@ -0,0 +1,72 @@
+import Datatable from "@/components/Tables/Datatable";
+import moment from "moment";
+import { Card, CardHeader, CardBody, CardTitle } from "reactstrap";
+import { API_URL } from "@/env";
+import Swal from "sweetalert2";
+
+function Riwayat({ data, role }) {
+	const handleOpenAlert = () => {
+		Swal.fire({
+			icon: 'error',
+			title: 'Oops...',
+			html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+			confirmButtonColor: "#3e3a8e",
+			confirmButtonText: 'Oke'
+		})
+	};
+	return (
+		<Card className="card-default">
+			<CardHeader>
+				<CardTitle>Riwayat Perpanjangan Sanksi</CardTitle>
+			</CardHeader>
+			<CardBody>
+				<Datatable options={{ responsive: true }}>
+					<table className="table table-striped my-4 w-100"  data-order='[ [2, "asc"]]'>
+						<thead>
+							<tr>
+								<th>Tanggal perpanjangan</th>
+								<th>Dokumen</th>
+								<th>Perpanjangan Ke</th>
+
+							</tr>
+						</thead>
+						<tbody>
+							{data?.length
+							
+								? data.map((data, i) => (
+									
+								<tr>
+									<td>{moment(data.masa_berlaku.from_date).format("DD MMMM YYYY")}-{moment(data.masa_berlaku.to_date).format("DD MMMM YYYY")}</td>
+									<td>
+										{data.dokumen?.map((e) => (
+											<>
+												<em className="fa-lg far fa-file-code"></em>
+												{role === 2024 ?
+													<a className="text-muted" onClick={handleOpenAlert}>
+														{e.judul}
+													</a>
+													:
+													<>
+													<a className="text-muted" href={e.path} target="_blank" download={e.judul}>
+														{e.judul}
+													</a>
+												</>
+
+												}
+											</>
+										))}
+									</td>
+									<td>{i+1}</td>
+								</tr>
+							)) : (
+								""
+							)}
+						</tbody>
+					</table>
+				</Datatable>
+			</CardBody>
+		</Card>
+	);
+}
+
+export default Riwayat;

+ 40 - 19
components/Sanksi/BeritaAcara.js

@@ -325,16 +325,16 @@ class BeritaAcara extends Component {
                             Pada hari ini
                             Pada hari ini
                             {dataSuratBA?.isEditTanggal &&
                             {dataSuratBA?.isEditTanggal &&
                                 <span style={{ textIndent: "0rem" }}>
                                 <span style={{ textIndent: "0rem" }}>
-                                     <Datetime
-																			timeFormat={false}
-																			inputProps={{ className: "form-control" }}
-																			value={tanggal ? new Date(tanggal) : tanggal || "Isi Tanggal"}
-                                                                            onChange={(tanggal) => {
-                                                                                this.setState({ tanggal, setTanggal: true }, this.setDataSuratBA)
-                                                                            }}
-																			closeOnSelect={true}
-																			
-																		/>
+                                    <Datetime
+                                        timeFormat={false}
+                                        inputProps={{ className: "form-control" }}
+                                        value={tanggal ? new Date(tanggal) : tanggal || "Isi Tanggal"}
+                                        onChange={(tanggal) => {
+                                            this.setState({ tanggal, setTanggal: true }, this.setDataSuratBA)
+                                        }}
+                                        closeOnSelect={true}
+
+                                    />
                                     <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditTanggal} />
                                     <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditTanggal} />
                                     <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={this.isEditTanggal}
                                     <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={this.isEditTanggal}
                                     />
                                     />
@@ -396,15 +396,15 @@ class BeritaAcara extends Component {
                                     {dataSuratBA?.isEditTanggal_2 &&
                                     {dataSuratBA?.isEditTanggal_2 &&
                                         <span style={{ textIndent: "0rem" }}>
                                         <span style={{ textIndent: "0rem" }}>
                                             <Datetime
                                             <Datetime
-																			timeFormat={false}
-																			inputProps={{ className: "form-control" }}
-																			value={tanggal_2 ? new Date(tanggal_2) : tanggal_2 || "Isi Tanggal"}
-                                                                            onChange={(tanggal_2) => {
-                                                                                this.setState({ tanggal_2, setTanggal_2: true }, this.setDataSuratBA)
-                                                                            }}
-																			closeOnSelect={true}
-																			
-																		/>
+                                                timeFormat={false}
+                                                inputProps={{ className: "form-control" }}
+                                                value={tanggal_2 ? new Date(tanggal_2) : tanggal_2 || "Isi Tanggal"}
+                                                onChange={(tanggal_2) => {
+                                                    this.setState({ tanggal_2, setTanggal_2: true }, this.setDataSuratBA)
+                                                }}
+                                                closeOnSelect={true}
+
+                                            />
                                             <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditTanggal_2} />
                                             <button className='bg-transparent button-transparent border-0 fas fa-times-circle text-danger' onClick={this.isEditTanggal_2} />
                                             <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={this.isEditTanggal_2}
                                             <button className='bg-transparent button-transparent border-0 fas fa-check-circle text-success' onClick={this.isEditTanggal_2}
                                             />
                                             />
@@ -576,6 +576,27 @@ class BeritaAcara extends Component {
                         <p>
                         <p>
                             Demikian Laporan Evaluasi dan Pembahasan ini dibuat dengan sesungguhnya dan telah dibaca dan dicermati oleh peserta rapat yang hadir.
                             Demikian Laporan Evaluasi dan Pembahasan ini dibuat dengan sesungguhnya dan telah dibaca dan dicermati oleh peserta rapat yang hadir.
                         </p>
                         </p>
+                        {ENV === "local" &&
+                            <CopyToClipboard
+                                text={`http://localhost:3000/signature/pleno-sanksi/${dataLaporan.data?._id}`}
+                                options={{ asHtml: true }}
+                            >
+                                <div>
+                                    <span className="btn-radius">
+                                        <Button color id="Popover1" className="ml-0 mt-2 mb-2 btn-v1-outline-purple" onClick={() => {
+                                            this.CloseCopied()
+                                        }} ><span><em className="fas fa-project-diagram float-left mt-1 mr-1" />&nbsp;Link Dokumen</span>
+
+                                            {/* <h5 className="p-0 mt-3 float-right"> <em className="fas fa-project-diagram float-left mt-1" /> &nbsp;Link Dokumen</h5> */}
+                                        </Button>
+                                    </span>
+                                    <Popover placement="bottom" isOpen={this.state.copied} target="Popover1" toggle={this.Copied}>
+                                        <PopoverHeader>Link Berhasil Disalin</PopoverHeader>
+                                    </Popover>
+                                </div>
+
+                            </CopyToClipboard>
+                        }
                         {ENV === "production" &&
                         {ENV === "production" &&
                             <CopyToClipboard
                             <CopyToClipboard
                                 text={`https://sidali.kemdikbud.go.id/signature/pleno-sanksi/${dataLaporan.data?._id}`}
                                 text={`https://sidali.kemdikbud.go.id/signature/pleno-sanksi/${dataLaporan.data?._id}`}

+ 171 - 0
components/Sanksi/Modul.js

@@ -0,0 +1,171 @@
+import React, { useRef, Component } from 'react';
+import { Row, Col, Button, Popover, PopoverHeader, PopoverBody, Card, CardBody, Modal, ModalBody, ModalFooter } from "reactstrap";
+import ComponentToPrint from "./Modul_print";
+import ReactToPrint, { PrintContextConsumer } from 'react-to-print';
+import id from 'date-fns/locale/id';
+import CopyToClipboard from "react-copy-to-clipboard";
+import { getAutoSave } from "@/actions/autosave";
+import ContentEditable from 'react-contenteditable'
+import { removePesertaPleno } from '../../actions/sanksi';
+import { ToastContainer, toast } from "react-toastify";
+import Router from "next/router";
+import { getCsrf } from '../../actions/security';
+import { ENV } from '../../env';
+import Swal from 'sweetalert2';
+import Datetime from "react-datetime";
+
+class Modul extends Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            selectedPeserta: "",
+            copiedd: false,
+
+
+        };
+    };
+
+    handleOpenAlert = () => {
+        Swal.fire({
+            icon: 'error',
+            title: 'Oops...',
+            html: 'Maaf anda tidak memiliki akses untuk menyelesaikan<p> proses ini.</p>',
+            confirmButtonColor: "#3e3a8e",
+            confirmButtonText: 'Oke'
+        })
+    };
+    CloseCopiedd = () => {
+
+        setTimeout(() => {
+            this.setState({
+                copiedd: !this.state.copiedd
+            });
+        }, 1000);
+    }
+
+    Copiedd = () => this.setState({
+        copiedd: !this.state.copiedd
+    })
+
+    render() {
+        const { dataLaporan, daftarPeserta } = this.props
+        return (
+            <div>
+                <div className=' content-heading border-radius-login'>
+                    <span className="btn-radius">
+                        {this.props.role === 2024 ?
+                            <Button color className="btn-labeled-4" onClick={this.handleOpenAlert}>
+                                <h4 className="p-0 mt-2">Print dan Download</h4>
+                            </Button> :
+                            <ReactToPrint
+                                trigger={() => {
+                                    return <span>
+                                        <Button color className="btn-labeled-4">
+                                            <h4 className="p-0 mt-2">Print dan Download</h4>
+                                        </Button>
+                                    </span>
+                                }}
+                                content={() => this.componentRef}
+                            />
+                        }
+
+                    </span>
+                </div>
+                <div style={{ display: "none" }}>
+                    <ComponentToPrint ref={el => (this.componentRef = el)} query={this.props.query} />
+                </div>
+                {ENV === "local" &&
+                    <CopyToClipboard
+                        text={`http://localhost:3000/signature/modul/${dataLaporan.data?._id}`}
+                        options={{ asHtml: true }}
+                    >
+                        <div>
+                            <span className="btn-radius">
+                                <Button color id="Popover1" className="ml-0 mt-2 mb-2 btn-v1-outline-purple" onClick={() => {
+                                    this.CloseCopiedd()
+                                }} ><span><em className="fas fa-project-diagram float-left mt-1 mr-1" />&nbsp;Link Dokumen</span>
+
+                                    {/* <h5 className="p-0 mt-3 float-right"> <em className="fas fa-project-diagram float-left mt-1" /> &nbsp;Link Dokumen</h5> */}
+                                </Button>
+                            </span>
+                            <Popover placement="bottom" isOpen={this.state.copiedd} target="Popover1" toggle={this.Copiedd}>
+                                <PopoverHeader>Link Berhasil Disalin</PopoverHeader>
+                            </Popover>
+                        </div>
+
+                    </CopyToClipboard>
+                }
+                {ENV === "production" &&
+                    <CopyToClipboard
+                        text={`https://sidali.kemdikbud.go.id/signature/modul/${dataLaporan.data?._id}`}
+                        options={{ asHtml: true }}
+                    >
+                        <div>
+                            <span className="btn-radius">
+                                <Button color id="Popover1" className="ml-0 mt-2 mb-2 btn-v1-outline-purple" onClick={() => {
+                                    this.CloseCopied()
+                                }} ><span><em className="fas fa-project-diagram float-left mt-1 mr-1" />&nbsp;Link Dokumen</span>
+
+                                    {/* <h5 className="p-0 mt-3 float-right"> <em className="fas fa-project-diagram float-left mt-1" /> &nbsp;Link Dokumen</h5> */}
+                                </Button>
+                            </span>
+                            <Popover placement="bottom" isOpen={this.state.copiedd} target="Popover1" toggle={this.Copied}>
+                                <PopoverHeader>Link Berhasil Disalin</PopoverHeader>
+                            </Popover>
+                        </div>
+
+                    </CopyToClipboard>
+                }
+                {ENV === "development" &&
+                    <CopyToClipboard
+                        text={`https://dev.sidali.kemdikbud.go.id/signature/modul/${dataLaporan.data?._id}`}
+                        options={{ asHtml: true }}
+                    >
+                        <div>
+                            <span className="btn-radius">
+                                <Button color id="Popover1" className="ml-0 mt-2 mb-2 btn-v1-outline-purple" onClick={() => {
+                                    this.CloseCopied()
+                                }} ><span><em className="fas fa-project-diagram float-left mt-1 mr-1" />&nbsp;Link Dokumen</span>
+
+                                    {/* <h5 className="p-0 mt-3 float-right"> <em className="fas fa-project-diagram float-left mt-1" /> &nbsp;Link Dokumen</h5> */}
+                                </Button>
+                            </span>
+                            <Popover placement="bottom" isOpen={this.state.copiedd} target="Popover1" toggle={this.Copied}>
+                                <PopoverHeader>Link Berhasil Disalin</PopoverHeader>
+                            </Popover>
+                        </div>
+
+                    </CopyToClipboard>
+                }
+
+
+                <div  >
+                    <div className='header-ttd signature-border pt-1 pb-1'>
+                        <text className='header-ttd font-weight-bold '>PESERTA RAPAT</text>
+                    </div>
+                    <div id="ttd">
+                        {daftarPeserta
+                            ? daftarPeserta.data?.daftar_kehadiran_peserta?.map((value) => (
+                                <div className='ttd-div'>
+                                    <div className='sign-ttd'>
+                                        <img
+                                            className='sign-ttd'
+                                            src={value.ttd.path} />
+                                    </div>
+                                    <div className='sign-nama'>
+                                        <text>
+                                            {value.nama}
+                                        </text>
+                                    </div>
+                                </div>
+                            )) : ""}
+                    </div>
+                </div>
+            </div>
+        )
+    }
+}
+
+
+
+export default Modul

+ 74 - 0
components/Sanksi/Modul_print.js

@@ -0,0 +1,74 @@
+import React, { Component } from 'react';
+import SignatureCanvas from 'react-signature-canvas'
+import { getOneLaporan, updateLaporan } from "@/actions/pelaporan";
+import { Row, Col, Input, FormGroup, Label, Progress } from "reactstrap";
+import { connect } from "react-redux";
+import moment from "moment";
+import 'moment/locale/id'
+moment.locale('id')
+import { getAutoSave } from "@/actions/autosave";
+import { getDaftarHadirPeserta } from '../../actions/public';
+
+
+
+
+class ComponentToPrint extends React.Component {
+    formData = {}
+    constructor(props) {
+        super(props);
+        this.state = {
+            dataLaporan: {},
+
+        };
+    }
+
+    static getInitialProps = async ({ query }) => {
+        return { query };
+    };
+
+
+    componentDidMount = async () => {
+        const { query, token } = this.props;
+        const { id } = query;
+        const dataLaporan = await getOneLaporan(token, id);
+        const daftarPeserta = await getDaftarHadirPeserta(token, id)
+
+        this.setState({ dataLaporan, daftarPeserta });
+
+    };
+
+    render() {
+        const { daftarPeserta} = this.state
+        return (
+            <page>
+                
+                    <div className='mt-5'>
+                        <div className='header-ttd signature-border pt-1 pb-1'>
+                            <text className='header-ttd font-weight-bold '>PESERTA RAPAT</text>
+                        </div>
+                        <div id="ttd">
+                            {daftarPeserta
+                                ?daftarPeserta.data?.daftar_kehadiran_peserta?.map((value) => (
+                                    <div className='ttd-div'>
+                                        <div className='sign-ttd'>
+                                            <img
+                                                className='sign-ttd'
+                                                src={value.ttd.path} />
+                                        </div>
+                                        <div className='sign-nama'>
+                                            <text>
+                                                {value.nama}
+                                            </text>
+                                        </div>
+                                    </div>
+                                )) : ""}
+                        </div>
+                    </div>
+
+            </page>
+
+
+        );
+    }
+}
+export default ComponentToPrint

+ 16 - 1
pages/app/perpanjangan-sanksi/detail.js

@@ -8,6 +8,8 @@ import { getOneSanksi, addRekomendasiDelegasi } from "@/actions/sanksi";
 import Loader from "@/components/Common/Loader";
 import Loader from "@/components/Common/Loader";
 import { connect } from "react-redux";
 import { connect } from "react-redux";
 import InputTanggal from "../../../components/PerpanjanganSanksi/InputTanggal";
 import InputTanggal from "../../../components/PerpanjanganSanksi/InputTanggal";
+import Riwayat from "@/components/PerpanjanganSanksi/Riwayat";
+
 
 
 
 
 class Detail extends Component {
 class Detail extends Component {
@@ -61,11 +63,24 @@ class Detail extends Component {
 
 
 							<Col xl="9">
 							<Col xl="9">
 								<DetailSanksi data={sanksi.data} role={this.props.user.role.id} />
 								<DetailSanksi data={sanksi.data} role={this.props.user.role.id} />
-								<InputTanggal query={query} token={token} data={sanksi.data} />
 							</Col>
 							</Col>
 							<Col lg="3">{pt ? <DetailPT data={pt} /> : <Loader />}</Col>
 							<Col lg="3">{pt ? <DetailPT data={pt} /> : <Loader />}</Col>
 						</Row>
 						</Row>
 					)}
 					)}
+							{sanksi.data && (
+						<Row>
+							<Col>
+							<InputTanggal query={query} token={token} data={sanksi.data} />
+							</Col>
+						</Row>
+						)}
+					{sanksi.data && (
+						<Row>
+							<Col>
+								<Riwayat data={sanksi.data?.riwayat_sanksi} role={this.props.user.role.id} />
+							</Col>
+						</Row>
+						)}
 				</div>
 				</div>
 			</ContentWrapper>
 			</ContentWrapper>
 		);
 		);

+ 31 - 2
pages/app/sanksi/proses.js

@@ -27,6 +27,8 @@ import { ENV } from "../../../env";
 import Swal from "sweetalert2";
 import Swal from "sweetalert2";
 import Redudansi from "../../../components/Sanksi/Redudansi";
 import Redudansi from "../../../components/Sanksi/Redudansi";
 import { createLog } from "../../../actions/log";
 import { createLog } from "../../../actions/log";
+import Modul from "../../../components/Sanksi/Modul";
+import { getDaftarHadirPeserta } from "../../../actions/public";
 
 
 
 
 
 
@@ -58,12 +60,13 @@ class ProsesSanksi extends Component {
 		const { query, token } = this.props;
 		const { query, token } = this.props;
 		const { id } = query;
 		const { id } = query;
 		const pelaporan = await getOneLaporan(token, id);
 		const pelaporan = await getOneLaporan(token, id);
+		const daftarPeserta = await getDaftarHadirPeserta(token, id)
 		const { data: listSanksi } = await getPelanggaranSanksi(token)
 		const { data: listSanksi } = await getPelanggaranSanksi(token)
 		const getDataSave = await getAutoSave({ id, laporan: true });
 		const getDataSave = await getAutoSave({ id, laporan: true });
 		const autoSaveDataPelanggaran = getDataSave.data?.PenetapanSanksi?.dataPelanggaran;
 		const autoSaveDataPelanggaran = getDataSave.data?.PenetapanSanksi?.dataPelanggaran;
 		const dataform = getDataSave.data?.PenetapanSanksi?.dataUpload
 		const dataform = getDataSave.data?.PenetapanSanksi?.dataUpload
 		const activeStep = getDataSave.data?.PenetapanSanksi?.activeStep
 		const activeStep = getDataSave.data?.PenetapanSanksi?.activeStep
-		this.setState({ pelaporan, listSanksi, activeStep: activeStep || "1" });
+		this.setState({daftarPeserta, pelaporan, listSanksi, activeStep: activeStep || "1" });
 		this.setState({ dataPelanggaran: autoSaveDataPelanggaran, dataUpload:dataform })
 		this.setState({ dataPelanggaran: autoSaveDataPelanggaran, dataUpload:dataform })
 	
 	
 	};
 	};
@@ -452,7 +455,7 @@ class ProsesSanksi extends Component {
 	};
 	};
 
 
 	render() {
 	render() {
-		const { dataUpload, dataPelanggaran, pelaporan, dataSuratBA, thisclose } = this.state
+		const { dataUpload, dataPelanggaran, pelaporan, dataSuratBA, thisclose, daftarPeserta } = this.state
 		return (
 		return (
 			<ContentWrapper unwrap>
 			<ContentWrapper unwrap>
 				{/* <Header /> */}
 				{/* <Header /> */}
@@ -557,6 +560,19 @@ class ProsesSanksi extends Component {
 												<h4 className="text-left my-3">7. Ringkasan</h4>
 												<h4 className="text-left my-3">7. Ringkasan</h4>
 											</NavLink>
 											</NavLink>
 										</NavItem>
 										</NavItem>
+										<NavItem style={stepNavitemStyle}>
+											<NavLink
+												tag="div"
+												className={classnames({
+													active: this.state.activeStep === "8",
+												})}
+												onClick={this.toggleStep("8")}
+												disabled={thisclose === "Ditutup"}
+											// onClick={this.toggleStep("6")}
+											>
+												<h4 className="text-left my-3">8. Tanda Tangan Kehadiran</h4>
+											</NavLink>
+										</NavItem>
 									</Nav>
 									</Nav>
 								</Col>
 								</Col>
 								<Col xs="8">
 								<Col xs="8">
@@ -730,6 +746,19 @@ class ProsesSanksi extends Component {
 												</Button>
 												</Button>
 											</div>
 											</div>
 										</TabPane>
 										</TabPane>
+										<TabPane tabId="8">
+											<Card>
+												<Modul query={this.props.query} dataLaporan={pelaporan} role={this.props?.user?.role.id} daftarPeserta={daftarPeserta} />
+											</Card>
+											<div className="d-flex">
+												{/* <Button color className="btn-login color-3e3a8e" onClick={this.toggleStep("4")}>
+													<span className="font-color-white">Previous</span>
+												</Button>
+												<Button className="ml-auto btn-login color-3e3a8e" color onClick={this.toggleStep("6")}>
+													<span className="font-color-white">Next</span>
+												</Button> */}
+											</div>
+										</TabPane>
 									</TabContent>
 									</TabContent>
 								</Col>
 								</Col>
 							</Row>
 							</Row>

+ 170 - 0
pages/signature/modul/[id].js

@@ -0,0 +1,170 @@
+import React, { Component } from 'react';
+import BasePage from "@/components/Layout/BasePage";
+
+import { addDaftarHadirPeserta, getOneLaporanPublic, signature } from '../../../actions/public';
+import { getAutoSave } from "@/actions/autosave";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import { Row, Col, Card, CardBody, Button, Modal, ModalBody, ModalFooter, FormGroup, Input, Navbar, NavItem, NavLink, NavbarBrand } from "reactstrap";
+import { Formik, Form, Field, ErrorMessage } from "formik";
+import * as Yup from "yup";
+import SignatureCanvas from 'react-signature-canvas'
+import { addPesertaPleno } from '../../../actions/public';
+import { toast } from "react-toastify";
+import Router from "next/router";
+import swal from "sweetalert2";
+import Link from 'next/dist/client/link';
+import moment from 'moment';
+
+
+
+
+
+class PlenoSanksi extends Component {
+    constructor(props) {
+        super(props);
+        this.state = {
+            dataLaporan: {},
+            modal: false,
+            signature: "",
+            nama: "",
+            data: {},
+            changesign: false,
+            pageDone: false,
+
+        }
+    }
+    static getInitialProps = async ({ query }) => {
+        return { query };
+
+    };
+
+    componentDidMount = async () => {
+        const { query } = this.props;
+        const { id } = query;
+        const dataLaporan = await getOneLaporanPublic(id);
+        this.setState({ dataLaporan });
+    };
+
+    toggleModal = (value = true) => {
+        if (!value) {
+            this.setState({ modal: false });
+        } else {
+            this.setState({ modal: !this.state.modal });
+        }
+    };
+    sigPad = []
+    clear = () => {
+        this.sigPad.clear()
+    }
+    updateValueSignature = () => {
+        const addsig = this.sigPad.getTrimmedCanvas().toDataURL('image/png')
+        this.setState({
+            signature: addsig,
+            changesign: true
+
+        })
+    }
+
+    updateValueNama = (e) => {
+        this.setState({ nama: e.target.value });
+    }
+
+
+    onSubmit = async (e) => {
+
+        const { query, token } = this.props;
+        const { id } = query;
+        const sign = this.state.signature
+        const blob = await (await fetch(sign)).blob();
+        const files = new File([blob], new Date().valueOf() + 'image.png', { type: blob.type })
+        const formdata = new FormData();
+        formdata.append("ttd", files);
+        formdata.append("laporan_id", id);
+        formdata.append("nama", this.state.nama);
+        const added = await addDaftarHadirPeserta(token, formdata);
+        const toastid = toast.loading("Please wait...");
+        if (!added) {
+            swal.fire({
+                title: "Gagal Input Tanda Tangan",
+                icon: "error",
+                confirmButtonColor: "#3e3a8e",
+            });
+
+        } else {
+            swal.fire({
+                title: "Berhasil Input Tanda Tangan",
+                icon: "success",
+                confirmButtonColor: "#3e3a8e",
+            });
+            Router.push(`/signature/modul/done/${id}`);
+        }
+    };
+
+
+
+
+    render() {
+        const { signature, nama, changesign } = this.state
+
+        return (
+            <ContentWrapper unwrap>
+                <Modal isOpen={this.state.modal} >
+
+                    <ModalBody>
+                        <FormGroup row>
+                            <label className="col-md-2 col-form-label">Nama:<span className=' text-danger'>*</span></label>
+                            <div className="col-md-10">
+                                <Input type="text" value={this.state.nama} onChange={(e) => { this.updateValueNama(e) }} />
+                            </div>
+                        </FormGroup>
+                        <FormGroup row>
+                            <label className="col-md-2 col-form-label">Tanda Tangan:</label>
+                            <div className="col-md-10">
+                                <SignatureCanvas penColor='black' canvasProps={{ className: 'sigCanvas signature-style' }} ref={(ref) => { this.sigPad = ref }} onEnd={(e) => this.setState({ changesign: false })} />
+                            </div>
+                        </FormGroup>
+                        <ModalFooter>
+                            <Button color className="btn-login" onClick={this.updateValueSignature
+                            }>
+                                <span className="font-color-white">Simpan</span>
+                            </Button>
+                            <Button color className="btn-v2" onClick={() => { this.clear(), this.updateValueSignature() }}>
+                                Hapus
+                            </Button>
+                        </ModalFooter>
+                        <ModalFooter>
+                            <Button color className="bg-danger" onClick={this.toggleModal}>
+                                Batal
+                            </Button>
+                            <Button color disabled={signature === "" || signature === "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAAtJREFUGFdjYAACAAAFAAGq1chRAAAAAElFTkSuQmCC" || nama === "" || changesign === false} className=" color-3e3a8e" onClick={this.onSubmit}>
+                                <span className="font-color-white ">Kirim</span>
+                            </Button>
+
+                        </ModalFooter>
+
+                    </ModalBody>
+                </Modal>
+
+                <div className='page-sign'>
+                    <div className=" ml-5">
+                        <p >
+                            Klik tombol Hadir untuk melakukan tanda tangan sebagai tanda bukti kehadiran rapat
+                        </p>
+                        <Button color="" className="btn-labeled-2" onClick={this.toggleModal}>
+                            <h4 className="mt-2 mb-md-2 text-center font-color-white pl-3 pr-3">Hadir</h4>
+                        </Button>
+                    </div>
+
+                </div>
+
+
+            </ContentWrapper>
+        );
+    }
+
+}
+
+PlenoSanksi.Layout = BasePage;
+export default PlenoSanksi;
+
+

+ 69 - 0
pages/signature/modul/done/[id].js

@@ -0,0 +1,69 @@
+import React, { Component } from 'react';
+import BasePage from "@/components/Layout/BasePage";
+import ContentWrapper from "@/components/Layout/ContentWrapper";
+import { Row, Col, Card, CardBody, Button, Modal, ModalBody, ModalFooter, FormGroup, Input, Navbar, NavItem, NavLink, NavbarBrand } from "reactstrap";
+import { getOneLaporanPublic } from '@/actions/public';
+
+import Link from 'next/dist/client/link';
+class PlenoSanksi extends Component {
+
+    constructor(props) {
+        super(props);
+        this.state = {
+            dataLaporan: {},
+
+
+        }
+    }
+    static getInitialProps = async ({ query }) => {
+        return { query };
+
+    };
+    componentDidMount = async () => {
+        const { query } = this.props;
+        const { id } = query;
+        const dataLaporan = await getOneLaporanPublic(id);
+        this.setState({ dataLaporan });
+    };
+    render() {
+        const { dataLaporan } = this.state
+        return (
+            <div>
+                <Navbar className="navbar-color" expand="md" dark>
+                    <NavbarBrand href="/">
+                        <img className="width-133" src="/static/img/Logo-Sidali.png" alt="App Logo" />
+                    </NavbarBrand>
+                </Navbar>
+                <ContentWrapper>
+                    <div id="pageDone-TTD">
+                        <div className=' float-lg-right'>
+                            <span className=''>
+                                <img className=" main-logo-1" src="/static/img/ditbaga-logo.png" alt="gambar" />
+                                <img className="main-logo" src="/static/img/logo_kemdikbudristek.png" alt="gambar" />
+                            </span>
+                        </div>
+                        <div className='main text-center'>
+                            <img className="main" src="/static/img/success_ttd.png" alt="gambar" />
+
+                        </div>
+                        <div className='text-center'>
+                            <text className='text-1'>Tanda tangan Anda berhasil tersimpan!</text>
+                            {/* <p className=' pt-2 text-center font-color-black '>Terima kasih, dengan demikian Anda telah memberikan persetujuan terhadap Laporan Hasil Evaluasi dan Pembahasan.</p> */}
+                        </div>
+                        {/* <Link href="/app">
+                            <div className="btn-radius d-block text-center">
+                                <Button color className="btn-labeled-3">
+                                    <h4 className="p-0 mt-2">Kunjungi Aplikasi SIDALI</h4>
+                                </Button>
+                            </div>
+                        </Link> */}
+                    </div>
+
+                </ContentWrapper>
+            </div>
+
+        );
+    }
+}
+PlenoSanksi.Layout = BasePage;
+export default PlenoSanksi;

+ 2 - 1
styles/app/app/mycss.scss

@@ -240,4 +240,5 @@ border-radius: 4px;
       border-width: 1px;
       border-width: 1px;
       border-color: #b7b7bc;
       border-color: #b7b7bc;
       border-radius: 8px;
       border-radius: 8px;
-    }
+    }
+