fix: 修复首页交叉评查和知识库入口的渲染逻辑。
This commit is contained in:
+51
-54
@@ -59,6 +59,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
|
|||||||
if (userRole && frontendJWT) {
|
if (userRole && frontendJWT) {
|
||||||
const { getUserRoutesByRole } = await import('~/api/auth/user-routes');
|
const { getUserRoutesByRole } = await import('~/api/auth/user-routes');
|
||||||
const routesResult = await getUserRoutesByRole(userRole, frontendJWT, true); // includeHidden=true
|
const routesResult = await getUserRoutesByRole(userRole, frontendJWT, true); // includeHidden=true
|
||||||
|
// console.log('🔍 [Index Loader] 顶级路由paths:', routesResult.data?.map(r => r.path));
|
||||||
|
|
||||||
if (routesResult.success && routesResult.data) {
|
if (routesResult.success && routesResult.data) {
|
||||||
// 查找 '/settings' 路由及其子路由
|
// 查找 '/settings' 路由及其子路由
|
||||||
@@ -439,7 +440,6 @@ export default function Index() {
|
|||||||
loaderData.entryModules && loaderData.entryModules.length > 0 ? (
|
loaderData.entryModules && loaderData.entryModules.length > 0 ? (
|
||||||
<>
|
<>
|
||||||
{loaderData.entryModules.map((module) => {
|
{loaderData.entryModules.map((module) => {
|
||||||
// 判断是否为智慧法务助手,如果是且有交叉评查权限,则在其之前插入交叉评查卡片
|
|
||||||
const isLLMModule = module.name === '智慧法务助手';
|
const isLLMModule = module.name === '智慧法务助手';
|
||||||
|
|
||||||
// 🔑 如果是智慧法务助手且用户没有访问权限,则不渲染该模块
|
// 🔑 如果是智慧法务助手且用户没有访问权限,则不渲染该模块
|
||||||
@@ -448,61 +448,58 @@ export default function Index() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<React.Fragment key={module.id}>
|
<div
|
||||||
{/* 在智慧法务助手之前插入交叉评查入口 */}
|
key={module.id}
|
||||||
{isLLMModule && loaderData.hasCrossCheckingAccess && (
|
className="module-card"
|
||||||
<div
|
onClick={() => handleModuleClick(module)}
|
||||||
className="module-card"
|
onKeyDown={(e) => handleKeyDown(module, e)}
|
||||||
onClick={handleEnterCrossChecking}
|
role="button"
|
||||||
onKeyDown={(e) => {
|
tabIndex={0}
|
||||||
if (e.key === 'Enter' || e.key === ' ') {
|
aria-label={module.name}
|
||||||
handleEnterCrossChecking();
|
>
|
||||||
}
|
<img
|
||||||
}}
|
src={isLLMModule ? '/images/icon_assistant.png' : getModuleIcon(module)}
|
||||||
role="button"
|
alt={module.name}
|
||||||
tabIndex={0}
|
className="w-12 h-12 mx-1"
|
||||||
aria-label="交叉评查"
|
/>
|
||||||
>
|
<span className="module-name">{module.name}</span>
|
||||||
<img
|
</div>
|
||||||
src="/images/icon_cross@2x.png"
|
|
||||||
alt="交叉评查"
|
|
||||||
className="w-12 h-12 mx-1"
|
|
||||||
onError={(e) => {
|
|
||||||
// 如果图片加载失败,使用 icon
|
|
||||||
(e.target as HTMLImageElement).style.display = 'none';
|
|
||||||
const parent = (e.target as HTMLImageElement).parentElement;
|
|
||||||
if (parent) {
|
|
||||||
const icon = document.createElement('i');
|
|
||||||
icon.className = 'ri-shuffle-line';
|
|
||||||
icon.style.fontSize = '48px';
|
|
||||||
icon.style.color = 'var(--color-primary)';
|
|
||||||
parent.insertBefore(icon, parent.firstChild);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
<span className="module-name">交叉评查</span>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{/* 渲染原有模块 */}
|
|
||||||
<div
|
|
||||||
className="module-card"
|
|
||||||
onClick={() => handleModuleClick(module)}
|
|
||||||
onKeyDown={(e) => handleKeyDown(module, e)}
|
|
||||||
role="button"
|
|
||||||
tabIndex={0}
|
|
||||||
aria-label={module.name}
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
src={isLLMModule ? '/images/icon_assistant.png' : getModuleIcon(module)}
|
|
||||||
alt={module.name}
|
|
||||||
className="w-12 h-12 mx-1"
|
|
||||||
/>
|
|
||||||
<span className="module-name">{module.name}</span>
|
|
||||||
</div>
|
|
||||||
</React.Fragment>
|
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|
||||||
|
{/* 交叉评查入口 - 独立渲染,不依赖智慧法务助手模块 */}
|
||||||
|
{loaderData.hasCrossCheckingAccess && (
|
||||||
|
<div
|
||||||
|
className="module-card"
|
||||||
|
onClick={handleEnterCrossChecking}
|
||||||
|
onKeyDown={(e) => {
|
||||||
|
if (e.key === 'Enter' || e.key === ' ') {
|
||||||
|
handleEnterCrossChecking();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
role="button"
|
||||||
|
tabIndex={0}
|
||||||
|
aria-label="交叉评查"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
src="/images/icon_cross@2x.png"
|
||||||
|
alt="交叉评查"
|
||||||
|
className="w-12 h-12 mx-1"
|
||||||
|
onError={(e) => {
|
||||||
|
(e.target as HTMLImageElement).style.display = 'none';
|
||||||
|
const parent = (e.target as HTMLImageElement).parentElement;
|
||||||
|
if (parent) {
|
||||||
|
const icon = document.createElement('i');
|
||||||
|
icon.className = 'ri-shuffle-line';
|
||||||
|
icon.style.fontSize = '48px';
|
||||||
|
icon.style.color = 'var(--color-primary)';
|
||||||
|
parent.insertBefore(icon, parent.firstChild);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<span className="module-name">交叉评查</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<div className="text-center text-gray-500 py-8">
|
<div className="text-center text-gray-500 py-8">
|
||||||
|
|||||||
Reference in New Issue
Block a user