diff --git a/ipi-survey-platform/src/components/common/FormControls.jsx b/ipi-survey-platform/src/components/common/FormControls.jsx
index a0e273f..83fea11 100644
--- a/ipi-survey-platform/src/components/common/FormControls.jsx
+++ b/ipi-survey-platform/src/components/common/FormControls.jsx
@@ -570,6 +570,7 @@ export const DateField = ({
rightIcon = calendarIconSrc,
onBlur,
onFocus,
+ required=false,
...rest
}) => {
const inputRef = React.useRef(null);
@@ -647,6 +648,7 @@ export const DateField = ({
{label && (
)}
@@ -662,6 +664,7 @@ export const DateField = ({
style={inputStyle}
onFocus={handleFocus}
onBlur={handleBlur}
+ required={required}
{...rest}
/>
{rightIcon && (
diff --git a/ipi-survey-platform/src/components/dashboard/SurveyStatus.jsx b/ipi-survey-platform/src/components/dashboard/SurveyStatus.jsx
index 73ef944..5572316 100644
--- a/ipi-survey-platform/src/components/dashboard/SurveyStatus.jsx
+++ b/ipi-survey-platform/src/components/dashboard/SurveyStatus.jsx
@@ -35,7 +35,6 @@ export const SurveyStatus = ({ data = null, loading = false, error = '' }) => {
const navigate = useNavigate();
const handleStartSurvey = (survey) => {
- console.log('Starting survey:', survey.title);
};
const surveyData = data || {};
diff --git a/ipi-survey-platform/src/components/overview/DetailedOverview.jsx b/ipi-survey-platform/src/components/overview/DetailedOverview.jsx
index c2949f5..6fae0c7 100644
--- a/ipi-survey-platform/src/components/overview/DetailedOverview.jsx
+++ b/ipi-survey-platform/src/components/overview/DetailedOverview.jsx
@@ -67,11 +67,7 @@ export const DetailedOverview = ({ submission, onBack }) => {
try {
setIsLoading(true);
setError(null);
- console.log('Fetching submission details for ID:', submission.id);
- const response = await fetchSubmissionDetail(submission.id);
-
- console.log('API Response:', response);
-
+ const response = await fetchSubmissionDetail(submission.id);
if (response && response.data) {
console.log('Setting submission data:', response.data);
setSubmissionData(response.data);
diff --git a/ipi-survey-platform/src/pages/Admin/configuration/QuarterlyWindows.jsx b/ipi-survey-platform/src/pages/Admin/configuration/QuarterlyWindows.jsx
index a080fff..a1d99f3 100644
--- a/ipi-survey-platform/src/pages/Admin/configuration/QuarterlyWindows.jsx
+++ b/ipi-survey-platform/src/pages/Admin/configuration/QuarterlyWindows.jsx
@@ -2,16 +2,13 @@ import React from 'react';
import Table from '@/components/common/Table';
import { TextField, SelectField, DateField } from '@/components/common/FormControls';
import StatusBadge from '@/components/common/StatusBadge';
-import { createQuarterlyWindow, updateQuarterlyWindow, getQuarterlyWindows, deleteQuarterlyWindow } from '@/services/configuration/quarterlyWindows';
+import { createQuarterlyWindow, updateQuarterlyWindow, getQuarterlyWindows } from '@/services/configuration/quarterlyWindows';
import CustomToast from '@/components/common/CustomToast';
const downloadIconSrc = '/assets/images/DownloadSimple.svg';
const addIconSrc = '/assets/images/ic_baseline-plus.svg';
const pencilActiveSrc = '/assets/images/PencilSimple.svg';
const pencilInactiveSrc = '/assets/images/pencilsimple-inactive.svg';
-const trashActiveSrc = '/assets/images/Trash - active.svg';
-const trashInactiveSrc = '/assets/images/Trash - Inactive.svg';
-const deleteIconSrc = '/assets/images/delete.svg';
const caretDownActiveSrc = '/assets/images/caretdown-active.svg';
const searchIconSrc = '/assets/images/material-symbols_search-rounded.svg';
const caretDownSrc = '/assets/images/CaretDown-black.svg';
@@ -31,15 +28,12 @@ const createEmptyQuarterForm = () => ({
const QuarterlyWindows = () => {
const [quarterData, setQuarterData] = React.useState([]);
const [editingRow, setEditingRow] = React.useState(null);
- const [deletingRow, setDeletingRow] = React.useState(null);
const [modalMode, setModalMode] = React.useState(null);
const [form, setForm] = React.useState(createEmptyQuarterForm());
const [originalForm, setOriginalForm] = React.useState(null);
- const [showDeleteConfirm, setShowDeleteConfirm] = React.useState(false);
const [searchTerm, setSearchTerm] = React.useState('');
const [statusFilter, setStatusFilter] = React.useState('all');
const [hoveredEdit, setHoveredEdit] = React.useState(null);
- const [hoveredDelete, setHoveredDelete] = React.useState(null);
const [currentPage, setCurrentPage] = React.useState(1);
const pageSize = 10;
const [isLoading, setIsLoading] = React.useState(false);
@@ -76,7 +70,7 @@ const QuarterlyWindows = () => {
startDate: item.start_date || '',
endDate: item.end_date || '',
gracePeriod: item.grace_periods_days ? `${item.grace_periods_days} days` : '0 days',
- submissionCount: '0',
+ submissionCount: item.submission_count?.toString() || '-',
status: item.is_active ? 'Active' : 'Inactive'
}));
setQuarterData(formattedData);
@@ -95,13 +89,6 @@ const QuarterlyWindows = () => {
fetchQuarterlyWindows();
}, []);
- const deletingQuarter = React.useMemo(() => {
- if (deletingRow === null || deletingRow < 0 || deletingRow >= quarterData.length) {
- return null;
- }
- return quarterData[deletingRow];
- }, [deletingRow, quarterData]);
-
const headers = ['Survey Name', 'Year', 'Quarter', 'Start Date', 'End Date', 'Grace Period', 'Submission Count', 'Status', 'Actions'];
const columnwidth = [300, 100, 100, 100, 100, 100, 100, 100, 100];
const filteredRows = React.useMemo(() => {
@@ -198,19 +185,9 @@ const QuarterlyWindows = () => {
- const openDeleteConfirm = (index) => {
- setDeletingRow(index);
- setShowDeleteConfirm(true);
- };
-
- const closeDeleteConfirm = () => {
- setShowDeleteConfirm(false);
- setDeletingRow(null);
- };
-
const showToast = (message, type = 'success') => {
setToast({ show: true, message, type });
- setTimeout(() => setToast({ ...toast, show: false }), 4000);
+ setTimeout(() => setToast(prev => ({ ...prev, show: false })), 4000);
};
const handleSave = async () => {
@@ -219,6 +196,14 @@ const QuarterlyWindows = () => {
showToast('Please fill in all required fields', 'error');
return;
}
+
+ const startDate = new Date(form.startDate);
+ const endDate = new Date(form.endDate);
+ if (endDate <= startDate) {
+ showToast('Close Date must be after Open Date', 'error');
+ return;
+ }
+
const formatDateForAPI = (dateString) => {
if (!dateString) return '';
// If already in YYYY-MM-DD format
@@ -234,12 +219,13 @@ const QuarterlyWindows = () => {
return new Date(dateString).toISOString().split('T')[0];
};
+
const formattedData = {
survey_name: form.survey_name || '',
year: form.year ? parseInt(form.year, 10) : 0,
quarter: form.quarter || '',
- start_date: form.startDate ? formatDateForAPI(form.startDate) : '',
- end_date: form.endDate ? formatDateForAPI(form.endDate) : '',
+ start_date: startDate.toISOString().split('T')[0],
+ end_date: endDate.toISOString().split('T')[0],
grace_periods_days: form.gracePeriod ? parseInt(form.gracePeriod.split(' ')[0], 10) || 0 : 0,
is_active: form.status === 'Active',
establishment: form.establishment || '-',
@@ -296,36 +282,6 @@ const QuarterlyWindows = () => {
}
};
- const handleDelete = async () => {
- if (deletingRow === null) return;
-
- try {
- // First, get the item to ensure we have the latest data
- const itemToDelete = quarterData[deletingRow];
- if (!itemToDelete?.id) {
- showToast('Error: Could not find the item to delete', 'error');
- closeDeleteConfirm();
- return;
- }
-
- // Call the delete API with the ID
- const response = await deleteQuarterlyWindow(itemToDelete.id);
-
- if (response.status === 'success') {
- // Update the UI by removing the deleted item
- setQuarterData(prev => prev.filter(item => item.id !== itemToDelete.id));
- showToast('Quarterly window deleted successfully!');
- } else {
- showToast(response.message || 'Failed to delete quarterly window', 'error');
- }
- } catch (error) {
- console.error('Error deleting quarterly window:', error);
- showToast('An error occurred while deleting. Please try again.', 'error');
- } finally {
- closeDeleteConfirm();
- }
- };
-
return (
<>
{toast.show && (
@@ -434,21 +390,6 @@ const QuarterlyWindows = () => {
className="h-5 w-5"
/>
-
);
}
@@ -474,6 +415,28 @@ const QuarterlyWindows = () => {
border: '1px solid #E5E7EB',
}}
>
+ {/* Toast Notification */}
+ {toast.show && (
+