Files
worklenz/worklenz-frontend/src/components/board/subTaskCard/SubTaskCard.tsx
chamiakJ 591d348ae5 feat(localization): update and enhance localization files for multiple languages
- Updated localization files for various languages, including English, German, Spanish, Portuguese, and Chinese, to ensure consistency and accuracy across the application.
- Added new keys and updated existing ones to support recent UI changes and features, particularly in project views, task lists, and admin center settings.
- Enhanced the structure of localization files to improve maintainability and facilitate future updates.
- Implemented performance optimizations in the frontend components to better handle localization data.
2025-07-28 07:19:55 +05:30

168 lines
4.6 KiB
TypeScript

import React, { useEffect, useState } from 'react';
import {
Avatar,
Col,
DatePicker,
Divider,
Flex,
Row,
Tooltip,
Typography,
} from '@/shared/antd-imports';
import StatusDropdown from '../../taskListCommon/statusDropdown/StatusDropdown';
import dayjs, { Dayjs } from 'dayjs';
import { useTranslation } from 'react-i18next';
import { IProjectTask } from '@/types/project/projectTasksViewModel.types';
import Avatars from '@/components/avatars/avatars';
interface SubTaskProps {
subtask: IProjectTask;
}
const SubTaskCard: React.FC<SubTaskProps> = ({ subtask }) => {
const [isSubToday, setIsSubToday] = useState(false);
const [isSubTomorrow, setIsSubTomorrow] = useState(false);
const [isItSubPrevDate, setIsItSubPrevDate] = useState(false);
const [subTaskDueDate, setSubTaskDueDate] = useState<Dayjs | null>(null);
const { t } = useTranslation('kanban-board');
const handleSubTaskDateChange = (date: Dayjs | null) => {
setSubTaskDueDate(date);
};
const formatDate = (date: Dayjs | null) => {
if (!date) return '';
const today = dayjs();
const tomorrow = today.add(1, 'day');
if (date.isSame(today, 'day')) {
return 'Today';
} else if (date.isSame(tomorrow, 'day')) {
return 'Tomorrow';
} else {
return date.isSame(today, 'year') ? date.format('MMM DD') : date.format('MMM DD, YYYY');
}
};
useEffect(() => {
if (subTaskDueDate) {
setIsSubToday(subTaskDueDate.isSame(dayjs(), 'day'));
setIsSubTomorrow(subTaskDueDate.isSame(dayjs().add(1, 'day'), 'day'));
setIsItSubPrevDate(subTaskDueDate.isBefore(dayjs()));
} else {
setIsSubToday(false);
setIsSubTomorrow(false);
setIsItSubPrevDate(false);
}
}, [subTaskDueDate]);
return (
<Row
key={subtask.id}
style={{
marginTop: '0.5rem',
width: '100%',
}}
>
<Col span={10}>
<Typography.Text
style={{ fontWeight: 500, fontSize: '12px' }}
delete={subtask.status === 'done'}
>
{subtask.name}
</Typography.Text>
</Col>
<Col span={4}>
<Avatar.Group
size="small"
max={{
count: 1,
style: {
color: '#f56a00',
backgroundColor: '#fde3cf',
},
}}
>
<Avatars members={subtask.names || []} />
</Avatar.Group>
</Col>
<Col span={10}>
<Flex>
<DatePicker
className={`custom-placeholder ${!subTaskDueDate ? 'empty-date' : isSubToday || isSubTomorrow ? 'selected-date' : isItSubPrevDate ? 'red-colored' : ''}`}
placeholder={t('dueDate')}
style={{
fontSize: '12px',
opacity: subTaskDueDate ? 1 : 0,
}}
onChange={handleSubTaskDateChange}
variant="borderless"
size="small"
suffixIcon={false}
format={value => formatDate(value)}
/>
<div>
<StatusDropdown currentStatus={subtask.status} />
</div>
</Flex>
</Col>
{/* <div
style={{
display: 'flex',
justifyContent: 'space-between',
}}
>
<Typography.Text
style={{ fontWeight: 500 }}
delete={subtask.status === 'done'}
>
{subtask.task}
</Typography.Text>
<StatusDropdown currentStatus={subtask.status} />
</div>
<div style={{ display: 'flex' }}>
<Avatar.Group
size="small"
max={{
count: 1,
style: {
color: '#f56a00',
backgroundColor: '#fde3cf',
},
}}
>
{subtask.members?.map((member) => (
<Avatar
style={{
backgroundColor: AvatarNamesMap[member.memberName.charAt(0)],
fontSize: '12px',
}}
size="small"
>
{member.memberName.charAt(0)}
</Avatar>
))}
</Avatar.Group>
<DatePicker
className={`custom-placeholder ${!subTaskDueDate ? 'empty-date' : isSubToday || isSubTomorrow ? 'selected-date' : isItSubPrevDate ? 'red-colored' : ''}`}
placeholder="Due date"
style={{
fontSize: '12px',
opacity: subTaskDueDate ? 1 : 0,
}}
onChange={handleSubTaskDateChange}
variant="borderless"
size="small"
suffixIcon={false}
format={(value) => formatDate(value)}
/>
</div> */}
<Divider style={{ margin: '5px' }} />
</Row>
);
};
export default SubTaskCard;