Activity ve ActivityItem entityleri düzenlendi
This commit is contained in:
parent
1faad17e7c
commit
d77675108e
3 changed files with 59 additions and 78 deletions
|
|
@ -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
|
|
||||||
}
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in a new issue