2026-01-28 05:48:46 +00:00
|
|
|
"use client";
|
|
|
|
|
|
|
|
|
|
import { useState, useEffect } from "react";
|
|
|
|
|
import dynamic from "next/dynamic"; // ⬅️ PENTING
|
|
|
|
|
import { useUploadContext } from "../_context/upload-context";
|
|
|
|
|
import { Button } from "@/shared/components/ui/button";
|
|
|
|
|
import MetadataForm, { getInitialMetadata } from "./map/MetadataForm";
|
|
|
|
|
import TablePreview from "./map/TablePreview";
|
|
|
|
|
import { log } from "node:console";
|
|
|
|
|
import uploadApi from "@/shared/services/map-upload";
|
|
|
|
|
import { useUploadLogic } from "../_hooks/use-upload";
|
|
|
|
|
import { toast } from "sonner";
|
|
|
|
|
|
|
|
|
|
// 🔥 IMPORT DYNAMIC UNTUK KOMPONEN PETA
|
|
|
|
|
const SpatialStylePreview = dynamic(() => import("./map/StylePreview"), {
|
|
|
|
|
ssr: false,
|
|
|
|
|
loading: () => <div className="h-[400px] bg-slate-100 flex items-center justify-center">Loading Map...</div>
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const StylingLayers = dynamic(() => import("./map/StylingLayers"), {
|
|
|
|
|
ssr: false
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export default function StepValidate() {
|
|
|
|
|
const { state, setState, goToStep } = useUploadContext();
|
|
|
|
|
const {
|
|
|
|
|
loading,
|
|
|
|
|
handleSaveToDatabase
|
|
|
|
|
} = useUploadLogic();
|
|
|
|
|
|
|
|
|
|
// State lokal untuk Metadata & Style
|
|
|
|
|
// const [metadata, setMetadata] = useState(state.result?.data.metadata_suggest || {});
|
|
|
|
|
const [metadata, setMetadata] = useState(() =>
|
|
|
|
|
getInitialMetadata(state.result?.data.metadata_suggest || {})
|
|
|
|
|
);
|
|
|
|
|
const [styleConfig, setStyleConfig] = useState({"styleType": "sld","sldContent": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<StyledLayerDescriptor version=\"1.0.0\"\n xmlns=\"http://www.opengis.net/sld\"\n xmlns:ogc=\"http://www.opengis.net/ogc\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n xmlns:se=\"http://www.opengis.net/se\"\n xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:schemaLocation=\"http://www.opengis.net/sld\n http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd\">\n\n <NamedLayer>\n <Name>layer</Name>\n <UserStyle>\n <FeatureTypeStyle>\n <Rule>\n \n <PolygonSymbolizer>\n <Fill>\n <CssParameter name=\"fill\">#3388ff</CssParameter>\n <CssParameter name=\"fill-opacity\">0.5</CssParameter>\n </Fill>\n <Stroke>\n <CssParameter name=\"stroke\">#232323</CssParameter>\n <CssParameter name=\"stroke-width\">1</CssParameter>\n </Stroke>\n </PolygonSymbolizer>\n \n </Rule>\n </FeatureTypeStyle>\n </UserStyle>\n </NamedLayer>\n</StyledLayerDescriptor>\n"});
|
|
|
|
|
|
|
|
|
|
// Ambil dummy geosStyle atau fetch dari API
|
|
|
|
|
const geosStyle = [{name: "Style A"}, {name: "Style B"}];
|
|
|
|
|
|
|
|
|
|
// const handleConfirm = async () => {
|
|
|
|
|
// const table = state.result?.data;
|
|
|
|
|
// const data = {
|
|
|
|
|
// title: metadata.title,
|
|
|
|
|
// columns: table.columns,
|
|
|
|
|
// rows: table.preview,
|
|
|
|
|
// author: metadata,
|
|
|
|
|
// style: styleConfig.sldContent
|
|
|
|
|
// }
|
|
|
|
|
// handleSaveToDatabase
|
|
|
|
|
// // Gabungkan metadata + style + data result -> Kirim ke API saveToDatabase
|
|
|
|
|
// // goToStep("SUCCESS");
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
const handleConfirm = async () => {
|
|
|
|
|
// Validasi Frontend
|
|
|
|
|
if (!metadata.title) {
|
|
|
|
|
toast.warning("Judul data wajib diisi.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const table = state.result?.data;
|
|
|
|
|
const data = {
|
|
|
|
|
title: metadata.title,
|
2026-02-10 01:56:22 +00:00
|
|
|
path: state.result?.data.tmp_path,
|
2026-01-28 05:48:46 +00:00
|
|
|
columns: table.columns,
|
|
|
|
|
rows: table.preview,
|
|
|
|
|
author: metadata,
|
|
|
|
|
style: styleConfig.sldContent
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await handleSaveToDatabase(data);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div className="h-full flex flex-col gap-6">
|
|
|
|
|
<h2 className="text-xl font-bold">Validasi & Styling</h2>
|
|
|
|
|
|
|
|
|
|
<div className="grid grid-cols-1 lg:grid-cols-12 gap-6">
|
|
|
|
|
{/* Bagian Peta Preview */}
|
|
|
|
|
<div className="lg:col-span-8 h-[500px] border rounded-lg overflow-hidden relative">
|
|
|
|
|
<SpatialStylePreview
|
|
|
|
|
data={state.result?.data.preview || []}
|
|
|
|
|
styleConfig={styleConfig}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{/* Bagian Kontrol Style */}
|
|
|
|
|
<div className="lg:col-span-4 h-[500px] border rounded-lg p-2">
|
|
|
|
|
<StylingLayers
|
|
|
|
|
data={state.result?.data.preview}
|
|
|
|
|
geometryType={state.result?.data.geometry_type}
|
|
|
|
|
onSubmit={setStyleConfig}
|
|
|
|
|
geosStyle={geosStyle}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{/* Bagian Metadata */}
|
|
|
|
|
<div className="">
|
|
|
|
|
<h3 className="font-bold mb-4">{state.result?.data.file_name}</h3>
|
|
|
|
|
|
|
|
|
|
{/* <MetadataForm
|
|
|
|
|
initialValues={metadata}
|
|
|
|
|
onChange={setMetadata}
|
|
|
|
|
/> */}
|
|
|
|
|
|
|
|
|
|
<div className="grid grid-cols-1 lg:grid-cols-12 gap-6">
|
|
|
|
|
{/* Bagian Tabel Preview */}
|
|
|
|
|
<div className="lg:col-span-8 h-[500px] border rounded-lg p-0">
|
|
|
|
|
<h4 className="font-bold m-2">Cuplikan Data</h4>
|
|
|
|
|
{/* <SpatialStylePreview
|
|
|
|
|
data={state.result?.data.preview || []}
|
|
|
|
|
styleConfig={styleConfig}
|
|
|
|
|
/> */}
|
|
|
|
|
<TablePreview result={state.result?.data} />
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{/* Bagian Info Dataset */}
|
|
|
|
|
<div className="lg:col-span-4 h-[500px] border rounded-lg p-2">
|
|
|
|
|
<div className="mb-2 flex align-center justify-between">
|
|
|
|
|
<h4 className="m-0 font-bold">Info Dataset</h4>
|
|
|
|
|
<h4 className="m-0 text-gray-500 italic"><span className="text-red-500">*</span>AI Generate</h4>
|
|
|
|
|
</div>
|
|
|
|
|
<MetadataForm
|
|
|
|
|
initialValues={metadata}
|
|
|
|
|
// onChange={setMetadata}
|
|
|
|
|
onChange={(updatedData) => setMetadata(updatedData)}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div className="flex justify-end gap-3 mt-4 pb-10">
|
|
|
|
|
<Button variant="outline" onClick={() => goToStep("UPLOAD")}>Batal</Button>
|
|
|
|
|
<Button onClick={handleConfirm} disabled={loading}>
|
|
|
|
|
{loading ? "Menyimpan..." : "Simpan & Publikasi"}
|
|
|
|
|
</Button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|