localhost-llm commited on
Commit
c139d2c
·
verified ·
1 Parent(s): 46410be

Add 2 files

Browse files
Files changed (2) hide show
  1. index.html +132 -25
  2. prompts.txt +1 -0
index.html CHANGED
@@ -25,6 +25,19 @@
25
  .fade-in {
26
  animation: fadeIn 0.3s ease-in-out;
27
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  @keyframes fadeIn {
29
  from { opacity: 0; }
30
  to { opacity: 1; }
@@ -68,6 +81,8 @@
68
  });
69
  const [viewMode, setViewMode] = useState('month'); // 'month' or 'week'
70
  const [selectedEvent, setSelectedEvent] = useState(null);
 
 
71
 
72
  // Sample initial events
73
  useEffect(() => {
@@ -78,7 +93,8 @@
78
  description: 'Discuss project requirements with ABC Corp',
79
  date: new Date(new Date().setDate(new Date().getDate() + 1)),
80
  time: '10:30',
81
- type: 'meeting'
 
82
  },
83
  {
84
  id: 2,
@@ -86,7 +102,8 @@
86
  description: 'Check on product delivery status',
87
  date: new Date(new Date().setDate(new Date().getDate() + 3)),
88
  time: '14:00',
89
- type: 'call'
 
90
  },
91
  {
92
  id: 3,
@@ -94,7 +111,17 @@
94
  description: 'Send proposal to XYZ Inc',
95
  date: new Date(new Date().setDate(new Date().getDate() - 2)),
96
  time: '11:15',
97
- type: 'email'
 
 
 
 
 
 
 
 
 
 
98
  }
99
  ];
100
  setEvents(sampleEvents);
@@ -186,7 +213,8 @@
186
  description: newEvent.description,
187
  date: new Date(selectedDate),
188
  time: newEvent.time,
189
- type: newEvent.type
 
190
  };
191
 
192
  setEvents([...events, event]);
@@ -198,6 +226,12 @@
198
  setSelectedEvent(null);
199
  };
200
 
 
 
 
 
 
 
201
  const isToday = (date) => {
202
  if (!date) return false;
203
  const today = new Date();
@@ -364,6 +398,38 @@
364
  );
365
  };
366
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
367
  return (
368
  <div className="min-h-screen bg-gray-100 p-2 sm:p-4 md:p-8">
369
  <div className="max-w-6xl mx-auto">
@@ -427,33 +493,64 @@
427
  {viewMode === 'month' ? renderMonthView() : renderWeekView()}
428
  </div>
429
 
430
- <div className="bg-white rounded-lg shadow p-2 sm:p-4">
431
- <h3 className="text-base sm:text-lg font-semibold text-gray-800 mb-2 sm:mb-4">Upcoming Follow-Ups</h3>
432
- <div className="space-y-2 sm:space-y-3">
 
433
  {events
434
- .filter(event => event.date >= new Date())
435
  .sort((a, b) => a.date - b.date)
436
  .slice(0, 5)
437
- .map(event => (
438
- <div
439
- key={event.id}
440
- onClick={() => setSelectedEvent(event)}
441
- className={`p-2 sm:p-3 rounded-lg cursor-pointer ${getEventTypeColor(event.type)} text-white`}
442
- >
443
- <div className="flex justify-between items-center">
444
- <div>
445
- <div className="font-medium text-xs sm:text-sm">{event.title}</div>
446
- <div className="text-xs">{event.date.toLocaleDateString()} at {event.time}</div>
447
- </div>
448
- <i className={`fas ${getEventTypeIcon(event.type)} text-xs sm:text-sm`}></i>
449
- </div>
450
- </div>
451
- ))}
452
- {events.filter(event => event.date >= new Date()).length === 0 && (
453
- <div className="text-center py-4 text-gray-500 text-xs sm:text-sm">No upcoming follow-ups</div>
454
  )}
455
  </div>
456
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
457
  </div>
458
 
459
  {/* Add Event Modal */}
@@ -574,6 +671,16 @@
574
  <p className="text-gray-800 text-xs sm:text-sm">{selectedEvent.description || 'No description provided'}</p>
575
  </div>
576
 
 
 
 
 
 
 
 
 
 
 
577
  <div className="flex justify-end space-x-2 sm:space-x-3 pt-3 sm:pt-4">
578
  <button
579
  onClick={() => handleDeleteEvent(selectedEvent.id)}
 
25
  .fade-in {
26
  animation: fadeIn 0.3s ease-in-out;
27
  }
28
+ .event-card {
29
+ transition: all 0.2s ease;
30
+ }
31
+ .event-card:hover {
32
+ transform: translateY(-2px);
33
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
34
+ }
35
+ .section-toggle {
36
+ transition: all 0.3s ease;
37
+ }
38
+ .section-toggle:hover {
39
+ background-color: rgba(59, 130, 246, 0.1);
40
+ }
41
  @keyframes fadeIn {
42
  from { opacity: 0; }
43
  to { opacity: 1; }
 
81
  });
82
  const [viewMode, setViewMode] = useState('month'); // 'month' or 'week'
83
  const [selectedEvent, setSelectedEvent] = useState(null);
84
+ const [showCompleted, setShowCompleted] = useState(false);
85
+ const [showAll, setShowAll] = useState(false);
86
 
87
  // Sample initial events
88
  useEffect(() => {
 
93
  description: 'Discuss project requirements with ABC Corp',
94
  date: new Date(new Date().setDate(new Date().getDate() + 1)),
95
  time: '10:30',
96
+ type: 'meeting',
97
+ completed: false
98
  },
99
  {
100
  id: 2,
 
102
  description: 'Check on product delivery status',
103
  date: new Date(new Date().setDate(new Date().getDate() + 3)),
104
  time: '14:00',
105
+ type: 'call',
106
+ completed: false
107
  },
108
  {
109
  id: 3,
 
111
  description: 'Send proposal to XYZ Inc',
112
  date: new Date(new Date().setDate(new Date().getDate() - 2)),
113
  time: '11:15',
114
+ type: 'email',
115
+ completed: true
116
+ },
117
+ {
118
+ id: 4,
119
+ title: 'Project Review',
120
+ description: 'Review project milestones with team',
121
+ date: new Date(new Date().setDate(new Date().getDate() - 5)),
122
+ time: '15:30',
123
+ type: 'meeting',
124
+ completed: true
125
  }
126
  ];
127
  setEvents(sampleEvents);
 
213
  description: newEvent.description,
214
  date: new Date(selectedDate),
215
  time: newEvent.time,
216
+ type: newEvent.type,
217
+ completed: false
218
  };
219
 
220
  setEvents([...events, event]);
 
226
  setSelectedEvent(null);
227
  };
228
 
229
+ const toggleEventCompletion = (id) => {
230
+ setEvents(events.map(event =>
231
+ event.id === id ? { ...event, completed: !event.completed } : event
232
+ ));
233
+ };
234
+
235
  const isToday = (date) => {
236
  if (!date) return false;
237
  const today = new Date();
 
398
  );
399
  };
400
 
401
+ const renderEventCard = (event) => {
402
+ return (
403
+ <div
404
+ key={event.id}
405
+ onClick={() => setSelectedEvent(event)}
406
+ className={`event-card p-3 sm:p-4 rounded-lg cursor-pointer ${getEventTypeColor(event.type)} text-white mb-2 sm:mb-3`}
407
+ >
408
+ <div className="flex justify-between items-start">
409
+ <div className="flex-1">
410
+ <div className="font-medium text-sm sm:text-base mb-1">{event.title}</div>
411
+ <div className="text-xs sm:text-sm mb-1">{event.date.toLocaleDateString()} at {event.time}</div>
412
+ {event.description && (
413
+ <div className="text-xs opacity-90 truncate">{event.description}</div>
414
+ )}
415
+ </div>
416
+ <div className="flex items-center space-x-2">
417
+ <i className={`fas ${getEventTypeIcon(event.type)} text-sm sm:text-base`}></i>
418
+ <button
419
+ onClick={(e) => {
420
+ e.stopPropagation();
421
+ toggleEventCompletion(event.id);
422
+ }}
423
+ className={`w-5 h-5 rounded-full flex items-center justify-center ${event.completed ? 'bg-white text-green-500' : 'bg-white bg-opacity-30'}`}
424
+ >
425
+ {event.completed && <i className="fas fa-check text-xs"></i>}
426
+ </button>
427
+ </div>
428
+ </div>
429
+ </div>
430
+ );
431
+ };
432
+
433
  return (
434
  <div className="min-h-screen bg-gray-100 p-2 sm:p-4 md:p-8">
435
  <div className="max-w-6xl mx-auto">
 
493
  {viewMode === 'month' ? renderMonthView() : renderWeekView()}
494
  </div>
495
 
496
+ {/* Upcoming Follow-Ups */}
497
+ <div className="bg-white rounded-lg shadow p-4 sm:p-6 mb-4 sm:mb-6">
498
+ <h3 className="text-base sm:text-lg font-semibold text-gray-800 mb-3 sm:mb-4">Upcoming Follow-Ups</h3>
499
+ <div className="space-y-3 sm:space-y-4">
500
  {events
501
+ .filter(event => !event.completed && event.date >= new Date())
502
  .sort((a, b) => a.date - b.date)
503
  .slice(0, 5)
504
+ .map(event => renderEventCard(event))}
505
+ {events.filter(event => !event.completed && event.date >= new Date()).length === 0 && (
506
+ <div className="text-center py-4 text-gray-500 text-sm">No upcoming follow-ups</div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
507
  )}
508
  </div>
509
  </div>
510
+
511
+ {/* Completed Follow-Ups */}
512
+ <div className="bg-white rounded-lg shadow p-4 sm:p-6 mb-4 sm:mb-6">
513
+ <div
514
+ className="flex justify-between items-center cursor-pointer mb-3 sm:mb-4 section-toggle p-2 rounded-lg"
515
+ onClick={() => setShowCompleted(!showCompleted)}
516
+ >
517
+ <h3 className="text-base sm:text-lg font-semibold text-gray-800">Completed Follow-Ups</h3>
518
+ <i className={`fas ${showCompleted ? 'fa-chevron-up' : 'fa-chevron-down'} text-gray-500`}></i>
519
+ </div>
520
+ {showCompleted && (
521
+ <div className="space-y-3 sm:space-y-4">
522
+ {events
523
+ .filter(event => event.completed)
524
+ .sort((a, b) => b.date - a.date)
525
+ .slice(0, 5)
526
+ .map(event => renderEventCard(event))}
527
+ {events.filter(event => event.completed).length === 0 && (
528
+ <div className="text-center py-4 text-gray-500 text-sm">No completed follow-ups</div>
529
+ )}
530
+ </div>
531
+ )}
532
+ </div>
533
+
534
+ {/* All Follow-Ups */}
535
+ <div className="bg-white rounded-lg shadow p-4 sm:p-6">
536
+ <div
537
+ className="flex justify-between items-center cursor-pointer mb-3 sm:mb-4 section-toggle p-2 rounded-lg"
538
+ onClick={() => setShowAll(!showAll)}
539
+ >
540
+ <h3 className="text-base sm:text-lg font-semibold text-gray-800">All Follow-Ups</h3>
541
+ <i className={`fas ${showAll ? 'fa-chevron-up' : 'fa-chevron-down'} text-gray-500`}></i>
542
+ </div>
543
+ {showAll && (
544
+ <div className="space-y-3 sm:space-y-4">
545
+ {events
546
+ .sort((a, b) => a.date - b.date)
547
+ .map(event => renderEventCard(event))}
548
+ {events.length === 0 && (
549
+ <div className="text-center py-4 text-gray-500 text-sm">No follow-ups created yet</div>
550
+ )}
551
+ </div>
552
+ )}
553
+ </div>
554
  </div>
555
 
556
  {/* Add Event Modal */}
 
671
  <p className="text-gray-800 text-xs sm:text-sm">{selectedEvent.description || 'No description provided'}</p>
672
  </div>
673
 
674
+ <div className="flex items-center mb-4 sm:mb-5">
675
+ <span className="text-xs sm:text-sm font-medium text-gray-700 mr-2">Status:</span>
676
+ <button
677
+ onClick={() => toggleEventCompletion(selectedEvent.id)}
678
+ className={`px-3 py-1 rounded-lg text-xs sm:text-sm ${selectedEvent.completed ? 'bg-green-100 text-green-800' : 'bg-gray-100 text-gray-800'}`}
679
+ >
680
+ {selectedEvent.completed ? 'Completed' : 'Pending'}
681
+ </button>
682
+ </div>
683
+
684
  <div className="flex justify-end space-x-2 sm:space-x-3 pt-3 sm:pt-4">
685
  <button
686
  onClick={() => handleDeleteEvent(selectedEvent.id)}
prompts.txt CHANGED
@@ -0,0 +1 @@
 
 
1
+ after upcoming follow-ups give a completed follow-ups section and all