forked from CSI-KJSCE/BOS-React-
soft delete code added
This commit is contained in:
@@ -2,7 +2,7 @@ const Meeting = require("../models/Meeting");
|
||||
|
||||
exports.getMeetings = async (req, res) => {
|
||||
try {
|
||||
const meetings = await Meeting.find();
|
||||
const meetings = await Meeting.find({ isDelete : false });
|
||||
const formattedMeetings = meetings.map((meeting) => {
|
||||
const formattedAgenda = meeting.agenda
|
||||
? meeting.agenda.map((item, index) => `<li>${index + 1}. ${item}</li>`).join("")
|
||||
@@ -16,3 +16,20 @@ exports.getMeetings = async (req, res) => {
|
||||
res.status(500).json({ error: "Error fetching meetings" });
|
||||
}
|
||||
};
|
||||
// ✅ Soft delete controller (NEW)
|
||||
exports.softDeleteMeeting = async (req, res) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
|
||||
const meeting = await Meeting.findByIdAndUpdate(id, { isDeleted: true }, { new: true });
|
||||
|
||||
if (!meeting) {
|
||||
return res.status(404).json({ error: "Meeting not found" });
|
||||
}
|
||||
|
||||
res.json({ message: "Meeting soft deleted successfully", meeting });
|
||||
} catch (error) {
|
||||
console.error("Error soft deleting meeting:", error);
|
||||
res.status(500).json({ error: "Failed to soft delete meeting" });
|
||||
}
|
||||
};
|
||||
|
||||
@@ -11,6 +11,10 @@ const meetingSchema = new mongoose.Schema({
|
||||
endTime: String,
|
||||
recipients: [String],
|
||||
attachments: [{ filename: String, path: String }],
|
||||
isDeleted: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = mongoose.model("Meeting", meetingSchema);
|
||||
|
||||
@@ -1,8 +1,16 @@
|
||||
const express = require("express");
|
||||
const { getMeetings } = require("../controllers/meetingController");
|
||||
const {
|
||||
getMeetings,
|
||||
softDeleteMeeting // ✅ Add this line
|
||||
} = require("../controllers/meetingController");
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
// GET all non-deleted meetings
|
||||
router.get("/meetings", getMeetings);
|
||||
|
||||
// ✅ Add soft delete route
|
||||
router.patch("/meetings/:id/soft-delete", softDeleteMeeting);
|
||||
|
||||
module.exports = router;
|
||||
|
||||
|
||||
@@ -122,6 +122,21 @@ html, body {
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.soft-delete-button {
|
||||
background-color: #d9534f;
|
||||
color: white;
|
||||
padding: 8px 14px;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.soft-delete-button:hover {
|
||||
background-color: #c9302c;
|
||||
}
|
||||
|
||||
|
||||
/* Meeting Cards */
|
||||
.meeting-card {
|
||||
background-color: var(--white);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//Page5.js
|
||||
// Page5.js
|
||||
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
@@ -12,10 +12,9 @@ const Page5 = () => {
|
||||
const [meetings, setMeetings] = useState([]);
|
||||
const [expandedIndex, setExpandedIndex] = useState(null);
|
||||
|
||||
useEffect(() => {
|
||||
const fetchMeetings = () => {
|
||||
axios.get('http://localhost:5000/api/meetings')
|
||||
.then((response) => {
|
||||
// Sort meetings by date (newest first) and time
|
||||
const sortedMeetings = response.data.sort((a, b) => {
|
||||
const dateA = new Date(`${a.date}T${a.startTime}`);
|
||||
const dateB = new Date(`${b.date}T${b.startTime}`);
|
||||
@@ -26,22 +25,35 @@ const Page5 = () => {
|
||||
.catch((error) => {
|
||||
console.error('Error fetching meetings:', error);
|
||||
});
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
fetchMeetings();
|
||||
}, []);
|
||||
|
||||
const toggleExpand = (index) => {
|
||||
setExpandedIndex(prev => (prev === index ? null : index));
|
||||
};
|
||||
|
||||
const handleSoftDelete = async (id) => {
|
||||
try {
|
||||
await axios.patch(`http://localhost:5000/api/meetings/${id}/soft-delete`);
|
||||
alert('Meeting soft deleted!');
|
||||
fetchMeetings();
|
||||
} catch (error) {
|
||||
console.error('Error deleting meeting:', error);
|
||||
alert('Soft delete failed.');
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="page-container">
|
||||
{/* Header Bar */}
|
||||
<header className="header-bar">
|
||||
<img src={image} alt="Left Logo" className="leftlogo" />
|
||||
<h1 className="college-name">Somaiya Scheduler</h1>
|
||||
<img src={somaiyatrust} alt="Right Logo" className="rightlogo" />
|
||||
</header>
|
||||
|
||||
{/* Navigation Bar */}
|
||||
<nav className="navbar">
|
||||
<ul>
|
||||
<li><Link to="/page2">Home</Link></li>
|
||||
@@ -53,7 +65,6 @@ const Page5 = () => {
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
{/* Main Content */}
|
||||
<div className="meetings-page-container">
|
||||
<h1 className="page-title">Meeting Details</h1>
|
||||
|
||||
@@ -141,6 +152,18 @@ const Page5 = () => {
|
||||
>
|
||||
Add to Google Calendar
|
||||
</a>
|
||||
|
||||
{/* ✅ Soft Delete Button */}
|
||||
<button
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
handleSoftDelete(meeting._id);
|
||||
}}
|
||||
className="soft-delete-button"
|
||||
>
|
||||
Delete Meeting
|
||||
</button>
|
||||
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
@@ -150,7 +173,6 @@ const Page5 = () => {
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Footer */}
|
||||
<footer>
|
||||
<div className="terms">
|
||||
<a href="#">Terms and Policies</a>
|
||||
|
||||
Reference in New Issue
Block a user