diff --git a/ui/src/services/videoroom/signalr.tsx b/ui/src/services/videoroom/signalr.tsx index e3acd05..2b7b8e9 100644 --- a/ui/src/services/videoroom/signalr.tsx +++ b/ui/src/services/videoroom/signalr.tsx @@ -227,6 +227,9 @@ export class SignalRService { title="⚠️ Bağlantı yok. Sınıfa katılmadan önce bağlantıyı kontrol edin." type="warning" />, + { + placement: 'bottom-end', + }, ) return } diff --git a/ui/src/services/videoroom/webrtc.tsx b/ui/src/services/videoroom/webrtc.tsx index 744825b..34a0566 100644 --- a/ui/src/services/videoroom/webrtc.tsx +++ b/ui/src/services/videoroom/webrtc.tsx @@ -96,6 +96,7 @@ export class WebRTCService { title={`⚠️ Bağlantı başarısız, yeniden deneniyor (${retries + 1}/${this.maxRetries})`} type="warning" />, + { placement: 'bottom-end' }, ) this.retryCounts.set(userId, retries + 1) await this.restartIce(peerConnection, userId) @@ -122,6 +123,7 @@ export class WebRTCService { title={`⚠️ ICE candidate eklenemedi. Kullanıcı: ${userId}`} type="warning" />, + { placement: 'bottom-end' }, ) } } @@ -201,6 +203,7 @@ export class WebRTCService { title={`⚠️ ICE candidate eklenemedi. Kullanıcı: ${userId}`} type="warning" />, + { placement: 'bottom-end' }, ) } } else { diff --git a/ui/src/views/admin/files/FileManager.tsx b/ui/src/views/admin/files/FileManager.tsx index 4648c43..2924257 100644 --- a/ui/src/views/admin/files/FileManager.tsx +++ b/ui/src/views/admin/files/FileManager.tsx @@ -139,7 +139,9 @@ const FileManager = () => { setItems(items) } catch (error) { console.error('Failed to fetch items:', error) - toast.push(Failed to load files and folders) + toast.push(Failed to load files and folders, { + placement: 'bottom-end', + }) } finally { setLoading(false) } @@ -288,10 +290,14 @@ const FileManager = () => { await fileManagementService.uploadFileDirectly(formData, selectedTenant?.id) } await fetchItems(currentFolderId) - toast.push(Files uploaded successfully) + toast.push(Files uploaded successfully, { + placement: 'bottom-end', + }) } catch (error) { console.error('Upload failed:', error) - toast.push(Failed to upload files) + toast.push(Failed to upload files, { + placement: 'bottom-end', + }) throw error } finally { setUploading(false) @@ -309,10 +315,14 @@ const FileManager = () => { selectedTenant?.id, ) await fetchItems(currentFolderId) - toast.push(Folder created successfully) + toast.push(Folder created successfully, { + placement: 'bottom-end', + }) } catch (error) { console.error('Create folder failed:', error) - toast.push(Failed to create folder) + toast.push(Failed to create folder, { + placement: 'bottom-end', + }) throw error } finally { setCreating(false) @@ -332,10 +342,14 @@ const FileManager = () => { selectedTenant?.id, ) await fetchItems(currentFolderId) - toast.push(Item renamed successfully) + toast.push(Item renamed successfully, { + placement: 'bottom-end', + }) } catch (error) { console.error('Rename failed:', error) - toast.push(Failed to rename item) + toast.push(Failed to rename item, { + placement: 'bottom-end', + }) throw error } finally { setRenaming(false) @@ -357,10 +371,14 @@ const FileManager = () => { await fetchItems(currentFolderId) setSelectedItems([]) - toast.push(Items deleted successfully) + toast.push(Items deleted successfully, { + placement: 'bottom-end', + }) } catch (error) { console.error('Delete failed:', error) - toast.push(Failed to delete items) + toast.push(Failed to delete items, { + placement: 'bottom-end', + }) throw error } finally { setDeleting(false) @@ -399,6 +417,7 @@ const FileManager = () => { Protected system folders cannot be deleted. , + { placement: 'bottom-end' }, ) return } @@ -411,6 +430,7 @@ const FileManager = () => { Folder {item.name} contains files and cannot be deleted for security reasons. , + { placement: 'bottom-end' }, ) return } @@ -550,6 +570,7 @@ const FileManager = () => { {protectedItems.length} protected system folder(s) cannot be deleted:{' '} {protectedItems.map((i) => i.name).join(', ')} , + { placement: 'bottom-end' }, ) } @@ -559,6 +580,7 @@ const FileManager = () => { {foldersWithFiles.length} folder(s) containing files cannot be deleted for security reasons: {foldersWithFiles.join(', ')} , + { placement: 'bottom-end' }, ) } @@ -573,6 +595,7 @@ const FileManager = () => { No items can be deleted. Selected items are either protected or folders containing files. , + { placement: 'bottom-end' }, ) } } @@ -588,6 +611,7 @@ const FileManager = () => { {protectedItems.length} protected system folder(s) cannot be copied:{' '} {protectedItems.map((i) => i.name).join(', ')} , + { placement: 'bottom-end' }, ) } @@ -606,6 +630,7 @@ const FileManager = () => { {copyableItems.length} item(s) copied to clipboard , + { placement: 'bottom-end' }, ) } } @@ -621,6 +646,7 @@ const FileManager = () => { {protectedItems.length} protected system folder(s) cannot be moved:{' '} {protectedItems.map((i) => i.name).join(', ')} , + { placement: 'bottom-end' }, ) } @@ -639,6 +665,7 @@ const FileManager = () => { {cuttableItems.length} item(s) cut to clipboard , + { placement: 'bottom-end' }, ) } } @@ -650,6 +677,7 @@ const FileManager = () => { No items in clipboard , + { placement: 'bottom-end' }, ) return } @@ -667,6 +695,7 @@ const FileManager = () => { {itemIds.length} item(s) copied successfully , + { placement: 'bottom-end' }, ) } catch (error) { console.error('Copy failed:', error) @@ -674,6 +703,7 @@ const FileManager = () => { Failed to copy items , + { placement: 'bottom-end' }, ) } finally { setLoading(false) @@ -685,6 +715,7 @@ const FileManager = () => { Cannot move items to the same folder , + { placement: 'bottom-end' }, ) return } @@ -700,6 +731,7 @@ const FileManager = () => { {itemIds.length} item(s) moved successfully , + { placement: 'bottom-end' }, ) } catch (error) { console.error('Move failed:', error) @@ -707,6 +739,7 @@ const FileManager = () => { Failed to move items , + { placement: 'bottom-end' }, ) } finally { setLoading(false) @@ -717,6 +750,7 @@ const FileManager = () => { Invalid clipboard data , + { placement: 'bottom-end' }, ) } } @@ -812,6 +846,7 @@ const FileManager = () => { Protected system folders cannot be renamed , + { placement: 'bottom-end' }, ) } } @@ -841,6 +876,7 @@ const FileManager = () => { Only files can be downloaded , + { placement: 'bottom-end' }, ) } } @@ -856,7 +892,8 @@ const FileManager = () => { title={translate('::FileManager.DeleteSelectedItems')} onClick={deleteSelectedItems} > - {translate('::Delete')} {selectedItems.length > 0 && `(${selectedItems.length})`} + {translate('::Delete')}{' '} + {selectedItems.length > 0 && `(${selectedItems.length})`} {/* Selection Actions */} @@ -1044,10 +1081,18 @@ const FileManager = () => { {/* List View Header */} {viewMode === 'list' && (
-
{translate('::App.Listform.ListformField.Name')}
-
{translate('::App.Listform.ListformField.Type')}
-
{translate('::App.Listform.ListformField.Size')}
-
{translate('::App.Listform.ListformField.Modified')}
+
+ {translate('::App.Listform.ListformField.Name')} +
+
+ {translate('::App.Listform.ListformField.Type')} +
+
+ {translate('::App.Listform.ListformField.Size')} +
+
+ {translate('::App.Listform.ListformField.Modified')} +
{/* Actions column */}
)} @@ -1100,6 +1145,7 @@ const FileManager = () => { Item ready to move. Navigate to target folder and paste. , + { placement: 'bottom-end' }, ) } }} @@ -1115,6 +1161,7 @@ const FileManager = () => { Image preview feature will be added soon. , + { placement: 'bottom-end' }, ) } else { // Diğer dosya tipleri için download diff --git a/ui/src/views/admin/files/components/FileItem.tsx b/ui/src/views/admin/files/components/FileItem.tsx index 2764f9d..b1e0d26 100644 --- a/ui/src/views/admin/files/components/FileItem.tsx +++ b/ui/src/views/admin/files/components/FileItem.tsx @@ -107,11 +107,15 @@ const getFileTypeLabel = (item: FileItemType, translate: (key: string) => string if (mimeType?.startsWith('audio/')) return translate('::FileManager.Sound') // 'Ses' if (mimeType?.includes('pdf')) return translate('::FileManager.PDF') // 'PDF' if (mimeType?.includes('word')) return translate('::FileManager.Word') // 'Word' - if (mimeType?.includes('excel') || mimeType?.includes('spreadsheet')) return translate('::FileManager.Excel') // 'Excel' - if (mimeType?.includes('powerpoint') || mimeType?.includes('presentation')) return translate('::FileManager.PowerPoint') // 'PowerPoint' - if (['zip', 'rar', '7z', 'tar', 'gz'].includes(extension || '')) return translate('::FileManager.Archive') // 'Arşiv' + if (mimeType?.includes('excel') || mimeType?.includes('spreadsheet')) + return translate('::FileManager.Excel') // 'Excel' + if (mimeType?.includes('powerpoint') || mimeType?.includes('presentation')) + return translate('::FileManager.PowerPoint') // 'PowerPoint' + if (['zip', 'rar', '7z', 'tar', 'gz'].includes(extension || '')) + return translate('::FileManager.Archive') // 'Arşiv' if (['txt', 'md'].includes(extension || '')) return translate('::FileManager.Text') // 'Metin' - if (['json', 'xml', 'css', 'js', 'ts', 'html'].includes(extension || '')) return translate('::FileManager.Code') // 'Kod' + if (['json', 'xml', 'css', 'js', 'ts', 'html'].includes(extension || '')) + return translate('::FileManager.Code') // 'Kod' return extension?.toUpperCase() || translate('::FileManager.File') } @@ -134,7 +138,9 @@ const FileItem = forwardRef((props, ref) => { } = props const [dropdownOpen, setDropdownOpen] = useState(false) - const [contextMenuPosition, setContextMenuPosition] = useState<{ x: number; y: number } | null>(null) + const [contextMenuPosition, setContextMenuPosition] = useState<{ x: number; y: number } | null>( + null, + ) const { translate } = useLocalization() const handleClick = () => { onSelect?.(item) @@ -147,7 +153,7 @@ const FileItem = forwardRef((props, ref) => { const handleContextMenu = (e: MouseEvent) => { e.preventDefault() e.stopPropagation() - + // Only show context menu if there are actions available if (actionMenuItems.length > 0) { setContextMenuPosition({ x: e.clientX, y: e.clientY }) @@ -217,6 +223,7 @@ const FileItem = forwardRef((props, ref) => { Dosya URL'si panoya kopyalandı , + { placement: 'bottom-end' }, ) }, () => { @@ -224,6 +231,7 @@ const FileItem = forwardRef((props, ref) => { URL kopyalanamadı , + { placement: 'bottom-end' }, ) }, ) @@ -279,12 +287,16 @@ const FileItem = forwardRef((props, ref) => { ] const dropdownList = ( -
{actionMenuItems.map((menuItem) => (
((props, ref) => { onDoubleClick={handleDoubleClick} onContextMenu={handleContextMenu} > - {/* File Name */} -
- {/* Checkbox */} - {!item.isReadOnly ? ( - - ) : ( -
// Boş alan bırak - )} - - {/* File Icon or Preview */} -
- {item.type === 'file' && item.mimeType?.startsWith('image/') ? ( - + {/* Checkbox */} + {!item.isReadOnly ? ( + ) : ( -
- {getFileIcon(item, false)} -
+
// Boş alan bırak + )} + + {/* File Icon or Preview */} +
+ {item.type === 'file' && item.mimeType?.startsWith('image/') ? ( + + ) : ( +
+ {getFileIcon(item, false)} +
+ )} +
+ +

+ {item.name} +

+ {item.isReadOnly && ( + + Protected + ! + )}
-

- {item.name} -

- {item.isReadOnly && ( - - Protected - ! - - )} -
- - {/* File Type - Hidden on mobile */} -
- {getFileTypeLabel(item, translate)} -
- - {/* File Size / Folder Item Count */} -
- {item.type === 'file' && item.size ? ( + {/* File Type - Hidden on mobile */} +
- {formatFileSize(item.size)} + {getFileTypeLabel(item, translate)} - ) : item.type === 'folder' && typeof item.childCount === 'number' ? ( +
+ + {/* File Size / Folder Item Count */} +
+ {item.type === 'file' && item.size ? ( + + {formatFileSize(item.size)} + + ) : item.type === 'folder' && typeof item.childCount === 'number' ? ( + + {item.childCount} öğe + + ) : ( + - + )} +
+ + {/* Modified Date - Hidden on mobile */} +
- {item.childCount} öğe + {formatDate(item.modifiedAt)} - ) : ( - - - )} +
+ + {/* Action Menu - Removed */} +
- {/* Modified Date - Hidden on mobile */} -
- - {formatDate(item.modifiedAt)} - -
- - {/* Action Menu - Removed */} -
-
-
- - {/* Context Menu */} - {dropdownOpen && contextMenuPosition && dropdownList} + {/* Context Menu */} + {dropdownOpen && contextMenuPosition && dropdownList} ) } @@ -457,69 +467,68 @@ const FileItem = forwardRef((props, ref) => { onDoubleClick={handleDoubleClick} onContextMenu={handleContextMenu} > - {/* Checkbox */} - {!item.isReadOnly && ( -
- -
- )} - - - - {/* File/Folder Icon or Preview */} -
- {item.type === 'file' && item.mimeType?.startsWith('image/') ? ( -
- +
- ) : ( -
{getFileIcon(item, true)}
)} -
- {/* File/Folder Name and Details */} -
-
-

- {item.name} -

+ {/* File/Folder Icon or Preview */} +
+ {item.type === 'file' && item.mimeType?.startsWith('image/') ? ( +
+ +
+ ) : ( +
{getFileIcon(item, true)}
+ )}
- {/* File Size and Type */} - {item.type === 'file' && ( -
-

{getFileTypeLabel(item, translate)}

- {item.size && ( -

- {formatFileSize(item.size)} -

- )} + {/* File/Folder Name and Details */} +
+
+

+ {item.name} +

- )} - {/* Folder Child Count */} - {item.type === 'folder' && ( -

- {typeof item.childCount === 'number' ? `${item.childCount} ${translate('::App.Listform.ListformField.Item')}` : translate('::FileManager.Counting')} -

- )} + {/* File Size and Type */} + {item.type === 'file' && ( +
+

+ {getFileTypeLabel(item, translate)} +

+ {item.size && ( +

+ {formatFileSize(item.size)} +

+ )} +
+ )} + + {/* Folder Child Count */} + {item.type === 'folder' && ( +

+ {typeof item.childCount === 'number' + ? `${item.childCount} ${translate('::App.Listform.ListformField.Item')}` + : translate('::FileManager.Counting')} +

+ )} +
-
- - {/* Context Menu */} - {dropdownOpen && contextMenuPosition && dropdownList} + + {/* Context Menu */} + {dropdownOpen && contextMenuPosition && dropdownList} ) }) diff --git a/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogEditForm.tsx b/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogEditForm.tsx index ec1cac5..5c2b7cb 100644 --- a/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogEditForm.tsx +++ b/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogEditForm.tsx @@ -894,7 +894,7 @@ function JsonRowOpDialogEditForm({