const React = require("react");
const { useContext, useEffect, useState } = require("react");
import { Button, Card, CardImage, Modal, ModalBody, ModalHeader, ModalFooter, Input } from "@themesberg/react-bootstrap";
import ReactDOM from 'react-dom';
import { CartProvider } from 'snappet';
const Syltk = () => {
const [loading, setLoading] = React.useState(true);
const [postData, setPostData] = React.useState([]);
const [currentLang, setCurrentLang] = React.useState("it");
const [selectedImage, setSelectedImage] = React.useState("");
const [isImageSelected, setIsImageSelected] = React.useState(false);
const [editingField, setEditingField] = React.useState("");
const [editModalOpen, setEditModalOpen] = React.useState(false);
const [editValue, setEditValue] = React.useState("");
const authCtx = React.useContext(AuthContext);
////const token = authCtx.token;
////function fetch data
const fetchData = async () => {
try {
const { data } = await axios.get(`${BASE_URL}/api/syltk`);
setPostData(data);
setLoading(false);
} catch (error) {
console.error("Error fetching data:", error);
}
};
useEffect(() => {
fetchData();
}, []);
// useEffect(() => {
// const initialEditValues = data.map(() => "");
// setEditValues(initialEditValues);
// }, [data]);
const items = postData?.data;
const handleLangChange = (lang) => {
setCurrentLang(lang);
};
const filteredItems = items?.filter((item) => item.lang === currentLang);
const handleModalOpen = (field, value) => {
setEditingField(field);
setEditValue(value);
setEditModalOpen(true);
if (
field === "image_left" ||
field === "image_center" ||
field === "image_right"
) {
setIsImageSelected(true);
} else {
setIsImageSelected(false);
}
// setIsOutsideClickDisabled(true);
};
const handleFileSelectUpdate = (e) => {
setSelectedImage(e.target.files[0]);
setIsImageSelected(true);
};
const handleUpdate = async () => {
try {
const updatedItem = {
...filteredItems[0],
...editValue,
};
const formData = new FormData();
if (
editingField === "image_left" ||
editingField === "image_center" ||
editingField === "image_right"
) {
formData.append(editingField, selectedImage);
} else {
formData.append(editingField, editValue);
}
console.log(updatedItem);
// await axios.post(`${BASE_URL}/api/syltk/${updatedItem.id}`, formData, {
// headers: {
// Authorization: `Bearer ${token}`,
// "Content-Type": "multipart/form-data",
// "X-localization": currentLang,
// },
// });
await fetchData();
setEditModalOpen(false);
} catch (error) {
console.error("Error updating data:", error);
}
};
const additionalDataFields = [
{
label: "Longitude",
field: "long",
buttonText: "Edit Longitude",
},
{
label: "Latitude",
field: "lat",
buttonText: "Edit Latitude",
},
{
label: "Mobile Number",
field: "mobile_number",
buttonText: "Edit Mobile Number",
},
{
label: "Email",
field: "email",
buttonText: "Edit Email",
},
{
label: "Website",
field: "website",
buttonText: "Edit Website",
},
];
const dataColumns1 = [
"vessel_max_length",
"vessel_max_deadweight",
"container_vessel_max_load",
"vessels_on_the_wave_breaker",
"vessels_received_simultaneously",
];
const dataColumns2 = [
"container_vessels_pier",
"bulk_vessels_pier",
"harbor_basin",
];
const dataColumns3 = ["container_vessel", "bulk_vessel"];
const data = (filteredItems ?? []).map((item) => {
const rowData = {};
dataColumns1.forEach((column) => {
rowData[column] = item[column];
});
return rowData;
});
const data2 = (filteredItems ?? []).map((item) => {
const rowData = {};
dataColumns2.forEach((column) => {
rowData[column] = JSON.parse(item[column].replace(/'/g, '"'));
});
return rowData;
});
// Example usage of the EditableTable component with the dummy data
return (
<>
<div
className={`card-items-container ${
currentLang === "ar" ? "text-end" : "text-start"
} col text-center`}
>
<div className=" m-3">
<MDBBtn className=" m-3" onClick={() => handleLangChange("en")}>
English
</MDBBtn>
<MDBBtn className=" m-3" onClick={() => handleLangChange("it")}>
Italy
</MDBBtn>
<MDBBtn className=" m-3" onClick={() => handleLangChange("ar")}>
Arabic
</MDBBtn>
</div>
{loading ? (
<div>Loading...</div>
) : (
filteredItems &&
filteredItems.map((item, index) => (
<React.Fragment key={index}>
<MDBCard className="p-4">
<div className="row">
<div className="col">
<div className="image-container">
{selectedImage && editingField === "image_left" ? (
<img
className="img-fluid shadow-4"
src={URL.createObjectURL(selectedImage)}
alt="Selected Image"
/>
) : (
<MDBCardImage
className="img-fluid shadow-4"
src={`${BASE_URL}/storage/${item.image_left}`}
position="top"
alt="..."
/>
)}
<div className="m-3">
<MDBBtn
onClick={() =>
handleModalOpen("image_left", item.image_left)
}
>
Edit Image Left
</MDBBtn>
</div>
</div>
</div>
<div className="col">
<div className="image-container">
{selectedImage && editingField === "image_center" ? (
<img
className="img-fluid shadow-4"
src={URL.createObjectURL(selectedImage)}
alt="Selected Image"
/>
) : (
<MDBCardImage
className="img-fluid shadow-4"
src={`${BASE_URL}/storage/${item.image_center}`}
position="top"
alt="..."
/>
)}
<div className="m-3">
<MDBBtn
onClick={() =>
handleModalOpen("image_center", item.image_center)
}
>
Edit Image Center
</MDBBtn>
</div>
</div>
</div>
<div className="col">
<div className="image-container">
{selectedImage && editingField === "image_right" ? (
<img
className="img-fluid shadow-4"
src={URL.createObjectURL(selectedImage)}
alt="Selected Image"
/>
) : (
<MDBCardImage
className="img-fluid shadow-4"
src={`${BASE_URL}/storage/${item.image_right}`}
position="top"
alt="..."
/>
)}
<div className="m-3">
<MDBBtn
onClick={() =>
handleModalOpen("image_right", item.image_right)
}
>
Edit Image Right
</MDBBtn>
</div>
</div>
</div>
</div>
</MDBCard>
{/* Additional data */}
<div className="row m-2">
{additionalDataFields.map((dataField) => (
<div className="col-md-4 mb-4" key={dataField.field}>
<MDBCard className="mt-3">
<div className="m-3">
<p>
{dataField.label}: {item[dataField.field]}
</p>
<div className="m-3">
<MDBBtn
onClick={() =>
handleModalOpen(
dataField.field,
item[dataField.field]
)
}
color="success"
>
{dataField.buttonText}
</MDBBtn>
</div>
</div>
</MDBCard>
</div>
))}
</div>
{/* start Table sections */}
{/* Data table 1 */}
<div className="card">
<h3 className="card-header text-center font-weight-bold text-uppercase py-4">
Editable table
</h3>
<div className="card-body">
<div className="table-editable">
<table className="table table-bordered table-responsive-md table-striped text-center">
<thead>
<tr>
{dataColumns1.map((column) => (
<th key={column}>{column}</th>
))}
</tr>
</thead>
<tbody>
{data.map((item) => (
<tr key={item.id}>
{dataColumns1.map((column) => (
<td key={column}>
{item[column]}
<input
type="text"
className="form-control"
onChange={(e) => {
setEditingField(column); // Replace 'field' with 'column'
setEditValue(e.target.value);
}}
/>
</td>
))}
</tr>
))}
</tbody>
</table>
<MDBBtn color="primary" onClick={handleUpdate}>
Save
</MDBBtn>
</div>
</div>
</div>
{/* Data table */}
{/* end Table sections */}
</React.Fragment>
))
)}
{/* //Modal Show to update the data */}
<MDBModal show={editModalOpen} tabIndex="-1">
<div
className="custom-modal-container"
style={{
backgroundColor: "white",
marginLeft: "8rem",
marginRight: "8rem",
marginTop: "3rem",
borderRadius: "10px",
}}
>
<MDBModalHeader>Edit</MDBModalHeader>
<MDBModalBody>
{!isImageSelected && (
<MDBInput
label="New Value"
value={editValue}
onChange={(e) => setEditValue(e.target.value)}
/>
)}
{isImageSelected && (
<div className="mt-3">
<input type="file" onChange={handleFileSelectUpdate} />
</div>
)}
</MDBModalBody>
<MDBModalFooter>
<MDBBtn color="secondary" onClick={() => setEditModalOpen(false)}>
Cancel
</MDBBtn>
<MDBBtn color="primary" onClick={handleUpdate}>
Save
</MDBBtn>
</MDBModalFooter>
</div>
</MDBModal>
</div>
</>
);
};
function App() {
return (
<CartProvider>
<main className="p-4">
<Sytts />
</main>
</CartProvider>
);
}
ReactDOM
.createRoot(document.getElementById("root"))
.render(<App />)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>