Add workplaceNumber field to user authentication and statistics API. Update frontend components and localization to support new field. Enhance user experience by displaying workplace information in relevant areas.
This commit is contained in:
@@ -49,6 +49,11 @@ export const ParticipantsProgress: React.FC<ParticipantsProgressProps> = ({ part
|
||||
<VStack align="stretch" gap={3}>
|
||||
{/* Participant Header */}
|
||||
<Box>
|
||||
{participant.workplaceNumber && (
|
||||
<Text fontSize="xs" color="gray.500" mb={1}>
|
||||
{participant.workplaceNumber}
|
||||
</Text>
|
||||
)}
|
||||
<Text fontSize="lg" fontWeight="bold" color="teal.700">
|
||||
{participant.nickname}
|
||||
</Text>
|
||||
|
||||
@@ -482,9 +482,16 @@ export const SubmissionsPage: React.FC = () => {
|
||||
transition="all 0.2s"
|
||||
>
|
||||
<HStack justify="space-between" mb={2} gap={2}>
|
||||
<Text fontSize="sm" fontWeight="medium" truncate maxW="180px">
|
||||
{participant.nickname}
|
||||
</Text>
|
||||
<VStack align="start" gap={0}>
|
||||
{participant.workplaceNumber && (
|
||||
<Text fontSize="xs" color="gray.500">
|
||||
{participant.workplaceNumber}
|
||||
</Text>
|
||||
)}
|
||||
<Text fontSize="sm" fontWeight="medium" truncate maxW="180px">
|
||||
{participant.nickname}
|
||||
</Text>
|
||||
</VStack>
|
||||
<Badge colorPalette={colorPalette} size="sm">
|
||||
{participant.progressPercent}%
|
||||
</Badge>
|
||||
@@ -520,6 +527,7 @@ export const SubmissionsPage: React.FC = () => {
|
||||
<Table.Header>
|
||||
<Table.Row>
|
||||
<Table.ColumnHeader>{t('challenge.admin.submissions.table.user')}</Table.ColumnHeader>
|
||||
<Table.ColumnHeader>{t('challenge.admin.submissions.table.workplace')}</Table.ColumnHeader>
|
||||
<Table.ColumnHeader>{t('challenge.admin.submissions.table.task')}</Table.ColumnHeader>
|
||||
<Table.ColumnHeader>{t('challenge.admin.submissions.table.status')}</Table.ColumnHeader>
|
||||
<Table.ColumnHeader>{t('challenge.admin.submissions.table.attempt')}</Table.ColumnHeader>
|
||||
@@ -542,6 +550,11 @@ export const SubmissionsPage: React.FC = () => {
|
||||
? rawUser
|
||||
: ''
|
||||
|
||||
const workplaceNumber =
|
||||
rawUser && typeof rawUser === 'object' && 'workplaceNumber' in rawUser
|
||||
? rawUser.workplaceNumber ?? ''
|
||||
: ''
|
||||
|
||||
const title =
|
||||
rawTask && typeof rawTask === 'object' && 'title' in rawTask
|
||||
? (rawTask.title ?? '')
|
||||
@@ -552,6 +565,11 @@ export const SubmissionsPage: React.FC = () => {
|
||||
return (
|
||||
<Table.Row key={submission.id}>
|
||||
<Table.Cell fontWeight="medium">{nickname}</Table.Cell>
|
||||
<Table.Cell>
|
||||
<Text fontSize="sm" color="gray.600">
|
||||
{workplaceNumber || '—'}
|
||||
</Text>
|
||||
</Table.Cell>
|
||||
<Table.Cell>{title}</Table.Cell>
|
||||
<Table.Cell>
|
||||
<StatusBadge status={submission.status} />
|
||||
|
||||
@@ -61,6 +61,7 @@ export const UsersPage: React.FC = () => {
|
||||
<Table.Header>
|
||||
<Table.Row>
|
||||
<Table.ColumnHeader>{t('challenge.admin.users.table.nickname')}</Table.ColumnHeader>
|
||||
<Table.ColumnHeader>{t('challenge.admin.users.table.workplace')}</Table.ColumnHeader>
|
||||
<Table.ColumnHeader>{t('challenge.admin.users.table.id')}</Table.ColumnHeader>
|
||||
<Table.ColumnHeader>{t('challenge.admin.users.stats.total.submissions')}</Table.ColumnHeader>
|
||||
<Table.ColumnHeader>{t('challenge.admin.users.stats.completed')}</Table.ColumnHeader>
|
||||
@@ -71,6 +72,11 @@ export const UsersPage: React.FC = () => {
|
||||
{filteredUsers.map((user) => (
|
||||
<Table.Row key={user.userId}>
|
||||
<Table.Cell fontWeight="medium">{user.nickname}</Table.Cell>
|
||||
<Table.Cell>
|
||||
<Text fontSize="sm" color="gray.600">
|
||||
{user.workplaceNumber || '—'}
|
||||
</Text>
|
||||
</Table.Cell>
|
||||
<Table.Cell>
|
||||
<Text fontSize="xs" fontFamily="monospace" color="gray.600">
|
||||
{user.userId}
|
||||
|
||||
Reference in New Issue
Block a user