Untitled

 avatar
unknown
plain_text
2 years ago
13 kB
8
Indexable
import React, { useState, useCallback, useEffect } from "react";
import { useDropzone } from "react-dropzone";
import * as XLSX from 'xlsx';
import { push, ref, onValue, update } from 'firebase/database';
import { GoUpload } from "react-icons/go";
import { db } from "../dbconfig/firebaseConfig";
import { Modal } from "bootstrap";
import { FcHighPriority } from "react-icons/fc";
import SubjectsFile from '../excelTemplate/SubjectTest.xlsx';
export default function ImportFiles() {
    const [excelData, setExcelData] = useState(null);
    const [excelFileName, setExcelFileName] = useState(null);
    const [selectedData, setSelectedData] = useState(null);
    const [department, setDepartment] = useState([]);
    const [modal, setModal] = useState(null);
    const [headerCount, setHeaderCount] = useState(0);
    const [fileHeaders, setFileHeaders] = useState([]);
    const [subjectToImport, setSubjectToImport] = useState({
        SubjectCode: '',
        SubjectDescription: '',
        SubjectSchedule: '',
        SubjectSemester: '',
        SubjectTerm: '',
        SubjectTime: ''
    })
    const HeadersAccepted = ['Subject Code','Subject Description','Subject Term','Subject Semester','Subject Schedule','Subject Time'];
    const dbref = ref(db, 'Subjects');
    useEffect(() => {
        const fetchSubjects = () => {
            onValue(dbref, (departmentSnap) => {
                const subjectDepartment = departmentSnap.val();
                if (subjectDepartment) {
                    const subjectArray = Object.entries(subjectDepartment).map(([key, value]) => ({
                        key, ...value
                    }));
                    setDepartment(subjectArray);
                } else {
                    setDepartment([]);
                }
            });
        }
        fetchSubjects();
        return () => {
            onValue(dbref, () => { });
        };
    }, []);
    const onDrop = useCallback((acceptedFiles) => {
        if (acceptedFiles.length > 0) {
            const file = acceptedFiles[0];
            if (!file.name.endsWith('.xls') && !file.name.endsWith('.xlsx')) {
                console.log('invalid file');
                const invalidFile = new Modal(document.getElementById('invalidFile'));
                invalidFile.show();
                return;
            }
    
            setExcelFileName(file.name);
            const reader = new FileReader();
            reader.onload = (e) => {
                const data = e.target.result;
                const workbook = XLSX.read(data, { type: "binary" });
                const sheetName = workbook.SheetNames[0];
                const worksheet = workbook.Sheets[sheetName];
                const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
                const headers = jsonData[0];
    
                if (
                    HeadersAccepted.length !== headers.length ||
                    !HeadersAccepted.every((acceptedHeader) => headers.includes(acceptedHeader))
                ) {
                    const invalidHeaders = new Modal(document.getElementById('invalidHeaders'));
                    invalidHeaders.show();
                    return;
                }
    
                setExcelData(jsonData);
                setHeaderCount(headers.length);
                setFileHeaders(headers);
            };
            reader.readAsBinaryString(file);
        }
    }, [HeadersAccepted]);
    const { getRootProps, getInputProps } = useDropzone({ onDrop });
    const importSubject = (row) => {
        setSelectedData(row);
        console.log('selected subject', { ...row });
        console.log(headerCount);
        const headers = excelData[0];
        const selectDepartment = new Modal(document.getElementById('selectDepartment'));
        selectDepartment.show();
        setModal(selectDepartment);
    }


    const saveSelectedDepartments = () => {
        const selectedDepartments = Array.from(document.querySelectorAll('input[name="selectedDepartments"]:checked')).map(checkbox => checkbox.value);
        console.log(selectedData[0], selectedData[2]);

    }
    const downloadTemplate = () =>{
        const template = SubjectsFile;
        window.location.href = template;
    }
    return (
        <div className="container-fluid">
            <div className="d-flex align-items-center justify-content-center" style={{ minHeight: "100vh" }}>
                <div className="card text-center">
                    <div className="card-content">
                        <div className="card-header">
                            <div className="card-title">
                                <span className="text-dark text-uppercase h5 px-3">Import <b>Excel</b> Files</span>
                            </div>
                        </div>
                        <div className="card-body">
                            <div {...getRootProps()} style={{ cursor: "pointer" }}>
                                <input {...getInputProps()} />
                                <p><b className="h4">Excel</b> file here, click here to select one</p>
                            </div>
                            {excelData && (
                                <div className="mt-3">
                                    <h5>{excelFileName}</h5>
                                    <table className="table table-bordered">
                                        <thead>
                                            <tr>
                                                {excelData[0].map((header, index) => (
                                                    <React.Fragment key={index}>
                                                        <th>{header}</th>
                                                        {index === excelData[0].length - 1 && <th>Action</th>}
                                                    </React.Fragment>
                                                ))}
                                            </tr>
                                        </thead>
                                        <tbody>
                                            {excelData.slice(1).map((row, rowIndex) => (
                                                <tr key={rowIndex}>
                                                    {row.map((cell, cellIndex) => (
                                                        <React.Fragment key={cellIndex}>
                                                            <td>{cell}</td>
                                                            {cellIndex === row.length - 1 && (
                                                                <td>
                                                                    <button className="btn btn-primary" onClick={() => { importSubject(row) }}>
                                                                        import <GoUpload />
                                                                    </button>
                                                                </td>
                                                            )}
                                                        </React.Fragment>
                                                    ))}
                                                </tr>
                                            ))}
                                        </tbody>
                                    </table>
                                </div>
                            )}
                        </div>
                        <div className="card-footer">
                            <button className="btn btn-info text-light" onClick={downloadTemplate}>Download Excel Template</button>
                        </div>
                    </div>
                </div>
            </div>
            <div id="selectDepartment" className="modal fade" tabIndex="-1" role="dialog">
                <div className="modal-dialog modal-dialog-centered">
                    <div className="modal-content">
                        <div className="modal-header">
                            <h5 className="modal-title">Select Department</h5>
                            <button type="button" className="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                        </div>
                        <div className="modal-body text-success">
                            <center>
                                {department.map((subject) => (
                                    <div key={subject.key} className="form-check">
                                        <input
                                            type="checkbox"
                                            id={`department_${subject.key}`}
                                            name="selectedDepartments"
                                            value={subject.key}
                                            className="form-check-input"
                                        />
                                        <label htmlFor={`department_${subject.key}`} className="form-check-label">
                                            {subject.key}
                                        </label>
                                    </div>
                                ))}
                            </center>
                        </div>
                        <div className="modal-footer">
                            <button type="button" className="btn btn-secondary" data-bs-dismiss='modal'>Cancel</button>
                            <button type="button" className="btn btn-primary" onClick={saveSelectedDepartments}>Save</button>
                        </div>
                    </div>
                </div>
            </div>
            <div id="invalidHeaders" className="modal fade" tabIndex="-1" role="dialog">
    <div className="modal-dialog modal-dialog-centered">
        <div className="modal-content">
            <div className="modal-header">
                <div className="modal-title">Invalid File</div>
            </div>
            <div className="modal-body h3 text-dark">
                <center>
                    Please check your file. File should include all of the following Headers:
                    <ul className="list-unstyled">
                        {HeadersAccepted.map((acceptedHeader, index) => (
                            <li key={index} className="text-info text-danger text-uppercase">{acceptedHeader}</li>
                        ))}
                    </ul>
                </center>
            </div>
            <div className="modal-footer">
                <button className="btn btn-secondary" data-bs-dismiss='modal'>Close</button>
            </div>
        </div>
    </div>
</div>
            <div id="ActionModal" className="modal fade" tabIndex="-1" role="dialog">
                <div className="modal-dialog modal-dialog-centered">
                    <div className="modal-content">
                        <div className="modal-header">
                            <div className="modal-title"><p id="modalTitle"></p></div>
                        </div>
                        <div className="modal-body h3 text-dark">
                            <center>
                                <p id="modalBody"></p>
                            </center>
                        </div>
                        <div className="modal-footer">
                            <button className="btn btn-secondary" data-bs-dismiss='modal'>Close</button>
                        </div>
                    </div>
                </div>
            </div>
            <div id="invalidFile" className="modal fade" tabIndex="-1" role="dialog">
                <div className="modal-dialog modal-dialog-centered">
                    <div className="modal-content">
                        <div className="modal-header">
                            <div className="modal-title h3"><FcHighPriority />Invalid File<FcHighPriority /></div>
                        </div>
                        <div className="modal-body h3 text-dark">
                            <center>
                                Don't you get smart with me boi. We asked for <b className="text-danger">Excel File</b> we expect to get <b className="text-danger">Excel File</b> nothing less, nothing more. <p className="text-success">Try this shit one more time, we're banning the shit out of you.</p>
                            </center>
                        </div>
                        <div className="modal-footer">
                            <button className="btn btn-secondary" data-bs-dismiss='modal'>Close</button>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    );
}
Editor is loading...
Leave a Comment