Skip to content

Commit 2938343

Browse files
committed
Final premium synchronization: AI Summaries, IST Timezone, and Admin Control Center for internship defense
1 parent ee166fe commit 2938343

File tree

7 files changed

+30
-25
lines changed

7 files changed

+30
-25
lines changed

Frontend/src/admin/components/TicketTable.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React from 'react';
22
import { useNavigate } from 'react-router-dom';
33
import { Activity, ShieldCheck, Clock, User, ArrowRight, ExternalLink } from 'lucide-react';
4+
import { formatTimelineDate } from '../../utils/dateUtils';
45

56
const TicketTable = ({ tickets = [], isLoading = false, limit = null }) => {
67
const navigate = useNavigate();
@@ -89,7 +90,7 @@ const TicketTable = ({ tickets = [], isLoading = false, limit = null }) => {
8990
</div>
9091
<span className="text-[10px] text-slate-400 font-bold uppercase flex items-center gap-1.5 italic tracking-wide">
9192
<Clock size={10} className="text-slate-300" />
92-
{new Date(ticket.created_at || ticket.createdAt || ticket.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}
93+
{formatTimelineDate(ticket.created_at || ticket.createdAt || ticket.timestamp)}
9394
</span>
9495
</div>
9596
</td>

Frontend/src/admin/pages/AdminAnalytics.jsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { supabase } from "../../lib/supabaseClient";
1212
import StatCard from '../components/StatCard';
1313
import { Card, CardContent } from "../../components/ui/card";
1414
import useAuthStore from "../../store/authStore";
15+
import { formatTimelineDate } from "../../utils/dateUtils";
1516

1617
const COLORS = ['#6366f1', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6', '#a855f7', '#ec4899'];
1718

@@ -60,7 +61,7 @@ const AdminAnalytics = () => {
6061
const timeMap = {};
6162
tickets.forEach(t => {
6263
if (t.created_at) {
63-
const date = new Date(t.created_at).toLocaleDateString([], { month: 'short', day: 'numeric' });
64+
const date = formatTimelineDate(t.created_at).split(',')[0]; // Extract just the date part for the axis
6465
timeMap[date] = (timeMap[date] || 0) + 1;
6566
}
6667
});
@@ -96,10 +97,10 @@ const AdminAnalytics = () => {
9697
// 5. Live Activity Feed (Latest 10)
9798
const liveFeed = tickets.slice(0, 10).map(t => ({
9899
ticket_id: t.id,
99-
user: t.user_id ? `User ${t.user_id.slice(0, 5)}` : 'System',
100+
user: t.user_id ? `User ${t.user_id.slice(0, 5)}` : (t.profiles?.full_name || 'Anonymous'),
100101
action: `Ticket ${t.status || 'Updated'}`,
101102
type: t.status === 'open' ? 'create' : t.status === 'resolved' ? 'resolve' : 'assign',
102-
timeFormatted: new Date(t.created_at).toLocaleString(),
103+
timeFormatted: formatTimelineDate(t.created_at),
103104
time: new Date(t.created_at).getTime()
104105
}));
105106

Frontend/src/admin/pages/AdminDashboard.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { supabase } from "../../lib/supabaseClient";
1919
import StatCard from "../components/StatCard";
2020
import TicketTable from "../components/TicketTable";
2121
import { Card, CardContent } from "../../components/ui/card";
22+
import { formatTimelineDate } from "../../utils/dateUtils";
2223

2324
/**
2425
* AdminDashboard Page
@@ -209,7 +210,7 @@ const AdminDashboard = () => {
209210
<div className="flex items-center gap-1.5 px-3 py-1 bg-slate-50 rounded-full border border-slate-100">
210211
<Activity size={10} className="text-slate-400" />
211212
<span className="text-[8px] font-black text-slate-400 uppercase tracking-widest">
212-
Last Telemetry Sync: {new Date().toLocaleTimeString()}
213+
Last Telemetry Sync: {formatTimelineDate(new Date())}
213214
</span>
214215
</div>
215216
</div>

Frontend/src/admin/pages/AdminTickets.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ const AdminTickets = () => {
170170
return tickets.filter(t =>
171171
String(t.id).includes(q) ||
172172
(t.subject || '').toLowerCase().includes(q) ||
173+
(t.summary || '').toLowerCase().includes(q) ||
173174
(t.description || '').toLowerCase().includes(q) ||
174175
(t.profiles?.full_name || '').toLowerCase().includes(q)
175176
);

Frontend/src/user/components/RecentTickets.jsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,9 @@ const RecentTickets = () => {
122122
</span>
123123
</td>
124124
<td className="py-4 pr-4">
125-
<p className="text-sm font-semibold text-gray-900 line-clamp-1 group-hover:text-emerald-600 transition-colors">
126-
{ticket.subject || ticket.description || "No description provided"}
127-
</p>
125+
<p className="text-sm font-semibold text-gray-900 line-clamp-1 group-hover:text-emerald-600 transition-colors">
126+
{ticket.summary || ticket.subject || ticket.description || "No description provided"}
127+
</p>
128128
</td>
129129
<td className="py-4">
130130
{getStatusBadge(ticket.status)}

Frontend/src/user/pages/MyTickets.jsx

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { Badge } from "../../components/ui/badge";
1111
import { Select } from "../../components/ui/select";
1212
import { formatTicketId } from "../../utils/format";
1313
import TicketStatusBadge from "../components/TicketStatusBadge";
14-
import { format } from 'date-fns';
14+
import { formatTimelineDate, getTimeZoneAbbr } from "../../utils/dateUtils";
1515
import {
1616
Tooltip,
1717
TooltipContent,
@@ -96,6 +96,7 @@ function MyTickets() {
9696
const searchLower = searchQuery.toLowerCase();
9797
const matchesSearch =
9898
(ticket.subject || '').toLowerCase().includes(searchLower) ||
99+
(ticket.summary || '').toLowerCase().includes(searchLower) ||
99100
(ticket.description || '').toLowerCase().includes(searchLower) ||
100101
String(ticket.id).includes(searchLower);
101102

@@ -262,8 +263,8 @@ function MyTickets() {
262263
>
263264
<div className="space-y-3">
264265
<div>
265-
<p className="text-[10px] uppercase font-bold text-gray-400 tracking-wider mb-1">Issue Overview</p>
266-
<p className="text-sm font-medium leading-relaxed overflow-hidden text-ellipsis whitespace-nowrap">{ticket.description || "No description provided"}</p>
266+
<p className="text-[10px] uppercase font-bold text-gray-400 tracking-wider mb-1">Issue Overview</p>
267+
<p className="text-sm font-medium leading-relaxed overflow-hidden text-ellipsis whitespace-nowrap">{ticket.summary || ticket.description || "No description provided"}</p>
267268
</div>
268269
<div className="grid grid-cols-2 gap-3">
269270
<div>
@@ -284,9 +285,9 @@ function MyTickets() {
284285
</Tooltip>
285286
</td>
286287
<td className="px-6 py-4 w-1/3 max-w-[300px]">
287-
<p className="text-sm font-semibold text-gray-900 truncate group-hover:text-emerald-700 transition-colors">
288-
{ticket.subject || ticket.description || "No subject"}
289-
</p>
288+
<p className="text-sm font-semibold text-gray-900 truncate group-hover:text-emerald-700 transition-colors">
289+
{ticket.summary || ticket.subject || ticket.description || "No subject"}
290+
</p>
290291
</td>
291292
<td className="px-6 py-4">
292293
<span className="text-sm font-medium text-gray-600 bg-gray-100 px-2.5 py-1 rounded-md">
@@ -301,16 +302,16 @@ function MyTickets() {
301302
{ticket.priority || 'medium'}
302303
</span>
303304
</td>
304-
<td className="px-6 py-4">
305-
<div className="flex flex-col">
306-
<span className="text-sm font-semibold text-gray-700">
307-
{format(new Date(ticket.created_at), 'MMM d, yyyy')}
308-
</span>
309-
<span className="text-xs text-gray-400 font-medium">
310-
{format(new Date(ticket.created_at), 'hh:mm a')}
311-
</span>
312-
</div>
313-
</td>
305+
<td className="px-6 py-4">
306+
<div className="flex flex-col">
307+
<span className="text-sm font-semibold text-gray-700">
308+
{formatTimelineDate(ticket.created_at)}
309+
</span>
310+
<span className="text-[10px] text-emerald-600 font-black uppercase tracking-widest mt-0.5">
311+
{getTimeZoneAbbr()} Node
312+
</span>
313+
</div>
314+
</td>
314315
</tr>
315316
))}
316317
</tbody>

Frontend/src/user/pages/TicketDetail.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ const TicketDetail = () => {
180180
</span>
181181
</div>
182182
<h1 className="text-3xl sm:text-4xl font-black text-gray-900 tracking-tight leading-[1.15] max-w-3xl">
183-
{ticket.text?.length > 120 ? ticket.text.substring(0, 120) + "..." : (ticket.text || ticket.summary || "No description provided")}
183+
{ticket.summary || ticket.subject || (ticket.text?.length > 120 ? ticket.text.substring(0, 120) + "..." : (ticket.text || "No description provided"))}
184184
</h1>
185185
</div>
186186
</div>

0 commit comments

Comments
 (0)