32a95d09f0
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / PR Build API Image (push) Has been skipped
CI/CD Pipeline / PR Build Web Image (push) Has been skipped
CI/CD Pipeline / PR Build Worker Image (push) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (push) Successful in 1m49s
CI/CD Pipeline / Validate - Type Check (mypy) (push) Successful in 2m10s
CI/CD Pipeline / Build Production API Image (push) Has been skipped
CI/CD Pipeline / Build Production Web Image (push) Has been skipped
CI/CD Pipeline / Build Production Worker Image (push) Has been skipped
CI/CD Pipeline / Frontend Lint (push) Successful in 2m40s
CI/CD Pipeline / Build Staging Web Image (push) Successful in 2m48s
CI/CD Pipeline / Frontend Unit Tests (push) Successful in 1m17s
CI/CD Pipeline / Validate - Code Quality (push) Successful in 5m1s
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 5m10s
CI/CD Pipeline / Unit Tests (push) Failing after 5m58s
CI/CD Pipeline / Deploy Production (push) Has been skipped
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Integration Tests (push) Successful in 2m33s
CI/CD Pipeline / Build Staging API Image (push) Successful in 17m18s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Has been cancelled
CI/CD Pipeline / Staging E2E Tests (push) Has been cancelled
CI/CD Pipeline / Staging API Integration Tests (push) Has been cancelled
CI/CD Pipeline / ACR Image Cleanup (push) Has been cancelled
CI/CD Pipeline / Canary Release to Production (push) Has been cancelled
71 lines
2.4 KiB
TypeScript
71 lines
2.4 KiB
TypeScript
import React from "react"
|
|
import { Drawer } from "antd"
|
|
import { CheckCircleOutlined, CloseCircleOutlined } from "@ant-design/icons"
|
|
import type { BatchOperationResult } from "@/api/assets"
|
|
|
|
/* ============================================================
|
|
* ResultDrawer — 操作结果抽屉
|
|
* ============================================================ */
|
|
export interface ResultDrawerProps {
|
|
open: boolean
|
|
title: string
|
|
result: BatchOperationResult | null
|
|
onClose: () => void
|
|
}
|
|
|
|
const ResultDrawer: React.FC<ResultDrawerProps> = ({ open, title, result, onClose }) => (
|
|
<Drawer title={`${title} — 操作结果`} open={open} onClose={onClose} width={420}>
|
|
{result && (
|
|
<div className="xx-batch-result">
|
|
<div className="xx-batch-result-summary">
|
|
<div className="xx-batch-result-stat">
|
|
<span className="xx-batch-result-total">总计 {result.total} 个</span>
|
|
</div>
|
|
<div className="xx-batch-result-stat success">
|
|
<CheckCircleOutlined />
|
|
<span>成功 {result.success_count} 个</span>
|
|
</div>
|
|
{result.failure_count > 0 && (
|
|
<div className="xx-batch-result-stat fail">
|
|
<CloseCircleOutlined />
|
|
<span>失败 {result.failure_count} 个</span>
|
|
</div>
|
|
)}
|
|
</div>
|
|
|
|
{(result?.succeeded?.length ?? 0) > 0 && (
|
|
<div className="xx-batch-result-section">
|
|
<h4 className="xx-batch-result-section-title success">
|
|
<CheckCircleOutlined /> 成功列表
|
|
</h4>
|
|
<div className="xx-batch-result-ids">
|
|
{result?.succeeded?.map((id) => (
|
|
<div key={id} className="xx-batch-result-id">
|
|
{id}
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
)}
|
|
|
|
{(result?.failed?.length ?? 0) > 0 && (
|
|
<div className="xx-batch-result-section">
|
|
<h4 className="xx-batch-result-section-title fail">
|
|
<CloseCircleOutlined /> 失败列表
|
|
</h4>
|
|
<div className="xx-batch-result-ids">
|
|
{result?.failed?.map((id) => (
|
|
<div key={id} className="xx-batch-result-id fail">
|
|
{id}
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
)}
|
|
</div>
|
|
)}
|
|
</Drawer>
|
|
)
|
|
|
|
export default ResultDrawer
|