Build
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
import { useEffect, useState } from 'react';
|
||||
import { useRouter } from 'next/navigation';
|
||||
import { dataStore, type SliderItem } from '@/lib/dataStore';
|
||||
import { dataStore, type SliderItem, type LiveStreamConfig, type Message, type SiteSettings, type FAQ, type Camera } from '@/lib/dataStore';
|
||||
import type { NewsItem } from '@/data/news';
|
||||
import type { MediaItem } from '@/data/media';
|
||||
import type { Document } from '@/data/documents';
|
||||
@@ -19,6 +19,11 @@ export default function Dashboard() {
|
||||
const [mediaItems, setMediaItems] = useState<MediaItem[]>([]);
|
||||
const [documents, setDocuments] = useState<Document[]>([]);
|
||||
const [metroStations, setMetroStations] = useState<MetroStation[]>([]);
|
||||
const [liveStreamConfig, setLiveStreamConfig] = useState<LiveStreamConfig | null>(null);
|
||||
const [messages, setMessages] = useState<Message[]>([]);
|
||||
const [siteSettings, setSiteSettings] = useState<SiteSettings | null>(null);
|
||||
const [faqs, setFaqs] = useState<FAQ[]>([]);
|
||||
const [cameras, setCameras] = useState<Camera[]>([]);
|
||||
|
||||
useEffect(() => {
|
||||
const token = localStorage.getItem('admin_token');
|
||||
@@ -37,6 +42,11 @@ export default function Dashboard() {
|
||||
setMediaItems(dataStore.getMedia());
|
||||
setDocuments(dataStore.getDocuments());
|
||||
setMetroStations(dataStore.getMetroStations());
|
||||
setLiveStreamConfig(dataStore.getLiveStream());
|
||||
setMessages(dataStore.getMessages());
|
||||
setSiteSettings(dataStore.getSiteSettings());
|
||||
setFaqs(dataStore.getFAQs().sort((a, b) => a.order - b.order));
|
||||
setCameras(dataStore.getCameras().sort((a, b) => a.order - b.order));
|
||||
};
|
||||
|
||||
const handleLogout = () => {
|
||||
@@ -48,7 +58,7 @@ export default function Dashboard() {
|
||||
{ title: 'Aktif Slider', value: sliderItems.filter(s => s.active).length.toString(), icon: '🎬', color: 'from-[#004B87] to-[#00B4D8]', change: '+1' },
|
||||
{ title: 'Toplam Haberler', value: newsItems.length.toString(), icon: '📰', color: 'from-[#00B4D8] to-[#0096C7]', change: '+2' },
|
||||
{ title: 'Medya İçeriği', value: mediaItems.length.toString(), icon: '📸', color: 'from-[#0096C7] to-[#48CAE4]', change: '+3' },
|
||||
{ title: 'Metro İstasyonları', value: metroStations.length.toString(), icon: '🚇', color: 'from-[#48CAE4] to-[#90E0EF]', change: '+2' },
|
||||
{ title: 'Gelen Mesajlar', value: messages.filter(m => !m.read).length.toString(), icon: '✉️', color: 'from-[#48CAE4] to-[#90E0EF]', change: `+${messages.filter(m => !m.read).length}` },
|
||||
];
|
||||
|
||||
const menuItems = [
|
||||
@@ -58,7 +68,11 @@ export default function Dashboard() {
|
||||
{ id: 'media', label: 'Medya', icon: '📸' },
|
||||
{ id: 'documents', label: 'Belgeler', icon: '📄' },
|
||||
{ id: 'metro-line', label: 'Metro Hattı', icon: '🚇' },
|
||||
{ id: 'settings', label: 'Ayarlar', icon: '⚙️' },
|
||||
{ id: 'live-stream', label: 'Canlı Yayın', icon: '📺' },
|
||||
{ id: 'cameras', label: 'Kameralar', icon: '📹' },
|
||||
{ id: 'faqs', label: 'SSS Yönetimi', icon: '❓' },
|
||||
{ id: 'messages', label: 'Gelen Mesajlar', icon: '✉️', badge: messages.filter(m => !m.read).length || undefined },
|
||||
{ id: 'site-settings', label: 'Site Ayarları', icon: '⚙️' },
|
||||
];
|
||||
|
||||
// Slider management functions
|
||||
@@ -110,11 +124,11 @@ export default function Dashboard() {
|
||||
}
|
||||
};
|
||||
|
||||
// Metro station update function
|
||||
const handleUpdateStation = (id: number, updates: Partial<MetroStation>) => {
|
||||
dataStore.updateStation(id, updates);
|
||||
loadData();
|
||||
};
|
||||
// Metro station update function (used in modal)
|
||||
// const handleUpdateStation = (id: number, updates: Partial<MetroStation>) => {
|
||||
// dataStore.updateStation(id, updates);
|
||||
// loadData();
|
||||
// };
|
||||
|
||||
// Categories
|
||||
const categories = [
|
||||
@@ -134,8 +148,8 @@ export default function Dashboard() {
|
||||
|
||||
// Form states
|
||||
const [selectedNewsCategory, setSelectedNewsCategory] = useState('all');
|
||||
const [editingNews, setEditingNews] = useState<NewsItem | null>(null);
|
||||
const [showNewsForm, setShowNewsForm] = useState(false);
|
||||
// const [editingNews, setEditingNews] = useState<NewsItem | null>(null);
|
||||
// const [showNewsForm, setShowNewsForm] = useState(false);
|
||||
const [selectedMediaType, setSelectedMediaType] = useState<'all' | 'video' | 'photo'>('all');
|
||||
const [selectedDocCategory, setSelectedDocCategory] = useState('all');
|
||||
|
||||
@@ -215,7 +229,6 @@ export default function Dashboard() {
|
||||
description: '',
|
||||
buttonText: 'Detaylı Bilgi',
|
||||
buttonLink: '#',
|
||||
image: '',
|
||||
active: false
|
||||
};
|
||||
setEditingSlide(newSlide);
|
||||
@@ -239,7 +252,9 @@ export default function Dashboard() {
|
||||
content: '',
|
||||
date: new Date().toLocaleDateString('tr-TR'),
|
||||
image: '',
|
||||
category: 'announcement',
|
||||
category: 'announcements',
|
||||
author: 'Admin',
|
||||
tags: [],
|
||||
featured: false
|
||||
};
|
||||
setEditingNewsItem(newNews);
|
||||
@@ -273,7 +288,6 @@ export default function Dashboard() {
|
||||
title: '',
|
||||
description: '',
|
||||
type: 'photo',
|
||||
url: '',
|
||||
thumbnail: '',
|
||||
date: new Date().toLocaleDateString('tr-TR'),
|
||||
category: 'construction'
|
||||
@@ -308,10 +322,10 @@ export default function Dashboard() {
|
||||
id: Math.max(...documents.map(d => d.id), 0) + 1,
|
||||
title: '',
|
||||
description: '',
|
||||
type: 'pdf',
|
||||
type: 'PDF',
|
||||
size: '',
|
||||
date: new Date().toLocaleDateString('tr-TR'),
|
||||
category: 'technical',
|
||||
category: 'teknik',
|
||||
downloadUrl: '#'
|
||||
};
|
||||
setEditingDocument(newDoc);
|
||||
@@ -408,7 +422,12 @@ export default function Dashboard() {
|
||||
}`}
|
||||
>
|
||||
<span className="text-2xl">{item.icon}</span>
|
||||
<span className="font-medium">{item.label}</span>
|
||||
<span className="font-medium flex-1 text-left">{item.label}</span>
|
||||
{item.badge && item.badge > 0 && (
|
||||
<span className="px-2 py-1 bg-red-500 text-white text-xs rounded-full font-bold">
|
||||
{item.badge}
|
||||
</span>
|
||||
)}
|
||||
</button>
|
||||
))}
|
||||
</nav>
|
||||
@@ -1289,145 +1308,617 @@ export default function Dashboard() {
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Features */}
|
||||
<div className="mt-4 pt-4 border-t">
|
||||
<p className="text-xs font-semibold text-gray-600 mb-2">ÖZELLİKLER:</p>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
{station.features.map((feature, i) => (
|
||||
<span key={i} className="px-2 py-1 bg-gray-100 text-gray-700 text-xs rounded">
|
||||
{feature}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
{/* Stats */}
|
||||
<div className="grid grid-cols-1 md:grid-cols-4 gap-4">
|
||||
<div className="bg-white rounded-xl shadow-sm p-6">
|
||||
<div className="flex items-center justify-between">
|
||||
<div>
|
||||
<p className="text-sm text-gray-600">Toplam İstasyon</p>
|
||||
<p className="text-2xl font-bold text-[#003366] mt-1">{metroStations.length}</p>
|
||||
</div>
|
||||
<div className="text-4xl">🚇</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="bg-white rounded-xl shadow-sm p-6">
|
||||
<div className="flex items-center justify-between">
|
||||
<div>
|
||||
<p className="text-sm text-gray-600">Tamamlanan</p>
|
||||
<p className="text-2xl font-bold text-green-600 mt-1">{metroStations.filter(s => s.status === 'completed').length}</p>
|
||||
</div>
|
||||
<div className="text-4xl">✅</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="bg-white rounded-xl shadow-sm p-6">
|
||||
<div className="flex items-center justify-between">
|
||||
<div>
|
||||
<p className="text-sm text-gray-600">Devam Eden</p>
|
||||
<p className="text-2xl font-bold text-blue-600 mt-1">{metroStations.filter(s => s.status === 'in-progress').length}</p>
|
||||
</div>
|
||||
<div className="text-4xl">🔄</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="bg-white rounded-xl shadow-sm p-6">
|
||||
<div className="flex items-center justify-between">
|
||||
<div>
|
||||
<p className="text-sm text-gray-600">Planlanan</p>
|
||||
<p className="text-2xl font-bold text-yellow-600 mt-1">{metroStations.filter(s => s.status === 'planned').length}</p>
|
||||
</div>
|
||||
<div className="text-4xl">📅</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Settings Section */}
|
||||
{activeSection === 'settings' && (
|
||||
{/* Live Stream Management Section */}
|
||||
{activeSection === 'live-stream' && liveStreamConfig && (
|
||||
<div className="space-y-6">
|
||||
<div className="bg-white rounded-xl shadow-sm p-6">
|
||||
<h3 className="text-2xl font-bold text-[#003366] mb-6">Sistem Ayarları</h3>
|
||||
|
||||
<div className="space-y-6">
|
||||
{/* Site Settings */}
|
||||
<div className="border-b pb-6">
|
||||
<h4 className="text-lg font-semibold text-[#004B87] mb-4 flex items-center space-x-2">
|
||||
<span>🌐</span>
|
||||
<span>Site Ayarları</span>
|
||||
</h4>
|
||||
<div className="space-y-4">
|
||||
<div>
|
||||
<label className="block text-sm font-medium text-gray-700 mb-2">Site Başlığı</label>
|
||||
<input type="text" defaultValue="A2 Metro Hattı Projesi" className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent" />
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-sm font-medium text-gray-700 mb-2">Site Açıklaması</label>
|
||||
<textarea rows={3} defaultValue="Ankara Büyükşehir Belediyesi A2 Metro Hattı İnşaat Projesi" className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div className="mb-6">
|
||||
<h3 className="text-2xl font-bold text-[#003366]">Canlı Yayın Yönetimi</h3>
|
||||
<p className="text-gray-600 mt-1">YouTube canlı yayın URL'sini ve ayarlarını yönetin</p>
|
||||
</div>
|
||||
|
||||
<form onSubmit={(e) => {
|
||||
e.preventDefault();
|
||||
dataStore.setLiveStream(liveStreamConfig);
|
||||
alert('Canlı yayın ayarları kaydedildi!');
|
||||
}} className="space-y-6">
|
||||
<div>
|
||||
<label className="flex items-center space-x-2 mb-4">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={liveStreamConfig.active}
|
||||
onChange={(e) => setLiveStreamConfig({ ...liveStreamConfig, active: e.target.checked })}
|
||||
className="w-5 h-5 text-[#00B4D8] border-gray-300 rounded focus:ring-[#00B4D8]"
|
||||
/>
|
||||
<span className="text-sm font-semibold text-gray-700">Canlı Yayın Aktif</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
{/* Admin Settings */}
|
||||
<div className="border-b pb-6">
|
||||
<h4 className="text-lg font-semibold text-[#004B87] mb-4 flex items-center space-x-2">
|
||||
<span>👤</span>
|
||||
<span>Admin Ayarları</span>
|
||||
</h4>
|
||||
<div className="space-y-4">
|
||||
<div>
|
||||
<label className="block text-sm font-medium text-gray-700 mb-2">Kullanıcı Adı</label>
|
||||
<input type="text" defaultValue="admin" className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent" />
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-sm font-medium text-gray-700 mb-2">Yeni Şifre</label>
|
||||
<input type="password" placeholder="Boş bırakın değiştirmek istemiyorsanız" className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent" />
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">
|
||||
Yayın Başlığı
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
value={liveStreamConfig.title || ''}
|
||||
onChange={(e) => setLiveStreamConfig({ ...liveStreamConfig, title: e.target.value })}
|
||||
className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
placeholder="Canlı Yayın"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* Notification Settings */}
|
||||
<div className="border-b pb-6">
|
||||
<h4 className="text-lg font-semibold text-[#004B87] mb-4 flex items-center space-x-2">
|
||||
<span>🔔</span>
|
||||
<span>Bildirim Ayarları</span>
|
||||
</h4>
|
||||
<div className="space-y-3">
|
||||
<label className="flex items-center space-x-3">
|
||||
<input type="checkbox" defaultChecked className="w-5 h-5 text-[#00B4D8] rounded focus:ring-[#00B4D8]" />
|
||||
<span className="text-sm text-gray-700">Yeni haber eklendiğinde bildir</span>
|
||||
</label>
|
||||
<label className="flex items-center space-x-3">
|
||||
<input type="checkbox" defaultChecked className="w-5 h-5 text-[#00B4D8] rounded focus:ring-[#00B4D8]" />
|
||||
<span className="text-sm text-gray-700">Belge yüklendiğinde bildir</span>
|
||||
</label>
|
||||
<label className="flex items-center space-x-3">
|
||||
<input type="checkbox" className="w-5 h-5 text-[#00B4D8] rounded focus:ring-[#00B4D8]" />
|
||||
<span className="text-sm text-gray-700">Günlük rapor gönder</span>
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">
|
||||
YouTube Embed URL *
|
||||
</label>
|
||||
<input
|
||||
type="url"
|
||||
value={liveStreamConfig.url}
|
||||
onChange={(e) => setLiveStreamConfig({ ...liveStreamConfig, url: e.target.value })}
|
||||
className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
placeholder="https://www.youtube.com/embed/VIDEO_ID"
|
||||
required
|
||||
/>
|
||||
<p className="mt-2 text-sm text-gray-500">
|
||||
YouTube video URL'sini embed formatında girin. Örnek: https://www.youtube.com/embed/VIDEO_ID
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Save Button */}
|
||||
<div className="flex justify-end space-x-3">
|
||||
<button className="px-6 py-3 border border-gray-300 rounded-lg font-semibold text-gray-700 hover:bg-gray-50 transition-all">
|
||||
İptal
|
||||
</button>
|
||||
<button className="px-6 py-3 bg-linear-to-r from-[#004B87] to-[#00B4D8] text-white rounded-lg font-semibold hover:shadow-lg transition-all">
|
||||
{/* Preview */}
|
||||
{liveStreamConfig.url && (
|
||||
<div>
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">Önizleme</label>
|
||||
<div className="relative w-full bg-gray-100 rounded-lg overflow-hidden" style={{paddingBottom: '56.25%'}}>
|
||||
<iframe
|
||||
className="absolute top-0 left-0 w-full h-full"
|
||||
src={liveStreamConfig.url}
|
||||
title="Önizleme"
|
||||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
||||
allowFullScreen
|
||||
></iframe>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="flex justify-end pt-4 border-t">
|
||||
<button
|
||||
type="submit"
|
||||
className="px-6 py-3 bg-linear-to-r from-[#004B87] to-[#00B4D8] text-white rounded-lg font-semibold hover:shadow-lg transition-all"
|
||||
>
|
||||
Değişiklikleri Kaydet
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{activeSection !== 'overview' && activeSection !== 'slider' && activeSection !== 'news' && activeSection !== 'media' && activeSection !== 'documents' && activeSection !== 'metro-line' && activeSection !== 'settings' && (
|
||||
{/* Messages Section */}
|
||||
{activeSection === 'messages' && (
|
||||
<div className="space-y-6">
|
||||
<div className="bg-white rounded-xl shadow-sm p-6">
|
||||
<div className="flex items-center justify-between mb-6">
|
||||
<div>
|
||||
<h3 className="text-2xl font-bold text-[#003366]">Gelen Mesajlar</h3>
|
||||
<p className="text-gray-600 mt-1">Kullanıcılardan gelen dilek, öneri ve şikayetler</p>
|
||||
</div>
|
||||
<div className="flex items-center space-x-2">
|
||||
<span className="px-4 py-2 bg-red-100 text-red-700 rounded-lg font-semibold text-sm">
|
||||
{messages.filter(m => !m.read).length} Okunmamış
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{messages.length === 0 ? (
|
||||
<div className="text-center py-12">
|
||||
<svg className="w-16 h-16 mx-auto text-gray-400 mb-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4" />
|
||||
</svg>
|
||||
<p className="text-gray-500">Henüz mesaj bulunmuyor</p>
|
||||
</div>
|
||||
) : (
|
||||
<div className="space-y-4">
|
||||
{messages.map((message) => (
|
||||
<div
|
||||
key={message.id}
|
||||
className={`border rounded-lg p-4 transition-all ${
|
||||
message.read ? 'bg-gray-50 border-gray-200' : 'bg-blue-50 border-blue-200'
|
||||
}`}
|
||||
>
|
||||
<div className="flex items-start justify-between mb-3">
|
||||
<div className="flex-1">
|
||||
<div className="flex items-center space-x-3 mb-2">
|
||||
<h4 className="font-bold text-[#003366]">{message.name}</h4>
|
||||
<span className={`px-3 py-1 text-xs font-semibold rounded-full ${
|
||||
message.type === 'sikayet' ? 'bg-red-100 text-red-700' :
|
||||
message.type === 'oneri' ? 'bg-green-100 text-green-700' :
|
||||
'bg-blue-100 text-blue-700'
|
||||
}`}>
|
||||
{message.type === 'sikayet' ? 'Şikayet' : message.type === 'oneri' ? 'Öneri' : 'Bilgi Talebi'}
|
||||
</span>
|
||||
{!message.read && (
|
||||
<span className="px-2 py-1 bg-red-500 text-white text-xs rounded-full">Yeni</span>
|
||||
)}
|
||||
</div>
|
||||
<p className="text-sm text-gray-600 mb-2">
|
||||
📧 {message.email} • 📱 {message.phone}
|
||||
</p>
|
||||
<p className="text-sm font-semibold text-gray-700 mb-2">
|
||||
Konu: {message.subject}
|
||||
</p>
|
||||
<p className="text-sm text-gray-700 bg-white p-3 rounded border">
|
||||
{message.message}
|
||||
</p>
|
||||
<p className="text-xs text-gray-500 mt-2">
|
||||
{new Date(message.date).toLocaleString('tr-TR')}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex space-x-2">
|
||||
{!message.read && (
|
||||
<button
|
||||
onClick={() => {
|
||||
dataStore.markMessageAsRead(message.id);
|
||||
loadData();
|
||||
}}
|
||||
className="px-4 py-2 bg-[#00B4D8] text-white rounded-lg text-sm font-semibold hover:bg-[#004B87] transition-colors"
|
||||
>
|
||||
Okundu İşaretle
|
||||
</button>
|
||||
)}
|
||||
<button
|
||||
onClick={() => {
|
||||
if (confirm('Bu mesajı silmek istediğinizden emin misiniz?')) {
|
||||
dataStore.deleteMessage(message.id);
|
||||
loadData();
|
||||
}
|
||||
}}
|
||||
className="px-4 py-2 bg-red-500 text-white rounded-lg text-sm font-semibold hover:bg-red-600 transition-colors"
|
||||
>
|
||||
Sil
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* FAQs Section */}
|
||||
{activeSection === 'faqs' && (
|
||||
<div className="space-y-6">
|
||||
<div className="bg-white rounded-xl shadow-sm p-6">
|
||||
<div className="flex items-center justify-between mb-6">
|
||||
<h3 className="text-2xl font-bold text-[#003366]">SSS Yönetimi</h3>
|
||||
<button
|
||||
onClick={() => {
|
||||
dataStore.addFAQ({
|
||||
question: 'Yeni Soru',
|
||||
answer: 'Cevap buraya yazılacak...',
|
||||
order: faqs.length + 1
|
||||
});
|
||||
loadData();
|
||||
}}
|
||||
className="px-4 py-2 bg-[#00B4D8] text-white rounded-lg font-semibold hover:bg-[#0096C7] transition-colors flex items-center space-x-2"
|
||||
>
|
||||
<span>➕</span>
|
||||
<span>Yeni SSS Ekle</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="space-y-4">
|
||||
{faqs.map((faq) => (
|
||||
<div key={faq.id} className="border border-gray-200 rounded-lg p-4">
|
||||
<div className="space-y-3">
|
||||
<div className="flex items-start justify-between gap-4">
|
||||
<div className="flex-1">
|
||||
<label className="block text-sm font-medium text-gray-700 mb-1">Soru</label>
|
||||
<input
|
||||
type="text"
|
||||
value={faq.question}
|
||||
onChange={(e) => {
|
||||
dataStore.updateFAQ(faq.id, { question: e.target.value });
|
||||
loadData();
|
||||
}}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
/>
|
||||
</div>
|
||||
<div className="flex items-center space-x-2">
|
||||
<input
|
||||
type="number"
|
||||
value={faq.order}
|
||||
onChange={(e) => {
|
||||
dataStore.updateFAQ(faq.id, { order: parseInt(e.target.value) });
|
||||
loadData();
|
||||
}}
|
||||
className="w-16 px-2 py-2 border border-gray-300 rounded-lg text-center"
|
||||
title="Sıra"
|
||||
/>
|
||||
<button
|
||||
onClick={() => {
|
||||
if (confirm('Bu SSS silinsin mi?')) {
|
||||
dataStore.deleteFAQ(faq.id);
|
||||
loadData();
|
||||
}
|
||||
}}
|
||||
className="px-3 py-2 bg-red-500 text-white rounded-lg hover:bg-red-600 transition-colors"
|
||||
>
|
||||
🗑️
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-sm font-medium text-gray-700 mb-1">Cevap</label>
|
||||
<textarea
|
||||
value={faq.answer}
|
||||
onChange={(e) => {
|
||||
dataStore.updateFAQ(faq.id, { answer: e.target.value });
|
||||
loadData();
|
||||
}}
|
||||
rows={3}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
{faqs.length === 0 && (
|
||||
<div className="text-center py-12 text-gray-500">
|
||||
<p className="text-lg mb-2">Henüz SSS eklenmemiş</p>
|
||||
<p className="text-sm">Yukarıdaki butonu kullanarak ilk SSS'nizi ekleyin</p>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Cameras Section */}
|
||||
{activeSection === 'cameras' && (
|
||||
<div className="space-y-6">
|
||||
<div className="bg-white rounded-xl shadow-sm p-6">
|
||||
<div className="flex items-center justify-between mb-6">
|
||||
<h3 className="text-2xl font-bold text-[#003366]">Kamera Yönetimi</h3>
|
||||
<button
|
||||
onClick={() => {
|
||||
dataStore.addCamera({
|
||||
name: 'Yeni Kamera',
|
||||
location: 'Konum',
|
||||
videoUrl: 'https://www.youtube.com/embed/VIDEO_ID',
|
||||
status: 'online',
|
||||
viewers: 0,
|
||||
order: cameras.length + 1
|
||||
});
|
||||
loadData();
|
||||
}}
|
||||
className="px-4 py-2 bg-[#00B4D8] text-white rounded-lg font-semibold hover:bg-[#0096C7] transition-colors flex items-center space-x-2"
|
||||
>
|
||||
<span>➕</span>
|
||||
<span>Yeni Kamera Ekle</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
||||
{cameras.map((camera) => (
|
||||
<div key={camera.id} className="border border-gray-200 rounded-lg p-4">
|
||||
<div className="space-y-3">
|
||||
<div className="flex items-start justify-between gap-2">
|
||||
<div className="flex-1">
|
||||
<label className="block text-sm font-medium text-gray-700 mb-1">Kamera Adı</label>
|
||||
<input
|
||||
type="text"
|
||||
value={camera.name}
|
||||
onChange={(e) => {
|
||||
dataStore.updateCamera(camera.id, { name: e.target.value });
|
||||
loadData();
|
||||
}}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
/>
|
||||
</div>
|
||||
<button
|
||||
onClick={() => {
|
||||
if (confirm('Bu kamera silinsin mi?')) {
|
||||
dataStore.deleteCamera(camera.id);
|
||||
loadData();
|
||||
}
|
||||
}}
|
||||
className="px-3 py-2 bg-red-500 text-white rounded-lg hover:bg-red-600 transition-colors"
|
||||
>
|
||||
🗑️
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-sm font-medium text-gray-700 mb-1">Konum</label>
|
||||
<input
|
||||
type="text"
|
||||
value={camera.location}
|
||||
onChange={(e) => {
|
||||
dataStore.updateCamera(camera.id, { location: e.target.value });
|
||||
loadData();
|
||||
}}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-sm font-medium text-gray-700 mb-1">Video URL (YouTube Embed)</label>
|
||||
<input
|
||||
type="text"
|
||||
value={camera.videoUrl}
|
||||
onChange={(e) => {
|
||||
dataStore.updateCamera(camera.id, { videoUrl: e.target.value });
|
||||
loadData();
|
||||
}}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
placeholder="https://www.youtube.com/embed/VIDEO_ID"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-3 gap-2">
|
||||
<div>
|
||||
<label className="block text-sm font-medium text-gray-700 mb-1">Durum</label>
|
||||
<select
|
||||
value={camera.status}
|
||||
onChange={(e) => {
|
||||
dataStore.updateCamera(camera.id, { status: e.target.value as 'online' | 'offline' });
|
||||
loadData();
|
||||
}}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
>
|
||||
<option value="online">Online</option>
|
||||
<option value="offline">Offline</option>
|
||||
</select>
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-sm font-medium text-gray-700 mb-1">İzleyici</label>
|
||||
<input
|
||||
type="number"
|
||||
value={camera.viewers || 0}
|
||||
onChange={(e) => {
|
||||
dataStore.updateCamera(camera.id, { viewers: parseInt(e.target.value) || 0 });
|
||||
loadData();
|
||||
}}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-sm font-medium text-gray-700 mb-1">Sıra</label>
|
||||
<input
|
||||
type="number"
|
||||
value={camera.order}
|
||||
onChange={(e) => {
|
||||
dataStore.updateCamera(camera.id, { order: parseInt(e.target.value) });
|
||||
loadData();
|
||||
}}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
{cameras.length === 0 && (
|
||||
<div className="text-center py-12 text-gray-500">
|
||||
<p className="text-lg mb-2">Henüz kamera eklenmemiş</p>
|
||||
<p className="text-sm">Yukarıdaki butonu kullanarak ilk kameranızı ekleyin</p>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Site Settings Section */}
|
||||
{activeSection === 'site-settings' && siteSettings && (
|
||||
<div className="space-y-6">
|
||||
<div className="bg-white rounded-xl shadow-sm p-6">
|
||||
<div className="mb-6">
|
||||
<h3 className="text-2xl font-bold text-[#003366]">Site Ayarları</h3>
|
||||
<p className="text-gray-600 mt-1">İletişim bilgileri ve sosyal medya bağlantılarını yönetin</p>
|
||||
</div>
|
||||
|
||||
<form onSubmit={(e) => {
|
||||
e.preventDefault();
|
||||
dataStore.updateSiteSettings(siteSettings);
|
||||
alert('Site ayarları kaydedildi!');
|
||||
}} className="space-y-8">
|
||||
|
||||
{/* Company Info */}
|
||||
<div className="border-b pb-6">
|
||||
<h4 className="text-lg font-bold text-[#003366] mb-4">Şirket Bilgileri</h4>
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
||||
<div>
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">Kısa Ad</label>
|
||||
<input
|
||||
type="text"
|
||||
value={siteSettings.companyInfo.name}
|
||||
onChange={(e) => setSiteSettings({
|
||||
...siteSettings,
|
||||
companyInfo: { ...siteSettings.companyInfo, name: e.target.value }
|
||||
})}
|
||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">Tam Ünvan</label>
|
||||
<input
|
||||
type="text"
|
||||
value={siteSettings.companyInfo.fullName}
|
||||
onChange={(e) => setSiteSettings({
|
||||
...siteSettings,
|
||||
companyInfo: { ...siteSettings.companyInfo, fullName: e.target.value }
|
||||
})}
|
||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">Kuruluş Yılı</label>
|
||||
<input
|
||||
type="text"
|
||||
value={siteSettings.companyInfo.foundedYear}
|
||||
onChange={(e) => setSiteSettings({
|
||||
...siteSettings,
|
||||
companyInfo: { ...siteSettings.companyInfo, foundedYear: e.target.value }
|
||||
})}
|
||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Contact Info */}
|
||||
<div className="border-b pb-6">
|
||||
<h4 className="text-lg font-bold text-[#003366] mb-4">İletişim Bilgileri</h4>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">Telefon</label>
|
||||
<input
|
||||
type="text"
|
||||
value={siteSettings.contact.phone}
|
||||
onChange={(e) => setSiteSettings({
|
||||
...siteSettings,
|
||||
contact: { ...siteSettings.contact, phone: e.target.value }
|
||||
})}
|
||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">E-posta</label>
|
||||
<input
|
||||
type="email"
|
||||
value={siteSettings.contact.email}
|
||||
onChange={(e) => setSiteSettings({
|
||||
...siteSettings,
|
||||
contact: { ...siteSettings.contact, email: e.target.value }
|
||||
})}
|
||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">KEP Adresi</label>
|
||||
<input
|
||||
type="text"
|
||||
value={siteSettings.contact.kep}
|
||||
onChange={(e) => setSiteSettings({
|
||||
...siteSettings,
|
||||
contact: { ...siteSettings.contact, kep: e.target.value }
|
||||
})}
|
||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
/>
|
||||
</div>
|
||||
<div className="md:col-span-2">
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">Adres</label>
|
||||
<textarea
|
||||
value={siteSettings.contact.address}
|
||||
onChange={(e) => setSiteSettings({
|
||||
...siteSettings,
|
||||
contact: { ...siteSettings.contact, address: e.target.value }
|
||||
})}
|
||||
rows={3}
|
||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent resize-none"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Social Media */}
|
||||
<div>
|
||||
<h4 className="text-lg font-bold text-[#003366] mb-4">Sosyal Medya</h4>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">Facebook</label>
|
||||
<input
|
||||
type="url"
|
||||
value={siteSettings.social.facebook}
|
||||
onChange={(e) => setSiteSettings({
|
||||
...siteSettings,
|
||||
social: { ...siteSettings.social, facebook: e.target.value }
|
||||
})}
|
||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
placeholder="https://facebook.com/..."
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">Twitter</label>
|
||||
<input
|
||||
type="url"
|
||||
value={siteSettings.social.twitter}
|
||||
onChange={(e) => setSiteSettings({
|
||||
...siteSettings,
|
||||
social: { ...siteSettings.social, twitter: e.target.value }
|
||||
})}
|
||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
placeholder="https://twitter.com/..."
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">Instagram</label>
|
||||
<input
|
||||
type="url"
|
||||
value={siteSettings.social.instagram}
|
||||
onChange={(e) => setSiteSettings({
|
||||
...siteSettings,
|
||||
social: { ...siteSettings.social, instagram: e.target.value }
|
||||
})}
|
||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
placeholder="https://instagram.com/..."
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">YouTube</label>
|
||||
<input
|
||||
type="url"
|
||||
value={siteSettings.social.youtube}
|
||||
onChange={(e) => setSiteSettings({
|
||||
...siteSettings,
|
||||
social: { ...siteSettings.social, youtube: e.target.value }
|
||||
})}
|
||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
placeholder="https://youtube.com/..."
|
||||
/>
|
||||
</div>
|
||||
<div className="md:col-span-2">
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">LinkedIn (Opsiyonel)</label>
|
||||
<input
|
||||
type="url"
|
||||
value={siteSettings.social.linkedin || ''}
|
||||
onChange={(e) => setSiteSettings({
|
||||
...siteSettings,
|
||||
social: { ...siteSettings.social, linkedin: e.target.value }
|
||||
})}
|
||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
placeholder="https://linkedin.com/..."
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex justify-end pt-4 border-t">
|
||||
<button
|
||||
type="submit"
|
||||
className="px-6 py-3 bg-linear-to-r from-[#004B87] to-[#00B4D8] text-white rounded-lg font-semibold hover:shadow-lg transition-all"
|
||||
>
|
||||
Değişiklikleri Kaydet
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{activeSection !== 'overview' && activeSection !== 'slider' && activeSection !== 'news' && activeSection !== 'media' && activeSection !== 'documents' && activeSection !== 'metro-line' && activeSection !== 'live-stream' && activeSection !== 'cameras' && activeSection !== 'faqs' && activeSection !== 'messages' && activeSection !== 'site-settings' && (
|
||||
<div className="bg-white rounded-xl shadow-sm p-8 text-center">
|
||||
<div className="text-6xl mb-4">
|
||||
{menuItems.find(item => item.id === activeSection)?.icon}
|
||||
@@ -1495,18 +1986,6 @@ export default function Dashboard() {
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">Görsel URL *</label>
|
||||
<input
|
||||
type="url"
|
||||
value={editingSlide.image}
|
||||
onChange={(e) => setEditingSlide({ ...editingSlide, image: e.target.value })}
|
||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
placeholder="https://example.com/image.jpg"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">Buton Metni</label>
|
||||
@@ -1539,7 +2018,7 @@ export default function Dashboard() {
|
||||
className="w-4 h-4 text-[#00B4D8] border-gray-300 rounded focus:ring-[#00B4D8]"
|
||||
/>
|
||||
<label htmlFor="slideActive" className="text-sm font-medium text-gray-700">
|
||||
Slider\'ı aktif yap (Ana sayfada göster)
|
||||
Slider'ı aktif yap (Ana sayfada göster)
|
||||
</label>
|
||||
</div>
|
||||
|
||||
@@ -1640,13 +2119,13 @@ export default function Dashboard() {
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">Kategori *</label>
|
||||
<select
|
||||
value={editingNewsItem.category}
|
||||
onChange={(e) => setEditingNewsItem({ ...editingNewsItem, category: e.target.value })}
|
||||
onChange={(e) => setEditingNewsItem({ ...editingNewsItem, category: e.target.value as 'construction' | 'announcements' | 'events' })}
|
||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
required
|
||||
>
|
||||
<option value="construction">İnşaat</option>
|
||||
<option value="announcement">Duyuru</option>
|
||||
<option value="event">Etkinlik</option>
|
||||
<option value="announcements">Duyuru</option>
|
||||
<option value="events">Etkinlik</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
@@ -1773,13 +2252,13 @@ export default function Dashboard() {
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">Medya URL *</label>
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">{editingMediaItem.type === 'video' ? 'Video URL *' : 'Thumbnail URL *'}</label>
|
||||
<input
|
||||
type="url"
|
||||
value={editingMediaItem.url}
|
||||
onChange={(e) => setEditingMediaItem({ ...editingMediaItem, url: e.target.value })}
|
||||
value={editingMediaItem.type === 'video' ? editingMediaItem.videoUrl || '' : editingMediaItem.thumbnail}
|
||||
onChange={(e) => setEditingMediaItem(editingMediaItem.type === 'video' ? { ...editingMediaItem, videoUrl: e.target.value } : { ...editingMediaItem, thumbnail: e.target.value })}
|
||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
placeholder="https://example.com/video.mp4"
|
||||
placeholder={editingMediaItem.type === 'video' ? "https://www.youtube.com/embed/VIDEO_ID" : "https://example.com/image.jpg"}
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
@@ -1869,14 +2348,14 @@ export default function Dashboard() {
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">Dosya Tipi *</label>
|
||||
<select
|
||||
value={editingDocument.type}
|
||||
onChange={(e) => setEditingDocument({ ...editingDocument, type: e.target.value })}
|
||||
onChange={(e) => setEditingDocument({ ...editingDocument, type: e.target.value as 'PDF' | 'DWG' | 'XLSX' | 'DOCX' })}
|
||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
required
|
||||
>
|
||||
<option value="pdf">PDF</option>
|
||||
<option value="doc">Word</option>
|
||||
<option value="xls">Excel</option>
|
||||
<option value="image">Görsel</option>
|
||||
<option value="PDF">PDF</option>
|
||||
<option value="DOCX">Word</option>
|
||||
<option value="XLSX">Excel</option>
|
||||
<option value="DWG">DWG</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
@@ -1896,14 +2375,15 @@ export default function Dashboard() {
|
||||
<label className="block text-sm font-semibold text-gray-700 mb-2">Kategori *</label>
|
||||
<select
|
||||
value={editingDocument.category}
|
||||
onChange={(e) => setEditingDocument({ ...editingDocument, category: e.target.value })}
|
||||
onChange={(e) => setEditingDocument({ ...editingDocument, category: e.target.value as 'ihale' | 'teknik' | 'cevresel' | 'raporlar' | 'guvenlik' })}
|
||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-[#00B4D8] focus:border-transparent"
|
||||
required
|
||||
>
|
||||
<option value="technical">Teknik</option>
|
||||
<option value="administrative">İdari</option>
|
||||
<option value="legal">Hukuki</option>
|
||||
<option value="financial">Mali</option>
|
||||
<option value="ihale">İhale</option>
|
||||
<option value="teknik">Teknik</option>
|
||||
<option value="cevresel">Çevresel</option>
|
||||
<option value="raporlar">Raporlar</option>
|
||||
<option value="guvenlik">Güvenlik</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user