diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json b/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json
index 7acc7df..30e40ef 100644
--- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json
+++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/LanguagesData.json
@@ -3636,6 +3636,48 @@
"en": "Audit Logs",
"tr": "Audit Günlükleri"
},
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.RoleSelector",
+ "en": "Please select your role",
+ "tr": "Lütfen rolünüzü seçin"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.Host",
+ "en": "Host",
+ "tr": "Oda Sahibi"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.HostDescription",
+ "en": "The host creates the room, starts the session, manages participants and views reports.",
+ "tr": "Odayı oluşturur, oturumu başlatır, katılımcıları yönetir ve raporları görüntüler."
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.Participant",
+ "en": "Participant",
+ "tr": "Katılımcı"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.ParticipantDescription",
+ "en": "Joins active rooms and interacts with the host and other participants.",
+ "tr": "Aktif odalara katılır, oda sahibi ve diğer katılımcılarla etkileşim kurar."
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.Observer",
+ "en": "Observer",
+ "tr": "İzleyici"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.ObserverDescription",
+ "en": "Joins active rooms and observes without interacting.",
+ "tr": "Aktif odalara katılır, ancak etkileşimde bulunmaz."
+ },
{
"resourceName": "Platform",
"key": "App.Videoroom",
@@ -3663,8 +3705,230 @@
{
"resourceName": "Platform",
"key": "App.Videoroom.Planning",
- "en": "Video Room Planning",
- "tr": "Video Oda Planlama"
+ "en": "Planning",
+ "tr": "Planlama"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.NewRoom",
+ "en": "New Room",
+ "tr": "Yeni Oda Oluştur"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.TotalRooms",
+ "en": "Total Rooms",
+ "tr": "Toplam Oda"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.ActiveRooms",
+ "en": "Active Rooms",
+ "tr": "Aktif Oda"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.OpenRooms",
+ "en": "Open Rooms",
+ "tr": "Katılıma Açık"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.PassiveRooms",
+ "en": "Passive Rooms",
+ "tr": "Pasif Oda"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.TotalParticipants",
+ "en": "Total Participants",
+ "tr": "Toplam Katılımcı"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.RoomSettings",
+ "en": "Room Settings",
+ "tr": "Oda Ayarları"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.ParticipantPermissions",
+ "en": "Participant Permissions",
+ "tr": "Katılımcı İzinleri"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.AllowHandRaise",
+ "en": "Allow Hand Raise",
+ "tr": "Parmak Kaldırma İzni"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.AllowStudentChat",
+ "en": "Allow Student Chat",
+ "tr": "Öğrenci Sohbet İzni"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.AllowPrivateMessages",
+ "en": "Allow Private Messages",
+ "tr": "Özel Mesaj İzni"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.DefaultSettings",
+ "en": "Default Settings",
+ "tr": "Varsayılan Ayarlar"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.AllowStudentScreenShare",
+ "en": "Allow Student Screen Share",
+ "tr": "Öğrenci Ekran Paylaşımı"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.MicrophoneMuted",
+ "en": "Microphone Muted",
+ "tr": "Mikrofon Kapalı"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.MicrophoneUnmuted",
+ "en": "Microphone Unmuted",
+ "tr": "Mikrofon Açık"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.DefaultMicrophoneState",
+ "en": "Microphone State",
+ "tr": "Mikrofon Durumu"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.DefaultCameraState",
+ "en": "Camera State",
+ "tr": "Kamera Durumu"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.CameraOn",
+ "en": "Camera On",
+ "tr": "Kamera Açık"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.DefaultLayout",
+ "en": "Default Layout",
+ "tr": "Varsayılan Layout"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.LayoutGridView",
+ "en": "Grid View",
+ "tr": "Izgara Görünümü"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.LayoutTeacherFocus",
+ "en": "Teacher Focus",
+ "tr": "Öğretmen Odaklı"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.LayoutPresentation",
+ "en": "Presentation",
+ "tr": "Sunum Modu"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.LayoutSidebar",
+ "en": "Sidebar",
+ "tr": "Yan Panel"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.DeleteRoom",
+ "en": "Delete Room",
+ "tr": "Odayı Sil"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.DeleteRoomWarning",
+ "en": "This action cannot be undone",
+ "tr": "Bu işlem geri alınamaz"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.AutomaticallyMuteNewParticipants",
+ "en": "Automatically Mute New Participants",
+ "tr": "Yeni katılımcıları otomatik sustur"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.Start",
+ "en": "Start",
+ "tr": "Başlat"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.Join",
+ "en": "Join",
+ "tr": "Katıl"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.CreateRoom",
+ "en": "Create Room",
+ "tr": "Oda Oluştur"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.EditRoom",
+ "en": "Edit Room",
+ "tr": "Odayı Düzenle"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.SaveChanges",
+ "en": "Save Changes",
+ "tr": "Değişiklikleri Kaydet"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.CameraOff",
+ "en": "Camera Off",
+ "tr": "Kamera Kapalı"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Listform.ListformField.RoomName",
+ "en": "Room Name",
+ "tr": "Oda Adı"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Listform.ListformField.RoomNamePlaceholder",
+ "en": "E.g. Math 101 - Differential Equations",
+ "tr": "Örn: Matematik 101 - Diferansiyel Denklemler"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Listform.ListformField.DescriptionPlaceholder",
+ "en": "E.g. Brief description about the class...",
+ "tr": "Örn: Ders hakkında kısa açıklama..."
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Listform.ListformField.SubjectPlaceholder",
+ "en": "E.g. Math, Physics, Chemistry",
+ "tr": "Örn: Matematik, Fizik, Kimya"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Videoroom.NoScheduledRooms",
+ "en": "No Scheduled Rooms",
+ "tr": "Henüz programlanmış oda bulunmamaktadır."
},
{
"resourceName": "Platform",
@@ -6156,6 +6420,24 @@
"tr": "Anketler",
"en": "Surveys"
},
+ {
+ "resourceName": "Platform",
+ "key": "App.Intranet.Events.EventComment",
+ "tr": "Henüz yorum yok. İlk yorumu sen yap!",
+ "en": "No comments yet. Be the first to comment!"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Intranet.Events.Comments",
+ "tr": "Yorumlar",
+ "en": "Comments"
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Intranet.Events.EventAttendance",
+ "tr": "Bir yorum yaz...",
+ "en": "Write a comment..."
+ },
{
"resourceName": "Platform",
"key": "App.Intranet.Events",
@@ -11958,6 +12240,18 @@
"tr": "Çalışıyor...",
"en": "Running..."
},
+ {
+ "resourceName": "Platform",
+ "key": "App.Platform.Intranet.SurveyModal.RequiredUserName",
+ "tr": "Bu anket isim belirtilerek doldurulmaktadır. Yanıtlarınız kaydedilecektir.",
+ "en": "This survey requires your name. Your responses will be recorded."
+ },
+ {
+ "resourceName": "Platform",
+ "key": "App.Platform.Intranet.SurveyModal.AnonymousNotice",
+ "tr": "Bu anket anonimdir. Kimlik bilgileriniz kaydedilmeyecektir.",
+ "en": "This survey is anonymous. Your identity will not be recorded."
+ },
{
"resourceName": "Platform",
"key": "App.Platform.Intranet.SurveyModal.RequiredField",
@@ -13706,6 +14000,12 @@
"en": "Duration",
"tr": "Süre"
},
+ {
+ "resourceName": "Platform",
+ "key": "App.Listform.ListformField.Minutes",
+ "en": "Minutes",
+ "tr": "Dakika"
+ },
{
"resourceName": "Platform",
"key": "App.Listform.ListformField.ElementId",
@@ -15758,6 +16058,12 @@
"en": "Subject",
"tr": "Konu"
},
+ {
+ "resourceName": "Platform",
+ "key": "App.Listform.ListformField.StartDateTime",
+ "en": "Start Date and Time",
+ "tr": "Başlangıç Tarihi ve Saati"
+ },
{
"resourceName": "Platform",
"key": "App.Listform.ListformField.SubmissionTime",
@@ -18033,4 +18339,4 @@
"tr": "Başarıyla Kaydedildi"
}
]
-}
\ No newline at end of file
+}
diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenusData.json b/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenusData.json
index 8d76fd1..0899400 100644
--- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenusData.json
+++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/MenusData.json
@@ -1123,21 +1123,11 @@
"RequiredPermissionName": "App.Intranet.Events.Event",
"IsDisabled": false
},
- {
- "ParentCode": "App.Administration",
- "Code": "App.Videoroom.Dashboard",
- "DisplayName": "App.Videoroom.Dashboard",
- "Order": 4,
- "Url": "/admin/videoroom/dashboard",
- "Icon": "FcVideoCall",
- "RequiredPermissionName": "App.Videoroom.Dashboard",
- "IsDisabled": false
- },
{
"ParentCode": "App.Administration",
"Code": "App.Administration.Restrictions",
"DisplayName": "App.Restrictions",
- "Order": 5,
+ "Order": 4,
"Url": null,
"Icon": "FaLock",
"RequiredPermissionName": null,
@@ -1167,7 +1157,7 @@
"ParentCode": "App.Administration",
"Code": "Abp.Identity",
"DisplayName": "Abp.Identity",
- "Order": 6,
+ "Order": 5,
"Url": null,
"Icon": "FcConferenceCall",
"RequiredPermissionName": null,
@@ -1257,7 +1247,7 @@
"ParentCode": "App.Administration",
"Code": "App.Reports.Management",
"DisplayName": "App.Reports.Management",
- "Order": 7,
+ "Order": 6,
"Url": null,
"Icon": "FcDocument",
"RequiredPermissionName": null,
@@ -1283,6 +1273,16 @@
"RequiredPermissionName": "App.Reports.ReportTemplates",
"IsDisabled": false
},
+ {
+ "ParentCode": "App.Administration",
+ "Code": "App.Videoroom.Dashboard",
+ "DisplayName": "App.Videoroom.Dashboard",
+ "Order": 7,
+ "Url": "/admin/videoroom/dashboard",
+ "Icon": "FcVideoCall",
+ "RequiredPermissionName": "App.Videoroom.Dashboard",
+ "IsDisabled": false
+ },
{
"ParentCode": "App.Administration",
"Code": "App.Files",
diff --git a/ui/src/views/admin/listForm/wizard/WizardFileManager.tsx b/ui/src/views/admin/listForm/wizard/WizardFileManager.tsx
index 061865c..8b5e213 100644
--- a/ui/src/views/admin/listForm/wizard/WizardFileManager.tsx
+++ b/ui/src/views/admin/listForm/wizard/WizardFileManager.tsx
@@ -12,7 +12,7 @@ import {
FaExclamationTriangle,
FaSearch,
FaEdit,
- FaUser,
+ FaCalendarAlt,
} from 'react-icons/fa'
import { FcAcceptDatabase } from 'react-icons/fc'
import { deleteWizardFile, getWizardFiles } from '@/services/wizard.service'
@@ -161,9 +161,12 @@ const WizardFileManager = () => {
{filteredFiles.length === 0 && !loading && (
-
- {translate('::App.Listforms.WizardNoFiles') || 'No wizard files found.'}
-
+
+
+
+ {translate('::App.Listforms.WizardNoFiles') || 'No wizard files found.'}
+
+
)}
{loading && (
@@ -187,7 +190,9 @@ const WizardFileManager = () => {
{f.wizardName || f.fileName}
- {f.fileName} - {f.listFormCode}
+
+ {f.fileName} - {f.listFormCode}
+
diff --git a/ui/src/views/admin/videoroom/Dashboard.tsx b/ui/src/views/admin/videoroom/Dashboard.tsx
index 3b58369..6eb4fb5 100644
--- a/ui/src/views/admin/videoroom/Dashboard.tsx
+++ b/ui/src/views/admin/videoroom/Dashboard.tsx
@@ -1,6 +1,6 @@
import React from 'react'
import { motion } from 'framer-motion'
-import { FaGraduationCap, FaUserCheck, FaEye } from 'react-icons/fa'
+import { FaEye, FaUsers, FaCrown } from 'react-icons/fa'
import { useStoreActions, useStoreState } from '@/store/store'
import { useNavigate } from 'react-router-dom'
import { ROUTES_ENUM } from '@/routes/route.constant'
@@ -36,7 +36,9 @@ const Dashboard: React.FC = () => {
animate={{ opacity: 1, y: 0 }}
className="text-center w-full max-w-4xl"
>
- Lütfen rolünüzü seçin
+
+ {translate('::' + 'App.Videoroom.RoleSelector')}
+
{
onClick={() => handleRoleSelect('teacher')}
className="bg-white rounded-lg shadow-lg p-6 sm:p-8 hover:shadow-xl transition-all duration-300 border-2 border-transparent hover:border-blue-500"
>
-
- Öğretmen
+
+
+ {translate('::' + 'App.Videoroom.Host')}
+
- Ders başlatın, öğrencilerle iletişim kurun ve katılım raporlarını görün
+ {translate('::' + 'App.Videoroom.HostDescription')}
@@ -58,10 +62,12 @@ const Dashboard: React.FC = () => {
onClick={() => handleRoleSelect('student')}
className="bg-white rounded-lg shadow-lg p-6 sm:p-8 hover:shadow-xl transition-all duration-300 border-2 border-transparent hover:border-green-500"
>
-
-
Öğrenci
+
+
+ {translate('::' + 'App.Videoroom.Participant')}
+
- Aktif derslere katılın, öğretmeniniz ve diğer öğrencilerle etkileşim kurun
+ {translate('::' + 'App.Videoroom.ParticipantDescription')}
@@ -72,9 +78,11 @@ const Dashboard: React.FC = () => {
className="bg-white rounded-lg shadow-lg p-6 sm:p-8 hover:shadow-xl transition-all duration-300 border-2 border-transparent hover:border-purple-500 md:col-span-2 lg:col-span-1"
>
-
Gözlemci
+
+ {translate('::' + 'App.Videoroom.Observer')}
+
- Sınıfı gözlemleyin, eğitim sürecini takip edin (ses/video paylaşımı yok)
+ {translate('::' + 'App.Videoroom.ObserverDescription')}
diff --git a/ui/src/views/admin/videoroom/RoomList.tsx b/ui/src/views/admin/videoroom/RoomList.tsx
index dba89be..a53f74c 100644
--- a/ui/src/views/admin/videoroom/RoomList.tsx
+++ b/ui/src/views/admin/videoroom/RoomList.tsx
@@ -14,7 +14,6 @@ import {
FaHourglassEnd,
FaDoorOpen,
FaSearch,
- FaFilter,
} from 'react-icons/fa'
import { useStoreState } from '@/store/store'
@@ -30,6 +29,9 @@ import {
import { Helmet } from 'react-helmet'
import { useLocalization } from '@/utils/hooks/useLocalization'
import { VideoroomDto } from '@/proxy/videoroom/models'
+import classNames from 'classnames'
+import { Button, Input } from '@/components/ui'
+import { FcVideoCall } from 'react-icons/fc'
export interface RoomProps {
status: string
@@ -70,6 +72,7 @@ const RoomList: React.FC = () => {
}
const [videoList, setVideoist] = useState([])
const [videoroom, setVideoroom] = useState(newClassEntity)
+ const mode = useStoreState((state) => state.theme.mode)
const [showCreateModal, setShowCreateModal] = useState(false)
const [showEditModal, setShowEditModal] = useState(false)
@@ -77,7 +80,6 @@ const RoomList: React.FC = () => {
// Filter/search state
const [searchTerm, setSearchTerm] = useState('')
- const [statusFilter, setStatusFilter] = useState('')
const getVideoroomList = async (
skipCount = 0,
@@ -110,8 +112,8 @@ const RoomList: React.FC = () => {
}
useEffect(() => {
- getVideoroomList(0, 1000, '', searchTerm, statusFilter)
- }, [searchTerm, statusFilter])
+ getVideoroomList(0, 1000, '', searchTerm)
+ }, [searchTerm])
const handleCreateClass = async (e: React.FormEvent) => {
e.preventDefault()
@@ -208,7 +210,9 @@ const RoomList: React.FC = () => {
className: 'bg-blue-100 text-blue-800',
showButtons: true,
title:
- user.role === 'teacher' && classSession.teacherId === user.id ? 'Dersi Başlat' : 'Katıl',
+ user.role === 'teacher' && classSession.teacherId === user.id
+ ? translate('::App.Videoroom.Start')
+ : translate('::App.Videoroom.Join'),
classes:
user.role === 'teacher' && classSession.teacherId === user.id
? 'bg-green-600 text-white hover:bg-green-700'
@@ -232,7 +236,9 @@ const RoomList: React.FC = () => {
className: 'bg-yellow-100 text-yellow-800',
showButtons: true,
title:
- user.role === 'teacher' && classSession.teacherId === user.id ? 'Sınıfa Git' : 'Katıl',
+ user.role === 'teacher' && classSession.teacherId === user.id
+ ? translate('::App.Videoroom.Start')
+ : translate('::App.Videoroom.Join'),
classes:
user.role === 'teacher' && classSession.teacherId === user.id
? 'bg-green-600 text-white hover:bg-green-700'
@@ -258,12 +264,50 @@ const RoomList: React.FC = () => {
<>
+
+ {/* ── Header ─────────────────────────────────────────────── */}
+
+
+
{translate('::App.Videoroom.List')}
+
+
+
+
+ setSearchTerm(e.target.value)}
+ />
+
+
+ {user.role === 'teacher' && (
+
+ )}
+
+
+
{/* Stats Cards */}
-
+
{
-
Toplam Sınıf
+
+ {translate('::App.Videoroom.TotalRooms')}
+
{widgets().totalCount}{' '}
@@ -294,7 +340,9 @@ const RoomList: React.FC = () => {
-
Aktif Sınıf
+
+ {translate('::App.Videoroom.ActiveRooms')}
+
{widgets().activeCount}
@@ -314,7 +362,9 @@ const RoomList: React.FC = () => {
-
Katılıma Açık
+
+ {translate('::App.Videoroom.OpenRooms')}
+
{widgets().openCount}
@@ -332,7 +382,9 @@ const RoomList: React.FC = () => {
-
Pasif Sınıf
+
+ {translate('::App.Videoroom.PassiveRooms')}
+
{widgets().passiveCount}
@@ -352,7 +404,9 @@ const RoomList: React.FC = () => {
-
Toplam Katılımcı
+
+ {translate('::App.Videoroom.TotalParticipants')}
+
{videoList.reduce((sum, c) => sum + c.participantCount, 0)}
@@ -361,188 +415,158 @@ const RoomList: React.FC = () => {
- {/* Filter Bar */}
-
-
-
-
- setSearchTerm(e.target.value)}
- />
-
-
-
-
-
-
-
-
{/* Scheduled Classes */}
-
-
Programlı Sınıflar
- {user.role === 'teacher' && (
-
- )}
-
-
- {videoList.length === 0 ? (
-
-
-
Henüz programlanmış sınıf bulunmamaktadır.
-
- ) : (
-
- {videoList.map((classSession, index) => {
- const { status, className, showButtons, title, classes, event } =
- getClassProps(classSession)
- return (
-
-
-
-
+ {videoList.length === 0 ? (
+
+
+
+ {translate('::App.Videoroom.NoScheduledRooms') ||
+ 'No scheduled classes found. Please create a new class.'}
+
+
+ ) : (
+
+ {videoList.map((classSession, index) => {
+ const { status, className, showButtons, title, classes, event } =
+ getClassProps(classSession)
+ const isActive = !classSession.actualStartTime && !classSession.actualEndTime
+ const isOpen = classSession.actualStartTime && !classSession.actualEndTime
+ const accentColor = isOpen
+ ? 'border-l-yellow-400'
+ : isActive
+ ? 'border-l-blue-500'
+ : 'border-l-gray-300'
+ return (
+
+ {/* Card Header */}
+
+
+
+
{classSession.name}
{status}
-
- {/* Sağ kısım: buton */}
- {showButtons && (
-
- {/* {user.role === 'teacher' && classSession.teacherId === user.id && ( */}
- {user.role === 'teacher' && (
- <>
-
-
-
-
-
- >
+ {(classSession.subject || classSession.description) && (
+
+ {classSession.subject && (
+
+ {classSession.subject}
+
+ )}
+ {classSession.description && (
+
+ {classSession.description}
+
)}
-
-
)}
-
-
{classSession.subject}
-
-
-
-
- {classSession.description}
-
-
-
-
-
-
-
-
- {showDbDateAsIs(classSession.scheduledStartTime)}
-
-
-
-
-
- {classSession.duration} dakika
-
-
-
- {classSession.scheduledEndTime && (
- <>
-
-
- {showDbDateAsIs(classSession.scheduledEndTime!)}
+ {/* Action Buttons */}
+ {showButtons && (
+
+ {user.role === 'teacher' && (
+ <>
+
+
-
-
-
- {classSession.participantCount}/{classSession.maxParticipants}
-
-
+
+
+
+ >
+ )}
+
+
-
-
- )
- })}
-
- )}
-
+ )}
+
+
+ {/* Card Footer — Meta Info */}
+
+
+
+ {showDbDateAsIs(classSession.scheduledStartTime)}
+
+
+
+ {classSession.duration} dk
+
+ {classSession.scheduledEndTime && (
+
+
+ {showDbDateAsIs(classSession.scheduledEndTime!)}
+
+ )}
+
+
+ {classSession.participantCount}/{classSession.maxParticipants}
+
+
+
+ )
+ })}
+
+ )}
{/* Class Modal (Create/Edit) */}
@@ -555,7 +579,9 @@ const RoomList: React.FC = () => {
>
- {showCreateModal ? 'Yeni Sınıf Oluştur' : 'Sınıfı Düzenle'}
+ {showCreateModal
+ ? translate('::App.Videoroom.CreateRoom') || 'Yeni Sınıf Oluştur'
+ : translate('::App.Videoroom.EditRoom') || 'Sınıfı Düzenle'}
@@ -565,7 +591,7 @@ const RoomList: React.FC = () => {
>
{
value={videoroom.name}
onChange={(e) => setVideoroom({ ...videoroom, name: e.target.value })}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
- placeholder="Örn: Matematik 101 - Diferansiyel Denklemler"
+ placeholder={
+ translate('::App.Listform.ListformField.RoomNamePlaceholder') ||
+ 'Enter room name...'
+ }
/>
-
+
setVideoroom({ ...videoroom, subject: e.target.value })}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
- placeholder="Örn: Matematik, Fizik, Kimya"
+ placeholder={
+ translate('::App.Listform.ListformField.SubjectPlaceholder') ||
+ 'E.g. Math, Physics, Chemistry'
+ }
/>
{
{
{
{/* Sınıf Ayarları */}
-
Sınıf Ayarları
+
+ {translate('::App.Videoroom.RoomSettings') || 'Sınıf Ayarları'}
+
@@ -849,15 +927,17 @@ const RoomList: React.FC = () => {
resetForm()
}
}}
- className="px-6 py-3 border border-gray-300 text-gray-700 rounded-lg hover:bg-gray-50 transition-colors"
+ className="px-3 py-1 border border-gray-300 text-gray-700 rounded-lg hover:bg-gray-50 transition-colors"
>
- İptal
+ {translate('::Cancel') || 'İptal'}
@@ -879,14 +959,18 @@ const RoomList: React.FC = () => {
-
Sınıfı Sil
-
Bu işlem geri alınamaz
+
+ {translate('::App.Videoroom.DeleteRoom') || 'Sınıfı Sil'}
+
+
+ {translate('::App.Videoroom.DeleteRoomWarning') || 'Bu işlem geri alınamaz'}
+
- "{videoroom.name}" adlı sınıfı silmek istediğinizden emin
- misiniz?
+ {translate('::DeleteConfirmation') ||
+ 'Bu sınıfı silmek istediğinize emin misiniz?'}
@@ -897,13 +981,13 @@ const RoomList: React.FC = () => {
}}
className="px-4 py-2 border border-gray-300 text-gray-700 rounded-lg hover:bg-gray-50 transition-colors"
>
- İptal
+ {translate('::App.Common.Cancel') || 'İptal'}
diff --git a/ui/src/views/intranet/widgets/EventModal.tsx b/ui/src/views/intranet/widgets/EventModal.tsx
index 5554267..e04b7b3 100644
--- a/ui/src/views/intranet/widgets/EventModal.tsx
+++ b/ui/src/views/intranet/widgets/EventModal.tsx
@@ -19,6 +19,7 @@ import { AVATAR_URL } from '@/constants/app.constant'
import { intranetService } from '@/services/intranet.service'
import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
+import { useLocalization } from '@/utils/hooks/useLocalization'
dayjs.extend(relativeTime)
@@ -41,6 +42,7 @@ const imgSrc = (img: string) => {
const EventModal: React.FC
= ({ event, onClose }) => {
const currentLocale = useLocale()
const photos = (event.photos || '').split('|').filter(Boolean)
+ const { translate } = useLocalization()
// Photo slider state
const [activePhoto, setActivePhoto] = useState(0)
@@ -254,14 +256,14 @@ const EventModal: React.FC = ({ event, onClose }) => {
- Yorumlar ({comments.length})
+ {translate('::App.Intranet.Events.Comments')} ({comments.length})
{/* Comment List */}
{comments.length === 0 ? (
- Henüz yorum yok. İlk yorumu sen yap!
+ {translate('::App.Intranet.Events.EventComment')}
) : (
comments.map((comment) => (
@@ -298,9 +300,10 @@ const EventModal: React.FC
= ({ event, onClose }) => {
diff --git a/ui/src/views/intranet/widgets/SurveyModal.tsx b/ui/src/views/intranet/widgets/SurveyModal.tsx
index f3bb4b4..5c20d44 100644
--- a/ui/src/views/intranet/widgets/SurveyModal.tsx
+++ b/ui/src/views/intranet/widgets/SurveyModal.tsx
@@ -11,7 +11,7 @@ interface SurveyModalProps {
import { useLocalization } from '@/utils/hooks/useLocalization'
const SurveyModal: React.FC
= ({ survey, onClose, onSubmit }) => {
- const { translate } = useLocalization();
+ const { translate } = useLocalization()
const isUpdate = !!survey.myResponse
const [answers, setAnswers] = useState<{ [questionId: string]: any }>(() => {
@@ -20,7 +20,7 @@ const SurveyModal: React.FC = ({ survey, onClose, onSubmit })
survey.myResponse.answers.map((a) => [
a.questionId,
a.questionType === 'rating' ? Number(a.value) : a.value,
- ])
+ ]),
)
}
return {}
@@ -48,7 +48,11 @@ const SurveyModal: React.FC = ({ survey, onClose, onSubmit })
survey.questions.forEach((question) => {
if (question.isRequired) {
const val = answers[question.id]
- const isEmpty = val === undefined || val === null || val === '' || (question.type === 'rating' && Number(val) === 0)
+ const isEmpty =
+ val === undefined ||
+ val === null ||
+ val === '' ||
+ (question.type === 'rating' && Number(val) === 0)
if (isEmpty) {
newErrors[question.id] = translate('::App.Platform.Intranet.SurveyModal.RequiredField')
}
@@ -269,7 +273,7 @@ const SurveyModal: React.FC = ({ survey, onClose, onSubmit })
{!survey.isAnonymous && (
- ℹ️ Bu anket isim belirtilerek doldurulmaktadır. Yanıtlarınız kaydedilecektir.
+ ℹ️ {translate('::App.Platform.Intranet.SurveyModal.RequiredUserName')}
)}
@@ -277,7 +281,7 @@ const SurveyModal: React.FC = ({ survey, onClose, onSubmit })
{survey.isAnonymous && (
- ✅ Bu anket anonimdir. Kimlik bilgileriniz kaydedilmeyecektir.
+ ✅ {translate('::App.Platform.Intranet.SurveyModal.AnonymousNotice')}
)}