From ee7114a2dc30f814c7f7b374ef74d3d1cb92b359 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96ZT=C3=9CRK?= <76204082+iamsedatozturk@users.noreply.github.com> Date: Mon, 20 Oct 2025 16:41:31 +0300 Subject: [PATCH] =?UTF-8?q?intranet=20i=C3=A7n=20komponentler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/src/views/intranet/Announcement.tsx | 291 --- ui/src/views/intranet/Birthday.tsx | 279 --- ui/src/views/intranet/Cafeteria.tsx | 207 -- ui/src/views/intranet/Dashboard.tsx | 1776 +---------------- ui/src/views/intranet/Document.tsx | 458 ----- ui/src/views/intranet/Event.tsx | 464 ----- .../views/intranet/HR/ExpenseManagement.tsx | 480 ----- ui/src/views/intranet/HR/LeaveManagement.tsx | 426 ---- .../views/intranet/HR/OvertimeManagement.tsx | 356 ---- ui/src/views/intranet/Reservation.tsx | 313 --- ui/src/views/intranet/Sidebar.tsx | 464 ----- ui/src/views/intranet/Survey.tsx | 298 --- ui/src/views/intranet/Task.tsx | 674 ------- ui/src/views/intranet/Training.tsx | 399 ---- ui/src/views/intranet/Visitor.tsx | 393 ---- .../modals/AnnouncementDetailModal.tsx | 195 ++ .../intranet/modals/ExpenseRequestModal.tsx | 135 ++ .../intranet/modals/LeaveRequestModal.tsx | 120 ++ .../intranet/modals/OvertimeRequestModal.tsx | 115 ++ .../modals/ReservationRequestModal.tsx | 160 ++ ui/src/views/intranet/modals/SurveyModal.tsx | 141 ++ .../intranet/widgets/ActiveReservations.tsx | 59 + .../views/intranet/widgets/ActiveSurveys.tsx | 58 + .../intranet/widgets/ExpenseManagement.tsx | 74 + .../widgets/ImportantAnnouncements.tsx | 84 + .../intranet/widgets/LeaveManagement.tsx | 78 + .../intranet/widgets/OvertimeManagement.tsx | 71 + .../views/intranet/widgets/PriorityTasks.tsx | 75 + .../intranet/widgets/RecentDocuments.tsx | 65 + .../intranet/widgets/ShuttleSchedule.tsx | 116 ++ .../views/intranet/widgets/TodayBirthdays.tsx | 54 + ui/src/views/intranet/widgets/TodayEvents.tsx | 47 + .../views/intranet/widgets/UpcomingEvents.tsx | 47 + .../intranet/widgets/UpcomingTrainings.tsx | 50 + ui/src/views/intranet/widgets/WeeklyMenu.tsx | 73 + 35 files changed, 1897 insertions(+), 7198 deletions(-) delete mode 100644 ui/src/views/intranet/Announcement.tsx delete mode 100644 ui/src/views/intranet/Birthday.tsx delete mode 100644 ui/src/views/intranet/Cafeteria.tsx delete mode 100644 ui/src/views/intranet/Document.tsx delete mode 100644 ui/src/views/intranet/Event.tsx delete mode 100644 ui/src/views/intranet/HR/ExpenseManagement.tsx delete mode 100644 ui/src/views/intranet/HR/LeaveManagement.tsx delete mode 100644 ui/src/views/intranet/HR/OvertimeManagement.tsx delete mode 100644 ui/src/views/intranet/Reservation.tsx delete mode 100644 ui/src/views/intranet/Sidebar.tsx delete mode 100644 ui/src/views/intranet/Survey.tsx delete mode 100644 ui/src/views/intranet/Task.tsx delete mode 100644 ui/src/views/intranet/Training.tsx delete mode 100644 ui/src/views/intranet/Visitor.tsx create mode 100644 ui/src/views/intranet/modals/AnnouncementDetailModal.tsx create mode 100644 ui/src/views/intranet/modals/ExpenseRequestModal.tsx create mode 100644 ui/src/views/intranet/modals/LeaveRequestModal.tsx create mode 100644 ui/src/views/intranet/modals/OvertimeRequestModal.tsx create mode 100644 ui/src/views/intranet/modals/ReservationRequestModal.tsx create mode 100644 ui/src/views/intranet/modals/SurveyModal.tsx create mode 100644 ui/src/views/intranet/widgets/ActiveReservations.tsx create mode 100644 ui/src/views/intranet/widgets/ActiveSurveys.tsx create mode 100644 ui/src/views/intranet/widgets/ExpenseManagement.tsx create mode 100644 ui/src/views/intranet/widgets/ImportantAnnouncements.tsx create mode 100644 ui/src/views/intranet/widgets/LeaveManagement.tsx create mode 100644 ui/src/views/intranet/widgets/OvertimeManagement.tsx create mode 100644 ui/src/views/intranet/widgets/PriorityTasks.tsx create mode 100644 ui/src/views/intranet/widgets/RecentDocuments.tsx create mode 100644 ui/src/views/intranet/widgets/ShuttleSchedule.tsx create mode 100644 ui/src/views/intranet/widgets/TodayBirthdays.tsx create mode 100644 ui/src/views/intranet/widgets/TodayEvents.tsx create mode 100644 ui/src/views/intranet/widgets/UpcomingEvents.tsx create mode 100644 ui/src/views/intranet/widgets/UpcomingTrainings.tsx create mode 100644 ui/src/views/intranet/widgets/WeeklyMenu.tsx diff --git a/ui/src/views/intranet/Announcement.tsx b/ui/src/views/intranet/Announcement.tsx deleted file mode 100644 index 0db20d25..00000000 --- a/ui/src/views/intranet/Announcement.tsx +++ /dev/null @@ -1,291 +0,0 @@ -import React, { useState } from 'react' -import { motion } from 'framer-motion' -import { - HiBell, - HiMagnifyingGlass, - HiFunnel, - HiEye, - HiCalendar, - HiUser -} from 'react-icons/hi2' -import dayjs from 'dayjs' -import 'dayjs/locale/tr' -import { mockAnnouncements, Announcement } from '../../mocks/mockIntranetData' - -dayjs.locale('tr') - -const AnnouncementsModule: React.FC = () => { - const [announcements] = useState(mockAnnouncements) - const [searchQuery, setSearchQuery] = useState('') - const [selectedCategory, setSelectedCategory] = useState('all') - const [selectedAnnouncement, setSelectedAnnouncement] = useState(null) - - const categories = [ - { id: 'all', label: 'Tümü', color: 'blue' }, - { id: 'general', label: 'Genel', color: 'blue' }, - { id: 'hr', label: 'İK', color: 'purple' }, - { id: 'it', label: 'IT', color: 'orange' }, - { id: 'event', label: 'Etkinlik', color: 'green' }, - { id: 'urgent', label: 'Acil', color: 'red' } - ] - - const filteredAnnouncements = announcements.filter(announcement => { - const matchesSearch = announcement.title.toLowerCase().includes(searchQuery.toLowerCase()) || - announcement.content.toLowerCase().includes(searchQuery.toLowerCase()) - const matchesCategory = selectedCategory === 'all' || announcement.category === selectedCategory - return matchesSearch && matchesCategory - }) - - const getCategoryColor = (category: string) => { - const colors: Record = { - general: 'bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 border-blue-200 dark:border-blue-800', - hr: 'bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300 border-purple-200 dark:border-purple-800', - it: 'bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300 border-orange-200 dark:border-orange-800', - event: 'bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300 border-green-200 dark:border-green-800', - urgent: 'bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 border-red-200 dark:border-red-800' - } - return colors[category] || colors.general - } - - const getCategoryBadge = (category: string) => { - const labels: Record = { - general: 'Genel', - hr: 'İK', - it: 'IT', - event: 'Etkinlik', - urgent: 'Acil' - } - return labels[category] - } - - return ( -
-
- {/* Header */} -
-

- Duyurular & Haberler -

-

- Şirket duyurularını ve haberleri takip edin -

-
- - {/* Arama ve Filtreler */} -
-
- - setSearchQuery(e.target.value)} - className="w-full pl-10 pr-4 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500" - /> -
-
- - {categories.map(cat => ( - - ))} -
-
- - {/* Duyuru Listesi */} -
- {/* Sol Kolon - Liste */} -
- {filteredAnnouncements.map(announcement => ( - setSelectedAnnouncement(announcement)} - > - {announcement.imageUrl && ( -
- {announcement.title} - {announcement.isPinned && ( -
- 📌 SABİTLENDİ -
- )} -
- )} -
-
-

- {announcement.title} -

- - {getCategoryBadge(announcement.category)} - -
-

- {announcement.excerpt} -

-
-
- {announcement.author.fullName} - {announcement.author.fullName} -
-
- - {dayjs(announcement.publishDate).format('DD MMMM YYYY')} -
-
- - {announcement.viewCount} -
-
-
-
- ))} - - {filteredAnnouncements.length === 0 && ( -
- -

- {searchQuery ? 'Arama kriterlerine uygun duyuru bulunamadı' : 'Henüz duyuru bulunmuyor'} -

-
- )} -
- - {/* Sağ Kolon - Detay */} -
- {selectedAnnouncement ? ( -
- {selectedAnnouncement.imageUrl && ( -
- {selectedAnnouncement.title} -
- )} -
-
- - {getCategoryBadge(selectedAnnouncement.category)} - - {selectedAnnouncement.isPinned && ( - - 📌 Sabitlendi - - )} -
-

- {selectedAnnouncement.title} -

-
- {selectedAnnouncement.author.fullName} -
-

- {selectedAnnouncement.author.fullName} -

-

- {dayjs(selectedAnnouncement.publishDate).format('DD MMMM YYYY, HH:mm')} -

-
-
-
-

- {selectedAnnouncement.content} -

-
- {selectedAnnouncement.attachments && selectedAnnouncement.attachments.length > 0 && ( -
-

- 📎 Ekler -

-
- {selectedAnnouncement.attachments.map((attachment, idx) => ( - -
- 📄 -
-
-

- {attachment.name} -

-

- {attachment.size} -

-
-
- ))} -
-
- )} - {selectedAnnouncement.departments && selectedAnnouncement.departments.length > 0 && ( -
-

- Hedef Departmanlar: -

-
- {selectedAnnouncement.departments.map((dept, idx) => ( - - {dept} - - ))} -
-
- )} -
- - {selectedAnnouncement.viewCount} kez görüntülendi -
-
-
- ) : ( -
- -

- Detayları görüntülemek için bir duyuru seçin -

-
- )} -
-
-
-
- ) -} - -export default AnnouncementsModule diff --git a/ui/src/views/intranet/Birthday.tsx b/ui/src/views/intranet/Birthday.tsx deleted file mode 100644 index f4aa8717..00000000 --- a/ui/src/views/intranet/Birthday.tsx +++ /dev/null @@ -1,279 +0,0 @@ -import React, { useState } from 'react' -import { motion } from 'framer-motion' -import { HiCake, HiGift, HiCalendar } from 'react-icons/hi2' -import dayjs from 'dayjs' -import isBetween from 'dayjs/plugin/isBetween' -import { mockBirthdays, mockAnniversaries, Birthday, WorkAnniversary } from '../../mocks/mockIntranetData' - -dayjs.extend(isBetween) - -const BirthdaysModule: React.FC = () => { - const [selectedMonth, setSelectedMonth] = useState(dayjs().month()) - - const months = [ - 'Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', - 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık' - ] - - // Bugünün doğum günleri - const todayBirthdays = mockBirthdays.filter(b => - dayjs(b.date).month() === dayjs().month() && - dayjs(b.date).date() === dayjs().date() - ) - - // Bu haftanın doğum günleri - const thisWeekBirthdays = mockBirthdays.filter(b => { - const birthDate = dayjs().year(dayjs().year()).month(dayjs(b.date).month()).date(dayjs(b.date).date()) - return birthDate.isBetween(dayjs().startOf('week'), dayjs().endOf('week'), null, '[]') - }) - - // Seçilen aydaki doğum günleri - const monthBirthdays = mockBirthdays.filter(b => dayjs(b.date).month() === selectedMonth) - .sort((a, b) => dayjs(a.date).date() - dayjs(b.date).date()) - - // Bu ayki iş yıldönümleri - const thisMonthAnniversaries = mockAnniversaries.filter((a: WorkAnniversary) => dayjs(a.hireDate).month() === dayjs().month()) - - const getBirthdayMessage = (birthday: Birthday) => { - const age = birthday.age || dayjs().year() - dayjs(birthday.date).year() - return `${age}. yaş günü kutlu olsun! 🎉` - } - - const getAnniversaryMessage = (anniversary: WorkAnniversary) => { - return `${anniversary.years} yıllık iş birliğimiz için teşekkürler! 🎊` - } - - return ( -
-
- {/* Header */} -
-

- 🎂 Doğum Günleri & Yıldönümleri -

-

- Ekip üyelerimizin özel günlerini kutlayalım -

-
- - {/* Stats */} -
- {/* Bugün */} - -
- - {todayBirthdays.length} -
-

Bugün Doğanlar

-

- {todayBirthdays.length > 0 ? 'Kutlama zamanı!' : 'Bugün doğum günü yok'} -

-
- - {/* Bu Hafta */} - -
- - {thisWeekBirthdays.length} -
-

Bu Hafta

-

- {dayjs().startOf('week').format('DD MMM')} - {dayjs().endOf('week').format('DD MMM')} -

-
- - {/* İş Yıldönümleri */} - -
- - {thisMonthAnniversaries.length} -
-

Bu Ay Yıldönümü

-

- {dayjs().format('MMMM')} ayında -

-
-
- - {/* Bugünün Doğum Günleri */} - {todayBirthdays.length > 0 && ( -
-

- 🎉 Bugün Doğum Günü Olanlar -

-
- {todayBirthdays.map((birthday, idx) => ( - -
- {birthday.employee.fullName} -
-

- {birthday.employee.fullName} -

-

- {birthday.employee.department?.name || 'Genel'} -

-

- {getBirthdayMessage(birthday)} -

-
-
-
- ))} -
-
- )} - - {/* Ay Seçici */} -
-
-

- 📅 Aylık Doğum Günleri -

- -
- - {/* Doğum Günleri Listesi */} -
- {monthBirthdays.map((birthday, idx) => { - const isToday = dayjs(birthday.date).month() === dayjs().month() && - dayjs(birthday.date).date() === dayjs().date() - return ( - -
- {dayjs(birthday.date).date()} - {months[selectedMonth].substring(0, 3)} -
- - {birthday.employee.fullName} - -
-

- {birthday.employee.fullName} -

-

- {birthday.employee.department?.name || 'Genel'} -

-
- -
-

- {birthday.age || dayjs().year() - dayjs(birthday.date).year()} yaşında -

- {isToday && ( - - 🎂 Bugün! - - )} -
-
- ) - })} - {monthBirthdays.length === 0 && ( -
- -

{months[selectedMonth]} ayında doğum günü yok

-
- )} -
-
- - {/* İş Yıldönümleri */} - {thisMonthAnniversaries.length > 0 && ( -
-

- 🎊 Bu Ayki İş Yıldönümleri -

-
- {thisMonthAnniversaries.map((anniversary: WorkAnniversary, idx: number) => ( - -
- {anniversary.employee.fullName} -
-

- {anniversary.employee.fullName} -

-

- {anniversary.employee.department?.name || 'Genel'} -

-

- {getAnniversaryMessage(anniversary)} -

-
-
- {anniversary.years} - YIL -
-
-
- ))} -
-
- )} -
-
- ) -} - -export default BirthdaysModule diff --git a/ui/src/views/intranet/Cafeteria.tsx b/ui/src/views/intranet/Cafeteria.tsx deleted file mode 100644 index 02c92380..00000000 --- a/ui/src/views/intranet/Cafeteria.tsx +++ /dev/null @@ -1,207 +0,0 @@ -import React, { useState } from 'react' -import { motion } from 'framer-motion' -import { HiClock, HiMapPin } from 'react-icons/hi2' -import dayjs from 'dayjs' -import { mockMealMenus, mockShuttleRoutes } from '../../mocks/mockIntranetData' - -const CafeteriaModule: React.FC = () => { - const [selectedView, setSelectedView] = useState<'menu' | 'shuttle'>('menu') - - return ( -
-
- {/* Header */} -
-

- 🍽️ Kafeterya & Servis -

-

- Yemek menüsü ve servis saatleri -

-
- - {/* Tabs */} -
- - -
- - {/* Menu View */} - {selectedView === 'menu' && ( -
- {mockMealMenus.map((menu, idx) => ( - -
-
{dayjs(menu.date).format('DD MMM')}
-

{menu.dayOfWeek}

-
- - {menu.meals.map((meal, mealIdx) => ( -
-
- - {meal.type === 'lunch' ? '🍽️ Öğle Yemeği' : meal.type} - - {meal.calories && {meal.calories} kcal} -
-
    - {meal.items.map((item, itemIdx) => ( -
  • - - {item} -
  • - ))} -
-
- ))} -
- ))} -
- )} - - {/* Shuttle View */} - {selectedView === 'shuttle' && ( -
-
-

🌅 Sabah Servisleri

-
- {mockShuttleRoutes.filter(s => s.type === 'morning').map((shuttle, idx) => ( - -
-

{shuttle.name}

- 5 - ? 'bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300' - : 'bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300' - }`}> - {shuttle.available} Koltuk - -
- -
-
- - - {shuttle.departureTime} - {shuttle.arrivalTime} - -
-
- -
- {shuttle.route.map((stop, idx) => ( - - {stop} - {idx < shuttle.route.length - 1 && ' → '} - - ))} -
-
-
- -
-
-
-

- {shuttle.capacity - shuttle.available} / {shuttle.capacity} dolu -

- - ))} -
-
- -
-

🌆 Akşam Servisleri

-
- {mockShuttleRoutes.filter(s => s.type === 'evening').map((shuttle, idx) => ( - -
-

{shuttle.name}

- 5 - ? 'bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300' - : 'bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300' - }`}> - {shuttle.available} Koltuk - -
- -
-
- - - {shuttle.departureTime} - {shuttle.arrivalTime} - -
-
- -
- {shuttle.route.map((stop, idx) => ( - - {stop} - {idx < shuttle.route.length - 1 && ' → '} - - ))} -
-
-
- -
-
-
-

- {shuttle.capacity - shuttle.available} / {shuttle.capacity} dolu -

- - ))} -
-
-
- )} -
-
- ) -} - -export default CafeteriaModule diff --git a/ui/src/views/intranet/Dashboard.tsx b/ui/src/views/intranet/Dashboard.tsx index 26e03864..0ba89eb7 100644 --- a/ui/src/views/intranet/Dashboard.tsx +++ b/ui/src/views/intranet/Dashboard.tsx @@ -1,47 +1,36 @@ import React, { useState } from 'react' -import { motion, AnimatePresence } from 'framer-motion' -import { - HiBell as BellIcon, - HiCalendar as CalendarIcon, - HiDocumentText as DocumentTextIcon, - HiChartBar as ChartBarIcon, - HiUserGroup as UserGroupIcon, - HiClock as ClockIcon, - HiXMark, - HiEye, - HiPaperClip, - HiTruck as TruckIcon, - HiAcademicCap as AcademicCapIcon, - HiKey as KeyIcon, - HiClipboardDocumentCheck as ClipboardIcon, - HiPlus, - HiCurrencyDollar, - HiArrowDownTray, -} from 'react-icons/hi2' -import { IoRestaurant as RestaurantIcon } from 'react-icons/io5' +import { AnimatePresence } from 'framer-motion' import dayjs from 'dayjs' import 'dayjs/locale/tr' import relativeTime from 'dayjs/plugin/relativeTime' import isBetween from 'dayjs/plugin/isBetween' -import { - mockAnnouncements, - mockEvents, - mockBirthdays, - mockAnniversaries, - mockTasks, - mockDocuments, - mockMealMenus, - mockShuttleRoutes, - mockTrainings, - mockReservations, - mockSurveys, - mockLeaveRequests, - mockOvertimeRequests, - mockExpenseRequests, - Announcement, - Survey, -} from '../../mocks/mockIntranetData' -import { LeaveStatusEnum, LeaveTypeEnum } from '../../types/hr' +import { Announcement, Survey } from '../../mocks/mockIntranetData' + +// Widgets +import TodayEvents from './widgets/TodayEvents' +import TodayBirthdays from './widgets/TodayBirthdays' +import UpcomingEvents from './widgets/UpcomingEvents' +import RecentDocuments from './widgets/RecentDocuments' +import ImportantAnnouncements from './widgets/ImportantAnnouncements' +import PriorityTasks from './widgets/PriorityTasks' +import WeeklyMenu from './widgets/WeeklyMenu' +import ShuttleSchedule from './widgets/ShuttleSchedule' +import LeaveManagement from './widgets/LeaveManagement' +import OvertimeManagement from './widgets/OvertimeManagement' +import ExpenseManagement from './widgets/ExpenseManagement' +import UpcomingTrainings from './widgets/UpcomingTrainings' +import ActiveReservations from './widgets/ActiveReservations' +import ActiveSurveys from './widgets/ActiveSurveys' + +// Modals +import SurveyModal from './modals/SurveyModal' +import LeaveRequestModal from './modals/LeaveRequestModal' +import OvertimeRequestModal from './modals/OvertimeRequestModal' +import ExpenseRequestModal from './modals/ExpenseRequestModal' +import ReservationRequestModal from './modals/ReservationRequestModal' +import AnnouncementDetailModal from './modals/AnnouncementDetailModal' + +// Social Wall import SocialWall from './SocialWall' dayjs.locale('tr') @@ -50,59 +39,13 @@ dayjs.extend(isBetween) const IntranetDashboard: React.FC = () => { const [selectedAnnouncement, setSelectedAnnouncement] = useState(null) - const [showSurveyModal, setShowSurveyModal] = useState(false) const [selectedSurvey, setSelectedSurvey] = useState(null) + const [showSurveyModal, setShowSurveyModal] = useState(false) const [showLeaveModal, setShowLeaveModal] = useState(false) const [showOvertimeModal, setShowOvertimeModal] = useState(false) const [showExpenseModal, setShowExpenseModal] = useState(false) const [showReservationModal, setShowReservationModal] = useState(false) - // Bugünün etkinlikleri - const todayEvents = mockEvents.filter( - (event) => event.isPublished && dayjs(event.date).isSame(dayjs(), 'day'), - ) - - // Yaklaşan etkinlikler (7 gün içinde) - const upcomingEvents = mockEvents.filter( - (event) => - event.isPublished && - dayjs(event.date).isAfter(dayjs()) && - dayjs(event.date).isBefore(dayjs().add(7, 'day')), - ) - - // Bugün doğanlar (sadece ay ve günü karşılaştır) - const todayBirthdays = mockBirthdays.filter((b) => { - const birthDate = dayjs(b.date) - const today = dayjs() - return birthDate.month() === today.month() && birthDate.date() === today.date() - }) - - // Bu haftaki doğum günleri (sadece ay ve günü karşılaştır) - const weekBirthdays = mockBirthdays.filter((b) => { - const birthDate = dayjs(b.date) - const today = dayjs() - const weekStart = today.startOf('week') - const weekEnd = today.endOf('week') - - // Bu yılki doğum gününü oluştur - const thisBirthday = today.year(today.year()).month(birthDate.month()).date(birthDate.date()) - return thisBirthday.isBetween(weekStart, weekEnd, null, '[]') - }) - - // Bu ayki iş yıldönümleri - const monthAnniversaries = mockAnniversaries.filter( - (a) => dayjs(a.hireDate).month() === dayjs().month(), - ) - - // Öncelikli görevler - const priorityTasks = mockTasks - .filter((t) => t.priority === 'high' || t.priority === 'urgent') - .slice(0, 3) - - // Sabitlenmiş duyurular - const pinnedAnnouncements = mockAnnouncements.filter((a) => a.isPinned).slice(0, 3) - - // Handler fonksiyonları const handleTakeSurvey = (survey: Survey) => { setSelectedSurvey(survey) setShowSurveyModal(true) @@ -111,52 +54,27 @@ const IntranetDashboard: React.FC = () => { const handleSubmitSurvey = () => { setShowSurveyModal(false) setSelectedSurvey(null) - // TODO: Başarı bildirimi göster } - // Bu haftanın menüleri - const weekMenus = mockMealMenus.filter((menu) => { - const menuDate = dayjs(menu.date) - const today = dayjs() - const weekStart = today.startOf('week') - const weekEnd = today.endOf('week') - return menuDate.isBetween(weekStart, weekEnd, null, '[]') - }) - - // Bugünün menüsü - const todayMenu = mockMealMenus.find((menu) => dayjs(menu.date).isSame(dayjs(), 'day')) - - // Sabah servisleri - const morningShuttles = mockShuttleRoutes.filter((s) => s.type === 'morning') - - // Akşam servisleri - const eveningShuttles = mockShuttleRoutes.filter((s) => s.type === 'evening') - - const getCategoryColor = (category: string) => { - const colors: Record = { - general: 'bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300', - hr: 'bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300', - it: 'bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300', - event: 'bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300', - urgent: 'bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300', - } - return colors[category] || colors.general + const handleSubmitLeave = () => { + setShowLeaveModal(false) } - const getPriorityColor = (priority: string) => { - const colors: Record = { - low: 'bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300', - medium: 'bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-300', - high: 'bg-orange-100 dark:bg-orange-900/30 text-orange-600 dark:text-orange-300', - urgent: 'bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-300', - } - return colors[priority] + const handleSubmitOvertime = () => { + setShowOvertimeModal(false) + } + + const handleSubmitExpense = () => { + setShowExpenseModal(false) + } + + const handleSubmitReservation = () => { + setShowReservationModal(false) } return (
- {/* Header */}

@@ -165,1619 +83,85 @@ const IntranetDashboard: React.FC = () => {

- {/* Main Grid - 3 Kolon: Sol (2/6), Orta (5/6), Sağ (3/6) */}
- {/* Sol Kolon (1/6) */}
- {/* Bugünün Etkinlikleri */} -
-
-

- - Bugün -

-
-
- {todayEvents.length > 0 ? ( - todayEvents.map((event) => ( -
-

- {event.title} -

-

- {dayjs(event.date).format('DD MMMM YYYY')} - {event.location} -

-

- {event.participants} katılımcı -

-
- )) - ) : ( -

- Bugün etkinlik yok -

- )} -
-
- - {/* Bugün Doğanlar */} -
-
-

- 🎂 Bugün Doğanlar -

-
-
- {todayBirthdays.length > 0 ? ( - todayBirthdays.map((birthday, index) => ( -
- {birthday.employee.fullName} -
-

- {birthday.employee.fullName} -

-

- {birthday.age} yaşında 🎉 -

-

- {birthday.employee.department?.name || 'Genel'} -

-
-
- )) - ) : ( -

- Bugün doğan yok -

- )} -
-
- - {/* Yaklaşan Etkinlikler */} -
-
-

- - Yaklaşan Etkinlikler -

-
-
- {upcomingEvents.length > 0 ? ( - upcomingEvents.slice(0, 3).map((event) => ( -
-

- {event.title} -

-

- {dayjs(event.date).format('DD MMMM YYYY')} - {event.location} -

-
- )) - ) : ( -

- Yaklaşan etkinlik yok -

- )} -
-
- - {/* Son Dokümanlar */} -
-
-
-

- - Son Dokümanlar -

-
-
-
- {mockDocuments.slice(0, 3).map((doc) => ( -
-
-
- -
-
-

- {doc.name} -

-

- {doc.category === 'policy' && '📋 Politika'} - {doc.category === 'procedure' && '📝 Prosedür'} - {doc.category === 'form' && '📄 Form'} - {doc.category === 'template' && '📋 Şablon'} - {doc.category === 'report' && '📊 Rapor'} - {doc.category === 'other' && '📄 Diğer'} - - {doc.size} -

-
- {dayjs(doc.uploadDate).fromNow()} - - {doc.downloadCount} indirme -
-
- -
-
- ))} -
-
- - {/* Bu Hafta Doğanlar */} - {weekBirthdays.length > 0 && ( -
-
-

- 🎂 Bu Hafta Doğanlar -

-
-
- {weekBirthdays.slice(0, 3).map((birthday, index) => ( -
- {birthday.employee.fullName} -
-

- {birthday.employee.fullName} -

-

- {dayjs(birthday.date).format('DD MMM')} -

-
-
- ))} -
-
- )} - - {/* İş Yıldönümleri */} - {monthAnniversaries.length > 0 && ( -
-
-

- 🎉 İş Yıldönümleri -

-
-
- {monthAnniversaries.slice(0, 3).map((anniversary, index) => ( -
- {anniversary.employee.fullName} -
-

- {anniversary.employee.fullName} -

-

- {anniversary.years} yıl 🎊 -

-
-
- ))} -
-
- )} - - {/* Yaklaşan Eğitimler */} -
-
-

- - Yaklaşan Eğitimler -

-
-
- {mockTrainings - .filter((t) => t.status === 'upcoming') - .slice(0, 3) - .map((training) => ( -
-

- {training.title} -

-

- {training.instructor} • {training.duration} -

-
- - {dayjs(training.startDate).format('DD MMM')} - {dayjs(training.endDate).format('DD MMM')} - - - {training.enrolled}/{training.maxParticipants} - -
-
- ))} - {mockTrainings.filter((t) => t.status === 'upcoming').length === 0 && ( -

- Yaklaşan eğitim yok -

- )} -
-
- - {/* Aktif Rezervasyonlar */} -
-
-

- - Aktif Rezervasyonlar -

-
-
- {mockReservations - .filter((r) => r.status === 'approved') - .slice(0, 3) - .map((reservation) => ( -
-
-

- {reservation.resourceName} -

- - {reservation.type === 'room' ? '🏢' : reservation.type === 'vehicle' ? '🚗' : '⚙️'} - -
-

- {dayjs(reservation.startDate).format('DD MMM HH:mm')} - {dayjs(reservation.endDate).format('HH:mm')} -

-
- ))} - {mockReservations.filter((r) => r.status === 'approved').length === 0 && ( -

- Aktif rezervasyon yok -

- )} - - -
-
- - {/* Aktif Anketler */} -
-
-

- - Aktif Anketler -

-
-
- {mockSurveys - .filter((s) => s.status === 'active') - .slice(0, 3) - .map((survey) => ( -
handleTakeSurvey(survey)} - className="p-3 rounded-lg bg-purple-50 dark:bg-purple-900/20 border border-purple-200 dark:border-purple-800 hover:bg-purple-100 dark:hover:bg-purple-900/30 cursor-pointer transition-colors" - > -

- {survey.title} -

-
- - {survey.totalQuestions} soru - - - {survey.responses} yanıt - -
-

- Son tarih: {dayjs(survey.deadline).format('DD MMM')} -

- -
- ))} - {mockSurveys.filter((s) => s.status === 'active').length === 0 && ( -

- Aktif anket yok -

- )} -
-
+ + + + + + setShowReservationModal(true)} /> +
- {/* Orta Kolon (4/6) - Sadece Sosyal Duvar */}
- {/* Sosyal Duvar */}
- {/* Sağ Kolon (1/6) */}
- {/* Önemli Duyurular */} -
-
-
-

- - Önemli Duyurular -

-
-
-
- {pinnedAnnouncements.map((announcement) => ( -
setSelectedAnnouncement(announcement)} - className="p-6 hover:bg-gray-50 dark:hover:bg-gray-700/50 cursor-pointer transition-colors" - > -
- {announcement.author.fullName} -
-
-

- {announcement.title} -

- - {announcement.category === 'general' && 'Genel'} - {announcement.category === 'hr' && 'İK'} - {announcement.category === 'it' && 'IT'} - {announcement.category === 'event' && 'Etkinlik'} - {announcement.category === 'urgent' && 'Acil'} - -
-

- {announcement.excerpt} -

-
- {announcement.author.fullName} - - {dayjs(announcement.publishDate).fromNow()} - - {announcement.viewCount} görüntülenme -
-
-
-
- ))} -
-
- {/* Öncelikli Görevler */} -
-
-

- - Öncelikli Görevler -

-
-
- {priorityTasks.map((task) => ( -
-
- -
-
-

- {task.title} -

- - {task.priority === 'urgent' && '🔥 Acil'} - {task.priority === 'high' && 'Yüksek'} - {task.priority === 'medium' && 'Orta'} - {task.priority === 'low' && 'Düşük'} - -
-

- {task.description} -

-
- - - {dayjs(task.dueDate).format('DD MMM')} - - - - {task.assignedTo.length} kişi - -
-
-
-
- ))} -
-
- - {/* Haftalık Menü */} -
-
-
-

- - Haftalık Menü -

- -
-
-
- {weekMenus.map((menu) => { - const isToday = dayjs(menu.date).isSame(dayjs(), 'day') - return ( -
-
-
-

- {menu.dayOfWeek} - {isToday && ( - - Bugün - - )} -

-

- {dayjs(menu.date).format('DD MMMM')} -

-
-
-
- {menu.meals[0]?.items.slice(0, 3).map((item, idx) => ( -

- • {item} -

- ))} - {menu.meals[0]?.items.length > 3 && ( -

- +{menu.meals[0].items.length - 3} daha... -

- )} -
-
- ) - })} -
-
- - {/* Servis Saatleri */} -
-
-

- - Servis Saatleri -

-
-
- {/* Sabah Servisleri */} -
-

- 🌅 Sabah Servisleri -

-
- {morningShuttles.slice(0, 2).map((shuttle) => ( -
-
-
-

- {shuttle.name} -

-

- {shuttle.route[0]} → {shuttle.route[shuttle.route.length - 1]} -

-
-
-

- {shuttle.departureTime} -

-
-
-
- - {shuttle.arrivalTime} - - 5 - ? 'bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300' - : shuttle.available > 0 - ? 'bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300' - : 'bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300' - }`} - > - {shuttle.available} yer - -
-
- ))} -
-
- - {/* Akşam Servisleri */} -
-

- 🌆 Akşam Servisleri -

-
- {eveningShuttles.slice(0, 2).map((shuttle) => ( -
-
-
-

- {shuttle.name} -

-

- {shuttle.route[0]} → {shuttle.route[shuttle.route.length - 1]} -

-
-
-

- {shuttle.departureTime} -

-
-
-
- - {shuttle.arrivalTime} - - 5 - ? 'bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300' - : shuttle.available > 0 - ? 'bg-orange-100 dark:bg-orange-900/30 text-orange-700 dark:text-orange-300' - : 'bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300' - }`} - > - {shuttle.available} yer - -
-
- ))} -
-
-
-
- - {/* İzin Yönetimi */} -
-
-

- - İzin Yönetimi -

-
-
- {/* İzin bakiye özeti */} -
-
-

Yıllık İzin

-

12 gün

-
-
-

Hastalık İzni

-

8 gün

-
-
- - {/* Son izin talepleri */} -
- {mockLeaveRequests.slice(0, 3).map((leave) => ( -
-
-

- {leave.leaveType === LeaveTypeEnum.Annual ? '🏖️ Yıllık' : - leave.leaveType === LeaveTypeEnum.Sick ? '🏥 Hastalık' : - leave.leaveType === LeaveTypeEnum.Unpaid ? '💼 Ücretsiz' : '📋 Diğer'} İzin -

- - {leave.status === LeaveStatusEnum.Approved ? 'Onaylandı' : - leave.status === LeaveStatusEnum.Pending ? 'Bekliyor' : 'Reddedildi'} - -
-

- {dayjs(leave.startDate).format('DD MMM')} - {dayjs(leave.endDate).format('DD MMM')} ({leave.totalDays} gün) -

-
- ))} -
- - -
-
- - {/* Mesai Yönetimi */} -
-
-

- - Mesai Yönetimi -

-
-
- {/* Mesai özeti */} -
-

Bu Ay Toplam

-

24 saat

-

20 onaylandı, 4 bekliyor

-
- - {/* Son mesai talepleri */} -
- {mockOvertimeRequests.slice(0, 3).map((overtime) => ( -
-
-

- ⏰ {overtime.totalHours} saat -

- - {overtime.status === LeaveStatusEnum.Approved ? 'Onaylandı' : - overtime.status === LeaveStatusEnum.Pending ? 'Bekliyor' : 'Reddedildi'} - -
-

- {dayjs(overtime.date).format('DD MMM YYYY')} -

-
- ))} -
- - -
-
- - {/* Harcama Yönetimi */} -
-
-

- - Harcama Yönetimi -

-
-
- {/* Harcama özeti */} -
-

Bu Ay Toplam

-

₺2,370

-

₺2,050 onaylandı

-
- - {/* Son harcama talepleri */} -
- {mockExpenseRequests.slice(0, 3).map((expense) => ( -
-
-
-

- {expense.category === 'travel' ? '✈️' : - expense.category === 'meal' ? '🍽️' : - expense.category === 'accommodation' ? '🏨' : - expense.category === 'transport' ? '🚗' : '📋'} {expense.description} -

-

- ₺{expense.amount.toLocaleString('tr-TR')} -

-
- - {expense.status === 'approved' ? 'Onaylandı' : - expense.status === 'pending' ? 'Bekliyor' : 'Reddedildi'} - -
-
- ))} -
- - -
-
+ + + + + setShowLeaveModal(true)} /> + setShowOvertimeModal(true)} /> + setShowExpenseModal(true)} />
- {/* Survey Modal */} {showSurveyModal && selectedSurvey && ( - <> - setShowSurveyModal(false)} - /> -
- e.stopPropagation()} - > -
-
-

- {selectedSurvey.title} -

-

- {selectedSurvey.description} -

-
- -
- -
{ - e.preventDefault() - handleSubmitSurvey() - }} - className="p-6 space-y-6" - > - {/* Örnek Anket Soruları */} -
-
- -
- {[1, 2, 3, 4, 5].map((rating) => ( - - ))} -
-
- -
- - -
- -
- -