From a88e45542f13d3c7df7038026b310360c058845d Mon Sep 17 00:00:00 2001 From: Mayur Shinde Date: Thu, 18 Jun 2026 18:59:31 +0530 Subject: [PATCH] added legend on team shedule page --- src/data/statusTaxonomy.js | 16 ++++++++++ src/pages/AdminSchedule.jsx | 64 ++++++++++++++++++++++++++++++++----- 2 files changed, 72 insertions(+), 8 deletions(-) diff --git a/src/data/statusTaxonomy.js b/src/data/statusTaxonomy.js index 965af38..752b39f 100644 --- a/src/data/statusTaxonomy.js +++ b/src/data/statusTaxonomy.js @@ -59,3 +59,19 @@ export const LEAD_URGENCY = { export const REP_STATUS_COLORS = Object.fromEntries(Object.entries(REP_STATUS).map(([k, v]) => [k, v.color])); export const REP_STATUS_LABELS = Object.fromEntries(Object.entries(REP_STATUS).map(([k, v]) => [k, v.label])); export const URGENCY_COLORS = Object.fromEntries(Object.entries(LEAD_URGENCY).map(([k, v]) => [k, v.color])); + +// ── Team Schedule — appointment / meeting status ──────────────────────────── +// `badge` — Tailwind classes for the status pill +// `dot` — Tailwind bg class for the legend swatch +// `desc` — one-line meaning shown in the legend (so Converted vs Scheduled is clear) +export const MEETING_STATUS = { + Scheduled: { label: 'Scheduled', badge: 'bg-blue-500/20 text-blue-600 dark:text-blue-400', dot: 'bg-blue-500', desc: 'Upcoming appointment' }, + Rescheduled: { label: 'Rescheduled', badge: 'bg-amber-500/20 text-amber-600 dark:text-amber-400', dot: 'bg-amber-500', desc: 'Moved to a new date or time' }, + Completed: { label: 'Completed', badge: 'bg-emerald-500/20 text-emerald-600 dark:text-emerald-400', dot: 'bg-emerald-500', desc: 'Visit took place' }, + Converted: { label: 'Converted', badge: 'bg-violet-500/20 text-violet-600 dark:text-violet-400', dot: 'bg-violet-500', desc: 'Won — became a signed job' }, + Cancelled: { label: 'Cancelled', badge: 'bg-slate-500/20 text-slate-600 dark:text-slate-400', dot: 'bg-slate-400', desc: 'Called off' }, +}; + +export const MEETING_STATUS_ORDER = ['Scheduled', 'Rescheduled', 'Completed', 'Converted', 'Cancelled']; + +export const MEETING_STATUS_DEFAULT = { label: 'Unknown', badge: 'bg-zinc-400/20 text-zinc-500 dark:text-zinc-400', dot: 'bg-zinc-400', desc: '' }; diff --git a/src/pages/AdminSchedule.jsx b/src/pages/AdminSchedule.jsx index e3f8c68..101288a 100644 --- a/src/pages/AdminSchedule.jsx +++ b/src/pages/AdminSchedule.jsx @@ -1,7 +1,8 @@ import React, { useState, useMemo, useEffect, useRef } from 'react'; import { useMockStore } from '../data/mockStore'; +import { MEETING_STATUS, MEETING_STATUS_ORDER, MEETING_STATUS_DEFAULT } from '../data/statusTaxonomy'; import { useTheme } from '../context/ThemeContext'; -import { Calendar, User, Clock, MapPin, MoreHorizontal, Filter, X, ChevronDown } from 'lucide-react'; +import { Calendar, User, Clock, MapPin, MoreHorizontal, Filter, X, ChevronDown, Info } from 'lucide-react'; import { SpotlightCard } from '../components/SpotlightCard'; const AdminSchedule = () => { @@ -11,6 +12,10 @@ const AdminSchedule = () => { // Refs for click-outside detection const dateDropdownRef = useRef(null); const statusDropdownRef = useRef(null); + const legendRef = useRef(null); + + // Status legend popover (opens as a card from the Info button) + const [showLegend, setShowLegend] = useState(false); // Filter states const [dateFilter, setDateFilter] = useState('all'); // all, today, week, month, quarter, custom @@ -29,6 +34,9 @@ const AdminSchedule = () => { if (statusDropdownRef.current && !statusDropdownRef.current.contains(event.target)) { setShowStatusDropdown(false); } + if (legendRef.current && !legendRef.current.contains(event.target)) { + setShowLegend(false); + } }; document.addEventListener('mousedown', handleClickOutside); @@ -314,11 +322,56 @@ const AdminSchedule = () => { -
+

{viewMode === 'list' ? 'All Active Appointments' : 'Calendar Overview'}

+ {/* Status legend — opens as a card from the Info button; labels the + badge colors (Converted vs Scheduled, etc.). Responsive on all sizes. */} + {viewMode === 'list' && ( +
+ + {showLegend && ( +
+
+ Status Legend + +
+
+ {MEETING_STATUS_ORDER.map(status => { + const cfg = MEETING_STATUS[status]; + return ( +
+ +
+

{cfg.label}

+

{cfg.desc}

+
+
+ ); + })} +
+
+ )} +
+ )}
{viewMode === 'list' ? ( @@ -361,12 +414,7 @@ const AdminSchedule = () => {
- + {meeting.status}