{
if (ref) {
dom.current = ref;
}
}}
>
-
+
-
-
{menuMap[initConfig.selectKey]}
+
+
+ {menuMap[initConfig.selectKey]}
+
diff --git a/apps/admin/src/pages/Account/Settings/style.ts b/apps/admin/src/pages/Account/Settings/style.ts
index 3b8e4d8..b77c965 100644
--- a/apps/admin/src/pages/Account/Settings/style.ts
+++ b/apps/admin/src/pages/Account/Settings/style.ts
@@ -6,36 +6,76 @@ const useStyles = createStyles(({ token }) => {
display: 'flex',
width: '100%',
height: '100%',
- paddingTop: '16px',
- paddingBottom: '16px',
+ minHeight: '520px',
+ overflow: 'hidden',
backgroundColor: token.colorBgContainer,
+ border: `${token.lineWidth}px solid ${token.colorBorderSecondary}`,
+ borderRadius: token.borderRadiusLG,
'.ant-list-split .ant-list-item:last-child': {
borderBottom: `1px solid ${token.colorSplit}`,
},
- '.ant-list-item': { paddingTop: '14px', paddingBottom: '14px' },
+ '.ant-list-item': { paddingTop: '16px', paddingBottom: '16px' },
+ '.ant-list-item-meta-title': {
+ color: token.colorTextHeading,
+ fontWeight: 600,
+ },
+ '.ant-list-item-meta-description': {
+ color: token.colorTextTertiary,
+ },
+ '.ant-list-item-action a': {
+ color: token.colorTextSecondary,
+ },
+ '.ant-list-item-action a:hover': {
+ color: token.colorText,
+ },
[`@media screen and (max-width: ${token.screenMD}px)`]: {
flexDirection: 'column',
},
},
leftMenu: {
width: '224px',
- borderRight: `${token.lineWidth}px solid ${token.colorSplit}`,
- '.ant-menu-inline': { border: 'none !important' },
- '.ant-menu-horizontal': { fontWeight: 'bold' },
+ padding: '16px 12px',
+ backgroundColor: token.colorBgContainer,
+ borderRight: `${token.lineWidth}px solid ${token.colorBorderSecondary}`,
+ '.ant-menu': {
+ background: 'transparent',
+ border: 'none !important',
+ },
+ '.ant-menu-item': {
+ height: '40px',
+ marginInline: 0,
+ marginBlock: '4px',
+ borderRadius: token.borderRadius,
+ color: token.colorTextSecondary,
+ fontWeight: 500,
+ },
+ '.ant-menu-item:hover': {
+ color: token.colorText,
+ backgroundColor: token.colorFillTertiary,
+ },
+ '.ant-menu-item-selected': {
+ color: token.colorText,
+ backgroundColor: token.colorFillSecondary,
+ boxShadow: `inset 2px 0 0 ${token.colorBorder}`,
+ },
+ '.ant-menu-horizontal': { fontWeight: 600 },
[`@media screen and (max-width: ${token.screenMD}px)`]: {
width: '100%',
- border: 'none',
+ borderRight: 'none',
+ borderBottom: `${token.lineWidth}px solid ${token.colorBorderSecondary}`,
},
},
right: {
flex: '1',
- padding: '8px 40px',
+ minWidth: 0,
+ padding: '28px 40px 40px',
+ backgroundColor: token.colorBgContainer,
[`@media screen and (max-width: ${token.screenMD}px)`]: {
- padding: '40px',
+ padding: '24px',
},
},
title: {
- marginBottom: '12px',
+ marginBottom: '20px',
color: token.colorTextHeading,
fontWeight: '500',
fontSize: '20px',
@@ -43,7 +83,6 @@ const useStyles = createStyles(({ token }) => {
},
baseView: {
display: 'flex',
- paddingTop: '12px',
'.ant-legacy-form-item .ant-legacy-form-item-control-wrapper': {
width: '100%',
},
@@ -52,6 +91,44 @@ const useStyles = createStyles(({ token }) => {
'font.strong': { color: token.colorSuccess },
'font.medium': { color: token.colorWarning },
'font.weak': { color: token.colorError },
+ 'html.examora-dark .account-settings-main': {
+ backgroundColor: '#18181b',
+ borderColor: '#27272a',
+ },
+ 'html.examora-dark .account-settings-menu': {
+ backgroundColor: '#18181b',
+ borderRightColor: '#27272a',
+ },
+ 'html.examora-dark .account-settings-content': {
+ backgroundColor: '#18181b',
+ },
+ 'html.examora-dark .account-settings-main .ant-list-split .ant-list-item':
+ {
+ borderBlockEndColor: '#27272a',
+ },
+ 'html.examora-dark .account-settings-main .ant-list-item-meta-description':
+ {
+ color: '#a1a1aa',
+ },
+ 'html.examora-dark .account-settings-main .ant-list-item-action a': {
+ color: '#a1a1aa',
+ },
+ 'html.examora-dark .account-settings-main .ant-list-item-action a:hover':
+ {
+ color: '#e4e4e7',
+ },
+ 'html.examora-dark .account-settings-menu .ant-menu-item': {
+ color: '#a1a1aa',
+ },
+ 'html.examora-dark .account-settings-menu .ant-menu-item:hover': {
+ color: '#e4e4e7',
+ backgroundColor: 'rgba(63, 63, 70, 0.28)',
+ },
+ 'html.examora-dark .account-settings-menu .ant-menu-item-selected': {
+ color: '#e4e4e7',
+ backgroundColor: 'rgba(63, 63, 70, 0.42)',
+ boxShadow: 'inset 2px 0 0 #52525b',
+ },
},
};
});
diff --git a/apps/admin/src/pages/Assessment/Results/JudgeTasks/index.tsx b/apps/admin/src/pages/Assessment/Results/JudgeTasks/index.tsx
index b385637..91ff79e 100644
--- a/apps/admin/src/pages/Assessment/Results/JudgeTasks/index.tsx
+++ b/apps/admin/src/pages/Assessment/Results/JudgeTasks/index.tsx
@@ -16,11 +16,11 @@ import {
Drawer,
Space,
Spin,
- Tag,
Typography,
} from 'antd';
import dayjs from 'dayjs';
import React, { useEffect, useState } from 'react';
+import { StatusTag, statusToneFromAntdColor } from '@/components';
import { fetchEnvelope } from '@/utils/apiEnvelope';
import { requestErrorMessage } from '@/utils/request';
import {
@@ -128,7 +128,11 @@ const JudgeTasksContent: React.FC = () => {
width: 150,
search: false,
render: (_, record) => (
-
{record.status}
+
+ {record.status}
+
),
},
{
@@ -230,9 +234,13 @@ const JudgeTasksContent: React.FC = () => {
{detail.language}
-
+
{detail.status}
-
+
{detail.retry_count}/{detail.max_retry_count}
diff --git a/apps/admin/src/pages/Assessment/Results/Submissions/index.tsx b/apps/admin/src/pages/Assessment/Results/Submissions/index.tsx
index 02b686c..9f16129 100644
--- a/apps/admin/src/pages/Assessment/Results/Submissions/index.tsx
+++ b/apps/admin/src/pages/Assessment/Results/Submissions/index.tsx
@@ -24,11 +24,11 @@ import {
Space,
Spin,
Table,
- Tag,
Typography,
} from 'antd';
import dayjs from 'dayjs';
import React, { useEffect, useMemo, useState } from 'react';
+import { StatusTag, statusToneFromAntdColor } from '@/components';
import { fetchEnvelope } from '@/utils/apiEnvelope';
import { requestErrorMessage } from '@/utils/request';
import {
@@ -157,7 +157,11 @@ const SubmissionsContent: React.FC = () => {
width: 140,
search: false,
render: (_, record) => (
- {record.status}
+
+ {record.status}
+
),
},
{
@@ -284,9 +288,13 @@ const SubmissionsContent: React.FC = () => {
{detail.user_id}
-
+
{detail.status}
-
+
{formatScore(detail.score, detail.max_score)}
@@ -304,7 +312,7 @@ const SubmissionsContent: React.FC = () => {
title: 'Status',
dataIndex: 'status',
width: 160,
- render: (status) => {status},
+ render: (status) => {status},
},
{
title: 'Score',
diff --git a/apps/admin/src/pages/Content/Library/Questions/Detail.tsx b/apps/admin/src/pages/Content/Library/Questions/Detail.tsx
index bb64cb6..6b04ce1 100644
--- a/apps/admin/src/pages/Content/Library/Questions/Detail.tsx
+++ b/apps/admin/src/pages/Content/Library/Questions/Detail.tsx
@@ -46,10 +46,10 @@ import {
Row,
Select,
Space,
- Tag,
} from 'antd';
import dayjs from 'dayjs';
import React, { useEffect, useMemo, useState } from 'react';
+import { StatusTag } from '@/components';
import { requestErrorMessage } from '@/utils/request';
import { SectionTitle } from './components/SectionTitle';
import { SortableItemWrapper } from './components/SortableItemWrapper';
@@ -272,12 +272,6 @@ interface QuestionEnvelope {
const HiddenFormValue: React.FC = () => null;
-const DIFFICULTY_TAGS: Record = {
- EASY: 'qdiff-easy',
- MEDIUM: 'qdiff-medium',
- HARD: 'qdiff-hard',
-};
-
/* ============================================================
Sub-components
============================================================ */
@@ -1433,15 +1427,19 @@ const QuestionsDetailContent: React.FC = () => {
question && !isNew ? (
#{question.id}
- {typeLabelMap[question.type]}
+ {typeLabelMap[question.type]}
{question.difficulty && (
-
{difficultyLabelMap[question.difficulty] || question.difficulty}
-
+
)}
= {
- EASY: 'question-diff-tag-easy',
- MEDIUM: 'question-diff-tag-medium',
- HARD: 'question-diff-tag-hard',
-};
-
const questionTypeIcon = (type: QuestionType) => {
if (type === 'PROGRAMMING') return ;
if (type === 'MULTIPLE_CHOICE' || type === 'TRUE_FALSE')
@@ -504,9 +498,7 @@ export const QuestionsPageContent: React.FC = ({
valueType: 'select',
valueEnum: typeValueEnum,
render: (_: unknown, question: AdminQuestion) => (
-
- {typeLabelMap[question.type] || question.type}
-
+ {typeLabelMap[question.type] || question.type}
),
},
{
@@ -521,13 +513,17 @@ export const QuestionsPageContent: React.FC = ({
valueEnum: difficultyValueEnum,
render: (_: unknown, question: AdminQuestion) =>
question.difficulty ? (
-
{difficultyLabelMap[question.difficulty] || question.difficulty}
-
+
) : (
{notSetLabel}
),
diff --git a/apps/admin/src/pages/Content/Papers/index.less b/apps/admin/src/pages/Content/Papers/index.less
index a429a92..8ab97c1 100644
--- a/apps/admin/src/pages/Content/Papers/index.less
+++ b/apps/admin/src/pages/Content/Papers/index.less
@@ -27,6 +27,14 @@
color: var(--ant-color-primary-hover);
}
+html.examora-dark .paper-title-button {
+ color: #fafafa;
+}
+
+html.examora-dark .paper-title-button:hover {
+ color: #d4d4d8;
+}
+
.paper-title-desc {
margin-top: 2px;
overflow: hidden;
@@ -37,20 +45,8 @@
text-overflow: ellipsis;
}
-.paper-status-tag {
- border-radius: 4px;
-}
-
-.paper-status-draft {
- color: #7a5d00;
- background: #fff7d6;
- border-color: #ffe58f;
-}
-
-.paper-status-published {
- color: #0f6b3d;
- background: #e8f7ef;
- border-color: #b7ebc6;
+html.examora-dark .paper-title-desc {
+ color: #a1a1aa;
}
.paper-date {
diff --git a/apps/admin/src/pages/Content/Papers/index.tsx b/apps/admin/src/pages/Content/Papers/index.tsx
index a64ed72..d71037b 100644
--- a/apps/admin/src/pages/Content/Papers/index.tsx
+++ b/apps/admin/src/pages/Content/Papers/index.tsx
@@ -13,9 +13,10 @@ import {
} from '@ant-design/pro-components';
import { API_PATHS } from '@examora/types';
import { history, request, useIntl } from '@umijs/max';
-import { App as AntdApp, Button, Dropdown, Space, Tag, Tooltip } from 'antd';
+import { App as AntdApp, Button, Dropdown, Space, Tooltip } from 'antd';
import dayjs from 'dayjs';
import React, { useMemo, useRef, useState } from 'react';
+import { StatusTag } from '@/components';
import {
type BatchActionResult,
proTableSortParams,
@@ -270,11 +271,9 @@ const PapersPageContent: React.FC = () => {
valueType: 'select',
valueEnum: statusValueEnum,
render: (_: unknown, paper: Paper) => (
-
+
{statusLabelMap[paper.status] || paper.status}
-
+
),
},
{
diff --git a/apps/admin/src/pages/Examination/ExamDetail/index.tsx b/apps/admin/src/pages/Examination/ExamDetail/index.tsx
index db9770b..944ebbf 100644
--- a/apps/admin/src/pages/Examination/ExamDetail/index.tsx
+++ b/apps/admin/src/pages/Examination/ExamDetail/index.tsx
@@ -42,13 +42,13 @@ import {
Spin,
Table,
Tabs,
- Tag,
Tree,
Typography,
} from 'antd';
import type { DataNode } from 'antd/es/tree';
import dayjs from 'dayjs';
import React, { useEffect, useMemo, useState } from 'react';
+import { StatusTag, statusToneFromAntdColor } from '@/components';
import {
formatScore,
resultStatusTone,
@@ -431,7 +431,11 @@ const ExamDetailContent: React.FC = () => {
}),
dataIndex: 'status',
render: (_, record) => (
- {record.status}
+
+ {record.status}
+
),
},
{
@@ -507,7 +511,11 @@ const ExamDetailContent: React.FC = () => {
}),
dataIndex: 'status',
render: (_, record) => (
- {record.status}
+
+ {record.status}
+
),
},
{
@@ -623,7 +631,13 @@ const ExamDetailContent: React.FC = () => {
defaultMessage: '状态',
})}
>
- {exam.status}
+
+ {exam.status}
+
{
defaultMessage: '状态',
})}
>
-
+
{resultDetail.status}
-
+
{
{
title: 'Status',
dataIndex: 'status',
- render: (status) => {status},
+ render: (status) => {status},
},
{
title: 'Score',
diff --git a/apps/admin/src/pages/Examination/ExamForm/index.tsx b/apps/admin/src/pages/Examination/ExamForm/index.tsx
index 1be1502..31def5c 100644
--- a/apps/admin/src/pages/Examination/ExamForm/index.tsx
+++ b/apps/admin/src/pages/Examination/ExamForm/index.tsx
@@ -18,9 +18,9 @@ import {
Select,
Space,
Spin,
- Tag,
} from 'antd';
import React, { useEffect, useMemo, useState } from 'react';
+import { StatusTag } from '@/components';
import { requestErrorMessage } from '@/utils/request';
import {
buildExamPayload,
@@ -156,7 +156,9 @@ const ExamFormContent: React.FC = () => {
})}
extra={
exam ? (
- {exam.status}
+
+ {exam.status}
+
) : null
}
>
diff --git a/apps/admin/src/pages/Examination/ExamList/index.tsx b/apps/admin/src/pages/Examination/ExamList/index.tsx
index c996107..235e1ab 100644
--- a/apps/admin/src/pages/Examination/ExamList/index.tsx
+++ b/apps/admin/src/pages/Examination/ExamList/index.tsx
@@ -19,10 +19,10 @@ import {
Modal,
Select,
Space,
- Tag,
} from 'antd';
import dayjs from 'dayjs';
import React, { useMemo, useRef, useState } from 'react';
+import { StatusTag, type StatusTagTone } from '@/components';
import type { BatchActionResult } from '@/utils/request';
import { requestErrorMessage } from '@/utils/request';
import {
@@ -52,12 +52,12 @@ const EXAM_STATUS_KEYS = [
'ARCHIVED',
] as const;
-const statusColors: Record = {
- DRAFT: 'default',
- PUBLISHED: 'green',
- RUNNING: 'blue',
- CLOSED: 'red',
- ARCHIVED: 'gray',
+const statusTones: Record = {
+ DRAFT: 'neutral',
+ PUBLISHED: 'info',
+ RUNNING: 'success',
+ CLOSED: 'warning',
+ ARCHIVED: 'neutral',
};
const ExamListContent: React.FC = () => {
@@ -311,9 +311,9 @@ const ExamListContent: React.FC = () => {
width: 120,
search: false,
render: (_: unknown, record) => (
-
+
{statusLabelMap[record.status] || record.status}
-
+
),
},
{
diff --git a/apps/admin/src/pages/Examination/ExamPublish/index.tsx b/apps/admin/src/pages/Examination/ExamPublish/index.tsx
index b643a91..c24a763 100644
--- a/apps/admin/src/pages/Examination/ExamPublish/index.tsx
+++ b/apps/admin/src/pages/Examination/ExamPublish/index.tsx
@@ -11,10 +11,10 @@ import {
Form,
InputNumber,
Space,
- Tag,
} from 'antd';
import type dayjs from 'dayjs';
import React, { useEffect, useState } from 'react';
+import { StatusTag } from '@/components';
import { requestErrorMessage } from '@/utils/request';
interface Exam {
@@ -143,7 +143,7 @@ const ExamPublishContent: React.FC = () => {
id: 'pages.exams.columns.status',
defaultMessage: '状态',
}),
- children: {exam.status},
+ children: {exam.status},
},
{
key: 'paper',
diff --git a/apps/admin/src/pages/System/Settings/UserGroups/Detail/index.tsx b/apps/admin/src/pages/System/Settings/UserGroups/Detail/index.tsx
index ad6c8bd..c6edb96 100644
--- a/apps/admin/src/pages/System/Settings/UserGroups/Detail/index.tsx
+++ b/apps/admin/src/pages/System/Settings/UserGroups/Detail/index.tsx
@@ -25,11 +25,11 @@ import {
Input,
Modal,
Tabs,
- Tag,
Typography,
} from 'antd';
import dayjs from 'dayjs';
import React, { useEffect, useRef, useState } from 'react';
+import { StatusTag } from '@/components';
import { fetchEnvelope } from '@/utils/apiEnvelope';
import { requestErrorMessage } from '@/utils/request';
import '../index.less';
@@ -72,6 +72,13 @@ const UserGroupDetailContent: React.FC = () => {
const [assignmentKeyword, setAssignmentKeyword] = useState('');
const [memberModalOpen, setMemberModalOpen] = useState(false);
const [selectedUserIDs, setSelectedUserIDs] = useState([]);
+ const sourceLabel = (source?: string) =>
+ source === 'LOCAL' || !source
+ ? intl.formatMessage({
+ id: 'pages.userGroups.sourceLocal',
+ defaultMessage: '本地',
+ })
+ : source;
const loadGroup = React.useCallback(async () => {
try {
@@ -273,7 +280,7 @@ const UserGroupDetailContent: React.FC = () => {
dataIndex: ['user', 'role'],
width: 110,
search: false,
- render: (_, item) => {item.user.role},
+ render: (_, item) => {item.user.role},
},
{
title: intl.formatMessage({
@@ -285,19 +292,19 @@ const UserGroupDetailContent: React.FC = () => {
search: false,
render: (_, item) =>
item.direct ? (
-
+
{intl.formatMessage({
id: 'pages.userGroups.detail.directMember',
defaultMessage: '直接成员',
})}
-
+
) : (
-
+
{intl.formatMessage({
id: 'pages.userGroups.detail.inheritedMember',
defaultMessage: '继承成员',
})}
-
+
),
},
{
@@ -378,7 +385,7 @@ const UserGroupDetailContent: React.FC = () => {
dataIndex: 'role',
width: 120,
search: false,
- render: (_, user) => {user.role},
+ render: (_, user) => {user.role},
},
];
@@ -406,12 +413,12 @@ const UserGroupDetailContent: React.FC = () => {
}),
dataIndex: 'target_type',
render: () => (
-
+
{intl.formatMessage({
id: 'pages.userGroups.name',
defaultMessage: '用户组',
})}
-
+
),
},
{
@@ -443,11 +450,11 @@ const UserGroupDetailContent: React.FC = () => {
content={
group ? (
-
- {group.source}
-
+
+ {sourceLabel(group.source)}
+
{group.source !== 'LOCAL' && (
-
+
{intl.formatMessage(
{
id: 'pages.userGroups.detail.syncMode',
@@ -455,9 +462,9 @@ const UserGroupDetailContent: React.FC = () => {
},
{ mode: group.sync_mode },
)}
-
+
)}
-
+
{intl.formatMessage(
{
id: 'pages.userGroups.detail.memberCount',
@@ -465,8 +472,8 @@ const UserGroupDetailContent: React.FC = () => {
},
{ count: group.member_count || 0 },
)}
-
-
+
+
{intl.formatMessage(
{
id: 'pages.userGroups.detail.examCount',
@@ -474,7 +481,7 @@ const UserGroupDetailContent: React.FC = () => {
},
{ count: assignments.length },
)}
-
+
) : null
}
diff --git a/apps/admin/src/pages/System/Settings/UserGroups/index.tsx b/apps/admin/src/pages/System/Settings/UserGroups/index.tsx
index ce25c96..c487802 100644
--- a/apps/admin/src/pages/System/Settings/UserGroups/index.tsx
+++ b/apps/admin/src/pages/System/Settings/UserGroups/index.tsx
@@ -16,10 +16,10 @@ import {
Input,
Modal,
Space,
- Tag,
} from 'antd';
import dayjs from 'dayjs';
import React, { useRef, useState } from 'react';
+import { StatusTag, type StatusTagTone } from '@/components';
import { fetchEnvelope } from '@/utils/apiEnvelope';
import { requestErrorMessage } from '@/utils/request';
import './index.less';
@@ -29,11 +29,9 @@ interface GroupFormValues {
description?: string;
}
-const sourceColor = (source?: string) => {
- if (!source || source === 'LOCAL') return 'default';
- if (source === 'LOGTO') return 'blue';
- if (source === 'SCIM') return 'purple';
- return 'cyan';
+const sourceTone = (source?: string): StatusTagTone => {
+ if (!source || source === 'LOCAL') return 'neutral';
+ return 'info';
};
const UserGroupsContent: React.FC = () => {
@@ -44,6 +42,14 @@ const UserGroupsContent: React.FC = () => {
const [modalOpen, setModalOpen] = useState(false);
const [saving, setSaving] = useState(false);
+ const sourceLabel = (source?: string) =>
+ source === 'LOCAL' || !source
+ ? intl.formatMessage({
+ id: 'pages.userGroups.sourceLocal',
+ defaultMessage: '本地',
+ })
+ : source;
+
const openCreate = () => {
form.resetFields();
setModalOpen(true);
@@ -198,7 +204,9 @@ const UserGroupsContent: React.FC = () => {
width: 110,
search: false,
render: (_, group) => (
- {group.source}
+
+ {sourceLabel(group.source)}
+
),
},
{
diff --git a/apps/admin/src/pages/System/Settings/Users/index.less b/apps/admin/src/pages/System/Settings/Users/index.less
index 67a5977..a17596f 100644
--- a/apps/admin/src/pages/System/Settings/Users/index.less
+++ b/apps/admin/src/pages/System/Settings/Users/index.less
@@ -57,66 +57,6 @@ html.examora-dark .user-name-sub {
color: #a1a1aa;
}
-.user-role-tag.ant-tag {
- height: 22px;
- margin: 0;
- padding: 0 9px;
- color: #111827;
- font-size: 12px;
- font-weight: 600;
- line-height: 20px;
- background: linear-gradient(180deg, #f1f3f5 0%, #e7eaee 100%);
- border: 1px solid #d9dde3;
- border-radius: 6px;
-}
-
-html.examora-dark .user-role-tag.ant-tag {
- color: #e4e4e7;
- background: linear-gradient(180deg, #27272a 0%, #1c1c1c 100%);
- border-color: #3f3f46;
-}
-
-.user-status-tag.ant-tag {
- height: 22px;
- margin: 0;
- padding: 0 9px;
- font-size: 12px;
- font-weight: 600;
- line-height: 20px;
- border: 0;
- border-radius: 4px;
-}
-
-.user-status-active {
- color: #15803d;
- background: #dcfce7;
-}
-
-.user-status-inactive {
- color: #6b7280;
- background: #f3f4f6;
-}
-
-.user-status-suspended {
- color: #b91c1c;
- background: #fee2e2;
-}
-
-html.examora-dark .user-status-active {
- color: #86efac;
- background: rgba(20, 83, 45, 0.52);
-}
-
-html.examora-dark .user-status-inactive {
- color: #a1a1aa;
- background: rgba(63, 63, 70, 0.52);
-}
-
-html.examora-dark .user-status-suspended {
- color: #fca5a5;
- background: rgba(127, 29, 29, 0.52);
-}
-
.user-date {
font-size: 13px;
line-height: 18px;
diff --git a/apps/admin/src/pages/System/Settings/Users/index.tsx b/apps/admin/src/pages/System/Settings/Users/index.tsx
index 96f3584..8481099 100644
--- a/apps/admin/src/pages/System/Settings/Users/index.tsx
+++ b/apps/admin/src/pages/System/Settings/Users/index.tsx
@@ -29,11 +29,11 @@ import {
Row,
Select,
Space,
- Tag,
Tooltip,
} from 'antd';
import dayjs from 'dayjs';
import React, { useMemo, useRef, useState } from 'react';
+import { StatusTag } from '@/components';
import './index.less';
interface User {
@@ -144,6 +144,14 @@ const UserListContent: React.FC = () => {
[statusLabelMap],
);
+ const sourceLabel = (source?: string) =>
+ source === 'LOCAL' || !source
+ ? intl.formatMessage({
+ id: 'pages.users.source.LOCAL',
+ defaultMessage: '本地',
+ })
+ : source;
+
// valueEnums for ProTable
const roleValueEnum = useMemo(
() =>
@@ -400,11 +408,7 @@ const UserListContent: React.FC = () => {
valueEnum: roleValueEnum,
render: (_, user) => {
const roleKey = normalizeRole(user.role);
- return (
-
- {roleLabelMap[roleKey] || user.role}
-
- );
+ return {roleLabelMap[roleKey] || user.role};
},
},
{
@@ -420,11 +424,17 @@ const UserListContent: React.FC = () => {
render: (_, user) => {
const statusKey = normalizeStatus(user.status);
return (
-
{statusLabelMap[statusKey] || user.status}
-
+
);
},
},
@@ -447,7 +457,13 @@ const UserListContent: React.FC = () => {
OIDC: { text: 'OIDC' },
SCIM: { text: 'SCIM' },
},
- render: (_, user) => {user.source || 'LOCAL'},
+ render: (_, user) => (
+
+ {sourceLabel(user.source)}
+
+ ),
},
{
title: intl.formatMessage({
diff --git a/apps/admin/src/pages/Welcome/index.tsx b/apps/admin/src/pages/Welcome/index.tsx
index 73834a9..af20e6c 100644
--- a/apps/admin/src/pages/Welcome/index.tsx
+++ b/apps/admin/src/pages/Welcome/index.tsx
@@ -28,11 +28,11 @@ import {
Row,
Space,
Statistic,
- Tag,
Timeline,
Typography,
} from 'antd';
import React from 'react';
+import { StatusTag } from '@/components';
import TrendLineChart from './TrendLineChart';
import './welcome.less';
@@ -42,6 +42,11 @@ const Welcome: React.FC = () => {
const intl = useIntl();
const f = (id: string, values?: Record) =>
intl.formatMessage({ id }, values);
+ const metricTone = (tone: string) => {
+ if (tone === 'amber') return 'warning';
+ if (tone === 'green') return 'success';
+ return 'info';
+ };
const weekDays = [
f('pages.dashboard.week.mon'),
f('pages.dashboard.week.tue'),
@@ -313,9 +318,9 @@ const Welcome: React.FC = () => {
{f('pages.dashboard.hero.kicker')}
-
+
Examora Admin
-
+