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