增加团队管理页面

This commit is contained in:
dengqichen 2025-10-29 13:31:55 +08:00
parent 4a4da47253
commit 01e702dfa2
17 changed files with 246 additions and 243 deletions

View File

@ -163,15 +163,15 @@ const EnvironmentList: React.FC = () => {
</CardHeader>
<CardContent>
<div className="rounded-md border">
<Table>
<Table minWidth="950px">
<TableHeader>
<TableRow>
<TableHead className="w-[120px]"></TableHead>
<TableHead className="w-[150px]"></TableHead>
<TableHead className="w-[300px]"></TableHead>
<TableHead className="w-[80px]"></TableHead>
<TableHead className="w-[100px]"></TableHead>
<TableHead className="w-[200px]"></TableHead>
<TableHead width="120px"></TableHead>
<TableHead width="150px"></TableHead>
<TableHead width="300px"></TableHead>
<TableHead width="80px"></TableHead>
<TableHead width="100px"></TableHead>
<TableHead width="200px" sticky></TableHead>
</TableRow>
</TableHeader>
<TableBody>
@ -185,16 +185,16 @@ const EnvironmentList: React.FC = () => {
list.map((item) => {
return (
<TableRow key={item.id}>
<TableCell className="font-medium">{item.envCode}</TableCell>
<TableCell>{item.envName}</TableCell>
<TableCell className="text-muted-foreground">{item.envDesc || '-'}</TableCell>
<TableCell>{item.sort}</TableCell>
<TableCell>
<TableCell width="120px" className="font-medium">{item.envCode}</TableCell>
<TableCell width="150px">{item.envName}</TableCell>
<TableCell width="300px" className="text-muted-foreground">{item.envDesc || '-'}</TableCell>
<TableCell width="80px">{item.sort}</TableCell>
<TableCell width="100px">
<Badge variant={item.enabled ? "default" : "secondary"} className="inline-flex">
{item.enabled ? '启用' : '禁用'}
</Badge>
</TableCell>
<TableCell>
<TableCell width="200px" sticky>
<div className="flex items-center gap-2">
<Button
variant="ghost"

View File

@ -229,16 +229,16 @@ const ExternalPage: React.FC = () => {
</CardHeader>
<CardContent>
<div className="rounded-md border">
<Table>
<Table minWidth="1120px">
<TableHeader>
<TableRow>
<TableHead className="w-[150px]"></TableHead>
<TableHead className="w-[100px]"></TableHead>
<TableHead className="w-[250px]"></TableHead>
<TableHead className="w-[120px]"></TableHead>
<TableHead className="w-[150px]"></TableHead>
<TableHead className="w-[100px]"></TableHead>
<TableHead className="w-[250px]"></TableHead>
<TableHead width="150px"></TableHead>
<TableHead width="100px"></TableHead>
<TableHead width="250px"></TableHead>
<TableHead width="120px"></TableHead>
<TableHead width="150px"></TableHead>
<TableHead width="100px"></TableHead>
<TableHead width="250px" sticky></TableHead>
</TableRow>
</TableHeader>
<TableBody>
@ -251,13 +251,13 @@ const ExternalPage: React.FC = () => {
) : (
list.map((item) => (
<TableRow key={item.id}>
<TableCell className="font-medium">{item.name}</TableCell>
<TableCell>
<TableCell width="150px" className="font-medium">{item.name}</TableCell>
<TableCell width="100px">
<Badge variant={getSystemTypeLabel(item.type).variant}>
{getSystemTypeLabel(item.type).label}
</Badge>
</TableCell>
<TableCell>
<TableCell width="250px">
<a
href={item.url}
target="_blank"
@ -268,17 +268,17 @@ const ExternalPage: React.FC = () => {
{item.url}
</a>
</TableCell>
<TableCell>{getAuthTypeLabel(item.authType)}</TableCell>
<TableCell className="text-muted-foreground">
<TableCell width="120px">{getAuthTypeLabel(item.authType)}</TableCell>
<TableCell width="150px" className="text-muted-foreground">
{item.lastConnectTime || '-'}
</TableCell>
<TableCell>
<TableCell width="100px">
<Switch
checked={item.enabled}
onCheckedChange={(checked) => handleStatusChange(item.id, checked)}
/>
</TableCell>
<TableCell>
<TableCell width="250px" sticky>
<div className="flex items-center gap-2">
<Button
variant="ghost"

View File

@ -463,20 +463,20 @@ const GitManager: React.FC = () => {
<p className="text-sm"> Git </p>
</div>
) : (
<Table>
<Table minWidth="900px">
<TableHeader>
<TableRow>
<TableHead className="w-[200px]"></TableHead>
<TableHead className="w-[200px]"></TableHead>
<TableHead className="w-[100px]"></TableHead>
<TableHead></TableHead>
<TableHead className="w-[200px]"></TableHead>
<TableHead width="200px"></TableHead>
<TableHead width="200px"></TableHead>
<TableHead width="100px"></TableHead>
<TableHead width="200px"></TableHead>
<TableHead width="200px" sticky></TableHead>
</TableRow>
</TableHeader>
<TableBody>
{filteredGroups.map((group) => (
<TableRow key={group.id}>
<TableCell className="font-medium">
<TableCell width="200px" className="font-medium">
<Button
variant="link"
className="p-0 h-auto font-medium text-base hover:underline"
@ -485,7 +485,7 @@ const GitManager: React.FC = () => {
{group.name}
</Button>
</TableCell>
<TableCell>
<TableCell width="200px">
<div className="flex items-center gap-2">
<code className="text-xs bg-muted px-2 py-1 rounded">
{group.path}
@ -499,13 +499,13 @@ const GitManager: React.FC = () => {
</Button>
</div>
</TableCell>
<TableCell>
<TableCell width="100px">
{renderVisibilityBadge(group.visibility)}
</TableCell>
<TableCell className="max-w-xs truncate" title={group.description}>
<TableCell width="200px" className="max-w-[200px] truncate" title={group.description}>
{group.description || '-'}
</TableCell>
<TableCell>
<TableCell width="200px" sticky>
<div className="flex items-center gap-2">
<Button variant="ghost" size="sm" onClick={handleSyncProjects}>
<RefreshCw className="mr-1 h-3 w-3" />
@ -598,22 +598,22 @@ const GitManager: React.FC = () => {
<p className="text-sm"> Git </p>
</div>
) : (
<Table>
<Table minWidth="990px">
<TableHeader>
<TableRow>
<TableHead className="w-[200px]"></TableHead>
<TableHead className="w-[200px]"></TableHead>
<TableHead className="w-[100px]"></TableHead>
<TableHead className="w-[120px]"></TableHead>
<TableHead></TableHead>
<TableHead className="w-[220px]"></TableHead>
<TableHead width="200px"></TableHead>
<TableHead width="200px"></TableHead>
<TableHead width="100px"></TableHead>
<TableHead width="120px"></TableHead>
<TableHead width="150px"></TableHead>
<TableHead width="220px" sticky></TableHead>
</TableRow>
</TableHeader>
<TableBody>
{filteredProjects.map((project) => (
<TableRow key={project.id}>
<TableCell className="font-medium">{project.name}</TableCell>
<TableCell>
<TableCell width="200px" className="font-medium">{project.name}</TableCell>
<TableCell width="200px">
<div className="flex items-center gap-2">
<code className="text-xs bg-muted px-2 py-1 rounded">
{project.path}
@ -627,19 +627,19 @@ const GitManager: React.FC = () => {
</Button>
</div>
</TableCell>
<TableCell>
<TableCell width="100px">
{renderVisibilityBadge(project.visibility)}
</TableCell>
<TableCell>
<TableCell width="120px">
<Badge variant="outline" className="inline-flex items-center gap-1">
<GitBranch className="h-3 w-3" />
{project.isDefaultBranch}
</Badge>
</TableCell>
<TableCell className="text-sm text-muted-foreground">
<TableCell width="150px" className="text-sm text-muted-foreground">
{formatTime(project.lastActivityAt)}
</TableCell>
<TableCell>
<TableCell width="220px" sticky>
<div className="flex items-center gap-2">
<Button variant="ghost" size="sm" onClick={handleSyncBranches}>
<RefreshCw className="mr-1 h-3 w-3" />

View File

@ -451,16 +451,16 @@ const JenkinsManagerList: React.FC = () => {
</CardHeader>
<CardContent>
<div className="rounded-md border">
<Table>
<Table minWidth="1170px">
<TableHeader>
<TableRow>
<TableHead className="w-[250px]">Job </TableHead>
<TableHead className="w-[300px]"></TableHead>
<TableHead className="w-[100px]"></TableHead>
<TableHead className="w-[120px]"></TableHead>
<TableHead className="w-[120px]"></TableHead>
<TableHead className="w-[180px]"></TableHead>
<TableHead className="w-[100px]"></TableHead>
<TableHead width="250px">Job </TableHead>
<TableHead width="300px"></TableHead>
<TableHead width="100px"></TableHead>
<TableHead width="120px"></TableHead>
<TableHead width="120px"></TableHead>
<TableHead width="180px"></TableHead>
<TableHead width="100px" sticky></TableHead>
</TableRow>
</TableHeader>
<TableBody>
@ -478,24 +478,24 @@ const JenkinsManagerList: React.FC = () => {
const statusInfo = getBuildStatusInfo(job.lastBuildStatus);
return (
<TableRow key={job.id}>
<TableCell className="font-medium">
<TableCell width="250px" className="font-medium">
<div className="flex items-center gap-2">
<span className="truncate">{job.jobName}</span>
</div>
</TableCell>
<TableCell className="text-muted-foreground text-sm">
<TableCell width="300px" className="text-muted-foreground text-sm">
{job.description || '-'}
</TableCell>
<TableCell>
<TableCell width="100px">
<span className="text-sm">#{job.lastBuildNumber}</span>
</TableCell>
<TableCell>
<TableCell width="120px">
<Badge variant={statusInfo.variant} className="inline-flex items-center gap-1">
{statusInfo.icon}
{statusInfo.label}
</Badge>
</TableCell>
<TableCell>
<TableCell width="120px">
<div className="space-y-1">
<Progress
value={job.healthReportScore}
@ -505,10 +505,10 @@ const JenkinsManagerList: React.FC = () => {
<span className="text-xs text-muted-foreground">{job.healthReportScore}%</span>
</div>
</TableCell>
<TableCell className="text-sm text-muted-foreground">
<TableCell width="180px" className="text-sm text-muted-foreground">
{formatTime(job.lastBuildTime)}
</TableCell>
<TableCell>
<TableCell width="100px" sticky>
<Button
variant="ghost"
size="sm"

View File

@ -291,17 +291,17 @@ const FormDataList: React.FC = () => {
{/* 表格 */}
<div className="rounded-md border">
<Table>
<Table minWidth="1230px">
<TableHeader>
<TableRow>
<TableHead className="w-[240px]"></TableHead>
<TableHead className="w-[120px]"></TableHead>
<TableHead className="w-[100px]"></TableHead>
<TableHead className="w-[150px]"></TableHead>
<TableHead className="w-[100px]"></TableHead>
<TableHead className="w-[180px]"></TableHead>
<TableHead className="w-[140px]"></TableHead>
<TableHead className="text-right"></TableHead>
<TableHead width="240px"></TableHead>
<TableHead width="120px"></TableHead>
<TableHead width="100px"></TableHead>
<TableHead width="150px"></TableHead>
<TableHead width="100px"></TableHead>
<TableHead width="180px"></TableHead>
<TableHead width="140px"></TableHead>
<TableHead width="200px" sticky></TableHead>
</TableRow>
</TableHeader>
<TableBody>
@ -319,12 +319,12 @@ const FormDataList: React.FC = () => {
const categoryInfo = getCategoryInfo(record.categoryId);
return (
<TableRow key={record.id} className="hover:bg-muted/50">
<TableCell>
<TableCell width="240px">
<code className="relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold">
{record.formKey}
</code>
</TableCell>
<TableCell>
<TableCell width="120px">
{categoryInfo ? (
<Badge variant="outline" className="flex items-center gap-1 w-fit">
{categoryInfo.icon && <Folder className="h-3 w-3" />}
@ -334,20 +334,20 @@ const FormDataList: React.FC = () => {
<Badge variant="outline"></Badge>
)}
</TableCell>
<TableCell>{getBusinessTypeBadge(record.businessType)}</TableCell>
<TableCell>
<TableCell width="100px">{getBusinessTypeBadge(record.businessType)}</TableCell>
<TableCell width="150px">
<span className="text-sm">{record.businessKey || '-'}</span>
</TableCell>
<TableCell>
<TableCell width="100px">
<span className="text-sm">{record.submitter || '匿名'}</span>
</TableCell>
<TableCell>
<TableCell width="180px">
<span className="text-sm">
{record.submitTime ? dayjs(record.submitTime).format('YYYY-MM-DD HH:mm:ss') : '-'}
</span>
</TableCell>
<TableCell>{getStatusBadge(record.status)}</TableCell>
<TableCell className="text-right">
<TableCell width="140px">{getStatusBadge(record.status)}</TableCell>
<TableCell width="200px" sticky>
<div className="flex justify-end gap-2">
<Button
variant="ghost"

View File

@ -260,17 +260,17 @@ const CategoryManageDialog: React.FC<CategoryManageDialogProps> = ({
</div>
{/* 表格 */}
<div className="overflow-x-auto">
<Table>
<div className="rounded-md border">
<Table minWidth="770px">
<TableHeader>
<TableRow>
<TableHead className="w-[160px]"></TableHead>
<TableHead className="w-[140px]"></TableHead>
<TableHead className="w-[60px]"></TableHead>
<TableHead className="w-[80px]"></TableHead>
<TableHead className="w-[80px]"></TableHead>
<TableHead className="min-w-[150px]"></TableHead>
<TableHead className="w-[100px] sticky right-0 bg-background shadow-[-2px_0_4px_rgba(0,0,0,0.05)]"></TableHead>
<TableHead width="160px"></TableHead>
<TableHead width="140px"></TableHead>
<TableHead width="60px"></TableHead>
<TableHead width="80px" className="text-center"></TableHead>
<TableHead width="80px"></TableHead>
<TableHead width="150px"></TableHead>
<TableHead width="100px" sticky></TableHead>
</TableRow>
</TableHeader>
<TableBody>
@ -286,15 +286,15 @@ const CategoryManageDialog: React.FC<CategoryManageDialogProps> = ({
) : data?.content && data.content.length > 0 ? (
data.content.map((record) => (
<TableRow key={record.id}>
<TableCell className="font-medium">
<TableCell width="160px" className="font-medium">
{record.name}
</TableCell>
<TableCell>
<TableCell width="140px">
<code className="text-xs bg-muted px-2 py-0.5 rounded whitespace-nowrap">
{record.code}
</code>
</TableCell>
<TableCell>
<TableCell width="60px">
{record.icon ? (
<div className="flex items-center justify-center">
<DynamicIcon name={record.icon} className="h-5 w-5" />
@ -303,18 +303,18 @@ const CategoryManageDialog: React.FC<CategoryManageDialogProps> = ({
<span className="text-muted-foreground text-sm">-</span>
)}
</TableCell>
<TableCell className="text-center">{record.sort}</TableCell>
<TableCell>
<TableCell width="80px" className="text-center">{record.sort}</TableCell>
<TableCell width="80px">
{record.enabled ? (
<CheckCircle2 className="h-4 w-4 text-green-500" />
) : (
<XCircle className="h-4 w-4 text-gray-400" />
)}
</TableCell>
<TableCell className="max-w-[200px] truncate" title={record.description}>
<TableCell width="150px" className="max-w-[150px] truncate" title={record.description}>
{record.description || '-'}
</TableCell>
<TableCell className="sticky right-0 bg-background shadow-[-2px_0_4px_rgba(0,0,0,0.05)]">
<TableCell width="100px" sticky>
<div className="flex items-center justify-end gap-1">
<Button
variant="ghost"

View File

@ -369,16 +369,16 @@ const FormDefinitionList: React.FC = () => {
{/* 表格 */}
<div className="rounded-md border">
<Table>
<Table minWidth="1180px">
<TableHeader>
<TableRow>
<TableHead className="w-[250px]"></TableHead>
<TableHead className="w-[200px]"></TableHead>
<TableHead className="w-[150px]"></TableHead>
<TableHead className="w-[80px]"></TableHead>
<TableHead className="w-[120px]"></TableHead>
<TableHead className="w-[180px]"></TableHead>
<TableHead className="w-[100px] text-right"></TableHead>
<TableHead width="250px"></TableHead>
<TableHead width="200px"></TableHead>
<TableHead width="150px"></TableHead>
<TableHead width="80px"></TableHead>
<TableHead width="120px"></TableHead>
<TableHead width="180px"></TableHead>
<TableHead width="200px" sticky></TableHead>
</TableRow>
</TableHeader>
<TableBody>
@ -396,7 +396,7 @@ const FormDefinitionList: React.FC = () => {
const categoryInfo = getCategoryInfo(record.categoryId);
return (
<TableRow key={record.id} className="hover:bg-muted/50">
<TableCell>
<TableCell width="250px">
<div>
<div className="font-medium">{record.name}</div>
{record.description && (
@ -406,10 +406,10 @@ const FormDefinitionList: React.FC = () => {
)}
</div>
</TableCell>
<TableCell>
<TableCell width="200px">
<code className="text-xs bg-muted px-2 py-1 rounded">{record.key}</code>
</TableCell>
<TableCell>
<TableCell width="150px">
{categoryInfo ? (
<div className="flex items-center gap-2">
<Folder className="h-4 w-4 text-muted-foreground" />
@ -419,16 +419,16 @@ const FormDefinitionList: React.FC = () => {
<span className="text-sm text-muted-foreground">-</span>
)}
</TableCell>
<TableCell>
<TableCell width="80px">
<Badge variant="outline" className="font-mono">
v{record.formVersion}
</Badge>
</TableCell>
<TableCell>{getStatusBadge(record.status)}</TableCell>
<TableCell className="text-sm text-muted-foreground">
<TableCell width="120px">{getStatusBadge(record.status)}</TableCell>
<TableCell width="180px" className="text-sm text-muted-foreground">
{record.updateTime || record.createTime}
</TableCell>
<TableCell>
<TableCell width="200px" sticky>
<div className="flex items-center justify-end gap-2">
<Button
variant="ghost"

View File

@ -150,7 +150,7 @@ const DepartmentPage: React.FC = () => {
// 当前部门行
rows.push(
<TableRow key={dept.id} className="hover:bg-muted/50">
<TableCell>
<TableCell width="250px">
<div className="flex items-center gap-2" style={{ paddingLeft: `${level * 24}px` }}>
{hasChildren ? (
<button
@ -169,16 +169,16 @@ const DepartmentPage: React.FC = () => {
<span className="font-medium">{dept.name}</span>
</div>
</TableCell>
<TableCell>
<TableCell width="150px">
<code className="text-sm bg-muted px-2 py-0.5 rounded">{dept.code}</code>
</TableCell>
<TableCell className="text-sm max-w-[200px] truncate" title={dept.description}>
<TableCell width="200px" className="text-sm max-w-[200px] truncate" title={dept.description}>
{dept.description || '-'}
</TableCell>
<TableCell className="text-center">{dept.sort}</TableCell>
<TableCell>{dept.leaderName || '-'}</TableCell>
<TableCell>{getStatusBadge(dept.enabled)}</TableCell>
<TableCell className="text-right">
<TableCell width="100px" className="text-center">{dept.sort}</TableCell>
<TableCell width="120px">{dept.leaderName || '-'}</TableCell>
<TableCell width="100px">{getStatusBadge(dept.enabled)}</TableCell>
<TableCell width="200px" sticky>
<div className="flex justify-end gap-2">
<Button
variant="ghost"
@ -291,16 +291,16 @@ const DepartmentPage: React.FC = () => {
<CardContent>
{/* 表格 */}
<div className="rounded-md border">
<Table>
<Table minWidth="1120px">
<TableHeader>
<TableRow>
<TableHead className="w-[250px]"></TableHead>
<TableHead className="w-[150px]"></TableHead>
<TableHead className="w-[200px]"></TableHead>
<TableHead className="w-[100px] text-center"></TableHead>
<TableHead className="w-[120px]"></TableHead>
<TableHead className="w-[100px]"></TableHead>
<TableHead className="text-right"></TableHead>
<TableHead width="250px"></TableHead>
<TableHead width="150px"></TableHead>
<TableHead width="200px"></TableHead>
<TableHead width="100px" className="text-center"></TableHead>
<TableHead width="120px"></TableHead>
<TableHead width="100px"></TableHead>
<TableHead width="200px" sticky></TableHead>
</TableRow>
</TableHeader>
<TableBody>

View File

@ -147,7 +147,7 @@ const MenuPage: React.FC = () => {
// 当前菜单行
rows.push(
<TableRow key={menu.id} className="hover:bg-muted/50">
<TableCell>
<TableCell width="250px">
<div className="flex items-center gap-2" style={{ paddingLeft: `${level * 24}px` }}>
{hasChildren ? (
<button
@ -166,20 +166,20 @@ const MenuPage: React.FC = () => {
<span className="font-medium">{menu.name}</span>
</div>
</TableCell>
<TableCell>
<TableCell width="80px">
{menu.icon && (
<div className="flex items-center">
{getIconComponent(menu.icon)}
</div>
)}
</TableCell>
<TableCell className="text-sm">{menu.path || '-'}</TableCell>
<TableCell className="text-sm max-w-[200px] truncate" title={menu.component}>
<TableCell width="200px" className="text-sm">{menu.path || '-'}</TableCell>
<TableCell width="200px" className="text-sm max-w-[200px] truncate" title={menu.component}>
{menu.component || '-'}
</TableCell>
<TableCell>{getTypeBadge(menu.type)}</TableCell>
<TableCell className="text-center">{menu.sort}</TableCell>
<TableCell className="text-right">
<TableCell width="100px">{getTypeBadge(menu.type)}</TableCell>
<TableCell width="100px" className="text-center">{menu.sort}</TableCell>
<TableCell width="200px" sticky>
<div className="flex justify-end gap-2">
<Button
variant="ghost"
@ -304,16 +304,16 @@ const MenuPage: React.FC = () => {
<CardContent>
{/* 表格 */}
<div className="rounded-md border">
<Table>
<Table minWidth="1130px">
<TableHeader>
<TableRow>
<TableHead className="w-[250px]"></TableHead>
<TableHead className="w-[80px]"></TableHead>
<TableHead className="w-[200px]"></TableHead>
<TableHead className="w-[200px]"></TableHead>
<TableHead className="w-[100px]"></TableHead>
<TableHead className="w-[100px] text-center"></TableHead>
<TableHead className="text-right"></TableHead>
<TableHead width="250px"></TableHead>
<TableHead width="80px"></TableHead>
<TableHead width="200px"></TableHead>
<TableHead width="200px"></TableHead>
<TableHead width="100px"></TableHead>
<TableHead width="100px" className="text-center"></TableHead>
<TableHead width="200px" sticky></TableHead>
</TableRow>
</TableHeader>
<TableBody>

View File

@ -161,12 +161,12 @@ const TagDialog: React.FC<TagDialogProps> = ({
</Button>
</div>
<div className="rounded-md border">
<Table>
<Table minWidth="650px">
<TableHeader>
<TableRow>
<TableHead className="w-[200px]"></TableHead>
<TableHead></TableHead>
<TableHead className="w-[150px] text-right"></TableHead>
<TableHead width="200px"></TableHead>
<TableHead width="300px"></TableHead>
<TableHead width="150px" sticky></TableHead>
</TableRow>
</TableHeader>
<TableBody>
@ -182,7 +182,7 @@ const TagDialog: React.FC<TagDialogProps> = ({
) : tags.length > 0 ? (
tags.map((tag) => (
<TableRow key={tag.id}>
<TableCell>
<TableCell width="200px">
<Badge
variant="outline"
style={{ backgroundColor: tag.color, color: '#fff' }}
@ -190,10 +190,10 @@ const TagDialog: React.FC<TagDialogProps> = ({
{tag.name}
</Badge>
</TableCell>
<TableCell className="max-w-[300px] truncate" title={tag.description}>
<TableCell width="300px" className="max-w-[300px] truncate" title={tag.description}>
{tag.description || '-'}
</TableCell>
<TableCell className="text-right">
<TableCell width="150px" sticky>
<div className="flex justify-end gap-2">
<Button
variant="ghost"

View File

@ -246,16 +246,16 @@ const RolePage: React.FC = () => {
{/* 表格 */}
<div className="rounded-md border">
<Table>
<Table minWidth="1180px">
<TableHeader>
<TableRow>
<TableHead className="w-[150px]"></TableHead>
<TableHead className="w-[150px]"></TableHead>
<TableHead className="w-[200px]"></TableHead>
<TableHead className="w-[100px]"></TableHead>
<TableHead className="w-[200px]"></TableHead>
<TableHead className="w-[180px]"></TableHead>
<TableHead className="text-right"></TableHead>
<TableHead width="150px"></TableHead>
<TableHead width="150px"></TableHead>
<TableHead width="200px"></TableHead>
<TableHead width="100px"></TableHead>
<TableHead width="200px"></TableHead>
<TableHead width="180px"></TableHead>
<TableHead width="200px" sticky></TableHead>
</TableRow>
</TableHeader>
<TableBody>
@ -273,11 +273,11 @@ const RolePage: React.FC = () => {
const isAdmin = record.code === 'admin';
return (
<TableRow key={record.id} className="hover:bg-muted/50">
<TableCell className="font-medium">
<TableCell width="150px" className="font-medium">
<code className="text-sm">{record.code}</code>
</TableCell>
<TableCell>{record.name}</TableCell>
<TableCell>
<TableCell width="150px">{record.name}</TableCell>
<TableCell width="200px">
<div className="flex flex-wrap gap-1">
{record.tags && record.tags.length > 0 ? (
record.tags.map(tag => (
@ -295,14 +295,14 @@ const RolePage: React.FC = () => {
)}
</div>
</TableCell>
<TableCell>{record.sort}</TableCell>
<TableCell className="text-sm max-w-[200px] truncate" title={record.description}>
<TableCell width="100px">{record.sort}</TableCell>
<TableCell width="200px" className="text-sm max-w-[200px] truncate" title={record.description}>
{record.description || '-'}
</TableCell>
<TableCell className="text-sm">
<TableCell width="180px" className="text-sm">
{record.createTime ? dayjs(record.createTime).format('YYYY-MM-DD HH:mm') : '-'}
</TableCell>
<TableCell className="text-right">
<TableCell width="200px" sticky>
<div className="flex justify-end gap-2">
<Button
variant="ghost"

View File

@ -315,18 +315,18 @@ const UserPage: React.FC = () => {
{/* 表格 */}
<div className="rounded-md border">
<Table>
<Table minWidth="1340px">
<TableHeader>
<TableRow>
<TableHead className="w-[120px]"></TableHead>
<TableHead className="w-[150px]"></TableHead>
<TableHead className="w-[200px]"></TableHead>
<TableHead className="w-[120px]"></TableHead>
<TableHead className="w-[120px]"></TableHead>
<TableHead className="w-[150px]"></TableHead>
<TableHead className="w-[100px]"></TableHead>
<TableHead className="w-[180px]"></TableHead>
<TableHead className="text-right"></TableHead>
<TableHead width="120px"></TableHead>
<TableHead width="150px"></TableHead>
<TableHead width="200px"></TableHead>
<TableHead width="120px"></TableHead>
<TableHead width="120px"></TableHead>
<TableHead width="150px"></TableHead>
<TableHead width="100px"></TableHead>
<TableHead width="180px"></TableHead>
<TableHead width="200px" sticky></TableHead>
</TableRow>
</TableHeader>
<TableBody>
@ -344,14 +344,14 @@ const UserPage: React.FC = () => {
const isAdmin = record.username === 'admin';
return (
<TableRow key={record.id} className="hover:bg-muted/50">
<TableCell className="font-medium">
<TableCell width="120px" className="font-medium">
{record.username}
</TableCell>
<TableCell>{record.nickname || '-'}</TableCell>
<TableCell className="text-sm">{record.email || '-'}</TableCell>
<TableCell className="text-sm">{record.phone || '-'}</TableCell>
<TableCell>{record.departmentName || '-'}</TableCell>
<TableCell>
<TableCell width="150px">{record.nickname || '-'}</TableCell>
<TableCell width="200px" className="text-sm">{record.email || '-'}</TableCell>
<TableCell width="120px" className="text-sm">{record.phone || '-'}</TableCell>
<TableCell width="120px">{record.departmentName || '-'}</TableCell>
<TableCell width="150px">
<div className="flex flex-wrap gap-1">
{record.roles && record.roles.length > 0 ? (
record.roles.map(role => (
@ -364,11 +364,11 @@ const UserPage: React.FC = () => {
)}
</div>
</TableCell>
<TableCell>{getStatusBadge(record.enabled)}</TableCell>
<TableCell className="text-sm">
<TableCell width="100px">{getStatusBadge(record.enabled)}</TableCell>
<TableCell width="180px" className="text-sm">
{record.createTime ? dayjs(record.createTime).format('YYYY-MM-DD HH:mm') : '-'}
</TableCell>
<TableCell className="text-right">
<TableCell width="200px" sticky>
<div className="flex justify-end gap-2">
<Button
variant="ghost"

View File

@ -299,18 +299,18 @@ const CategoryManageDialog: React.FC<CategoryManageDialogProps> = ({
</div>
{/* 分类列表 */}
<div className="rounded-md border overflow-x-auto">
<Table>
<div className="rounded-md border">
<Table minWidth="910px">
<TableHeader>
<TableRow>
<TableHead className="w-[160px]"></TableHead>
<TableHead className="w-[140px]"></TableHead>
<TableHead className="w-[60px]"></TableHead>
<TableHead className="w-[240px]"></TableHead>
<TableHead className="w-[80px] text-center"></TableHead>
<TableHead className="w-[80px]"></TableHead>
<TableHead className="min-w-[150px]"></TableHead>
<TableHead className="w-[100px] text-right sticky right-0 bg-background shadow-[-2px_0_4px_rgba(0,0,0,0.05)]"></TableHead>
<TableHead width="160px"></TableHead>
<TableHead width="140px"></TableHead>
<TableHead width="60px"></TableHead>
<TableHead width="240px"></TableHead>
<TableHead width="80px" className="text-center"></TableHead>
<TableHead width="80px"></TableHead>
<TableHead width="150px"></TableHead>
<TableHead width="100px" sticky></TableHead>
</TableRow>
</TableHeader>
<TableBody>
@ -323,13 +323,13 @@ const CategoryManageDialog: React.FC<CategoryManageDialogProps> = ({
) : data?.content && data.content.length > 0 ? (
data.content.map((record) => (
<TableRow key={record.id}>
<TableCell className="font-medium text-sm">{record.name}</TableCell>
<TableCell>
<TableCell width="160px" className="font-medium text-sm">{record.name}</TableCell>
<TableCell width="140px">
<code className="text-xs bg-muted px-2 py-0.5 rounded whitespace-nowrap">
{record.code}
</code>
</TableCell>
<TableCell>
<TableCell width="60px">
{record.icon ? (
<div className="flex items-center justify-center">
<DynamicIcon name={record.icon} className="h-5 w-5" />
@ -338,11 +338,11 @@ const CategoryManageDialog: React.FC<CategoryManageDialogProps> = ({
<span className="text-muted-foreground text-sm">-</span>
)}
</TableCell>
<TableCell>
<TableCell width="240px">
{renderTriggers(record.supportedTriggers)}
</TableCell>
<TableCell className="text-center">{record.sort}</TableCell>
<TableCell>
<TableCell width="80px" className="text-center">{record.sort}</TableCell>
<TableCell width="80px">
<Badge
variant={record.enabled ? "success" : "secondary"}
className="inline-flex items-center gap-1 text-xs whitespace-nowrap"
@ -360,10 +360,10 @@ const CategoryManageDialog: React.FC<CategoryManageDialogProps> = ({
)}
</Badge>
</TableCell>
<TableCell className="max-w-[200px] truncate text-sm" title={record.description}>
<TableCell width="150px" className="max-w-[150px] truncate text-sm" title={record.description}>
{record.description || '-'}
</TableCell>
<TableCell className="sticky right-0 bg-background shadow-[-2px_0_4px_rgba(0,0,0,0.05)]">
<TableCell width="100px" sticky>
<div className="flex items-center justify-end gap-1">
<Button
variant="ghost"

View File

@ -392,16 +392,16 @@ const WorkflowDefinitionList: React.FC = () => {
{/* 表格 */}
<div className="rounded-md border">
<Table>
<Table minWidth="1000px">
<TableHeader>
<TableRow>
<TableHead className="w-[200px]"></TableHead>
<TableHead className="w-[150px]"></TableHead>
<TableHead className="w-[120px]"></TableHead>
<TableHead className="w-[80px]"></TableHead>
<TableHead className="w-[120px]"></TableHead>
<TableHead></TableHead>
<TableHead className="text-right"></TableHead>
<TableHead width="200px"></TableHead>
<TableHead width="150px"></TableHead>
<TableHead width="120px"></TableHead>
<TableHead width="80px"></TableHead>
<TableHead width="120px"></TableHead>
<TableHead width="150px"></TableHead>
<TableHead width="180px" sticky></TableHead>
</TableRow>
</TableHeader>
<TableBody>
@ -420,27 +420,27 @@ const WorkflowDefinitionList: React.FC = () => {
const isDraft = record.status === 'DRAFT';
return (
<TableRow key={record.id} className="hover:bg-muted/50">
<TableCell className="font-medium">{record.name}</TableCell>
<TableCell>
<TableCell width="200px" className="font-medium">{record.name}</TableCell>
<TableCell width="150px">
<code className="relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold">
{record.key}
</code>
</TableCell>
<TableCell>
<TableCell width="120px">
{categoryInfo ? (
<Badge variant="outline">{categoryInfo.name}</Badge>
) : (
<Badge variant="outline"></Badge>
)}
</TableCell>
<TableCell>
<TableCell width="80px">
<span className="font-mono text-sm">{record.flowVersion || 1}</span>
</TableCell>
<TableCell>{getStatusBadge(record.status || 'DRAFT')}</TableCell>
<TableCell>
<TableCell width="120px">{getStatusBadge(record.status || 'DRAFT')}</TableCell>
<TableCell width="150px">
<span className="text-sm line-clamp-1">{record.description || '-'}</span>
</TableCell>
<TableCell className="text-right">
<TableCell width="180px" sticky>
<div className="flex justify-end gap-2">
{isDraft ? (
<>

View File

@ -90,24 +90,24 @@ const HistoryModal: React.FC<HistoryModalProps> = ({ visible, onCancel, workflow
) : (
<>
<div className="border rounded-lg">
<Table>
<Table minWidth="760px">
<TableHeader>
<TableRow>
<TableHead className="w-[200px]"></TableHead>
<TableHead className="w-[100px]"></TableHead>
<TableHead className="w-[180px]"></TableHead>
<TableHead className="w-[180px]"></TableHead>
<TableHead className="w-[100px] text-right"></TableHead>
<TableHead width="200px"></TableHead>
<TableHead width="100px"></TableHead>
<TableHead width="180px"></TableHead>
<TableHead width="180px"></TableHead>
<TableHead width="100px" sticky></TableHead>
</TableRow>
</TableHeader>
<TableBody>
{data.map((record) => (
<TableRow key={record.id}>
<TableCell className="font-medium">{record.businessKey}</TableCell>
<TableCell>{getStatusBadge(record.status)}</TableCell>
<TableCell>{record.startTime}</TableCell>
<TableCell>{record.endTime || '暂无'}</TableCell>
<TableCell className="text-right">
<TableCell width="200px" className="font-medium">{record.businessKey}</TableCell>
<TableCell width="100px">{getStatusBadge(record.status)}</TableCell>
<TableCell width="180px">{record.startTime}</TableCell>
<TableCell width="180px">{record.endTime || '暂无'}</TableCell>
<TableCell width="100px" sticky>
<Button
variant="link"
size="sm"

View File

@ -213,14 +213,14 @@ const WorkflowInstanceList: React.FC = () => {
{/* 表格 */}
<div className="rounded-md border">
<Table>
<Table minWidth="850px">
<TableHeader>
<TableRow>
<TableHead className="w-[200px]"></TableHead>
<TableHead className="w-[150px]"></TableHead>
<TableHead className="w-[180px]"></TableHead>
<TableHead className="w-[120px]"></TableHead>
<TableHead className="text-right"></TableHead>
<TableHead width="200px"></TableHead>
<TableHead width="150px"></TableHead>
<TableHead width="180px"></TableHead>
<TableHead width="120px"></TableHead>
<TableHead width="200px" sticky></TableHead>
</TableRow>
</TableHeader>
<TableBody>
@ -236,8 +236,8 @@ const WorkflowInstanceList: React.FC = () => {
) : data?.content && data.content.length > 0 ? (
data.content.map((record) => (
<TableRow key={record.id} className="hover:bg-muted/50">
<TableCell className="font-medium">{record.name}</TableCell>
<TableCell>
<TableCell width="200px" className="font-medium">{record.name}</TableCell>
<TableCell width="150px">
{record.businessKey ? (
<code className="relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold">
{record.businessKey}
@ -246,15 +246,15 @@ const WorkflowInstanceList: React.FC = () => {
<span className="text-muted-foreground">-</span>
)}
</TableCell>
<TableCell>
<TableCell width="180px">
<span className="text-sm">
{record.lastExecutionTime
? dayjs(record.lastExecutionTime).format('YYYY-MM-DD HH:mm:ss')
: '-'}
</span>
</TableCell>
<TableCell>{getStatusBadge(record.lastExecutionStatus)}</TableCell>
<TableCell className="text-right">
<TableCell width="120px">{getStatusBadge(record.lastExecutionStatus)}</TableCell>
<TableCell width="200px" sticky>
<div className="flex justify-end gap-2">
<Button
variant="ghost"

View File

@ -255,13 +255,14 @@ const NodeDesignList: React.FC = () => {
</CardHeader>
<CardContent>
<div className="rounded-md border">
<Table>
<Table minWidth="930px">
<TableHeader>
<TableRow>
{columns.map((column) => (
<TableHead
key={column.accessorKey || column.id}
style={{width: column.size}}
width={`${column.size}px`}
sticky={column.id === 'actions'}
>
{column.header}
</TableHead>
@ -274,6 +275,8 @@ const NodeDesignList: React.FC = () => {
{columns.map((column) => (
<TableCell
key={column.accessorKey || column.id}
width={`${column.size}px`}
sticky={column.id === 'actions'}
>
{column.cell
? column.cell({row: {original: item}})