Activity ve ActivityItem entityleri düzenlendi

This commit is contained in:
Sedat ÖZTÜRK 2025-10-13 15:52:26 +03:00
parent 1faad17e7c
commit d77675108e
3 changed files with 59 additions and 78 deletions

View file

@ -1,4 +1,4 @@
export interface ActivityItem { export interface Activity {
id: string id: string
type: 'note' | 'message' type: 'note' | 'message'
subject: string subject: string
@ -6,13 +6,16 @@ export interface ActivityItem {
recipientUserName?: string recipientUserName?: string
creatorId: string creatorId: string
creationTime: Date creationTime: Date
data?: NoteData | MessageData data?: ActivityItem
} }
export interface NoteData { export interface ActivityItem {
id?: string id?: string
type: 'note' | 'message'
entityName: string entityName: string
entityId: string entityId: string
recipientUserId?: string
recipientUserName?: string
subject: string subject: string
content: string content: string
creatorId?: string creatorId?: string
@ -31,16 +34,3 @@ export interface FileData {
creatorId?: string creatorId?: string
creationTime?: Date creationTime?: Date
} }
export interface MessageData {
id?: string
entityName: string
entityId: string
recipientUserId: string
recipientUserName: string
subject: string
content: string
creatorId?: string
creationTime?: Date
isRead?: boolean
}

View file

@ -9,10 +9,10 @@ import {
FaClock, FaClock,
} from 'react-icons/fa' } from 'react-icons/fa'
import { Button } from '@/components/ui' import { Button } from '@/components/ui'
import { ActivityItem } from '@/proxy/formActivity/models' import { Activity } from '@/proxy/formActivity/models'
interface ActivityListProps { interface ActivityListProps {
activities: ActivityItem[] activities: Activity[]
onDeleteNote?: (noteId: string) => void onDeleteNote?: (noteId: string) => void
onDeleteFile?: (fileId: string) => void onDeleteFile?: (fileId: string) => void
onDeleteMessage?: (messageId: string) => void onDeleteMessage?: (messageId: string) => void
@ -47,7 +47,7 @@ export const ActivityList: React.FC<ActivityListProps> = ({
} }
} }
const handleDelete = (activity: ActivityItem) => { const handleDelete = (activity: Activity) => {
switch (activity.type) { switch (activity.type) {
case 'note': case 'note':
onDeleteNote?.(activity.id) onDeleteNote?.(activity.id)
@ -106,8 +106,6 @@ export const ActivityList: React.FC<ActivityListProps> = ({
{/* Note tipinde dosyaları göster */} {/* Note tipinde dosyaları göster */}
{activity.type === 'note' && activity.data && (activity.data as any).attachedFiles?.length > 0 && ( {activity.type === 'note' && activity.data && (activity.data as any).attachedFiles?.length > 0 && (
<div className="mt-2 mb-2"> <div className="mt-2 mb-2">
<p className="text-xs font-medium text-gray-600 mb-1">Ekli Dosyalar:</p>
<div className="space-y-1">
{((activity.data as any).attachedFiles || []).map((file: any, index: number) => ( {((activity.data as any).attachedFiles || []).map((file: any, index: number) => (
<div key={index} className="flex items-center justify-between p-2 bg-gray-50 rounded border"> <div key={index} className="flex items-center justify-between p-2 bg-gray-50 rounded border">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
@ -127,7 +125,6 @@ export const ActivityList: React.FC<ActivityListProps> = ({
</div> </div>
))} ))}
</div> </div>
</div>
)} )}
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">

View file

@ -1,13 +1,12 @@
import { NoteData, FileData, MessageData, ActivityItem } from '@/proxy/formActivity/models' import { ActivityItem, FileData, Activity } from '@/proxy/formActivity/models'
import { useState, useEffect } from 'react' import { useState, useEffect } from 'react'
const STORAGE_PREFIX = 'form_activity_' const STORAGE_PREFIX = 'form_activity_'
export const useFormActivity = (entityName: string, entityId: string) => { export const useFormActivity = (entityName: string, entityId: string) => {
const [notes, setNotes] = useState<NoteData[]>([]) const [activityItems, setActivityItems] = useState<ActivityItem[]>([])
const [files, setFiles] = useState<FileData[]>([]) const [files, setFiles] = useState<FileData[]>([])
const [messages, setMessages] = useState<MessageData[]>([]) const [activities, setActivities] = useState<Activity[]>([])
const [activities, setActivities] = useState<ActivityItem[]>([])
const storageKey = `${STORAGE_PREFIX}${entityName}_${entityId}` const storageKey = `${STORAGE_PREFIX}${entityName}_${entityId}`
@ -19,9 +18,15 @@ export const useFormActivity = (entityName: string, entityId: string) => {
if (savedData) { if (savedData) {
try { try {
const parsed = JSON.parse(savedData) const parsed = JSON.parse(savedData)
setNotes(parsed.notes || []) // Eski veriyi yeni yapıya dönüştür
const oldNotes = parsed.notes || []
const oldMessages = parsed.messages || []
const combinedActivityItems: ActivityItem[] = [
...oldNotes.map((note: any) => ({ ...note, type: 'note' as const })),
...oldMessages.map((message: any) => ({ ...message, type: 'message' as const }))
]
setActivityItems(parsed.activityItems || combinedActivityItems || [])
setFiles(parsed.files || []) setFiles(parsed.files || [])
setMessages(parsed.messages || [])
} catch (error) { } catch (error) {
console.error('Failed to load activity data:', error) console.error('Failed to load activity data:', error)
} }
@ -30,55 +35,42 @@ export const useFormActivity = (entityName: string, entityId: string) => {
// Update activities when data changes // Update activities when data changes
useEffect(() => { useEffect(() => {
const allActivities: ActivityItem[] = [] const allActivities: Activity[] = []
// Add notes as activities (notes can contain files now) // Convert all activity items to activities
notes.forEach(note => { activityItems.forEach(item => {
allActivities.push({ allActivities.push({
id: note.id || `note_${Date.now()}`, id: item.id || `${item.type}_${Date.now()}`,
type: 'note', type: item.type,
subject: note.subject || '', subject: item.subject || '',
content: note.content, content: item.content,
creationTime: note.creationTime || new Date(), recipientUserName: item.recipientUserName,
creatorId: note.creatorId || 'Bilinmeyen', creationTime: item.creationTime || new Date(),
data: note creatorId: item.creatorId || 'Bilinmeyen',
}) data: item
})
// Add messages as activities
messages.forEach(message => {
allActivities.push({
id: message.id || `message_${Date.now()}`,
type: 'message',
subject: message.subject || '',
recipientUserName: message.recipientUserName,
content: message.content,
creationTime: message.creationTime || new Date(),
creatorId: message.creatorId || 'Bilinmeyen',
data: message
}) })
}) })
// Sort by timestamp (newest first) // Sort by timestamp (newest first)
allActivities.sort((a, b) => new Date(b.creationTime).getTime() - new Date(a.creationTime).getTime()) allActivities.sort((a, b) => new Date(b.creationTime).getTime() - new Date(a.creationTime).getTime())
setActivities(allActivities) setActivities(allActivities)
}, [notes, files, messages]) }, [activityItems, files])
// Save to localStorage whenever data changes // Save to localStorage whenever data changes
useEffect(() => { useEffect(() => {
if (!entityName || !entityId) return if (!entityName || !entityId) return
const dataToSave = { const dataToSave = {
notes, activityItems,
files, files
messages
} }
localStorage.setItem(storageKey, JSON.stringify(dataToSave)) localStorage.setItem(storageKey, JSON.stringify(dataToSave))
}, [notes, files, messages, storageKey]) }, [activityItems, files, storageKey])
const addNote = (subject: string, content: string) => { const addNote = (subject: string, content: string) => {
const newNote: NoteData = { const newActivityItem: ActivityItem = {
id: `note_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`, id: `note_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
type: 'note',
entityName, entityName,
entityId, entityId,
subject, subject,
@ -86,8 +78,8 @@ export const useFormActivity = (entityName: string, entityId: string) => {
creatorId: 'Mevcut Kullanıcı', // Bu gerçek implementasyonda authentication'dan gelecek creatorId: 'Mevcut Kullanıcı', // Bu gerçek implementasyonda authentication'dan gelecek
creationTime: new Date() creationTime: new Date()
} }
setNotes(prev => [...prev, newNote]) setActivityItems(prev => [...prev, newActivityItem])
return newNote return newActivityItem
} }
const addContent = async (subject: string, content: string, files: File[]) => { const addContent = async (subject: string, content: string, files: File[]) => {
@ -95,8 +87,9 @@ export const useFormActivity = (entityName: string, entityId: string) => {
const baseId = `content_${timestamp.getTime()}_${Math.random().toString(36).substr(2, 9)}` const baseId = `content_${timestamp.getTime()}_${Math.random().toString(36).substr(2, 9)}`
// Hem not hem de dosya varsa veya sadece biri varsa tek bir note aktivitesi oluştur // Hem not hem de dosya varsa veya sadece biri varsa tek bir note aktivitesi oluştur
const newNote: NoteData = { const newActivityItem: ActivityItem = {
id: baseId, id: baseId,
type: 'note',
entityName, entityName,
entityId, entityId,
subject, subject,
@ -136,17 +129,17 @@ export const useFormActivity = (entityName: string, entityId: string) => {
} }
// Note'a dosyaları ekle // Note'a dosyaları ekle
newNote.attachedFiles = uploadedFiles newActivityItem.attachedFiles = uploadedFiles
// Note'u kaydet // Activity Item'ı kaydet
setNotes(prev => [...prev, newNote]) setActivityItems(prev => [...prev, newActivityItem])
// Dosyaları ayrı ayrı da kaydet (eski sistem uyumluluğu için) // Dosyaları ayrı ayrı da kaydet (eski sistem uyumluluğu için)
if (uploadedFiles.length > 0) { if (uploadedFiles.length > 0) {
setFiles(prev => [...prev, ...uploadedFiles]) setFiles(prev => [...prev, ...uploadedFiles])
} }
return newNote return newActivityItem
} }
const addFile = (file: File) => { const addFile = (file: File) => {
@ -174,35 +167,36 @@ export const useFormActivity = (entityName: string, entityId: string) => {
} }
const sendMessage = (recipients: Array<{ value: string, label: string, email?: string }>, subject: string, content: string) => { const sendMessage = (recipients: Array<{ value: string, label: string, email?: string }>, subject: string, content: string) => {
const newMessages: MessageData[] = recipients.map(recipient => ({ const newMessageItems: ActivityItem[] = recipients.map(recipient => ({
id: `message_${Date.now()}_${Math.random().toString(36).substr(2, 9)}_${recipient.value}`, id: `message_${Date.now()}_${Math.random().toString(36).substr(2, 9)}_${recipient.value}`,
type: 'message' as const,
entityName, entityName,
entityId, entityId,
recipientUserId: recipient.value, recipientUserId: recipient.value,
recipientUserName: recipient.label, recipientUserName: recipient.label,
subject, subject,
content, content,
sentBy: 'Mevcut Kullanıcı', creatorId: 'Mevcut Kullanıcı',
sentAt: new Date(), creationTime: new Date()
isRead: false
})) }))
setMessages(prev => [...prev, ...newMessages]) setActivityItems(prev => [...prev, ...newMessageItems])
return newMessages return newMessageItems
} }
const deleteNote = (noteId: string) => { const deleteActivityItem = (itemId: string) => {
setNotes(prev => prev.filter(note => note.id !== noteId)) setActivityItems(prev => prev.filter(item => item.id !== itemId))
} }
const deleteFile = (fileId: string) => { const deleteFile = (fileId: string) => {
setFiles(prev => prev.filter(file => file.id !== fileId)) setFiles(prev => prev.filter(file => file.id !== fileId))
} }
const deleteMessage = (messageId: string) => { // Geriye dönük uyumluluk için
setMessages(prev => prev.filter(message => message.id !== messageId)) const notes = activityItems.filter(item => item.type === 'note')
} const messages = activityItems.filter(item => item.type === 'message')
return { return {
activityItems,
notes, notes,
files, files,
messages, messages,
@ -211,8 +205,8 @@ export const useFormActivity = (entityName: string, entityId: string) => {
addFile, addFile,
addContent, addContent,
sendMessage, sendMessage,
deleteNote, deleteNote: deleteActivityItem, // Not silme için
deleteFile, deleteFile,
deleteMessage deleteMessage: deleteActivityItem // Mesaj silme için
} }
} }