sozsoft-platform/ui/src/views/branch/BranchSeed.tsx
Sedat Öztürk 429227df1d Initial
2026-02-24 23:44:16 +03:00

141 lines
4.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { useState } from 'react'
import { Badge, Button } from '@/components/ui'
import { Container } from '@/components/shared'
import { Dialog, Notification, toast } from '@/components/ui'
import type { BranchSeedResultDto } from '@/proxy/branch/seed'
import { runBranchSeed } from '@/services/branch.service'
function BranchSeed({
open,
onDialogClose,
id,
name,
}: {
open: boolean
onDialogClose: () => void
id: string
name: string
}) {
const [isLoading, setIsLoading] = useState(false)
const [result, setResult] = useState<BranchSeedResultDto | null>(null)
const handleRunSeed = async () => {
if (!id) return
setIsLoading(true)
try {
const data = await runBranchSeed(id)
setResult(data)
if (data.success) {
toast.push(<Notification title="Seed işlemi başarılı" type="success" />, {
placement: 'top-end',
})
} else {
toast.push(<Notification title="Seed işlemi başarısız" type="danger" />, {
placement: 'top-end',
})
}
} catch (error) {
console.error(error)
setResult({
success: false,
message: 'Seed işlemi sırasında hata oluştu.',
totalInsertedCount: 0,
details: [],
})
toast.push(<Notification title="Seed işlemi sırasında hata oluştu" type="danger" />, {
placement: 'top-end',
})
} finally {
setIsLoading(false)
}
}
return (
<Container>
<Dialog
width="75%"
height="60%"
isOpen={open}
onClose={onDialogClose}
onRequestClose={onDialogClose}
>
<h5 className="mb-4 text-lg font-semibold">Branch Seed - {name}</h5>
<hr className="mb-3" />
<div className="mt-3 space-y-4">
{/* Başlık ve buton aynı satırda */}
<div className="flex items-center justify-between">
<div>
{result &&
(result.success ? (
<span className="text-green-600 font-semibold"> Seed İşlemi Başarılı</span>
) : (
<span className="text-red-600 font-semibold"> Seed İşlemi Başarısız</span>
))}
</div>
<div>
<Button size="xs" variant="solid" onClick={handleRunSeed} loading={isLoading}>
{isLoading ? 'Seed Çalıştırılıyor...' : 'Seed İşlemini Başlat'}
</Button>
</div>
</div>
{/* Sonuç Detayları */}
{result && (
<>
<p className="font-medium text-gray-700">{result.message}</p>
<p className="text-sm text-gray-600">
Toplam eklenen kayıt:{' '}
<span className="font-bold text-blue-600">{result.totalInsertedCount}</span>
</p>
{/* Detay Tablosu */}
{result.details.length > 0 && (
<div className="overflow-x-auto overflow-y-auto border border-gray-200 rounded-md max-h-[50vh]">
<table className="min-w-full text-sm">
<thead className="bg-gray-100 sticky top-0">
<tr>
<th className="border px-3 py-2 text-left">Entity</th>
<th className="border px-3 py-2 text-left">Eklenen</th>
<th className="border px-3 py-2 text-left">Uyarılar</th>
<th className="border px-3 py-2 text-left">Hatalar</th>
</tr>
</thead>
<tbody>
{result.details.map((d) => (
<tr key={d.entityName} className="hover:bg-gray-50">
<td className="border px-3 py-2 font-semibold text-gray-700">
<div className="flex items-center gap-2">
<span>{d.entityName}</span>
<Badge content={d.insertedCount} />
</div>
</td>
{/* Eklenen kolonunu tek satır formatında göster */}
<td className="border px-3 py-2">{d.insertedItems.join(', ')}</td>
<td className="border px-3 py-2 text-yellow-700">
{d.warnings.join(', ')}
</td>
<td className="border px-3 py-2 text-red-700">{d.errors.join(', ')}</td>
</tr>
))}
</tbody>
</table>
</div>
)}
{!result.details.length && (
<p className="text-gray-500 text-sm">Hiç detay bilgisi bulunamadı.</p>
)}
</>
)}
</div>
</Dialog>
</Container>
)
}
export default BranchSeed