import React, { useState } from "react";
import { useDropzone } from "react-dropzone";
import * as XLSX from "xlsx";
import {
BackHomeButton,
CommandPalletteButton,
MinimalPage,
PageHeading,
} from "ui";
import { BugReportButton, CommandInterface, Navigation } from "@/components";
interface VesselManagerRecord {
IMONumber: string;
EffectiveControl: string;
}
const UpdateVesselManager: React.FC = () => {
const [file, setFile] = useState<File | null>(null);
const [tableData, setTableData] = useState<VesselManagerRecord[]>([]);
const onDrop = (acceptedFiles: File[]) => {
const uploadedFile = acceptedFiles[0];
setFile(uploadedFile);
const reader = new FileReader();
reader.onload = (e) => {
const data = e.target?.result;
const workbook = XLSX.read(data, { type: "binary" });
const worksheet = workbook.Sheets["Recent Changes (EffControl)"];
const jsonData = XLSX.utils.sheet_to_json<VesselManagerRecord>(worksheet);
setTableData(jsonData);
};
reader.readAsBinaryString(uploadedFile);
};
const { getRootProps, getInputProps } = useDropzone({ onDrop });
return (
<MinimalPage
pageTitle={"Update Vessel Manager | Vessel Interface"}
pageDescription={"Vessel Interface | Update Vessel Manager"}
>
<div className="flex w-full flex-row justify-between pl-1 pt-1">
<div>
<BackHomeButton />
</div>
<Navigation />
<div className="flex flex-row gap-4">
<BugReportButton />
<CommandPalletteButton />
<CommandInterface />
</div>
</div>
<PageHeading text="Update Vessel Manager" />
<div className="mt-6 flex w-full flex-col gap-2 p-2 sm:w-1/2">
<div className="mt-4">
<div
{...getRootProps({
className:
"dropzone border-2 border-dashed p-4 rounded-md text-center cursor-pointer text-white",
})}
>
<input {...getInputProps()} />
<p>
Drag & drop a vessel manager update file here, or click to select
one
</p>
</div>
</div>
{file && (
<div className="mt-4">
<p className="text-white">File: {file.name}</p>
</div>
)}
{tableData.length > 0 && (
<div className="mt-6 overflow-x-auto">
<table className="min-w-full border-collapse border border-gray-400">
<thead>
<tr>
<th className="border border-gray-300 px-4 py-2 text-white">
IMO Number
</th>
<th className="border border-gray-300 px-4 py-2 text-white">
Effective Control
</th>
</tr>
</thead>
<tbody>
{tableData.map((record, index) => (
<tr key={index}>
<td className="border border-gray-300 px-4 py-2 text-white">
{record.IMONumber}
</td>
<td className="border border-gray-300 px-4 py-2 text-white">
{record.EffectiveControl}
</td>
</tr>
))}
</tbody>
</table>
</div>
)}
</div>
</MinimalPage>
);
};
export default UpdateVesselManager;
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter