From 27bdcbd80dea8b18f317173088018dd96c089bbe Mon Sep 17 00:00:00 2001 From: Chitkul Lakshya Date: Fri, 7 Aug 2026 23:28:07 +0530 Subject: [PATCH 1/3] docs: add detailed markdown documentation for drafts and email automation feature --- docs/feature-drafts-and-email.md | 65 ++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 docs/feature-drafts-and-email.md diff --git a/docs/feature-drafts-and-email.md b/docs/feature-drafts-and-email.md new file mode 100644 index 0000000..0e2a1fa --- /dev/null +++ b/docs/feature-drafts-and-email.md @@ -0,0 +1,65 @@ +# Feature: Drafts, Temporary Links, & Email Automation + +This document outlines the architecture, data models, and logic implemented to support the creation of form drafts, temporary public links, and automated email notifications in the Leddger AI platform. + +## 1. Overview +The goal of this feature is to allow recruiters to configure a custom form template (e.g., Team Builder), save it as a "Draft" with a strict expiration timeline, and generate a temporary URL to share with end users. When users submit the form, the data is stored securely in MongoDB, and the recruiter receives an instant email notification via an automated OAuth2 Gmail integration. + +## 2. Frontend Updates + +### Sidebar Navigation (`src/App.jsx`) +- Restructured the sidebar navigation layout to group `Sent`, `Draft`, and `Schedule` items logically. +- Added dividers (`isDivider: true`) to distinctly section off these features from the core inbox items and team spaces, matching the new minimalist UI. + +### Team Template Builder (`src/pages/TeamTemplateBuilder.jsx`) +- Introduced a **"Save & Generate Link"** control panel. +- Allows recruiters to set an expiration period (`24 Hours`, `3 Days`, `7 Days`). +- **Draft Creation Flow**: + 1. Compiles the current UI configuration (`toggles`, `selectedDepartments`, `leadRestriction`, etc.) into a config object. + 2. Sends an authenticated `POST` request to `/api/drafts` with the configuration and expiration time. + 3. Receives a `draftId` and generates a public-facing URL: `/form/[Title]/[draftId]`. + +### Public Form View (`src/pages/PublicFormView.jsx`) +- Created a brand new React route (`/form/:title/:draftId`) designed to be accessed without authentication. +- **Expiration Protection**: Automatically queries the backend to verify the link's validity. If the backend returns a `410 Gone` status, it strictly blocks access and renders a "Link Expired" warning. +- Dynamically generates form inputs (`Team Name`, `Department`, `Team Lead`, `Objective`) strictly based on what the recruiter originally configured in the Template Builder. + +## 3. Backend Architecture (Node.js & MongoDB) + +### Data Models +Two new Mongoose schemas were introduced to `server/models/`: + +1. **`FormDraft.js`** + - Serves as the blueprint saved by the recruiter. + - `draftId`: Unique UUID. + - `recruiterId`: The Firebase UID of the creator. + - `config`: JSON object storing all toggle states. + - `expiresAt`: Date object defining the exact moment the link dies. + - `status`: String (`draft`, `active`, `expired`). + +2. **`FormSubmission.js`** + - Captures the actual data submitted by the end user. + - `submissionId`: Unique UUID. + - `draftId`: Foreign key linking back to the `FormDraft`. + - `submittedData`: The JSON payload of what the user typed. + +### API Endpoints (`server/index.js`) +- `POST /api/drafts` (Protected): Generates the expiration date, creates the UUID, and saves the `FormDraft` model to MongoDB. +- `GET /api/forms/:draftId` (Public): Validates the `draftId`. Performs a strict check: `if (new Date() > draft.expiresAt)`. If expired, it permanently updates the DB status to `expired` and rejects the request with a `410`. +- `POST /api/forms/:draftId/submit` (Public): Receives the payload, saves it as a `FormSubmission`, and triggers the automated email script in the background. + +## 4. Gmail OAuth2 Automation + +### Email Service (`server/utils/emailService.js`) +- Replaced generic SMTP configurations with a secure Google OAuth2 implementation utilizing `nodemailer` and `googleapis`. +- Rather than using an app password, the application dynamically generates short-lived access tokens using a persistent `GOOGLE_REFRESH_TOKEN`. +- **Workflow**: + 1. The user submits the public form. + 2. The backend fires `sendFormSubmissionEmail(title, submittedData)`. + 3. `emailService.js` creates an OAuth2 transporter using the Client ID, Client Secret, and Refresh Token. + 4. Formats the submitted JSON data into a clean HTML email and sends it to the configured `GOOGLE_EMAIL` address. + +## 5. Security & Authentication Overhaul +- Upgraded the Firebase Admin SDK initialization in `server/middleware/auth.js`. +- Shifted from using a hardcoded `serviceAccountKey.json` file to securely parsing environment variables (`FIREBASE_PROJECT_ID`, `FIREBASE_CLIENT_EMAIL`, `FIREBASE_PRIVATE_KEY`). +- This change ensures that production secrets never accidentally leak into version control, satisfying enterprise-level security standards. From fa44154828de1e38ad4ea82093560eec69ea0604 Mon Sep 17 00:00:00 2001 From: Chitkul Lakshya Date: Fri, 7 Aug 2026 23:59:30 +0530 Subject: [PATCH 2/3] feat: move draft expiration logic to dedicated Drafts dashboard --- docs/drafts-dashboard-architecture.md | 30 ++++ server/index.js | 56 ++++++- server/models/FormDraft.js | 4 +- src/App.jsx | 15 +- src/pages/DraftsView.css | 222 ++++++++++++++++++++++++++ src/pages/DraftsView.jsx | 203 +++++++++++++++++++++++ src/pages/EmployeeTemplateBuilder.jsx | 57 ++++++- src/pages/StudentTemplateBuilder.jsx | 57 ++++++- src/pages/TeamTemplateBuilder.jsx | 39 +---- 9 files changed, 639 insertions(+), 44 deletions(-) create mode 100644 docs/drafts-dashboard-architecture.md create mode 100644 src/pages/DraftsView.css create mode 100644 src/pages/DraftsView.jsx diff --git a/docs/drafts-dashboard-architecture.md b/docs/drafts-dashboard-architecture.md new file mode 100644 index 0000000..9913ec6 --- /dev/null +++ b/docs/drafts-dashboard-architecture.md @@ -0,0 +1,30 @@ +# Drafts Dashboard & Expiry Scheduling Architecture + +This document tracks the UI/UX redesign and backend refactoring to move public form expiration logic out of the template builders and into a dedicated Drafts management interface. + +## 1. Objective +Provide recruiters with a cleaner template building experience by removing the "expiration dropdown" from the builder UI. Instead, saved templates remain strictly in a "Draft" status (un-shareable and inaccessible) until the recruiter goes to the Drafts Dashboard, selects a specific date/time calendar option, and activates the link. + +## 2. Backend Updates (`server/`) + +### Mongoose Models +- **`FormDraft.js`**: `expiresAt` is no longer required upon creation. When `expiresAt` is `null`, the draft is considered inactive. The `status` will now properly flow through `draft` -> `active` -> `expired`. + +### API Endpoints +- **`POST /api/drafts`**: Simplified to only take `title` and `config`. Generates a Draft with a `null` expiration and `draft` status. +- **`GET /api/drafts`**: New endpoint that queries the DB for all `FormDraft` records where `recruiterId` matches the authenticated `req.user.uid`. +- **`PUT /api/drafts/:draftId/activate`**: New endpoint that takes an exact ISO `expiresAt` timestamp and updates the draft's status to `active`. +- **`GET /api/forms/:draftId` (Public)**: Updated to strictly enforce 410 (Gone) or 403 (Forbidden) if the draft's `expiresAt` is `null` (not yet activated) or if the current time exceeds `expiresAt`. + +## 3. Frontend Updates (`src/`) + +### Cleaned Template Builders +- Removed `isSaving`, `draftLink`, and `expiresInHours` state. +- Removed the public link preview box and copy buttons. +- The UI simply has a "Save as Draft" button which persists the toggles. + +### Drafts Dashboard (`src/pages/DraftsView.jsx`) +- **Split-Pane Layout**: A modern white-and-grey UI featuring a list of templates on the right, and an active configuration screen on the left. +- **Draft List**: Displays the template title, creation date, and a pill-badge for status (`Draft`, `Active`, `Expired`). +- **Calendar UI**: Standard HTML5 `` and `` elements, elegantly styled to match the minimalist aesthetic. +- **Activation Flow**: Upon selecting a date and time, the UI hits the `PUT /api/drafts/:draftId/activate` endpoint, updates the state, and immediately renders the copyable public link. diff --git a/server/index.js b/server/index.js index a8eb457..fcbbc00 100644 --- a/server/index.js +++ b/server/index.js @@ -78,11 +78,7 @@ app.post('/api/user/departments', verifyToken, async (req, res) => { */ app.post('/api/drafts', verifyToken, async (req, res) => { try { - const { title, config, expiresInHours } = req.body; - - // Calculate expiration date - const hours = parseInt(expiresInHours, 10) || 24; - const expiresAt = new Date(Date.now() + hours * 60 * 60 * 1000); + const { title, config } = req.body; const draftId = uuidv4(); @@ -91,7 +87,8 @@ app.post('/api/drafts', verifyToken, async (req, res) => { recruiterId: req.user.uid, title, config, - expiresAt + status: 'draft', + expiresAt: null }); res.json({ message: 'Draft created', draftId: newDraft.draftId }); @@ -101,6 +98,49 @@ app.post('/api/drafts', verifyToken, async (req, res) => { } }); +/** + * GET /api/drafts + * Fetch all form drafts for the logged in recruiter + */ +app.get('/api/drafts', verifyToken, async (req, res) => { + try { + const drafts = await FormDraft.find({ recruiterId: req.user.uid }).sort({ createdAt: -1 }); + res.json({ drafts }); + } catch (error) { + console.error('Error fetching drafts:', error); + res.status(500).json({ error: 'Failed to fetch drafts' }); + } +}); + +/** + * PUT /api/drafts/:draftId/activate + * Activate a form draft by setting its expiration date + */ +app.put('/api/drafts/:draftId/activate', verifyToken, async (req, res) => { + try { + const { expiresAt } = req.body; + + if (!expiresAt) { + return res.status(400).json({ error: 'expiresAt is required' }); + } + + const draft = await FormDraft.findOne({ draftId: req.params.draftId, recruiterId: req.user.uid }); + + if (!draft) { + return res.status(404).json({ error: 'Draft not found' }); + } + + draft.expiresAt = new Date(expiresAt); + draft.status = 'active'; + await draft.save(); + + res.json({ message: 'Draft activated', draft }); + } catch (error) { + console.error('Error activating draft:', error); + res.status(500).json({ error: 'Failed to activate draft' }); + } +}); + /** * GET /api/forms/:draftId * Fetch public form config (no auth required) @@ -113,6 +153,10 @@ app.get('/api/forms/:draftId', async (req, res) => { return res.status(404).json({ error: 'Form not found' }); } + if (draft.status === 'draft' || !draft.expiresAt) { + return res.status(403).json({ error: 'This form link is not yet active.' }); + } + if (new Date() > draft.expiresAt || draft.status === 'expired') { // Mark as expired in DB if not already if (draft.status !== 'expired') { diff --git a/server/models/FormDraft.js b/server/models/FormDraft.js index 0179a06..f31f768 100644 --- a/server/models/FormDraft.js +++ b/server/models/FormDraft.js @@ -20,12 +20,12 @@ const FormDraftSchema = new mongoose.Schema({ }, expiresAt: { type: Date, - required: true + default: null }, status: { type: String, enum: ['draft', 'active', 'expired'], - default: 'active' + default: 'draft' }, createdAt: { type: Date, diff --git a/src/App.jsx b/src/App.jsx index 82e364a..24d3d45 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -82,6 +82,8 @@ const AnalyticsEngine = lazy(() => import('./pages/AnalyticsEngine.jsx')); const Welcome = lazy(() => import('./pages/Welcome.jsx')); const PrivacyPolicy = lazy(() => import('./pages/PrivacyPolicy.jsx')); const TermsOfService = lazy(() => import('./pages/TermsOfService.jsx')); +const PublicFormView = lazy(() => import('./pages/PublicFormView.jsx')); +const DraftsView = lazy(() => import('./pages/DraftsView.jsx')); // Pre-defined avatars from public sources @@ -182,7 +184,10 @@ export default function App() { Templates: [ { id: 'Student Template', label: 'Student', icon: GraduationCap }, { id: 'Employee Template', label: 'Employee', icon: Briefcase }, - { id: 'Team Template', label: 'Team', icon: Users } + { id: 'Team Template', label: 'Team', icon: Users }, + { id: 'dividerTemplates', isDivider: true }, + { id: 'Drafts', label: 'Drafts', icon: File }, + { id: 'Sent Forms', label: 'Sent', icon: Send } ], Analytics: [ { id: 'Analysis', label: 'Analysis', icon: BarChart3 }, @@ -1456,6 +1461,14 @@ export default function App() { ) : activeTab === 'Team Template' ? ( + ) : activeTab === 'Drafts' ? ( + + ) : activeTab === 'Sent Forms' ? ( +
+ +

Sent Forms

+

Responses and statuses for your sent forms will appear here.

+
) : activeTab === 'Projects' ? ( ) : activeTab === 'Teams' ? ( diff --git a/src/pages/DraftsView.css b/src/pages/DraftsView.css new file mode 100644 index 0000000..5657fd7 --- /dev/null +++ b/src/pages/DraftsView.css @@ -0,0 +1,222 @@ +.drafts-container { + display: flex; + height: 100%; + width: 100%; + background-color: #F8FAFC; +} + +.drafts-left-panel { + flex: 1; + padding: 40px; + background-color: #FFFFFF; + border-right: 1px solid #E2E8F0; + display: flex; + flex-direction: column; +} + +.drafts-right-panel { + width: 400px; + background-color: #F8FAFC; + padding: 30px; + overflow-y: auto; +} + +/* Header */ +.drafts-header { + margin-bottom: 24px; +} +.drafts-header h2 { + font-size: 24px; + font-weight: 600; + color: #0F172A; + margin-bottom: 4px; +} +.drafts-header p { + font-size: 14px; + color: #64748B; +} + +/* Draft List */ +.draft-list { + display: flex; + flex-direction: column; + gap: 12px; +} +.draft-card { + background-color: #FFFFFF; + border: 1px solid #E2E8F0; + border-radius: 8px; + padding: 16px; + cursor: pointer; + transition: all 0.2s ease; +} +.draft-card:hover { + border-color: #CBD5E1; + box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05); +} +.draft-card.selected { + border-color: #0F172A; + box-shadow: 0 0 0 1px #0F172A; +} +.draft-card-title { + font-size: 15px; + font-weight: 600; + color: #1E293B; + margin-bottom: 8px; +} +.draft-card-meta { + display: flex; + justify-content: space-between; + align-items: center; + font-size: 12px; + color: #64748B; +} + +/* Status Badges */ +.status-badge { + padding: 4px 8px; + border-radius: 4px; + font-size: 11px; + font-weight: 600; + text-transform: uppercase; +} +.status-badge.draft { + background-color: #F1F5F9; + color: #475569; +} +.status-badge.active { + background-color: #DCFCE7; + color: #166534; +} +.status-badge.expired { + background-color: #FEE2E2; + color: #991B1B; +} + +/* Activation Scheduler */ +.scheduler-container { + margin-top: 40px; + max-width: 500px; +} +.scheduler-title { + font-size: 18px; + font-weight: 600; + color: #0F172A; + margin-bottom: 16px; +} +.scheduler-form { + display: flex; + flex-direction: column; + gap: 20px; + background-color: #F8FAFC; + padding: 24px; + border-radius: 12px; + border: 1px solid #E2E8F0; +} +.form-group { + display: flex; + flex-direction: column; + gap: 8px; +} +.form-group label { + font-size: 13px; + font-weight: 600; + color: #334155; +} +.scheduler-input { + padding: 10px 12px; + border: 1px solid #CBD5E1; + border-radius: 6px; + font-size: 14px; + color: #1E293B; + background-color: #FFFFFF; + outline: none; + font-family: inherit; +} +.scheduler-input:focus { + border-color: #0F172A; + box-shadow: 0 0 0 2px rgba(15, 23, 42, 0.1); +} + +.activate-btn { + background-color: #0F172A; + color: #FFFFFF; + border: none; + padding: 12px; + border-radius: 6px; + font-size: 14px; + font-weight: 600; + cursor: pointer; + transition: background-color 0.2s; + display: flex; + align-items: center; + justify-content: center; + gap: 8px; +} +.activate-btn:hover { + background-color: #1E293B; +} +.activate-btn:disabled { + background-color: #94A3B8; + cursor: not-allowed; +} + +/* Live Link Panel */ +.live-link-panel { + margin-top: 32px; + padding: 20px; + background-color: #ECFDF5; + border: 1px solid #A7F3D0; + border-radius: 8px; +} +.live-link-title { + font-size: 14px; + font-weight: 600; + color: #065F46; + margin-bottom: 12px; + display: flex; + align-items: center; + gap: 6px; +} +.live-link-box { + display: flex; + gap: 8px; +} +.live-link-input { + flex: 1; + padding: 10px; + border: 1px solid #A7F3D0; + border-radius: 6px; + font-size: 13px; + background-color: #FFFFFF; + color: #065F46; +} +.copy-btn { + padding: 0 16px; + background-color: #059669; + color: white; + border: none; + border-radius: 6px; + font-size: 13px; + font-weight: 500; + cursor: pointer; +} +.copy-btn:hover { + background-color: #047857; +} + +/* Empty States */ +.empty-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + color: #94A3B8; + text-align: center; +} +.empty-state h3 { + color: #475569; + margin-top: 16px; + margin-bottom: 8px; +} diff --git a/src/pages/DraftsView.jsx b/src/pages/DraftsView.jsx new file mode 100644 index 0000000..627478b --- /dev/null +++ b/src/pages/DraftsView.jsx @@ -0,0 +1,203 @@ +import React, { useState, useEffect } from 'react'; +import { File, Calendar, Clock, CheckCircle2, AlertCircle, Link as LinkIcon, Copy } from 'lucide-react'; +import { auth } from '../firebaseAuth'; +import './DraftsView.css'; + +export default function DraftsView() { + const [drafts, setDrafts] = useState([]); + const [loading, setLoading] = useState(true); + const [selectedDraft, setSelectedDraft] = useState(null); + + const [expiryDate, setExpiryDate] = useState(''); + const [expiryTime, setExpiryTime] = useState(''); + const [isActivating, setIsActivating] = useState(false); + + useEffect(() => { + fetchDrafts(); + }, []); + + const fetchDrafts = async () => { + try { + const token = await auth.currentUser?.getIdToken(); + if (!token) return; + + const res = await fetch('http://localhost:5000/api/drafts', { + headers: { + 'Authorization': `Bearer ${token}` + } + }); + const data = await res.json(); + if (res.ok) { + setDrafts(data.drafts || []); + } + } catch (err) { + console.error('Failed to fetch drafts:', err); + } finally { + setLoading(false); + } + }; + + const handleSelectDraft = (draft) => { + setSelectedDraft(draft); + setExpiryDate(''); + setExpiryTime(''); + }; + + const handleActivateDraft = async () => { + if (!expiryDate || !expiryTime) { + alert('Please select both a date and time.'); + return; + } + + setIsActivating(true); + try { + // Combine date and time into local ISO + const dateTimeString = `${expiryDate}T${expiryTime}:00`; + const dateObj = new Date(dateTimeString); + + const token = await auth.currentUser?.getIdToken(); + const res = await fetch(`http://localhost:5000/api/drafts/${selectedDraft.draftId}/activate`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }, + body: JSON.stringify({ expiresAt: dateObj.toISOString() }) + }); + + const data = await res.json(); + if (res.ok) { + // Update local state + setDrafts(prev => prev.map(d => d.draftId === selectedDraft.draftId ? data.draft : d)); + setSelectedDraft(data.draft); + } else { + alert(data.error || 'Failed to activate draft'); + } + } catch (err) { + console.error(err); + alert('Network error while activating draft.'); + } finally { + setIsActivating(false); + } + }; + + const getStatusBadge = (status) => { + switch (status) { + case 'active': + return Active; + case 'expired': + return Expired; + default: + return Draft; + } + }; + + return ( +
+ {/* LEFT PANEL - Scheduler */} +
+
+

Draft Configuration

+

Select a saved draft to schedule its expiration and generate a public link.

+
+ + {selectedDraft ? ( +
+

{selectedDraft.title}

+ + {selectedDraft.status === 'draft' ? ( +
+
+ + setExpiryDate(e.target.value)} + min={new Date().toISOString().split('T')[0]} + /> +
+ +
+ + setExpiryTime(e.target.value)} + /> +
+ + +
+ ) : ( +
+
+ {selectedDraft.status === 'active' ? : } + {selectedDraft.status === 'active' ? 'Link is Live' : 'Link Expired'} +
+

+ Expires at: {new Date(selectedDraft.expiresAt).toLocaleString()} +

+
+ + +
+
+ )} +
+ ) : ( +
+ +

No Draft Selected

+

Select a draft from the right panel to schedule.

+
+ )} +
+ + {/* RIGHT PANEL - Drafts List */} +
+

Your Saved Drafts

+ + {loading ? ( +

Loading drafts...

+ ) : drafts.length === 0 ? ( +

You haven't saved any drafts yet.

+ ) : ( +
+ {drafts.map(draft => ( +
handleSelectDraft(draft)} + > +
{draft.title}
+
+ {new Date(draft.createdAt).toLocaleDateString()} + {getStatusBadge(draft.status)} +
+
+ ))} +
+ )} +
+
+ ); +} diff --git a/src/pages/EmployeeTemplateBuilder.jsx b/src/pages/EmployeeTemplateBuilder.jsx index 000e0b4..be672e8 100644 --- a/src/pages/EmployeeTemplateBuilder.jsx +++ b/src/pages/EmployeeTemplateBuilder.jsx @@ -1,5 +1,6 @@ import React, { useState } from 'react'; import { User, Link, Briefcase, Building, Calendar, Star, Target, MessageSquare, ClipboardList, Zap, Monitor, Smartphone, Camera, FileUp, Mail } from 'lucide-react'; +import { auth } from '../firebaseAuth'; import './TemplateBuilder.css'; const DEFAULT_TOGGLES = { @@ -28,10 +29,50 @@ export default function EmployeeTemplateBuilder() { const [formTitle, setFormTitle] = useState('Performance Review Form'); const [emailFormat, setEmailFormat] = useState('@[department].company.com'); + // Draft Generation State + const [isSaving, setIsSaving] = useState(false); + const toggleField = (key) => { setToggles(prev => ({ ...prev, [key]: !prev[key] })); }; + const handleSaveDraft = async () => { + setIsSaving(true); + try { + const config = { + toggles, + emailFormat + }; + + const token = await auth.currentUser.getIdToken(); + + const response = await fetch('http://localhost:5000/api/drafts', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }, + body: JSON.stringify({ + title: formTitle, + config + }) + }); + + const data = await response.json(); + if (response.ok) { + alert('Draft saved successfully! Go to the Drafts tab to generate a public link.'); + } else { + console.error('Failed to save draft:', data.error); + alert('Failed to save draft.'); + } + } catch (err) { + console.error(err); + alert('Error saving draft.'); + } finally { + setIsSaving(false); + } + }; + const renderCompoundEmail = (formatStr, placeholder = "john.doe") => { if (!formatStr) return ; @@ -85,11 +126,25 @@ export default function EmployeeTemplateBuilder() { setFormTitle(e.target.value)} /> + +
+

Save Form

+
+ +
+
{/* Category: Basic Details */} diff --git a/src/pages/StudentTemplateBuilder.jsx b/src/pages/StudentTemplateBuilder.jsx index df98f27..de17fb5 100644 --- a/src/pages/StudentTemplateBuilder.jsx +++ b/src/pages/StudentTemplateBuilder.jsx @@ -1,5 +1,6 @@ import React, { useState } from 'react'; import { User, Globe, Link, Mail, BookOpen, Star, Target, MessageSquare, ClipboardList, Clock, Layers, Monitor, Smartphone, Camera, FileUp } from 'lucide-react'; +import { auth } from '../firebaseAuth'; import './TemplateBuilder.css'; const DEFAULT_TOGGLES = { @@ -28,10 +29,50 @@ export default function StudentTemplateBuilder() { const [formTitle, setFormTitle] = useState('Student Evaluation Form'); const [emailFormat, setEmailFormat] = useState('@[branch].sreenidhi.edu.in'); + // Draft Generation State + const [isSaving, setIsSaving] = useState(false); + const toggleField = (key) => { setToggles(prev => ({ ...prev, [key]: !prev[key] })); }; + const handleSaveDraft = async () => { + setIsSaving(true); + try { + const config = { + toggles, + emailFormat + }; + + const token = await auth.currentUser.getIdToken(); + + const response = await fetch('http://localhost:5000/api/drafts', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }, + body: JSON.stringify({ + title: formTitle, + config + }) + }); + + const data = await response.json(); + if (response.ok) { + alert('Draft saved successfully! Go to the Drafts tab to generate a public link.'); + } else { + console.error('Failed to save draft:', data.error); + alert('Failed to save draft.'); + } + } catch (err) { + console.error(err); + alert('Error saving draft.'); + } finally { + setIsSaving(false); + } + }; + const renderCompoundEmail = (formatStr, placeholder = "john.doe") => { if (!formatStr) return ; @@ -85,11 +126,25 @@ export default function StudentTemplateBuilder() { setFormTitle(e.target.value)} /> + +
+

Save Form

+
+ +
+
{/* Category: Basic Details */} diff --git a/src/pages/TeamTemplateBuilder.jsx b/src/pages/TeamTemplateBuilder.jsx index cd84aca..d71fe26 100644 --- a/src/pages/TeamTemplateBuilder.jsx +++ b/src/pages/TeamTemplateBuilder.jsx @@ -39,8 +39,6 @@ export default function TeamTemplateBuilder() { // Draft Generation State const [isSaving, setIsSaving] = useState(false); - const [draftLink, setDraftLink] = useState(''); - const [expiresInHours, setExpiresInHours] = useState('24'); useEffect(() => { const fetchDepartments = async () => { @@ -120,7 +118,6 @@ export default function TeamTemplateBuilder() { const handleSaveDraft = async () => { setIsSaving(true); - setDraftLink(''); try { const config = { toggles, @@ -144,14 +141,13 @@ export default function TeamTemplateBuilder() { }, body: JSON.stringify({ title: formTitle, - config, - expiresInHours + config }) }); const data = await response.json(); if (response.ok) { - setDraftLink(`http://localhost:5173/form/${encodeURIComponent(formTitle)}/${data.draftId}`); + alert('Draft saved successfully! Go to the Drafts tab to generate a public link.'); } else { console.error('Failed to save draft:', data.error); alert('Failed to save draft.'); @@ -187,40 +183,17 @@ export default function TeamTemplateBuilder() {
-

Save & Generate Link

-
- +

Save Form

+
- - {draftLink && ( -
- -
- - -
-
- )}
From 6f379f24a89be8b6137cd778cb73af3f55015538 Mon Sep 17 00:00:00 2001 From: Eeshitha Gone <22311A6712@ds.sreenidhi.edu.in> Date: Sat, 8 Aug 2026 00:31:14 +0530 Subject: [PATCH 3/3] style: updated drafts dashboard layout and added success animation overlay --- public/Sucess.webm | Bin 0 -> 86244 bytes src/App.jsx | 4 +- src/pages/DraftsView.css | 7 +-- src/pages/DraftsView.jsx | 68 ++++++++++++++------------ src/pages/EmployeeTemplateBuilder.jsx | 9 +++- src/pages/StudentTemplateBuilder.jsx | 11 ++++- src/pages/TeamTemplateBuilder.jsx | 9 +++- src/pages/TemplateBuilder.css | 21 ++++++++ 8 files changed, 90 insertions(+), 39 deletions(-) create mode 100644 public/Sucess.webm diff --git a/public/Sucess.webm b/public/Sucess.webm new file mode 100644 index 0000000000000000000000000000000000000000..e7b7b7547e941ed439eb0313b645460c72097f02 GIT binary patch literal 86244 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

  • }-Ft-7AA$hAsE*NzlGC{~4%8}$SdojjfdMEy&J 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

    8NX14(w_C1 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 { if (['Dashboard', 'Alerts'].includes(tab)) return 'Home'; - if (['Student Template', 'Employee Template', 'Team Template'].includes(tab)) return 'Templates'; + if (['Student Template', 'Employee Template', 'Team Template', 'Drafts', 'Sent Forms'].includes(tab)) return 'Templates'; if (['Projects', 'Teams', 'Sourcing', 'Calendar'].includes(tab)) return 'Workspace'; if (['Analysis', 'Reports', 'Export'].includes(tab)) return 'Analytics'; if (['Knowledge Base'].includes(tab)) return 'Intelligence'; diff --git a/src/pages/DraftsView.css b/src/pages/DraftsView.css index 5657fd7..ec10a0e 100644 --- a/src/pages/DraftsView.css +++ b/src/pages/DraftsView.css @@ -5,19 +5,20 @@ background-color: #F8FAFC; } -.drafts-left-panel { +.drafts-main-panel { flex: 1; padding: 40px; background-color: #FFFFFF; - border-right: 1px solid #E2E8F0; display: flex; flex-direction: column; + overflow-y: auto; } -.drafts-right-panel { +.drafts-sidebar-panel { width: 400px; background-color: #F8FAFC; padding: 30px; + border-left: 1px solid #E2E8F0; overflow-y: auto; } diff --git a/src/pages/DraftsView.jsx b/src/pages/DraftsView.jsx index 627478b..1c5333c 100644 --- a/src/pages/DraftsView.jsx +++ b/src/pages/DraftsView.jsx @@ -94,12 +94,43 @@ export default function DraftsView() { return (

    - {/* LEFT PANEL - Scheduler */} -
    + {/* MAIN PANEL - Drafts List */} +
    -

    Draft Configuration

    -

    Select a saved draft to schedule its expiration and generate a public link.

    +

    Your Saved Drafts

    +

    Select a draft to schedule its expiration and generate a public link.

    + + {loading ? ( +

    Loading drafts...

    + ) : drafts.length === 0 ? ( +
    + +

    No Drafts Yet

    +

    You haven't saved any drafts. Create one in the template builder.

    +
    + ) : ( +
    + {drafts.map(draft => ( +
    handleSelectDraft(draft)} + > +
    {draft.title}
    +
    + {new Date(draft.createdAt).toLocaleDateString()} + {getStatusBadge(draft.status)} +
    +
    + ))} +
    + )} +
    + + {/* RIGHT SIDEBAR - Scheduler */} +
    +

    Draft Configuration

    {selectedDraft ? (
    @@ -167,37 +198,12 @@ export default function DraftsView() {

    No Draft Selected

    -

    Select a draft from the right panel to schedule.

    +

    Select a draft from the main panel to schedule.

    )}
    - {/* RIGHT PANEL - Drafts List */} -
    -

    Your Saved Drafts

    - - {loading ? ( -

    Loading drafts...

    - ) : drafts.length === 0 ? ( -

    You haven't saved any drafts yet.

    - ) : ( -
    - {drafts.map(draft => ( -
    handleSelectDraft(draft)} - > -
    {draft.title}
    -
    - {new Date(draft.createdAt).toLocaleDateString()} - {getStatusBadge(draft.status)} -
    -
    - ))} -
    - )} -
    +
    ); } diff --git a/src/pages/EmployeeTemplateBuilder.jsx b/src/pages/EmployeeTemplateBuilder.jsx index be672e8..0eb608e 100644 --- a/src/pages/EmployeeTemplateBuilder.jsx +++ b/src/pages/EmployeeTemplateBuilder.jsx @@ -31,6 +31,7 @@ export default function EmployeeTemplateBuilder() { // Draft Generation State const [isSaving, setIsSaving] = useState(false); + const [showSuccess, setShowSuccess] = useState(false); const toggleField = (key) => { setToggles(prev => ({ ...prev, [key]: !prev[key] })); @@ -60,7 +61,8 @@ export default function EmployeeTemplateBuilder() { const data = await response.json(); if (response.ok) { - alert('Draft saved successfully! Go to the Drafts tab to generate a public link.'); + setShowSuccess(true); + setTimeout(() => setShowSuccess(false), 2500); } else { console.error('Failed to save draft:', data.error); alert('Failed to save draft.'); @@ -114,6 +116,11 @@ export default function EmployeeTemplateBuilder() { return (
    + {showSuccess && ( +
    +
    + )} {/* LEFT PANEL - FIELD SELECTOR */}
    diff --git a/src/pages/StudentTemplateBuilder.jsx b/src/pages/StudentTemplateBuilder.jsx index de17fb5..f0e7228 100644 --- a/src/pages/StudentTemplateBuilder.jsx +++ b/src/pages/StudentTemplateBuilder.jsx @@ -31,6 +31,7 @@ export default function StudentTemplateBuilder() { // Draft Generation State const [isSaving, setIsSaving] = useState(false); + const [showSuccess, setShowSuccess] = useState(false); const toggleField = (key) => { setToggles(prev => ({ ...prev, [key]: !prev[key] })); @@ -60,7 +61,8 @@ export default function StudentTemplateBuilder() { const data = await response.json(); if (response.ok) { - alert('Draft saved successfully! Go to the Drafts tab to generate a public link.'); + setShowSuccess(true); + setTimeout(() => setShowSuccess(false), 2500); } else { console.error('Failed to save draft:', data.error); alert('Failed to save draft.'); @@ -114,8 +116,13 @@ export default function StudentTemplateBuilder() { return (
    + {showSuccess && ( +
    +
    + )} - {/* LEFT PANEL - FIELD SELECTOR */} + {/* LEFT PANEL - Sidebar Controls */}

    Student Template

    diff --git a/src/pages/TeamTemplateBuilder.jsx b/src/pages/TeamTemplateBuilder.jsx index d71fe26..664a854 100644 --- a/src/pages/TeamTemplateBuilder.jsx +++ b/src/pages/TeamTemplateBuilder.jsx @@ -39,6 +39,7 @@ export default function TeamTemplateBuilder() { // Draft Generation State const [isSaving, setIsSaving] = useState(false); + const [showSuccess, setShowSuccess] = useState(false); useEffect(() => { const fetchDepartments = async () => { @@ -147,7 +148,8 @@ export default function TeamTemplateBuilder() { const data = await response.json(); if (response.ok) { - alert('Draft saved successfully! Go to the Drafts tab to generate a public link.'); + setShowSuccess(true); + setTimeout(() => setShowSuccess(false), 2500); } else { console.error('Failed to save draft:', data.error); alert('Failed to save draft.'); @@ -164,6 +166,11 @@ export default function TeamTemplateBuilder() { return (
    + {showSuccess && ( +
    +
    + )} {/* LEFT PANEL - FIELD SELECTOR */}
    diff --git a/src/pages/TemplateBuilder.css b/src/pages/TemplateBuilder.css index 145b7bb..74c23e6 100644 --- a/src/pages/TemplateBuilder.css +++ b/src/pages/TemplateBuilder.css @@ -511,3 +511,24 @@ .compound-input-field::placeholder { color: #A0AEC0; } + +/* Success Overlay */ +.success-overlay { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: rgba(255, 255, 255, 0.8); + backdrop-filter: blur(4px); + z-index: 9999; + display: flex; + align-items: center; + justify-content: center; + animation: fadeIn 0.3s ease; +} +.success-video { + width: 300px; + height: 300px; + object-fit: contain; +}