From 81e1cd0f72118a27bf446238793016441dab45e5 Mon Sep 17 00:00:00 2001 From: selfrelease Date: Sat, 15 Aug 2026 15:14:13 +0800 Subject: [PATCH] =?UTF-8?q?ux:=20=E8=8A=B1=E5=90=8D=E5=86=8C=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E4=B8=A4=E8=A1=8C=E8=AE=B0=E5=BD=95=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E7=BE=8E=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 姓名列:姓名加粗深色 + 证件号码淡灰小字,紧凑行间距 - 社保缴费列:个人/企业改为右对齐标签式,字号区分主次 - 操作列:两行按钮间增加分隔线,按钮间距收紧 - 全行 padding 从 py-3 调整为 py-2.5,行高更紧凑 - 行间分隔线变淡(gray-100 → gray-50),hover 效果加 group Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- frontend/src/pages/Roster.tsx | 66 ++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/frontend/src/pages/Roster.tsx b/frontend/src/pages/Roster.tsx index 97e5439..0bf5d40 100644 --- a/frontend/src/pages/Roster.tsx +++ b/frontend/src/pages/Roster.tsx @@ -674,23 +674,25 @@ export default function Roster() { {employees.map((e: any) => ( setSelectedId(e.id)} > - ev.stopPropagation()}> + ev.stopPropagation()}> toggleSelect(e.id)} /> - -
{e.name}
-
{ - ev.stopPropagation() - if (e.idCardNumber) { - copyToClipboard(e.idCardNumber, '已复制证件号码') - } - }}>{e.idCardMasked || '—'}
+ +
+ {e.name} + { + ev.stopPropagation() + if (e.idCardNumber) { + copyToClipboard(e.idCardNumber, '已复制证件号码') + } + }}>{e.idCardMasked || '—'} +
- {colVisible('department') && {e.department}} - {colVisible('status') && + {colVisible('department') && {e.department}} + {colVisible('status') && )} } - {colVisible('hireDate') && {e.hireDate?.toString().slice(0, 10)}} - + {colVisible('hireDate') && {e.hireDate?.toString().slice(0, 10)}} + {e.hasTermination && e.latestTerminationDate && e.latestTerminationStatus !== 'CANCELLED' && e.latestTerminationStatus !== 'COMPLETED' ? ( {e.latestTerminationDate.toString().slice(0, 10)} @@ -719,10 +721,10 @@ export default function Roster() { )} - {colVisible('position') && {e.position || '—'}} - {colVisible('phone') && {e.phone || '—'}} - {colVisible('gender') && {e.gender || '—'}} - {colVisible('contractType') && + {colVisible('position') && {e.position || '—'}} + {colVisible('phone') && {e.phone || '—'}} + {colVisible('gender') && {e.gender || '—'}} + {colVisible('contractType') && {(() => { const typeConfig: Record = { FIXED: { label: '劳动合同-固定期', style: 'bg-blue-50 text-blue-700 border border-blue-200' }, @@ -739,7 +741,7 @@ export default function Roster() { return {cfg.label} })()} } - {colVisible('contractStatus') && + {colVisible('contractStatus') && {(() => { const tagStyles: Record = { expired: 'bg-red-50 text-danger', @@ -764,7 +766,7 @@ export default function Roster() { return {text} })()} } - {colVisible('contractExpiry') && + {colVisible('contractExpiry') && {(() => { const endDate = e.latestContract?.endDate if (!endDate) { @@ -784,7 +786,7 @@ export default function Roster() { return {dateStr} })()} } - {colVisible('socialStatus') && + {colVisible('socialStatus') && {(() => { const status = e.socialInsuranceStatus if (!status) return @@ -798,12 +800,12 @@ export default function Roster() { return {c.label} })()} } - {colVisible('socialInsBase') && + {colVisible('socialInsBase') && {e.socialInsBase ? e.socialInsBase.toLocaleString() : } } - {colVisible('socialInsAmount') && + {colVisible('socialInsAmount') && {(() => { - if (!e.socialInsCalc && !e.housingFundCalc) return + if (!e.socialInsCalc && !e.housingFundCalc) return const socialEmp = e.socialInsCalc?.socialEmp || 0 const socialOrg = e.socialInsCalc?.socialOrg || 0 const housingEmp = e.housingFundCalc?.housingEmp || 0 @@ -811,14 +813,14 @@ export default function Roster() { const totalEmp = socialEmp + housingEmp const totalOrg = socialOrg + housingOrg return ( -
- 个人: {totalEmp.toFixed(2)} - 企业: {totalOrg.toFixed(2)} +
+ 个人 {totalEmp.toFixed(2)} + 企业 {totalOrg.toFixed(2)}
) })()} } - {colVisible('records') && + {colVisible('records') &&
{(() => { const items = [ @@ -839,10 +841,10 @@ export default function Roster() { })()}
} - + {e.status === 'ACTIVE' && (!e.hasTermination || e.latestTerminationStatus === 'CANCELLED' || e.latestTerminationStatus === 'COMPLETED') && ( -
-
+
+
-
+