diff --git a/.cursor/rules/antd-components.mdc b/.cursor/rules/antd-components.mdc new file mode 100644 index 00000000..7db5eb05 --- /dev/null +++ b/.cursor/rules/antd-components.mdc @@ -0,0 +1,237 @@ +--- +alwaysApply: true +--- +# Ant Design Import Rules for Worklenz + +## 🚨 CRITICAL: Always Use Centralized Imports + +**NEVER import Ant Design components directly from 'antd' or '@ant-design/icons'** + +### ✅ Correct Import Pattern +```typescript +import { Button, Input, Select, EditOutlined, PlusOutlined } from '@antd-imports'; +// or +import { Button, Input, Select, EditOutlined, PlusOutlined } from '@/shared/antd-imports'; +``` + +### ❌ Forbidden Import Patterns +```typescript +// NEVER do this: +import { Button, Input, Select } from 'antd'; +import { EditOutlined, PlusOutlined } from '@ant-design/icons'; +``` + +## Why This Rule Exists + +### Benefits of Centralized Imports: +- **Better Tree-Shaking**: Optimized bundle size through centralized management +- **Consistent React Context**: Proper context sharing across components +- **Type Safety**: Centralized TypeScript definitions +- **Maintainability**: Single source of truth for all Ant Design imports +- **Performance**: Reduced bundle size and improved loading times + +## What's Available in `@antd-imports` + +### Core Components +- **Layout**: Layout, Row, Col, Flex, Divider, Space +- **Navigation**: Menu, Tabs, Breadcrumb, Pagination +- **Data Entry**: Input, Select, DatePicker, TimePicker, Form, Checkbox, InputNumber +- **Data Display**: Table, List, Card, Tag, Avatar, Badge, Progress, Statistic +- **Feedback**: Modal, Drawer, Alert, Message, Notification, Spin, Skeleton, Result +- **Other**: Button, Typography, Tooltip, Popconfirm, Dropdown, ConfigProvider + +### Icons +Common icons including: EditOutlined, DeleteOutlined, PlusOutlined, MoreOutlined, CheckOutlined, CloseOutlined, CalendarOutlined, UserOutlined, TeamOutlined, and many more. + +### Utilities +- **appMessage**: Centralized message utility +- **appNotification**: Centralized notification utility +- **antdConfig**: Default Ant Design configuration +- **taskManagementAntdConfig**: Task-specific configuration + +## Implementation Guidelines + +### When Creating New Components: +1. **Always** import from `@/shared/antd-imports` +2. Use `appMessage` and `appNotification` for user feedback +3. Apply `antdConfig` for consistent styling +4. Use `taskManagementAntdConfig` for task-related components + +### When Refactoring Existing Code: +1. Replace direct 'antd' imports with `@/shared/antd-imports` +2. Replace direct '@ant-design/icons' imports with `@/shared/antd-imports` +3. Update any custom message/notification calls to use the utilities + +### File Location +The centralized import file is located at: `worklenz-frontend/src/shared/antd-imports.ts` + +## Examples + +### Component Creation +```typescript +import React from 'react'; +import { Button, Input, Modal, EditOutlined, appMessage } from '@antd-imports'; + +const MyComponent = () => { + const handleClick = () => { + appMessage.success('Operation completed!'); + }; + + return ( + + ); +}; +``` + +### Form Implementation +```typescript +import { Form, Input, Select, Button, DatePicker } from '@antd-imports'; + +const MyForm = () => { + return ( +
+ + + + + + + + ({ - value: option, - text: option.toString(), + value: option.value, + label: option.value.toString(), + disabled: option.disabled, }))} onChange={setSelectedSeatCount} /> @@ -365,31 +371,31 @@ const UpgradePlans = () => { - + {/* Free Plan */} {t('freePlan')}} + title={{t('freePlan', 'Free Plan')}} onClick={() => setSelectedCard(paddlePlans.FREE)} >
$ 0.00 - {t('freeForever')} + {t('freeForever', 'Free Forever')} - {t('bestForPersonalUse')} + {t('bestForPersonalUse', 'Best for Personal Use')}
- {renderFeature(`${plans.free_tier_storage} ${t('storage')}`)} - {renderFeature(`${plans.projects_limit} ${t('projects')}`)} - {renderFeature(`${plans.team_member_limit} ${t('teamMembers')}`)} + {renderFeature(`${plans.free_tier_storage} ${t('storage', 'Storage')}`)} + {renderFeature(`${plans.projects_limit} ${t('projects', 'Projects')}`)} + {renderFeature(`${plans.team_member_limit} ${t('teamMembers', 'Team Members')}`)}
@@ -401,9 +407,9 @@ const UpgradePlans = () => { hoverable title={ - {t('annualPlan')}{' '} + {t('annualPlan', 'Annual Plan')}{' '} - {t('tag')} + {t('tag', 'Popular')} } @@ -429,16 +435,16 @@ const UpgradePlans = () => {
- {t('billedAnnually')} + {t('billedAnnually', 'Billed Annually')}
- {renderFeature(t('startupText01'))} - {renderFeature(t('startupText02'))} - {renderFeature(t('startupText03'))} - {renderFeature(t('startupText04'))} - {renderFeature(t('startupText05'))} + {renderFeature(t('startupText01', 'Unlimited Projects'))} + {renderFeature(t('startupText02', 'Unlimited Team Members'))} + {renderFeature(t('startupText03', 'Unlimited Storage'))} + {renderFeature(t('startupText04', 'Priority Support'))} + {renderFeature(t('startupText05', 'Advanced Analytics'))}
@@ -448,7 +454,7 @@ const UpgradePlans = () => { {t('monthlyPlan')}} + title={{t('monthlyPlan', 'Monthly Plan')}} onClick={() => setSelectedCard(paddlePlans.MONTHLY)} >
@@ -469,16 +475,16 @@ const UpgradePlans = () => { - {t('billedMonthly')} + {t('billedMonthly', 'Billed Monthly')}
- {renderFeature(t('startupText01'))} - {renderFeature(t('startupText02'))} - {renderFeature(t('startupText03'))} - {renderFeature(t('startupText04'))} - {renderFeature(t('startupText05'))} + {renderFeature(t('startupText01', 'Unlimited Projects'))} + {renderFeature(t('startupText02', 'Unlimited Team Members'))} + {renderFeature(t('startupText03', 'Unlimited Storage'))} + {renderFeature(t('startupText04', 'Priority Support'))} + {renderFeature(t('startupText05', 'Advanced Analytics'))}
@@ -509,8 +515,8 @@ const UpgradePlans = () => { disabled={billingInfo?.plan_id === plans.annual_plan_id} > {billingInfo?.status === SUBSCRIPTION_STATUS.ACTIVE - ? t('changeToPlan', { plan: t('annualPlan') }) - : t('continueWith', { plan: t('annualPlan') })} + ? t('changeToPlan', 'Change to {{plan}}', { plan: t('annualPlan', 'Annual Plan') }) + : t('continueWith', 'Continue with {{plan}}', { plan: t('annualPlan', 'Annual Plan') })} )} {selectedPlan === paddlePlans.MONTHLY && ( @@ -522,8 +528,8 @@ const UpgradePlans = () => { disabled={billingInfo?.plan_id === plans.monthly_plan_id} > {billingInfo?.status === SUBSCRIPTION_STATUS.ACTIVE - ? t('changeToPlan', { plan: t('monthlyPlan') }) - : t('continueWith', { plan: t('monthlyPlan') })} + ? t('changeToPlan', 'Change to {{plan}}', { plan: t('monthlyPlan', 'Monthly Plan') }) + : t('continueWith', 'Continue with {{plan}}', { plan: t('monthlyPlan', 'Monthly Plan') })} )} diff --git a/worklenz-frontend/src/components/admin-center/configuration/configuration.tsx b/worklenz-frontend/src/components/admin-center/configuration/configuration.tsx index afa5b51a..c01f82f9 100644 --- a/worklenz-frontend/src/components/admin-center/configuration/configuration.tsx +++ b/worklenz-frontend/src/components/admin-center/configuration/configuration.tsx @@ -1,5 +1,5 @@ -import { Button, Card, Col, Divider, Form, Input, notification, Row, Select } from 'antd'; -import React, { useEffect, useState } from 'react'; +import { Button, Card, Col, Divider, Form, Input, Row, Select } from '@/shared/antd-imports'; +import React, { useEffect, useState, useMemo, useCallback } from 'react'; import { RootState } from '../../../app/store'; import { useAppSelector } from '@/hooks/useAppSelector'; import { IBillingConfigurationCountry } from '@/types/admin-center/country.types'; @@ -7,14 +7,15 @@ import { adminCenterApiService } from '@/api/admin-center/admin-center.api.servi import { IBillingConfiguration } from '@/types/admin-center/admin-center.types'; import logger from '@/utils/errorLogger'; -const Configuration: React.FC = () => { +const Configuration: React.FC = React.memo(() => { const themeMode = useAppSelector((state: RootState) => state.themeReducer.mode); const [countries, setCountries] = useState([]); const [configuration, setConfiguration] = useState(); const [loading, setLoading] = useState(false); const [form] = Form.useForm(); - const fetchCountries = async () => { + + const fetchCountries = useCallback(async () => { try { const res = await adminCenterApiService.getCountries(); if (res.done) { @@ -23,61 +24,85 @@ const Configuration: React.FC = () => { } catch (error) { logger.error('Error fetching countries:', error); } - }; + }, []); - const fetchConfiguration = async () => { + const fetchConfiguration = useCallback(async () => { const res = await adminCenterApiService.getBillingConfiguration(); if (res.done) { setConfiguration(res.body); form.setFieldsValue(res.body); } - }; + }, [form]); useEffect(() => { fetchCountries(); fetchConfiguration(); - }, []); + }, [fetchCountries, fetchConfiguration]); - const handleSave = async (values: any) => { - try { - setLoading(true); - const res = await adminCenterApiService.updateBillingConfiguration(values); - if (res.done) { - fetchConfiguration(); + const handleSave = useCallback( + async (values: any) => { + try { + setLoading(true); + const res = await adminCenterApiService.updateBillingConfiguration(values); + if (res.done) { + fetchConfiguration(); + } + } catch (error) { + logger.error('Error updating configuration:', error); + } finally { + setLoading(false); } - } catch (error) { - logger.error('Error updating configuration:', error); - } finally { - setLoading(false); - } - }; + }, + [fetchConfiguration] + ); - const countryOptions = countries.map(country => ({ - label: country.name, - value: country.id, - })); + const countryOptions = useMemo( + () => + countries.map(country => ({ + label: country.name, + value: country.id, + })), + [countries] + ); + + const titleStyle = useMemo( + () => ({ + color: `${themeMode === 'dark' ? '#ffffffd9' : '#000000d9'}`, + fontWeight: 500, + fontSize: '16px', + display: 'flex', + gap: '4px', + }), + [themeMode] + ); + + const dividerTitleStyle = useMemo( + () => ({ + color: `${themeMode === 'dark' ? '#ffffffd9' : '#000000d9'}`, + fontWeight: 600, + fontSize: '16px', + display: 'flex', + gap: '4px', + }), + [themeMode] + ); + + const cardStyle = useMemo(() => ({ marginTop: '16px' }), []); + const colStyle = useMemo(() => ({ padding: '0 12px', height: '86px' }), []); + const dividerStyle = useMemo(() => ({ margin: '16px 0' }), []); + const buttonColStyle = useMemo(() => ({ paddingLeft: '12px' }), []); + + const handlePhoneInput = useCallback((e: React.FormEvent) => { + const input = e.target as HTMLInputElement; + input.value = input.value.replace(/[^0-9]/g, ''); + }, []); return (
- - Billing Details - - } - style={{ marginTop: '16px' }} - > + Billing Details} style={cardStyle}> - - + + { }, ]} > - + - + { }, ]} > - + - + { }, ]} > - { - const input = e.target as HTMLInputElement; // Type assertion to access 'value' - input.value = input.value.replace(/[^0-9]/g, ''); // Restrict non-numeric input - }} - /> + - - - Company Details - + + Company Details - - + + - + - + - - + + - + - - + + - + - @@ -212,6 +213,8 @@ const Configuration: React.FC = () => {
); -}; +}); + +Configuration.displayName = 'Configuration'; export default Configuration; diff --git a/worklenz-frontend/src/components/admin-center/overview/organization-admins-table/organization-admins-table.tsx b/worklenz-frontend/src/components/admin-center/overview/organization-admins-table/organization-admins-table.tsx index 4e757d28..b563f9e7 100644 --- a/worklenz-frontend/src/components/admin-center/overview/organization-admins-table/organization-admins-table.tsx +++ b/worklenz-frontend/src/components/admin-center/overview/organization-admins-table/organization-admins-table.tsx @@ -1,4 +1,4 @@ -import { Table, TableProps, Typography } from 'antd'; +import { Table, TableProps, Typography } from '@/shared/antd-imports'; import React, { useMemo } from 'react'; import { IOrganizationAdmin } from '@/types/admin-center/admin-center.types'; diff --git a/worklenz-frontend/src/components/admin-center/overview/organization-name/organization-name.tsx b/worklenz-frontend/src/components/admin-center/overview/organization-name/organization-name.tsx index 0a4a6b46..d86ea72d 100644 --- a/worklenz-frontend/src/components/admin-center/overview/organization-name/organization-name.tsx +++ b/worklenz-frontend/src/components/admin-center/overview/organization-name/organization-name.tsx @@ -1,9 +1,8 @@ import { adminCenterApiService } from '@/api/admin-center/admin-center.api.service'; import logger from '@/utils/errorLogger'; -import { EnterOutlined, EditOutlined } from '@ant-design/icons'; -import { Card, Button, Tooltip, Typography } from 'antd'; +import { EnterOutlined, EditOutlined } from '@/shared/antd-imports'; +import { Card, Button, Tooltip, Typography } from '@/shared/antd-imports'; import TextArea from 'antd/es/input/TextArea'; -import Paragraph from 'antd/es/typography/Paragraph'; import { TFunction } from 'i18next'; import { useState, useEffect } from 'react'; diff --git a/worklenz-frontend/src/components/admin-center/overview/organization-owner/organization-owner.tsx b/worklenz-frontend/src/components/admin-center/overview/organization-owner/organization-owner.tsx index 505f8f03..1a28cc42 100644 --- a/worklenz-frontend/src/components/admin-center/overview/organization-owner/organization-owner.tsx +++ b/worklenz-frontend/src/components/admin-center/overview/organization-owner/organization-owner.tsx @@ -1,8 +1,8 @@ import { adminCenterApiService } from '@/api/admin-center/admin-center.api.service'; import { IOrganization } from '@/types/admin-center/admin-center.types'; import logger from '@/utils/errorLogger'; -import { MailOutlined, PhoneOutlined, EditOutlined } from '@ant-design/icons'; -import { Card, Tooltip, Input, Button, Typography, InputRef } from 'antd'; +import { MailOutlined, PhoneOutlined, EditOutlined } from '@/shared/antd-imports'; +import { Card, Tooltip, Input, Button, Typography, InputRef } from '@/shared/antd-imports'; import { TFunction } from 'i18next'; import { useEffect, useRef, useState } from 'react'; diff --git a/worklenz-frontend/src/components/admin-center/teams/add-team-drawer/add-team-drawer.tsx b/worklenz-frontend/src/components/admin-center/teams/add-team-drawer/add-team-drawer.tsx index 06a24da3..9626e09b 100644 --- a/worklenz-frontend/src/components/admin-center/teams/add-team-drawer/add-team-drawer.tsx +++ b/worklenz-frontend/src/components/admin-center/teams/add-team-drawer/add-team-drawer.tsx @@ -1,5 +1,5 @@ import React, { useRef, useState } from 'react'; -import { Button, Drawer, Form, Input, InputRef, Typography } from 'antd'; +import { Button, Drawer, Form, Input, InputRef, Typography } from '@/shared/antd-imports'; import { fetchTeams } from '@features/teams/teamSlice'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import { useTranslation } from 'react-i18next'; diff --git a/worklenz-frontend/src/components/admin-center/teams/settings-drawer/settings-drawer.tsx b/worklenz-frontend/src/components/admin-center/teams/settings-drawer/settings-drawer.tsx index ff8e8bc0..148899b7 100644 --- a/worklenz-frontend/src/components/admin-center/teams/settings-drawer/settings-drawer.tsx +++ b/worklenz-frontend/src/components/admin-center/teams/settings-drawer/settings-drawer.tsx @@ -11,7 +11,7 @@ import { TableProps, Typography, Tooltip, -} from 'antd'; +} from '@/shared/antd-imports'; import React, { useState } from 'react'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import './settings-drawer.css'; diff --git a/worklenz-frontend/src/components/admin-center/teams/teams-table/teams-table.tsx b/worklenz-frontend/src/components/admin-center/teams/teams-table/teams-table.tsx index 91748681..1ea75af2 100644 --- a/worklenz-frontend/src/components/admin-center/teams/teams-table/teams-table.tsx +++ b/worklenz-frontend/src/components/admin-center/teams/teams-table/teams-table.tsx @@ -5,8 +5,8 @@ import { toggleSettingDrawer, deleteTeam, fetchTeams } from '@/features/teams/te import { useAppDispatch } from '@/hooks/useAppDispatch'; import { IOrganizationTeam } from '@/types/admin-center/admin-center.types'; import logger from '@/utils/errorLogger'; -import { SettingOutlined, DeleteOutlined } from '@ant-design/icons'; -import { Badge, Button, Card, Popconfirm, Table, TableProps, Tooltip, Typography } from 'antd'; +import { SettingOutlined, DeleteOutlined } from '@/shared/antd-imports'; +import { Badge, Button, Card, Popconfirm, Table, TableProps, Tooltip, Typography } from '@/shared/antd-imports'; import { TFunction } from 'i18next'; import { useState } from 'react'; import { useMediaQuery } from 'react-responsive'; diff --git a/worklenz-frontend/src/components/avatars/avatars.tsx b/worklenz-frontend/src/components/avatars/avatars.tsx index bd3b160e..f33cdf6c 100644 --- a/worklenz-frontend/src/components/avatars/avatars.tsx +++ b/worklenz-frontend/src/components/avatars/avatars.tsx @@ -1,4 +1,4 @@ -import { Avatar, Tooltip } from 'antd'; +import { Avatar, Tooltip } from '@/shared/antd-imports'; import React, { useCallback, useMemo } from 'react'; import { InlineMember } from '@/types/teamMembers/inlineMember.types'; diff --git a/worklenz-frontend/src/components/board/board-assignee-selector/board-assignee-selector.tsx b/worklenz-frontend/src/components/board/board-assignee-selector/board-assignee-selector.tsx index 308b2482..27604a44 100644 --- a/worklenz-frontend/src/components/board/board-assignee-selector/board-assignee-selector.tsx +++ b/worklenz-frontend/src/components/board/board-assignee-selector/board-assignee-selector.tsx @@ -15,7 +15,7 @@ import { useAppSelector } from '@/hooks/useAppSelector'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import { toggleProjectMemberDrawer } from '../../../features/projects/singleProject/members/projectMembersSlice'; import { colors } from '../../../styles/colors'; -import { PlusOutlined, UsergroupAddOutlined } from '@ant-design/icons'; +import { PlusOutlined, UsergroupAddOutlined } from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; import SingleAvatar from '@/components/common/single-avatar/single-avatar'; import { CheckboxChangeEvent } from 'antd/es/checkbox'; diff --git a/worklenz-frontend/src/components/board/changeCategoryDropdown/ChangeCategoryDropdown.tsx b/worklenz-frontend/src/components/board/changeCategoryDropdown/ChangeCategoryDropdown.tsx index 3e577c2e..1b5e59ba 100644 --- a/worklenz-frontend/src/components/board/changeCategoryDropdown/ChangeCategoryDropdown.tsx +++ b/worklenz-frontend/src/components/board/changeCategoryDropdown/ChangeCategoryDropdown.tsx @@ -1,9 +1,9 @@ -import { Badge, Card, Dropdown, Flex, Menu, MenuProps } from 'antd'; +import { Badge, Card, Dropdown, Flex, Menu, MenuProps } from '@/shared/antd-imports'; import React from 'react'; import { TaskStatusType } from '../../../types/task.types'; import { colors } from '../../../styles/colors'; import { useAppDispatch } from '@/hooks/useAppDispatch'; -import { RetweetOutlined, RightOutlined } from '@ant-design/icons'; +import { RetweetOutlined, RightOutlined } from '@/shared/antd-imports'; import './ChangeCategoryDropdown.css'; import { updateStatusCategory } from '../../../features/projects/status/StatusSlice'; import { useTranslation } from 'react-i18next'; diff --git a/worklenz-frontend/src/components/board/common-members-section/common-members-section.tsx b/worklenz-frontend/src/components/board/common-members-section/common-members-section.tsx index b4aca42f..c4c0411c 100644 --- a/worklenz-frontend/src/components/board/common-members-section/common-members-section.tsx +++ b/worklenz-frontend/src/components/board/common-members-section/common-members-section.tsx @@ -1,12 +1,12 @@ import React, { useEffect, useRef, useState } from 'react'; -import { Button, Dropdown, Input, InputRef, MenuProps, Typography } from 'antd'; +import { Button, Dropdown, Input, InputRef, MenuProps, Typography } from '@/shared/antd-imports'; import { DeleteOutlined, EditOutlined, LoadingOutlined, MoreOutlined, PlusOutlined, -} from '@ant-design/icons'; +} from '@/shared/antd-imports'; import { setTaskCardDisabled, initializeStatus } from '../../../features/board/create-card.slice'; import { TaskType } from '../../../types/task.types'; import TaskCreateCard from '../taskCreateCard/TaskCreateCard'; diff --git a/worklenz-frontend/src/components/board/common-phase-section/common-phase-section.tsx b/worklenz-frontend/src/components/board/common-phase-section/common-phase-section.tsx index 54e5dd9c..3e1b0333 100644 --- a/worklenz-frontend/src/components/board/common-phase-section/common-phase-section.tsx +++ b/worklenz-frontend/src/components/board/common-phase-section/common-phase-section.tsx @@ -1,12 +1,12 @@ import React, { useEffect, useRef, useState } from 'react'; -import { Button, Dropdown, Input, InputRef, MenuProps, Typography } from 'antd'; +import { Button, Dropdown, Input, InputRef, MenuProps, Typography } from '@/shared/antd-imports'; import { DeleteOutlined, EditOutlined, LoadingOutlined, MoreOutlined, PlusOutlined, -} from '@ant-design/icons'; +} from '@/shared/antd-imports'; import { setTaskCardDisabled, initializeStatus } from '../../../features/board/create-card.slice'; import { TaskType } from '../../../types/task.types'; import TaskCreateCard from '../taskCreateCard/TaskCreateCard'; diff --git a/worklenz-frontend/src/components/board/common-priority-section/common-priority-section.tsx b/worklenz-frontend/src/components/board/common-priority-section/common-priority-section.tsx index d718acfd..f2c04e51 100644 --- a/worklenz-frontend/src/components/board/common-priority-section/common-priority-section.tsx +++ b/worklenz-frontend/src/components/board/common-priority-section/common-priority-section.tsx @@ -1,12 +1,12 @@ import React, { useEffect, useRef, useState } from 'react'; -import { Button, Dropdown, Input, InputRef, MenuProps, Typography } from 'antd'; +import { Button, Dropdown, Input, InputRef, MenuProps, Typography } from '@/shared/antd-imports'; import { DeleteOutlined, EditOutlined, LoadingOutlined, MoreOutlined, PlusOutlined, -} from '@ant-design/icons'; +} from '@/shared/antd-imports'; import { setTaskCardDisabled, initializeStatus } from '../../../features/board/create-card.slice'; import { TaskType } from '../../../types/task.types'; import TaskCreateCard from '../taskCreateCard/TaskCreateCard'; diff --git a/worklenz-frontend/src/components/board/commonStatusSection/CommonStatusSection.tsx b/worklenz-frontend/src/components/board/commonStatusSection/CommonStatusSection.tsx index bcb67b73..af36a9c5 100644 --- a/worklenz-frontend/src/components/board/commonStatusSection/CommonStatusSection.tsx +++ b/worklenz-frontend/src/components/board/commonStatusSection/CommonStatusSection.tsx @@ -1,12 +1,12 @@ import React, { useEffect, useRef, useState } from 'react'; -import { Button, Dropdown, Input, InputRef, MenuProps, Typography } from 'antd'; +import { Button, Dropdown, Input, InputRef, MenuProps, Typography } from '@/shared/antd-imports'; import { DeleteOutlined, EditOutlined, LoadingOutlined, MoreOutlined, PlusOutlined, -} from '@ant-design/icons'; +} from '@/shared/antd-imports'; import { setTaskCardDisabled, initializeStatus } from '../../../features/board/create-card.slice'; import { TaskType } from '../../../types/task.types'; import TaskCreateCard from '../taskCreateCard/TaskCreateCard'; diff --git a/worklenz-frontend/src/components/board/custom-avatar-group.tsx b/worklenz-frontend/src/components/board/custom-avatar-group.tsx index 74668782..a69133e6 100644 --- a/worklenz-frontend/src/components/board/custom-avatar-group.tsx +++ b/worklenz-frontend/src/components/board/custom-avatar-group.tsx @@ -1,4 +1,4 @@ -import { Button, Flex } from 'antd'; +import { Button, Flex } from '@/shared/antd-imports'; import AddMembersDropdown from '@/components/add-members-dropdown/add-members-dropdown'; import Avatars from '../avatars/avatars'; import { IProjectTask } from '@/types/project/projectTasksViewModel.types'; diff --git a/worklenz-frontend/src/components/board/custom-due-date-picker.tsx b/worklenz-frontend/src/components/board/custom-due-date-picker.tsx index 5f5a25b0..ff68110e 100644 --- a/worklenz-frontend/src/components/board/custom-due-date-picker.tsx +++ b/worklenz-frontend/src/components/board/custom-due-date-picker.tsx @@ -1,6 +1,6 @@ import React, { useState, useRef } from 'react'; -import { DatePicker, Button, Flex } from 'antd'; -import { CalendarOutlined } from '@ant-design/icons'; +import { DatePicker, Button, Flex } from '@/shared/antd-imports'; +import { CalendarOutlined } from '@/shared/antd-imports'; import dayjs, { Dayjs } from 'dayjs'; import { useSocket } from '@/socket/socketContext'; import { SocketEvents } from '@/shared/socket-events'; diff --git a/worklenz-frontend/src/components/board/kanban-group/kanban-group.tsx b/worklenz-frontend/src/components/board/kanban-group/kanban-group.tsx index c9e402b2..1f37a56f 100644 --- a/worklenz-frontend/src/components/board/kanban-group/kanban-group.tsx +++ b/worklenz-frontend/src/components/board/kanban-group/kanban-group.tsx @@ -1,12 +1,12 @@ import React, { useEffect, useRef, useState } from 'react'; -import { Button, Dropdown, Input, InputRef, MenuProps, Typography } from 'antd'; +import { Button, Dropdown, Input, InputRef, MenuProps, Typography } from '@/shared/antd-imports'; import { DeleteOutlined, EditOutlined, LoadingOutlined, MoreOutlined, PlusOutlined, -} from '@ant-design/icons'; +} from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; import { useDroppable } from '@dnd-kit/core'; import { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable'; diff --git a/worklenz-frontend/src/components/board/subTaskCard/SubTaskCard.tsx b/worklenz-frontend/src/components/board/subTaskCard/SubTaskCard.tsx index 09adcc50..1076d82e 100644 --- a/worklenz-frontend/src/components/board/subTaskCard/SubTaskCard.tsx +++ b/worklenz-frontend/src/components/board/subTaskCard/SubTaskCard.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react'; -import { Avatar, Col, DatePicker, Divider, Flex, Row, Tooltip, Typography } from 'antd'; +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'; diff --git a/worklenz-frontend/src/components/board/taskCard/TaskCard.tsx b/worklenz-frontend/src/components/board/taskCard/TaskCard.tsx index fe6651f1..7a21184c 100644 --- a/worklenz-frontend/src/components/board/taskCard/TaskCard.tsx +++ b/worklenz-frontend/src/components/board/taskCard/TaskCard.tsx @@ -9,7 +9,7 @@ import { Dropdown, MenuProps, Button, -} from 'antd'; +} from '@/shared/antd-imports'; import { DoubleRightOutlined, PauseOutlined, @@ -20,7 +20,7 @@ import { ForkOutlined, CaretRightFilled, CaretDownFilled, -} from '@ant-design/icons'; +} from '@/shared/antd-imports'; import './TaskCard.css'; import dayjs, { Dayjs } from 'dayjs'; import AddMembersDropdown from '../../add-members-dropdown/add-members-dropdown'; diff --git a/worklenz-frontend/src/components/board/taskCard/priority-section/priority-section.tsx b/worklenz-frontend/src/components/board/taskCard/priority-section/priority-section.tsx index deb1cc7c..6134536c 100644 --- a/worklenz-frontend/src/components/board/taskCard/priority-section/priority-section.tsx +++ b/worklenz-frontend/src/components/board/taskCard/priority-section/priority-section.tsx @@ -1,10 +1,10 @@ -import { Flex, Typography } from 'antd'; +import { Flex, Typography } from '@/shared/antd-imports'; import './priority-section.css'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useState, useEffect, useMemo } from 'react'; import { IProjectTask } from '@/types/project/projectTasksViewModel.types'; import { ITaskPriority } from '@/types/tasks/taskPriority.types'; -import { DoubleLeftOutlined, MinusOutlined, PauseOutlined } from '@ant-design/icons'; +import { DoubleLeftOutlined, MinusOutlined, PauseOutlined } from '@/shared/antd-imports'; type PrioritySectionProps = { task: IProjectTask; diff --git a/worklenz-frontend/src/components/board/taskCreateCard/TaskCreateCard.tsx b/worklenz-frontend/src/components/board/taskCreateCard/TaskCreateCard.tsx index d7cab6ce..c72efe23 100644 --- a/worklenz-frontend/src/components/board/taskCreateCard/TaskCreateCard.tsx +++ b/worklenz-frontend/src/components/board/taskCreateCard/TaskCreateCard.tsx @@ -1,4 +1,4 @@ -import { Avatar, Button, DatePicker, Input, InputRef } from 'antd'; +import { Avatar, Button, DatePicker, Input, InputRef } from '@/shared/antd-imports'; import React, { forwardRef, useEffect, useRef, useState } from 'react'; import AddMembersDropdown from '../../add-members-dropdown/add-members-dropdown'; import dayjs, { Dayjs } from 'dayjs'; diff --git a/worklenz-frontend/src/components/board/taskCreateCard/priority-task-create-card.tsx b/worklenz-frontend/src/components/board/taskCreateCard/priority-task-create-card.tsx index f7f86a22..fbde3a28 100644 --- a/worklenz-frontend/src/components/board/taskCreateCard/priority-task-create-card.tsx +++ b/worklenz-frontend/src/components/board/taskCreateCard/priority-task-create-card.tsx @@ -1,4 +1,4 @@ -import { Avatar, Button, DatePicker, Input, InputRef } from 'antd'; +import { Avatar, Button, DatePicker, Input, InputRef } from '@/shared/antd-imports'; import React, { forwardRef, useEffect, useRef, useState } from 'react'; import AddMembersDropdown from '../../add-members-dropdown/add-members-dropdown'; import dayjs, { Dayjs } from 'dayjs'; diff --git a/worklenz-frontend/src/components/calendars/homeCalendar/HomeCalendar.tsx b/worklenz-frontend/src/components/calendars/homeCalendar/HomeCalendar.tsx index dcf50dda..44145520 100644 --- a/worklenz-frontend/src/components/calendars/homeCalendar/HomeCalendar.tsx +++ b/worklenz-frontend/src/components/calendars/homeCalendar/HomeCalendar.tsx @@ -1,4 +1,4 @@ -import { Calendar } from 'antd'; +import { Calendar } from '@/shared/antd-imports'; import React, { useEffect } from 'react'; import type { Dayjs } from 'dayjs'; import { useAppDispatch } from '@/hooks/useAppDispatch'; diff --git a/worklenz-frontend/src/components/charts/LazyChartComponents.tsx b/worklenz-frontend/src/components/charts/LazyChartComponents.tsx index 3a170a7b..3a606acb 100644 --- a/worklenz-frontend/src/components/charts/LazyChartComponents.tsx +++ b/worklenz-frontend/src/components/charts/LazyChartComponents.tsx @@ -1,5 +1,5 @@ import { lazy, Suspense } from 'react'; -import { Spin } from 'antd'; +import { Spin } from '@/shared/antd-imports'; // Lazy load Chart.js components const LazyBarChart = lazy(() => diff --git a/worklenz-frontend/src/components/charts/chart-loader.tsx b/worklenz-frontend/src/components/charts/chart-loader.tsx index 142b8e2d..85f07765 100644 --- a/worklenz-frontend/src/components/charts/chart-loader.tsx +++ b/worklenz-frontend/src/components/charts/chart-loader.tsx @@ -1,5 +1,5 @@ import React, { Suspense } from 'react'; -import { Spin } from 'antd'; +import { Spin } from '@/shared/antd-imports'; // Lazy load chart components to reduce initial bundle size const LazyBar = React.lazy(() => diff --git a/worklenz-frontend/src/components/common/invite-team-members/invite-team-members.tsx b/worklenz-frontend/src/components/common/invite-team-members/invite-team-members.tsx index b71e4d65..da36593d 100644 --- a/worklenz-frontend/src/components/common/invite-team-members/invite-team-members.tsx +++ b/worklenz-frontend/src/components/common/invite-team-members/invite-team-members.tsx @@ -1,4 +1,4 @@ -import { AutoComplete, Button, Drawer, Flex, Form, message, Select, Spin, Typography } from 'antd'; +import { AutoComplete, Button, Drawer, Flex, Form, message, Select, Spin, Typography } from '@/shared/antd-imports'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import { diff --git a/worklenz-frontend/src/components/common/people-dropdown/PeopleDropdown.tsx b/worklenz-frontend/src/components/common/people-dropdown/PeopleDropdown.tsx index c2f7ac78..dfbc862c 100644 --- a/worklenz-frontend/src/components/common/people-dropdown/PeopleDropdown.tsx +++ b/worklenz-frontend/src/components/common/people-dropdown/PeopleDropdown.tsx @@ -1,6 +1,6 @@ import React, { useState, useRef, useEffect, useMemo, useCallback } from 'react'; import { createPortal } from 'react-dom'; -import { PlusOutlined, UserAddOutlined } from '@ant-design/icons'; +import { PlusOutlined, UserAddOutlined } from '@/shared/antd-imports'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import { toggleProjectMemberDrawer } from '@/features/projects/singleProject/members/projectMembersSlice'; diff --git a/worklenz-frontend/src/components/common/project-status-icon/project-status-icon.tsx b/worklenz-frontend/src/components/common/project-status-icon/project-status-icon.tsx index 09974db2..919ce401 100644 --- a/worklenz-frontend/src/components/common/project-status-icon/project-status-icon.tsx +++ b/worklenz-frontend/src/components/common/project-status-icon/project-status-icon.tsx @@ -4,7 +4,7 @@ import Icon, { ClockCircleOutlined, CloseCircleOutlined, StopOutlined, -} from '@ant-design/icons'; +} from '@/shared/antd-imports'; const iconMap = { 'clock-circle': ClockCircleOutlined, diff --git a/worklenz-frontend/src/components/common/single-avatar/single-avatar.tsx b/worklenz-frontend/src/components/common/single-avatar/single-avatar.tsx index d6886d7f..b9d0447d 100644 --- a/worklenz-frontend/src/components/common/single-avatar/single-avatar.tsx +++ b/worklenz-frontend/src/components/common/single-avatar/single-avatar.tsx @@ -1,5 +1,5 @@ import { AvatarNamesMap } from '@/shared/constants'; -import { Avatar, Flex, Space } from 'antd'; +import { Avatar, Flex, Space } from '@/shared/antd-imports'; interface SingleAvatarProps { avatarUrl?: string; diff --git a/worklenz-frontend/src/components/common/template-drawer/template-drawer.tsx b/worklenz-frontend/src/components/common/template-drawer/template-drawer.tsx index 3dd9dd75..2250b869 100644 --- a/worklenz-frontend/src/components/common/template-drawer/template-drawer.tsx +++ b/worklenz-frontend/src/components/common/template-drawer/template-drawer.tsx @@ -1,4 +1,4 @@ -import type { MenuProps } from 'antd'; +import type { MenuProps } from '@/shared/antd-imports'; import { Empty, List, @@ -10,8 +10,7 @@ import { Image, Input, Flex, - Button, -} from 'antd'; +} from '@/shared/antd-imports'; import React, { useEffect, useState } from 'react'; import { useSelector } from 'react-redux'; import { useTranslation } from 'react-i18next'; @@ -23,7 +22,7 @@ import { IWorklenzTemplate, } from '@/types/project-templates/project-templates.types'; import './template-drawer.css'; -import { SearchOutlined } from '@ant-design/icons'; +import { SearchOutlined } from '@/shared/antd-imports'; import logger from '@/utils/errorLogger'; const { Title, Text } = Typography; diff --git a/worklenz-frontend/src/components/common/tooltip-wrapper/tooltip-wrapper.tsx b/worklenz-frontend/src/components/common/tooltip-wrapper/tooltip-wrapper.tsx index ab9d1504..83c55127 100644 --- a/worklenz-frontend/src/components/common/tooltip-wrapper/tooltip-wrapper.tsx +++ b/worklenz-frontend/src/components/common/tooltip-wrapper/tooltip-wrapper.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Tooltip, TooltipProps } from 'antd'; +import { Tooltip, TooltipProps } from '@/shared/antd-imports'; interface TooltipWrapperProps extends Omit { children: React.ReactElement; diff --git a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoard.tsx b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoard.tsx index b048744e..e98073f9 100644 --- a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoard.tsx +++ b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanBoard.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState, useMemo } from 'react'; import { useSelector, useDispatch } from 'react-redux'; -import { Card, Spin, Empty } from 'antd'; +import { Card, Spin, Empty } from '@/shared/antd-imports'; import { DndContext, DragOverlay, diff --git a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanCreateSection.tsx b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanCreateSection.tsx index eb9b87cc..7aec4fe7 100644 --- a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanCreateSection.tsx +++ b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanCreateSection.tsx @@ -1,9 +1,9 @@ import React, { useState, useRef, useEffect, useMemo } from 'react'; -import { Button, Flex } from 'antd'; -import { PlusOutlined } from '@ant-design/icons'; +import { Button, Flex } from '@/shared/antd-imports'; +import { PlusOutlined } from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; import { nanoid } from '@reduxjs/toolkit'; -import { DownOutlined } from '@ant-design/icons'; +import { DownOutlined } from '@/shared/antd-imports'; import { useAppSelector } from '@/hooks/useAppSelector'; import { themeWiseColor } from '@/utils/themeWiseColor'; diff --git a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanCreateSubtaskCard.tsx b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanCreateSubtaskCard.tsx index e15044b9..43440a2a 100644 --- a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanCreateSubtaskCard.tsx +++ b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanCreateSubtaskCard.tsx @@ -1,4 +1,4 @@ -import { Flex, Input, InputRef } from 'antd'; +import { Flex, Input, InputRef } from '@/shared/antd-imports'; import React, { useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; diff --git a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanCreateTaskCard.tsx b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanCreateTaskCard.tsx index f677c4bc..f3147149 100644 --- a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanCreateTaskCard.tsx +++ b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanCreateTaskCard.tsx @@ -1,5 +1,5 @@ import React, { useRef, useState, useEffect } from 'react'; -import { Button, Flex, Input, InputRef } from 'antd'; +import { Button, Flex, Input, InputRef } from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; import { nanoid } from '@reduxjs/toolkit'; import { useAppDispatch } from '@/hooks/useAppDispatch'; diff --git a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanGroup.tsx b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanGroup.tsx index 86b98521..d9e5d24a 100644 --- a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanGroup.tsx +++ b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanGroup.tsx @@ -12,7 +12,7 @@ import EnhancedKanbanTaskCard from './EnhancedKanbanTaskCard'; import VirtualizedTaskList from './VirtualizedTaskList'; import { useAppSelector } from '@/hooks/useAppSelector'; import './EnhancedKanbanGroup.css'; -import { Badge, Flex, InputRef, MenuProps, Popconfirm } from 'antd'; +import { Badge, Flex, InputRef, MenuProps, Popconfirm } from '@/shared/antd-imports'; import { themeWiseColor } from '@/utils/themeWiseColor'; import useIsProjectManager from '@/hooks/useIsProjectManager'; import { useAuthService } from '@/hooks/useAuth'; @@ -25,11 +25,11 @@ import { MoreOutlined, } from '@ant-design/icons/lib/icons'; import { colors } from '@/styles/colors'; -import { Input } from 'antd'; -import { Tooltip } from 'antd'; -import { Typography } from 'antd'; -import { Dropdown } from 'antd'; -import { Button } from 'antd'; +import { Input } from '@/shared/antd-imports'; +import { Tooltip } from '@/shared/antd-imports'; +import { Typography } from '@/shared/antd-imports'; +import { Dropdown } from '@/shared/antd-imports'; +import { Button } from '@/shared/antd-imports'; import { PlusOutlined } from '@ant-design/icons/lib/icons'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import { useTranslation } from 'react-i18next'; diff --git a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanTaskCard.tsx b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanTaskCard.tsx index c431b321..82f79c55 100644 --- a/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanTaskCard.tsx +++ b/worklenz-frontend/src/components/enhanced-kanban/EnhancedKanbanTaskCard.tsx @@ -15,18 +15,18 @@ import PrioritySection from '../board/taskCard/priority-section/priority-section import Typography from 'antd/es/typography'; import CustomDueDatePicker from '../board/custom-due-date-picker'; import { themeWiseColor } from '@/utils/themeWiseColor'; -import { ForkOutlined } from '@ant-design/icons'; +import { ForkOutlined } from '@/shared/antd-imports'; import { Dayjs } from 'dayjs'; import dayjs from 'dayjs'; -import { CaretDownFilled, CaretRightFilled } from '@ant-design/icons'; +import { CaretDownFilled, CaretRightFilled } from '@/shared/antd-imports'; import { fetchBoardSubTasks, toggleTaskExpansion, } from '@/features/enhanced-kanban/enhanced-kanban.slice'; -import { Divider } from 'antd'; -import { List } from 'antd'; -import { Skeleton } from 'antd'; -import { PlusOutlined } from '@ant-design/icons'; +import { Divider } from '@/shared/antd-imports'; +import { List } from '@/shared/antd-imports'; +import { Skeleton } from '@/shared/antd-imports'; +import { PlusOutlined } from '@/shared/antd-imports'; import BoardSubTaskCard from '@/pages/projects/projectView/board/board-section/board-sub-task-card/board-sub-task-card'; import BoardCreateSubtaskCard from '@/pages/projects/projectView/board/board-section/board-sub-task-card/board-create-sub-task-card'; import { useTranslation } from 'react-i18next'; diff --git a/worklenz-frontend/src/components/home-tasks/statusDropdown/home-tasks-status-dropdown.tsx b/worklenz-frontend/src/components/home-tasks/statusDropdown/home-tasks-status-dropdown.tsx index 424d3388..245dfbe6 100644 --- a/worklenz-frontend/src/components/home-tasks/statusDropdown/home-tasks-status-dropdown.tsx +++ b/worklenz-frontend/src/components/home-tasks/statusDropdown/home-tasks-status-dropdown.tsx @@ -1,4 +1,4 @@ -import { Badge, Flex, Select } from 'antd'; +import { Badge, Flex, Select } from '@/shared/antd-imports'; import './home-tasks-status-dropdown.css'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useTranslation } from 'react-i18next'; diff --git a/worklenz-frontend/src/components/home-tasks/taskDatePicker/home-tasks-date-picker.tsx b/worklenz-frontend/src/components/home-tasks/taskDatePicker/home-tasks-date-picker.tsx index 37f4d5a3..3e1ff724 100644 --- a/worklenz-frontend/src/components/home-tasks/taskDatePicker/home-tasks-date-picker.tsx +++ b/worklenz-frontend/src/components/home-tasks/taskDatePicker/home-tasks-date-picker.tsx @@ -1,6 +1,6 @@ import { useSocket } from '@/socket/socketContext'; import { IProjectTask } from '@/types/project/projectTasksViewModel.types'; -import { DatePicker } from 'antd'; +import { DatePicker } from '@/shared/antd-imports'; import dayjs from 'dayjs'; import calendar from 'dayjs/plugin/calendar'; import { SocketEvents } from '@/shared/socket-events'; diff --git a/worklenz-frontend/src/components/kanban-board-management-v2/kanbanGroup.tsx b/worklenz-frontend/src/components/kanban-board-management-v2/kanbanGroup.tsx index 98f57505..996653e1 100644 --- a/worklenz-frontend/src/components/kanban-board-management-v2/kanbanGroup.tsx +++ b/worklenz-frontend/src/components/kanban-board-management-v2/kanbanGroup.tsx @@ -1,8 +1,8 @@ import React, { useState } from 'react'; import { useDroppable } from '@dnd-kit/core'; import { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable'; -import { Button, Typography } from 'antd'; -import { PlusOutlined, MenuOutlined } from '@ant-design/icons'; +import { Button, Typography } from '@/shared/antd-imports'; +import { PlusOutlined, MenuOutlined } from '@/shared/antd-imports'; import { ITaskListGroup } from '@/types/tasks/taskList.types'; import { IGroupBy } from '@/features/tasks/tasks.slice'; import KanbanTaskCard from './kanbanTaskCard'; diff --git a/worklenz-frontend/src/components/kanban-board-management-v2/kanbanTaskCard.tsx b/worklenz-frontend/src/components/kanban-board-management-v2/kanbanTaskCard.tsx index 766fbfce..4e35a990 100644 --- a/worklenz-frontend/src/components/kanban-board-management-v2/kanbanTaskCard.tsx +++ b/worklenz-frontend/src/components/kanban-board-management-v2/kanbanTaskCard.tsx @@ -1,13 +1,13 @@ import React from 'react'; import { useSortable } from '@dnd-kit/sortable'; import { CSS } from '@dnd-kit/utilities'; -import { Avatar, Tag, Progress, Typography, Button, Tooltip, Space } from 'antd'; +import { Avatar, Tag, Progress, Typography, Button, Tooltip, Space } from '@/shared/antd-imports'; import { HolderOutlined, MessageOutlined, PaperClipOutlined, ClockCircleOutlined, -} from '@ant-design/icons'; +} from '@/shared/antd-imports'; import { IProjectTask } from '@/types/project/projectTasksViewModel.types'; import { IGroupBy } from '@/features/tasks/tasks.slice'; import { useTranslation } from 'react-i18next'; diff --git a/worklenz-frontend/src/components/kanban-board-management-v2/kanbanTaskListBoard.tsx b/worklenz-frontend/src/components/kanban-board-management-v2/kanbanTaskListBoard.tsx index 314f0f72..9ea40133 100644 --- a/worklenz-frontend/src/components/kanban-board-management-v2/kanbanTaskListBoard.tsx +++ b/worklenz-frontend/src/components/kanban-board-management-v2/kanbanTaskListBoard.tsx @@ -17,18 +17,13 @@ import { SortableContext, sortableKeyboardCoordinates, } from '@dnd-kit/sortable'; -import { Card, Spin, Empty, Flex } from 'antd'; +import { Card, Spin, Empty } from '@/shared/antd-imports'; import { RootState } from '@/app/store'; -import { IGroupBy, setGroup, fetchTaskGroups, reorderTasks } from '@/features/tasks/tasks.slice'; +import { fetchTaskGroups, reorderTasks } from '@/features/tasks/tasks.slice'; import { IProjectTask } from '@/types/project/projectTasksViewModel.types'; import { AppDispatch } from '@/app/store'; -import BoardSectionCard from '@/pages/projects/projectView/board/board-section/board-section-card/board-section-card'; -import BoardCreateSectionCard from '@/pages/projects/projectView/board/board-section/board-section-card/board-create-section-card'; -import { useAuthService } from '@/hooks/useAuth'; +import { useAuthService } from '@/hooks/useAuth'; import useIsProjectManager from '@/hooks/useIsProjectManager'; -import BoardViewTaskCard from '@/pages/projects/projectView/board/board-section/board-task-card/board-view-task-card'; -import TaskGroup from '../task-management/TaskGroup'; -import TaskRow from '../task-management/TaskRow'; import KanbanGroup from './kanbanGroup'; import KanbanTaskCard from './kanbanTaskCard'; import SortableKanbanGroup from './SortableKanbanGroup'; diff --git a/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/notfication-drawer.tsx b/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/notfication-drawer.tsx index 4f6d7201..44c761db 100644 --- a/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/notfication-drawer.tsx +++ b/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/notfication-drawer.tsx @@ -1,4 +1,4 @@ -import { Drawer, Empty, Segmented, Typography, Spin, Button, Flex } from 'antd'; +import { Drawer, Empty, Segmented, Typography, Spin, Button, Flex } from '@/shared/antd-imports'; import { useEffect, useState } from 'react'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useAppDispatch } from '@/hooks/useAppDispatch'; diff --git a/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/notification-button.tsx b/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/notification-button.tsx index c78731c4..16ae3b3c 100644 --- a/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/notification-button.tsx +++ b/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/notification-button.tsx @@ -1,5 +1,5 @@ -import { BellOutlined } from '@ant-design/icons'; -import { Badge, Button, Tooltip } from 'antd'; +import { BellOutlined } from '@/shared/antd-imports'; +import { Badge, Button, Tooltip } from '@/shared/antd-imports'; import { toggleDrawer } from '@features/navbar/notificationSlice'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import { useTranslation } from 'react-i18next'; diff --git a/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/notification-item.tsx b/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/notification-item.tsx index abbc0721..39023968 100644 --- a/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/notification-item.tsx +++ b/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/notification-item.tsx @@ -1,6 +1,6 @@ import { IWorklenzNotification } from '@/types/notifications/notifications.types'; -import { BankOutlined } from '@ant-design/icons'; -import { Button, Tag, Typography, theme } from 'antd'; +import { BankOutlined } from '@/shared/antd-imports'; +import { Button, Tag, Typography, theme } from '@/shared/antd-imports'; import DOMPurify from 'dompurify'; import React, { useState } from 'react'; import { fromNow } from '@/utils/dateUtils'; diff --git a/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/notification-template.tsx b/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/notification-template.tsx index 17b7fe91..f4a6e60a 100644 --- a/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/notification-template.tsx +++ b/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/notification-template.tsx @@ -1,5 +1,5 @@ -import { Button, Typography, Tag } from 'antd'; -import { BankOutlined } from '@ant-design/icons'; +import { Button, Typography, Tag } from '@/shared/antd-imports'; +import { BankOutlined } from '@/shared/antd-imports'; import { IWorklenzNotification } from '@/types/notifications/notifications.types'; import { useNavigate } from 'react-router-dom'; import { useAppDispatch } from '@/hooks/useAppDispatch'; diff --git a/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/push-notification-template.tsx b/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/push-notification-template.tsx index 05575285..b0bcc7bb 100644 --- a/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/push-notification-template.tsx +++ b/worklenz-frontend/src/components/navbar/notifications/notifications-drawer/notification/push-notification-template.tsx @@ -1,8 +1,8 @@ -import { notification } from 'antd'; +import { notification } from '@/shared/antd-imports'; import { IWorklenzNotification } from '@/types/notifications/notifications.types'; import { teamsApiService } from '@/api/teams/teams.api.service'; import { toQueryString } from '@/utils/toQueryString'; -import { BankOutlined } from '@ant-design/icons'; +import { BankOutlined } from '@/shared/antd-imports'; import './push-notification-template.css'; const PushNotificationTemplate = ({ diff --git a/worklenz-frontend/src/components/project-list/project-group/project-group-list.tsx b/worklenz-frontend/src/components/project-list/project-group/project-group-list.tsx index bb07669d..4c742efe 100644 --- a/worklenz-frontend/src/components/project-list/project-group/project-group-list.tsx +++ b/worklenz-frontend/src/components/project-list/project-group/project-group-list.tsx @@ -10,12 +10,10 @@ import { Tooltip, Badge, Space, - Avatar, theme, Divider, -} from 'antd'; +} from '@/shared/antd-imports'; import { - ClockCircleOutlined, TeamOutlined, CheckCircleOutlined, ProjectOutlined, @@ -23,7 +21,7 @@ import { SettingOutlined, InboxOutlined, MoreOutlined, -} from '@ant-design/icons'; +} from '@/shared/antd-imports'; import { ProjectGroupListProps } from '@/types/project/project.types'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useAppDispatch } from '@/hooks/useAppDispatch'; diff --git a/worklenz-frontend/src/components/project-list/project-list-table/project-list-actions/project-list-actions.tsx b/worklenz-frontend/src/components/project-list/project-list-table/project-list-actions/project-list-actions.tsx index c447ddeb..4a319a44 100644 --- a/worklenz-frontend/src/components/project-list/project-list-table/project-list-actions/project-list-actions.tsx +++ b/worklenz-frontend/src/components/project-list/project-list-table/project-list-actions/project-list-actions.tsx @@ -11,11 +11,10 @@ import { } from '@/features/projects/projectsSlice'; import { useAppSelector } from '@/hooks/useAppSelector'; import useIsProjectManager from '@/hooks/useIsProjectManager'; -import { useAuthService } from '@/hooks/useAuth'; import { IProjectViewModel } from '@/types/project/projectViewModel.types'; import logger from '@/utils/errorLogger'; -import { SettingOutlined, InboxOutlined } from '@ant-design/icons'; -import { Tooltip, Button, Popconfirm, Space } from 'antd'; +import { SettingOutlined, InboxOutlined } from '@/shared/antd-imports'; +import { Tooltip, Button, Popconfirm, Space } from '@/shared/antd-imports'; import { evt_projects_archive, evt_projects_archive_all, diff --git a/worklenz-frontend/src/components/project-list/project-list-table/project-list-category/project-list-category.tsx b/worklenz-frontend/src/components/project-list/project-list-table/project-list-category/project-list-category.tsx index 240267b9..07bc22b5 100644 --- a/worklenz-frontend/src/components/project-list/project-list-table/project-list-category/project-list-category.tsx +++ b/worklenz-frontend/src/components/project-list/project-list-table/project-list-category/project-list-category.tsx @@ -1,5 +1,5 @@ import { IProjectViewModel } from '@/types/project/projectViewModel.types'; -import { Tooltip, Tag } from 'antd'; +import { Tooltip, Tag } from '@/shared/antd-imports'; import { TFunction } from 'i18next'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import { setFilteredCategories, setRequestParams } from '@/features/projects/projectsSlice'; diff --git a/worklenz-frontend/src/components/project-list/project-list-table/project-list-favorite/project-rate-cell.tsx b/worklenz-frontend/src/components/project-list/project-list-table/project-list-favorite/project-rate-cell.tsx index c7e9ff89..90e8e505 100644 --- a/worklenz-frontend/src/components/project-list/project-list-table/project-list-favorite/project-rate-cell.tsx +++ b/worklenz-frontend/src/components/project-list/project-list-table/project-list-favorite/project-rate-cell.tsx @@ -7,8 +7,8 @@ import { useAppDispatch } from '@/hooks/useAppDispatch'; import { useAppSelector } from '@/hooks/useAppSelector'; import { colors } from '@/styles/colors'; import { IProjectViewModel } from '@/types/project/projectViewModel.types'; -import { StarFilled } from '@ant-design/icons'; -import { Button, ConfigProvider, Tooltip } from 'antd'; +import { StarFilled } from '@/shared/antd-imports'; +import { Button, ConfigProvider, Tooltip } from '@/shared/antd-imports'; import { TFunction } from 'i18next'; import { useCallback, useMemo } from 'react'; diff --git a/worklenz-frontend/src/components/project-list/project-list-table/project-list-progress/progress-list-progress.tsx b/worklenz-frontend/src/components/project-list/project-list-table/project-list-progress/progress-list-progress.tsx index 1be0b55d..7f2ce1bd 100644 --- a/worklenz-frontend/src/components/project-list/project-list-table/project-list-progress/progress-list-progress.tsx +++ b/worklenz-frontend/src/components/project-list/project-list-table/project-list-progress/progress-list-progress.tsx @@ -1,6 +1,6 @@ import { IProjectViewModel } from '@/types/project/projectViewModel.types'; import { getTaskProgressTitle } from '@/utils/project-list-utils'; -import { Tooltip, Progress } from 'antd'; +import { Tooltip, Progress } from '@/shared/antd-imports'; export const ProgressListProgress: React.FC<{ record: IProjectViewModel }> = ({ record }) => { return ( diff --git a/worklenz-frontend/src/components/project-list/project-list-table/project-list-updated-at/project-list-updated.tsx b/worklenz-frontend/src/components/project-list/project-list-table/project-list-updated-at/project-list-updated.tsx index bd0c7b5a..51257d84 100644 --- a/worklenz-frontend/src/components/project-list/project-list-table/project-list-updated-at/project-list-updated.tsx +++ b/worklenz-frontend/src/components/project-list/project-list-table/project-list-updated-at/project-list-updated.tsx @@ -1,7 +1,7 @@ import { IProjectViewModel } from '@/types/project/projectViewModel.types'; import { calculateTimeDifference } from '@/utils/calculate-time-difference'; import { formatDateTimeWithLocale } from '@/utils/format-date-time-with-locale'; -import { Tooltip } from 'antd'; +import { Tooltip } from '@/shared/antd-imports'; export const ProjectListUpdatedAt: React.FC<{ record: IProjectViewModel }> = ({ record }) => { return ( diff --git a/worklenz-frontend/src/components/project-list/project-list-table/project-name/project-name-cell.tsx b/worklenz-frontend/src/components/project-list/project-list-table/project-name/project-name-cell.tsx index 25a948ae..fc517782 100644 --- a/worklenz-frontend/src/components/project-list/project-list-table/project-name/project-name-cell.tsx +++ b/worklenz-frontend/src/components/project-list/project-list-table/project-name/project-name-cell.tsx @@ -6,8 +6,8 @@ import { useAppDispatch } from '@/hooks/useAppDispatch'; import { useAppSelector } from '@/hooks/useAppSelector'; import { IProjectViewModel } from '@/types/project/projectViewModel.types'; import { formatDateRange } from '@/utils/project-list-utils'; -import { CalendarOutlined } from '@ant-design/icons'; -import { Badge, Tooltip } from 'antd'; +import { CalendarOutlined } from '@/shared/antd-imports'; +import { Badge, Tooltip } from '@/shared/antd-imports'; import { TFunction } from 'i18next'; import { NavigateFunction } from 'react-router-dom'; diff --git a/worklenz-frontend/src/components/project-task-filters/create-status-button/create-status-button.tsx b/worklenz-frontend/src/components/project-task-filters/create-status-button/create-status-button.tsx index 64ac806b..29aefae5 100644 --- a/worklenz-frontend/src/components/project-task-filters/create-status-button/create-status-button.tsx +++ b/worklenz-frontend/src/components/project-task-filters/create-status-button/create-status-button.tsx @@ -1,4 +1,4 @@ -import { SettingOutlined } from '@ant-design/icons'; +import { SettingOutlined } from '@/shared/antd-imports'; import Tooltip from 'antd/es/tooltip'; import Button from 'antd/es/button'; import { useAppDispatch } from '@/hooks/useAppDispatch'; diff --git a/worklenz-frontend/src/components/project-task-filters/delete-status-drawer/delete-status-drawer.tsx b/worklenz-frontend/src/components/project-task-filters/delete-status-drawer/delete-status-drawer.tsx index 0dd5015c..3b6b7fd0 100644 --- a/worklenz-frontend/src/components/project-task-filters/delete-status-drawer/delete-status-drawer.tsx +++ b/worklenz-frontend/src/components/project-task-filters/delete-status-drawer/delete-status-drawer.tsx @@ -9,8 +9,8 @@ import useTabSearchParam from '@/hooks/useTabSearchParam'; import { fetchTaskGroups } from '@/features/tasks/tasks.slice'; import { deleteStatusToggleDrawer } from '@/features/projects/status/DeleteStatusSlice'; -import { Drawer, Alert, Card, Select, Button, Typography, Badge } from 'antd'; -import { DownOutlined } from '@ant-design/icons'; +import { Drawer, Alert, Card, Select, Button, Typography, Badge } from '@/shared/antd-imports'; +import { DownOutlined } from '@/shared/antd-imports'; import { useSelector } from 'react-redux'; import { deleteSection, diff --git a/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/column-configuration-modal.tsx b/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/column-configuration-modal.tsx index 34b317a4..ca56a761 100644 --- a/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/column-configuration-modal.tsx +++ b/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/column-configuration-modal.tsx @@ -1,6 +1,6 @@ import React, { useState, useEffect } from 'react'; -import { Modal, Checkbox, Button, Flex, Typography, Space, Divider, message } from 'antd'; -import { SettingOutlined, UpOutlined, DownOutlined } from '@ant-design/icons'; +import { Modal, Checkbox, Button, Flex, Typography, Space, Divider, message } from '@/shared/antd-imports'; +import { SettingOutlined, UpOutlined, DownOutlined } from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; // Configuration interface for column visibility diff --git a/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/group-by-filter-dropdown.tsx b/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/group-by-filter-dropdown.tsx index 7d290026..4969a406 100644 --- a/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/group-by-filter-dropdown.tsx +++ b/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/group-by-filter-dropdown.tsx @@ -1,6 +1,6 @@ import { useEffect, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import { CaretDownFilled } from '@ant-design/icons'; +import { CaretDownFilled } from '@/shared/antd-imports'; import { ConfigProvider, Flex, Dropdown, Button } from 'antd/es'; import { useSearchParams } from 'react-router-dom'; diff --git a/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/labels-filter-dropdown.tsx b/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/labels-filter-dropdown.tsx index dc63e9be..c4ae5b44 100644 --- a/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/labels-filter-dropdown.tsx +++ b/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/labels-filter-dropdown.tsx @@ -1,4 +1,4 @@ -import { CaretDownFilled } from '@ant-design/icons'; +import { CaretDownFilled } from '@/shared/antd-imports'; import Badge from 'antd/es/badge'; import Button from 'antd/es/button'; import Card from 'antd/es/card'; diff --git a/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/members-filter-dropdown.tsx b/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/members-filter-dropdown.tsx index 41c920c0..051f4522 100644 --- a/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/members-filter-dropdown.tsx +++ b/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/members-filter-dropdown.tsx @@ -1,6 +1,6 @@ import { useMemo, useRef, useState, useCallback, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; -import { CaretDownFilled } from '@ant-design/icons'; +import { CaretDownFilled } from '@/shared/antd-imports'; import { Badge, Button, @@ -13,8 +13,8 @@ import { List, Space, Typography, -} from 'antd'; -import type { InputRef } from 'antd'; + InputRef +} from '@/shared/antd-imports'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import { useAppSelector } from '@/hooks/useAppSelector'; diff --git a/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/priority-filter-dropdown.tsx b/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/priority-filter-dropdown.tsx index 094771dd..d2af5eb3 100644 --- a/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/priority-filter-dropdown.tsx +++ b/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/priority-filter-dropdown.tsx @@ -1,8 +1,8 @@ -import { CaretDownFilled } from '@ant-design/icons'; +import { CaretDownFilled } from '@/shared/antd-imports'; import { useMemo, useEffect, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; -import { Badge, Button, Card, Checkbox, Dropdown, List, Space } from 'antd'; +import { Badge, Button, Card, Checkbox, Dropdown, List, Space } from '@/shared/antd-imports'; import { useAppSelector } from '@/hooks/useAppSelector'; import { colors } from '@/styles/colors'; diff --git a/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/search-dropdown.tsx b/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/search-dropdown.tsx index e8743f39..bc072207 100644 --- a/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/search-dropdown.tsx +++ b/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/search-dropdown.tsx @@ -13,7 +13,7 @@ import Space from 'antd/es/space'; import Dropdown from 'antd/es/dropdown'; import { setSearch } from '@/features/tasks/tasks.slice'; -import { SearchOutlined } from '@ant-design/icons'; +import { SearchOutlined } from '@/shared/antd-imports'; import { setBoardSearch } from '@/features/board/board-slice'; diff --git a/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/show-fields-filter-dropdown.tsx b/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/show-fields-filter-dropdown.tsx index 56d1b7d5..8b76a129 100644 --- a/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/show-fields-filter-dropdown.tsx +++ b/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/show-fields-filter-dropdown.tsx @@ -1,4 +1,4 @@ -import { MoreOutlined, SettingOutlined } from '@ant-design/icons'; +import { MoreOutlined, SettingOutlined } from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; import Button from 'antd/es/button'; import Checkbox from 'antd/es/checkbox'; diff --git a/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/sort-filter-dropdown.tsx b/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/sort-filter-dropdown.tsx index a74f15b5..c86d2ff8 100644 --- a/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/sort-filter-dropdown.tsx +++ b/worklenz-frontend/src/components/project-task-filters/filter-dropdowns/sort-filter-dropdown.tsx @@ -1,4 +1,4 @@ -import { CaretDownFilled, SortAscendingOutlined, SortDescendingOutlined } from '@ant-design/icons'; +import { CaretDownFilled, SortAscendingOutlined, SortDescendingOutlined } from '@/shared/antd-imports'; import Badge from 'antd/es/badge'; import Button from 'antd/es/button'; diff --git a/worklenz-frontend/src/components/projects/project-create-button/project-create-button.tsx b/worklenz-frontend/src/components/projects/project-create-button/project-create-button.tsx index 5386ce0c..2cb2729b 100644 --- a/worklenz-frontend/src/components/projects/project-create-button/project-create-button.tsx +++ b/worklenz-frontend/src/components/projects/project-create-button/project-create-button.tsx @@ -1,7 +1,7 @@ -import { Button, Drawer, Dropdown } from 'antd'; +import { Button, Drawer, Dropdown } from '@/shared/antd-imports'; import { useEffect, useState } from 'react'; import { useAppDispatch } from '@/hooks/useAppDispatch'; -import { DownOutlined, EditOutlined, ImportOutlined } from '@ant-design/icons'; +import { DownOutlined, EditOutlined, ImportOutlined } from '@/shared/antd-imports'; import TemplateDrawer from '@/components/common/template-drawer/template-drawer'; import { useTranslation } from 'react-i18next'; import { useLocation, useNavigate } from 'react-router-dom'; diff --git a/worklenz-frontend/src/components/projects/project-drawer/project-basic-info/project-basic-info.tsx b/worklenz-frontend/src/components/projects/project-drawer/project-basic-info/project-basic-info.tsx index c01b8c70..63c512ed 100644 --- a/worklenz-frontend/src/components/projects/project-drawer/project-basic-info/project-basic-info.tsx +++ b/worklenz-frontend/src/components/projects/project-drawer/project-basic-info/project-basic-info.tsx @@ -1,4 +1,4 @@ -import { ColorPicker, Form, FormInstance, Input } from 'antd'; +import { ColorPicker, Form, FormInstance, Input } from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; import { IProjectViewModel } from '@/types/project/projectViewModel.types'; diff --git a/worklenz-frontend/src/components/projects/project-drawer/project-category-section/project-category-section.tsx b/worklenz-frontend/src/components/projects/project-drawer/project-category-section/project-category-section.tsx index 984c9b96..a388fdca 100644 --- a/worklenz-frontend/src/components/projects/project-drawer/project-category-section/project-category-section.tsx +++ b/worklenz-frontend/src/components/projects/project-drawer/project-category-section/project-category-section.tsx @@ -10,8 +10,8 @@ import { InputRef, Select, Typography, -} from 'antd'; -import { PlusOutlined } from '@ant-design/icons'; +} from '@/shared/antd-imports'; +import { PlusOutlined } from '@/shared/antd-imports'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import { diff --git a/worklenz-frontend/src/components/projects/project-drawer/project-client-section/project-client-section.tsx b/worklenz-frontend/src/components/projects/project-drawer/project-client-section/project-client-section.tsx index 426f8002..d8e2a4b8 100644 --- a/worklenz-frontend/src/components/projects/project-drawer/project-client-section/project-client-section.tsx +++ b/worklenz-frontend/src/components/projects/project-drawer/project-client-section/project-client-section.tsx @@ -2,8 +2,8 @@ import { createClient, fetchClients } from '@/features/settings/client/clientSli import { useAppDispatch } from '@/hooks/useAppDispatch'; import { IClientsViewModel } from '@/types/client.types'; import { IProjectViewModel } from '@/types/project/projectViewModel.types'; -import { QuestionCircleOutlined } from '@ant-design/icons'; -import { AutoComplete, Flex, Form, FormInstance, Spin, Tooltip, Typography } from 'antd'; +import { QuestionCircleOutlined } from '@/shared/antd-imports'; +import { AutoComplete, Flex, Form, FormInstance, Spin, Tooltip, Typography } from '@/shared/antd-imports'; import { TFunction } from 'i18next'; import { useState } from 'react'; diff --git a/worklenz-frontend/src/components/projects/project-drawer/project-drawer.tsx b/worklenz-frontend/src/components/projects/project-drawer/project-drawer.tsx index f6519cb9..2b6ef0c0 100644 --- a/worklenz-frontend/src/components/projects/project-drawer/project-drawer.tsx +++ b/worklenz-frontend/src/components/projects/project-drawer/project-drawer.tsx @@ -17,7 +17,7 @@ import { Switch, Tooltip, Typography, -} from 'antd'; +} from '@/shared/antd-imports'; import dayjs from 'dayjs'; import { fetchClients } from '@/features/settings/client/clientSlice'; diff --git a/worklenz-frontend/src/components/projects/project-drawer/project-health-section/project-health-section.tsx b/worklenz-frontend/src/components/projects/project-drawer/project-health-section/project-health-section.tsx index 95e1001e..83f3573a 100644 --- a/worklenz-frontend/src/components/projects/project-drawer/project-health-section/project-health-section.tsx +++ b/worklenz-frontend/src/components/projects/project-drawer/project-health-section/project-health-section.tsx @@ -1,5 +1,5 @@ import { TFunction } from 'i18next'; -import { Badge, Form, FormInstance, Select, Typography } from 'antd'; +import { Badge, Form, FormInstance, Select, Typography } from '@/shared/antd-imports'; import { IProjectHealth } from '@/types/project/projectHealth.types'; diff --git a/worklenz-frontend/src/components/projects/project-drawer/project-status-section/project-status-section.tsx b/worklenz-frontend/src/components/projects/project-drawer/project-status-section/project-status-section.tsx index d8e59933..10d1b12a 100644 --- a/worklenz-frontend/src/components/projects/project-drawer/project-status-section/project-status-section.tsx +++ b/worklenz-frontend/src/components/projects/project-drawer/project-status-section/project-status-section.tsx @@ -1,4 +1,4 @@ -import { Form, FormInstance, Select, Typography } from 'antd'; +import { Form, FormInstance, Select, Typography } from '@/shared/antd-imports'; import { TFunction } from 'i18next'; import { IProjectStatus } from '@/types/project/projectStatus.types'; diff --git a/worklenz-frontend/src/components/projects/project-manager-dropdown/project-manager-dropdown.tsx b/worklenz-frontend/src/components/projects/project-manager-dropdown/project-manager-dropdown.tsx index dd43960f..f8ac27f3 100644 --- a/worklenz-frontend/src/components/projects/project-manager-dropdown/project-manager-dropdown.tsx +++ b/worklenz-frontend/src/components/projects/project-manager-dropdown/project-manager-dropdown.tsx @@ -3,8 +3,8 @@ import { getTeamMembers } from '@/features/team-members/team-members.slice'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import { useAppSelector } from '@/hooks/useAppSelector'; import { ITeamMemberViewModel } from '@/types/teamMembers/teamMembersGetResponse.types'; -import { CloseCircleFilled, PlusCircleOutlined } from '@ant-design/icons'; -import { Button, Dropdown, Flex, Input, InputRef, theme, Typography } from 'antd'; +import { CloseCircleFilled, PlusCircleOutlined } from '@/shared/antd-imports'; +import { Button, Dropdown, Flex, Input, InputRef, theme, Typography } from '@/shared/antd-imports'; import React, { useEffect, useMemo, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import './project-manager-dropdown.css'; diff --git a/worklenz-frontend/src/components/projects/project-member-invite-drawer/project-member-invite-drawer.tsx b/worklenz-frontend/src/components/projects/project-member-invite-drawer/project-member-invite-drawer.tsx index 4d461de4..92f05b50 100644 --- a/worklenz-frontend/src/components/projects/project-member-invite-drawer/project-member-invite-drawer.tsx +++ b/worklenz-frontend/src/components/projects/project-member-invite-drawer/project-member-invite-drawer.tsx @@ -12,7 +12,7 @@ import { toggleProjectMemberDrawer, } from '@/features/projects/singleProject/members/projectMembersSlice'; import SingleAvatar from '@/components/common/single-avatar/single-avatar'; -import { DeleteOutlined, MailOutlined } from '@ant-design/icons'; +import { DeleteOutlined, MailOutlined } from '@/shared/antd-imports'; import { getTeamMembers } from '@/features/team-members/team-members.slice'; import logger from '@/utils/errorLogger'; import { validateEmail } from '@/utils/validateEmail'; diff --git a/worklenz-frontend/src/components/projects/project-stats-card.tsx b/worklenz-frontend/src/components/projects/project-stats-card.tsx index 68e539e5..68dd46d1 100644 --- a/worklenz-frontend/src/components/projects/project-stats-card.tsx +++ b/worklenz-frontend/src/components/projects/project-stats-card.tsx @@ -1,6 +1,6 @@ import { ReactNode } from 'react'; -import { Card, Flex, Skeleton, Tooltip, Typography } from 'antd'; -import { ExclamationCircleOutlined } from '@ant-design/icons'; +import { Card, Flex, Skeleton, Tooltip, Typography } from '@/shared/antd-imports'; +import { ExclamationCircleOutlined } from '@/shared/antd-imports'; import { colors } from '@/styles/colors'; type InsightCardProps = { diff --git a/worklenz-frontend/src/components/reporting/drawers/overview-team-info/members-tab/reporting-overview-members-tab.tsx b/worklenz-frontend/src/components/reporting/drawers/overview-team-info/members-tab/reporting-overview-members-tab.tsx index 7a98303e..13ae06e0 100644 --- a/worklenz-frontend/src/components/reporting/drawers/overview-team-info/members-tab/reporting-overview-members-tab.tsx +++ b/worklenz-frontend/src/components/reporting/drawers/overview-team-info/members-tab/reporting-overview-members-tab.tsx @@ -1,4 +1,4 @@ -import { Flex, Skeleton } from 'antd'; +import { Flex, Skeleton } from '@/shared/antd-imports'; import React, { useEffect, useMemo, useState } from 'react'; import CustomSearchbar from '../../../../CustomSearchbar'; import { useTranslation } from 'react-i18next'; diff --git a/worklenz-frontend/src/components/reporting/drawers/overview-team-info/members-tab/reporting-overview-members-table.tsx b/worklenz-frontend/src/components/reporting/drawers/overview-team-info/members-tab/reporting-overview-members-table.tsx index 4318bc04..f3a9f914 100644 --- a/worklenz-frontend/src/components/reporting/drawers/overview-team-info/members-tab/reporting-overview-members-table.tsx +++ b/worklenz-frontend/src/components/reporting/drawers/overview-team-info/members-tab/reporting-overview-members-table.tsx @@ -1,5 +1,5 @@ import React, { memo, useEffect, useMemo, useState } from 'react'; -import { ConfigProvider, Table, TableColumnsType } from 'antd'; +import { ConfigProvider, Table, TableColumnsType } from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import CustomTableTitle from '../../../../CustomTableTitle'; diff --git a/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-tab/reports-overview-category-graph.tsx b/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-tab/reports-overview-category-graph.tsx index ccb0ff60..96a442cc 100644 --- a/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-tab/reports-overview-category-graph.tsx +++ b/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-tab/reports-overview-category-graph.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Doughnut } from 'react-chartjs-2'; import { Chart, ArcElement, Tooltip, ChartOptions } from 'chart.js'; -import { Badge, Card, Flex, Typography } from 'antd'; +import { Badge, Card, Flex, Typography } from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; import { IRPTOverviewTeamChartData } from '@/types/reporting/reporting.types'; diff --git a/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-tab/reports-overview-project-health-graph.tsx b/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-tab/reports-overview-project-health-graph.tsx index 9ca3b4b6..ce9eb541 100644 --- a/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-tab/reports-overview-project-health-graph.tsx +++ b/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-tab/reports-overview-project-health-graph.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Doughnut } from 'react-chartjs-2'; import { Chart, ArcElement, Tooltip, ChartOptions } from 'chart.js'; -import { Badge, Card, Flex, Typography } from 'antd'; +import { Badge, Card, Flex, Typography } from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; import { IRPTOverviewTeamByHealth, diff --git a/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-tab/reports-overview-status-graph.tsx b/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-tab/reports-overview-status-graph.tsx index 862945ad..dde25b74 100644 --- a/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-tab/reports-overview-status-graph.tsx +++ b/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-tab/reports-overview-status-graph.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Doughnut } from 'react-chartjs-2'; import { Chart, ArcElement, Tooltip, ChartOptions } from 'chart.js'; -import { Badge, Card, Flex, Typography } from 'antd'; +import { Badge, Card, Flex, Typography } from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; import { IRPTOverviewTeamByStatus, IRPTOverviewTeamInfo } from '@/types/reporting/reporting.types'; import { ALPHA_CHANNEL } from '@/shared/constants'; diff --git a/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-team-info-drawer-tabs.tsx b/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-team-info-drawer-tabs.tsx index a285e3cf..60d0ea0a 100644 --- a/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-team-info-drawer-tabs.tsx +++ b/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-team-info-drawer-tabs.tsx @@ -1,4 +1,4 @@ -import { Tabs } from 'antd'; +import { Tabs } from '@/shared/antd-imports'; import { TabsProps } from 'antd/lib'; import { useTranslation } from 'react-i18next'; import OverviewReportsOverviewTab from './overview-tab/reports-overview-tab'; diff --git a/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-team-info-drawer.tsx b/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-team-info-drawer.tsx index d838a561..a0e8301f 100644 --- a/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-team-info-drawer.tsx +++ b/worklenz-frontend/src/components/reporting/drawers/overview-team-info/overview-team-info-drawer.tsx @@ -1,8 +1,7 @@ -import { Drawer, Typography, Flex, Button, Dropdown } from 'antd'; -import React, { useState } from 'react'; +import { Drawer, Typography, Flex, Button, Dropdown } from '@/shared/antd-imports'; import { useAppSelector } from '../../../../hooks/useAppSelector'; import { useAppDispatch } from '../../../../hooks/useAppDispatch'; -import { BankOutlined, DownOutlined } from '@ant-design/icons'; +import { BankOutlined } from '@/shared/antd-imports'; import { colors } from '../../../../styles/colors'; import { useTranslation } from 'react-i18next'; @@ -28,7 +27,7 @@ const OverviewTeamInfoDrawer = ({ team }: OverviewTeamInfoDrawerProps) => { return ( { diff --git a/worklenz-frontend/src/components/task-drawer/shared/activity-log/task-drawer-activity-log.tsx b/worklenz-frontend/src/components/task-drawer/shared/activity-log/task-drawer-activity-log.tsx index 7b23a596..b5e51432 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/activity-log/task-drawer-activity-log.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/activity-log/task-drawer-activity-log.tsx @@ -1,7 +1,7 @@ -import { Timeline, Typography, Flex, ConfigProvider, Tag, Tooltip, Skeleton } from 'antd'; +import { Timeline, Typography, Flex, ConfigProvider, Tag, Tooltip, Skeleton } from '@/shared/antd-imports'; import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { ArrowRightOutlined } from '@ant-design/icons'; +import { ArrowRightOutlined } from '@/shared/antd-imports'; import { IActivityLog, diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/attachments/attachments-grid.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/attachments/attachments-grid.tsx index 7145a556..9373bd4e 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/attachments/attachments-grid.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/attachments/attachments-grid.tsx @@ -3,8 +3,6 @@ import AttachmentsPreview from './attachments-preview'; import './attachments-preview.css'; import type { RcFile, UploadProps } from 'antd/es/upload'; import { TFunction } from 'i18next'; -import { ReloadOutlined } from '@ant-design/icons'; -import { message } from 'antd'; import AttachmentsUpload from './attachments-upload'; interface AttachmentsGridProps { diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/attachments/attachments-preview.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/attachments/attachments-preview.tsx index ad9b8aba..f0f119b4 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/attachments/attachments-preview.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/attachments/attachments-preview.tsx @@ -1,13 +1,12 @@ import { useState } from 'react'; import { ITaskAttachmentViewModel } from '@/types/tasks/task-attachment-view-model'; -import { Button, Modal, Spin, Tooltip, Typography, Popconfirm, message } from 'antd'; +import { Button, Modal, Spin, Tooltip, Typography, Popconfirm, message } from '@/shared/antd-imports'; import { EyeOutlined, DownloadOutlined, DeleteOutlined, QuestionCircleOutlined, - LoadingOutlined, -} from '@ant-design/icons'; +} from '@/shared/antd-imports'; import { attachmentsApiService } from '@/api/attachments/attachments.api.service'; import { IconsMap } from '@/shared/constants'; import './attachments-preview.css'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/attachments/attachments-upload.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/attachments/attachments-upload.tsx index 996821ec..01df2b96 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/attachments/attachments-upload.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/attachments/attachments-upload.tsx @@ -1,4 +1,4 @@ -import { LoadingOutlined, PlusOutlined } from '@ant-design/icons'; +import { LoadingOutlined, PlusOutlined } from '@/shared/antd-imports'; import React, { useRef, useState } from 'react'; import { TFunction } from 'i18next'; import './attachments-upload.css'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/comments/task-comments.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/comments/task-comments.tsx index 95e636fc..acaac62b 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/comments/task-comments.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/comments/task-comments.tsx @@ -1,9 +1,9 @@ import { useState, useEffect, useRef, useCallback } from 'react'; -import { Skeleton, Avatar, Tooltip, Popconfirm } from 'antd'; +import { Skeleton, Avatar, Tooltip, Popconfirm } from '@/shared/antd-imports'; import { Comment } from '@ant-design/compatible'; import dayjs from 'dayjs'; -import { LikeOutlined, LikeTwoTone } from '@ant-design/icons'; +import { LikeOutlined, LikeTwoTone } from '@/shared/antd-imports'; import { ITaskCommentViewModel } from '@/types/tasks/task-comments.types'; import taskCommentsApiService from '@/api/tasks/task-comments.api.service'; import { useAuthService } from '@/hooks/useAuth'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/comments/task-view-comment-edit.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/comments/task-view-comment-edit.tsx index e215ad99..1c4348f6 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/comments/task-view-comment-edit.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/comments/task-view-comment-edit.tsx @@ -1,5 +1,5 @@ import { useState, useEffect } from 'react'; -import { Button, Form, Input, Space } from 'antd'; +import { Button, Form, Input, Space } from '@/shared/antd-imports'; import { ITaskCommentViewModel } from '@/types/tasks/task-comments.types'; import taskCommentsApiService from '@/api/tasks/task-comments.api.service'; import logger from '@/utils/errorLogger'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/dependencies-table.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/dependencies-table.tsx index 28568a38..1816dd7f 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/dependencies-table.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/dependencies-table.tsx @@ -10,9 +10,9 @@ import { TableProps, Tag, Typography, -} from 'antd'; +} from '@/shared/antd-imports'; import React, { useState, useEffect } from 'react'; -import { DeleteOutlined, ExclamationCircleFilled } from '@ant-design/icons'; +import { DeleteOutlined, ExclamationCircleFilled } from '@/shared/antd-imports'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import { updateTaskCounts } from '@/features/task-management/task-management.slice'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-assignee-selector/task-drawer-assignee-selector.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-assignee-selector/task-drawer-assignee-selector.tsx index 0d0a1960..c9c71e7f 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-assignee-selector/task-drawer-assignee-selector.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-assignee-selector/task-drawer-assignee-selector.tsx @@ -11,7 +11,7 @@ import Button from 'antd/es/button'; import { useMemo, useRef, useState } from 'react'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useAppDispatch } from '@/hooks/useAppDispatch'; -import { PlusOutlined } from '@ant-design/icons'; +import { PlusOutlined } from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; import SingleAvatar from '@/components/common/single-avatar/single-avatar'; import { CheckboxChangeEvent } from 'antd/es/checkbox'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-due-date/task-drawer-due-date.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-due-date/task-drawer-due-date.tsx index b6a03690..0c8325b7 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-due-date/task-drawer-due-date.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-due-date/task-drawer-due-date.tsx @@ -1,5 +1,5 @@ import { useState } from 'react'; -import { Flex, DatePicker, Typography, Button, Form, FormInstance } from 'antd'; +import { Flex, DatePicker, Typography, Button, Form, FormInstance } from '@/shared/antd-imports'; import { t, TFunction } from 'i18next'; import dayjs, { Dayjs } from 'dayjs'; import { useTranslation } from 'react-i18next'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-estimation/task-drawer-estimation.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-estimation/task-drawer-estimation.tsx index ed204673..37bc6f55 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-estimation/task-drawer-estimation.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-estimation/task-drawer-estimation.tsx @@ -2,7 +2,7 @@ import { SocketEvents } from '@/shared/socket-events'; import { useSocket } from '@/socket/socketContext'; import { colors } from '@/styles/colors'; import { ITaskViewModel } from '@/types/tasks/task.types'; -import { Flex, Form, FormInstance, InputNumber, Typography } from 'antd'; +import { Flex, Form, FormInstance, InputNumber, Typography } from '@/shared/antd-imports'; import { TFunction } from 'i18next'; import { useState } from 'react'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-key/task-drawer-key.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-key/task-drawer-key.tsx index 659f39b9..d884c832 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-key/task-drawer-key.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-key/task-drawer-key.tsx @@ -1,7 +1,7 @@ import { ITaskFormViewModel } from '@/types/tasks/task.types'; -import { Tag } from 'antd'; +import { Tag } from '@/shared/antd-imports'; -import { Form } from 'antd'; +import { Form } from '@/shared/antd-imports'; interface TaskDrawerKeyProps { taskKey: string; diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-labels/task-drawer-labels.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-labels/task-drawer-labels.tsx index 55f957b3..2b70d41f 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-labels/task-drawer-labels.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-labels/task-drawer-labels.tsx @@ -1,4 +1,4 @@ -import { PlusOutlined } from '@ant-design/icons'; +import { PlusOutlined } from '@/shared/antd-imports'; import { Badge, Button, @@ -12,7 +12,7 @@ import { List, Tag, Typography, -} from 'antd'; +} from '@/shared/antd-imports'; import { useEffect, useMemo, useRef, useState } from 'react'; import { useAppSelector } from '@/hooks/useAppSelector'; import { colors } from '@/styles/colors'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-phase-selector/task-drawer-phase-selector.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-phase-selector/task-drawer-phase-selector.tsx index e7504761..2588d078 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-phase-selector/task-drawer-phase-selector.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-phase-selector/task-drawer-phase-selector.tsx @@ -1,8 +1,8 @@ import { useSocket } from '@/socket/socketContext'; import { ITaskPhase } from '@/types/tasks/taskPhase.types'; -import { Select } from 'antd'; +import { Select } from '@/shared/antd-imports'; -import { Form } from 'antd'; +import { Form } from '@/shared/antd-imports'; import { SocketEvents } from '@/shared/socket-events'; import { ITaskViewModel } from '@/types/tasks/task.types'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-priority-selector/task-drawer-priority-selector.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-priority-selector/task-drawer-priority-selector.tsx index 6436dfd9..b8678de6 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-priority-selector/task-drawer-priority-selector.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-priority-selector/task-drawer-priority-selector.tsx @@ -1,4 +1,4 @@ -import { Flex, Select, Typography } from 'antd'; +import { Flex, Select, Typography } from '@/shared/antd-imports'; import './priority-dropdown.css'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useState, useEffect, useMemo } from 'react'; @@ -6,7 +6,7 @@ import { ALPHA_CHANNEL } from '@/shared/constants'; import { useSocket } from '@/socket/socketContext'; import { SocketEvents } from '@/shared/socket-events'; import { ITaskPriority } from '@/types/tasks/taskPriority.types'; -import { DoubleLeftOutlined, MinusOutlined, PauseOutlined } from '@ant-design/icons'; +import { DoubleLeftOutlined, MinusOutlined, PauseOutlined } from '@/shared/antd-imports'; import { ITaskViewModel } from '@/types/tasks/task.types'; import { useAuthService } from '@/hooks/useAuth'; import { useAppDispatch } from '@/hooks/useAppDispatch'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-progress/task-drawer-progress.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-progress/task-drawer-progress.tsx index c8600ed9..f58f7ceb 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-progress/task-drawer-progress.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-progress/task-drawer-progress.tsx @@ -1,6 +1,6 @@ -import { Form, InputNumber, Tooltip, Modal } from 'antd'; +import { Form, InputNumber, Tooltip, Modal } from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; -import { QuestionCircleOutlined } from '@ant-design/icons'; +import { QuestionCircleOutlined } from '@/shared/antd-imports'; import { useAppSelector } from '@/hooks/useAppSelector'; import { ITaskViewModel } from '@/types/tasks/task.types'; import Flex from 'antd/lib/flex'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-recurring-config/task-drawer-recurring-config.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-recurring-config/task-drawer-recurring-config.tsx index 1d12c480..84ff8d47 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-recurring-config/task-drawer-recurring-config.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/details/task-drawer-recurring-config/task-drawer-recurring-config.tsx @@ -11,8 +11,8 @@ import { Skeleton, Row, Col, -} from 'antd'; -import { SettingOutlined } from '@ant-design/icons'; +} from '@/shared/antd-imports'; +import { SettingOutlined } from '@/shared/antd-imports'; import { useSocket } from '@/socket/socketContext'; import { SocketEvents } from '@/shared/socket-events'; import { diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/info-tab-footer.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/info-tab-footer.tsx index 0bfabd28..62f5383b 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/info-tab-footer.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/info-tab-footer.tsx @@ -1,7 +1,7 @@ -import { Button, Flex, Form, Mentions, Space, Tooltip, Typography, message } from 'antd'; +import { Button, Flex, Form, Mentions, Space, Tooltip, Typography, message } from '@/shared/antd-imports'; import { useCallback, useEffect, useRef, useState, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import { PaperClipOutlined, DeleteOutlined, PlusOutlined } from '@ant-design/icons'; +import { PaperClipOutlined, DeleteOutlined, PlusOutlined } from '@/shared/antd-imports'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import { colors } from '@/styles/colors'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/notify-member-selector.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/notify-member-selector.tsx index cde137d9..41563380 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/notify-member-selector.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/notify-member-selector.tsx @@ -1,4 +1,4 @@ -import { PlusOutlined } from '@ant-design/icons'; +import { PlusOutlined } from '@/shared/antd-imports'; import { Button, Card, @@ -10,7 +10,7 @@ import { InputRef, List, Typography, -} from 'antd'; +} from '@/shared/antd-imports'; import { useEffect, useMemo, useRef, useState } from 'react'; import { TFunction } from 'i18next'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/subtask-table.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/subtask-table.tsx index d8ca806b..8bb0fb36 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/subtask-table.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/subtask-table.tsx @@ -1,6 +1,6 @@ -import { Button, Flex, Input, Popconfirm, Progress, Table, Tag, Tooltip } from 'antd'; +import { Button, Flex, Input, Popconfirm, Progress, Table, Tag, Tooltip } from '@/shared/antd-imports'; import { useState, useMemo, useEffect } from 'react'; -import { DeleteOutlined, EditOutlined, ExclamationCircleFilled } from '@ant-design/icons'; +import { DeleteOutlined, EditOutlined, ExclamationCircleFilled } from '@/shared/antd-imports'; import { nanoid } from '@reduxjs/toolkit'; import { TFunction } from 'i18next'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/task-details-form.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/task-details-form.tsx index 23dac128..8e960674 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/task-details-form.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/task-details-form.tsx @@ -9,7 +9,7 @@ import { Button, ConfigProvider, Flex, -} from 'antd'; +} from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; import { colors } from '@/styles/colors'; import { ITaskFormViewModel, ITaskViewModel } from '@/types/tasks/task.types'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/info-tab/task-drawer-info-tab.tsx b/worklenz-frontend/src/components/task-drawer/shared/info-tab/task-drawer-info-tab.tsx index e90c9cce..f4dbd974 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/info-tab/task-drawer-info-tab.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/info-tab/task-drawer-info-tab.tsx @@ -1,6 +1,6 @@ -import { Button, Collapse, CollapseProps, Flex, Skeleton, Tooltip, Typography, Upload } from 'antd'; +import { Button, Collapse, CollapseProps, Flex, Skeleton, Tooltip, Typography } from '@/shared/antd-imports'; import React, { useEffect, useState, useRef } from 'react'; -import { ReloadOutlined } from '@ant-design/icons'; +import { ReloadOutlined } from '@/shared/antd-imports'; import DescriptionEditor from './description-editor'; import SubTaskTable from './subtask-table'; import DependenciesTable from './dependencies-table'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/time-log/TaskDrawerTimeLog.tsx b/worklenz-frontend/src/components/task-drawer/shared/time-log/TaskDrawerTimeLog.tsx index 02e073d8..35f6759d 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/time-log/TaskDrawerTimeLog.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/time-log/TaskDrawerTimeLog.tsx @@ -1,5 +1,5 @@ -import { DownloadOutlined, PlusOutlined } from '@ant-design/icons'; -import { Button, Divider, Flex, Skeleton, Typography } from 'antd'; +import { DownloadOutlined, PlusOutlined } from '@/shared/antd-imports'; +import { Button, Divider, Flex, Skeleton, Typography } from '@/shared/antd-imports'; import { useEffect, useState } from 'react'; import EmptyListPlaceholder from '@/components/EmptyListPlaceholder'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/time-log/task-drawer-time-log.tsx b/worklenz-frontend/src/components/task-drawer/shared/time-log/task-drawer-time-log.tsx index 97daf8b5..61f245cf 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/time-log/task-drawer-time-log.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/time-log/task-drawer-time-log.tsx @@ -1,5 +1,5 @@ -import { DownloadOutlined, PlayCircleFilled, PlusOutlined } from '@ant-design/icons'; -import { Button, Divider, Flex, Skeleton, Typography } from 'antd'; +import { DownloadOutlined } from '@/shared/antd-imports'; +import { Button, Divider, Flex, Skeleton, Typography } from '@/shared/antd-imports'; import { useEffect, useState, useCallback } from 'react'; import { TFunction } from 'i18next'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/time-log/time-log-form.tsx b/worklenz-frontend/src/components/task-drawer/shared/time-log/time-log-form.tsx index 91463e6b..ed48a922 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/time-log/time-log-form.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/time-log/time-log-form.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Button, DatePicker, Form, Input, TimePicker, Flex } from 'antd'; -import { ClockCircleOutlined } from '@ant-design/icons'; +import { Button, DatePicker, Form, Input, TimePicker, Flex } from '@/shared/antd-imports'; +import { ClockCircleOutlined } from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; import dayjs from 'dayjs'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/time-log/time-log-item.tsx b/worklenz-frontend/src/components/task-drawer/shared/time-log/time-log-item.tsx index a7d88fe6..8e1fcbe9 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/time-log/time-log-item.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/time-log/time-log-item.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Button, Divider, Flex, Popconfirm, Typography, Space } from 'antd'; +import { Button, Divider, Flex, Popconfirm, Typography, Space } from '@/shared/antd-imports'; import { colors } from '@/styles/colors'; import { ITaskLogViewModel } from '@/types/tasks/task-log-view.types'; import SingleAvatar from '@/components/common/single-avatar/single-avatar'; diff --git a/worklenz-frontend/src/components/task-drawer/shared/time-log/time-log-list.tsx b/worklenz-frontend/src/components/task-drawer/shared/time-log/time-log-list.tsx index 192d6990..05ff540a 100644 --- a/worklenz-frontend/src/components/task-drawer/shared/time-log/time-log-list.tsx +++ b/worklenz-frontend/src/components/task-drawer/shared/time-log/time-log-list.tsx @@ -1,4 +1,4 @@ -import { Flex } from 'antd'; +import { Flex } from '@/shared/antd-imports'; import React, { useState } from 'react'; import TimeLogItem from './time-log-item'; import { ITaskLogViewModel } from '@/types/tasks/task-log-view.types'; diff --git a/worklenz-frontend/src/components/task-drawer/task-drawer-header/task-drawer-header.tsx b/worklenz-frontend/src/components/task-drawer/task-drawer-header/task-drawer-header.tsx index 40de65e8..cad8d6cb 100644 --- a/worklenz-frontend/src/components/task-drawer/task-drawer-header/task-drawer-header.tsx +++ b/worklenz-frontend/src/components/task-drawer/task-drawer-header/task-drawer-header.tsx @@ -1,6 +1,6 @@ -import { Button, Dropdown, Flex, Input, InputRef, MenuProps, Tooltip } from 'antd'; +import { Button, Dropdown, Flex, Input, InputRef, MenuProps, Tooltip } from '@/shared/antd-imports'; import React, { ChangeEvent, useEffect, useRef, useState } from 'react'; -import { EllipsisOutlined } from '@ant-design/icons'; +import { EllipsisOutlined } from '@/shared/antd-imports'; import { TFunction } from 'i18next'; import './task-drawer-header.css'; diff --git a/worklenz-frontend/src/components/task-drawer/task-drawer-status-dropdown/task-drawer-status-dropdown.tsx b/worklenz-frontend/src/components/task-drawer/task-drawer-status-dropdown/task-drawer-status-dropdown.tsx index a7460e0a..e965d6a3 100644 --- a/worklenz-frontend/src/components/task-drawer/task-drawer-status-dropdown/task-drawer-status-dropdown.tsx +++ b/worklenz-frontend/src/components/task-drawer/task-drawer-status-dropdown/task-drawer-status-dropdown.tsx @@ -11,7 +11,7 @@ import { ITaskListStatusChangeResponse } from '@/types/tasks/task-list-status.ty import { ITaskViewModel } from '@/types/tasks/task.types'; import { ITaskStatus } from '@/types/tasks/taskStatus.types'; import { checkTaskDependencyStatus } from '@/utils/check-task-dependency-status'; -import { Select } from 'antd'; +import { Select } from '@/shared/antd-imports'; import { useMemo } from 'react'; import { updateEnhancedKanbanTaskStatus } from '@/features/enhanced-kanban/enhanced-kanban.slice'; diff --git a/worklenz-frontend/src/components/task-drawer/task-drawer.tsx b/worklenz-frontend/src/components/task-drawer/task-drawer.tsx index de80fb4f..835a9ab2 100644 --- a/worklenz-frontend/src/components/task-drawer/task-drawer.tsx +++ b/worklenz-frontend/src/components/task-drawer/task-drawer.tsx @@ -1,9 +1,9 @@ -import { TabsProps, Tabs, Button } from 'antd'; +import { TabsProps, Tabs, Button } from '@/shared/antd-imports'; import Drawer from 'antd/es/drawer'; import { InputRef } from 'antd/es/input'; import { useTranslation } from 'react-i18next'; import { useEffect, useRef, useState } from 'react'; -import { PlusOutlined, CloseOutlined, ArrowLeftOutlined } from '@ant-design/icons'; +import { PlusOutlined, CloseOutlined, ArrowLeftOutlined } from '@/shared/antd-imports'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useAppDispatch } from '@/hooks/useAppDispatch'; @@ -25,7 +25,7 @@ import TimeLogForm from './shared/time-log/time-log-form'; import { DEFAULT_TASK_NAME } from '@/shared/constants'; import useTaskDrawerUrlSync from '@/hooks/useTaskDrawerUrlSync'; import InfoTabFooter from './shared/info-tab/info-tab-footer'; -import { Flex } from 'antd'; +import { Flex } from '@/shared/antd-imports'; const TaskDrawer = () => { const { t } = useTranslation('task-drawer/task-drawer'); diff --git a/worklenz-frontend/src/components/task-drawer/task-hierarchy-breadcrumb/task-hierarchy-breadcrumb.tsx b/worklenz-frontend/src/components/task-drawer/task-hierarchy-breadcrumb/task-hierarchy-breadcrumb.tsx index 792b4347..2e9b615c 100644 --- a/worklenz-frontend/src/components/task-drawer/task-hierarchy-breadcrumb/task-hierarchy-breadcrumb.tsx +++ b/worklenz-frontend/src/components/task-drawer/task-hierarchy-breadcrumb/task-hierarchy-breadcrumb.tsx @@ -1,6 +1,6 @@ import React, { useState, useEffect } from 'react'; -import { Breadcrumb, Button, Typography, Tooltip } from 'antd'; -import { HomeOutlined } from '@ant-design/icons'; +import { Breadcrumb, Button, Typography, Tooltip } from '@/shared/antd-imports'; +import { HomeOutlined } from '@/shared/antd-imports'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import { fetchTask, setSelectedTaskId } from '@/features/task-drawer/task-drawer.slice'; diff --git a/worklenz-frontend/src/components/task-list-common/assigneeSelector/AssigneeSelector.tsx b/worklenz-frontend/src/components/task-list-common/assigneeSelector/AssigneeSelector.tsx index 256e7eb6..cda82637 100644 --- a/worklenz-frontend/src/components/task-list-common/assigneeSelector/AssigneeSelector.tsx +++ b/worklenz-frontend/src/components/task-list-common/assigneeSelector/AssigneeSelector.tsx @@ -11,14 +11,14 @@ import { InputRef, List, Typography, -} from 'antd'; +} from '@/shared/antd-imports'; import React, { useMemo, useRef, useState } from 'react'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import { toggleProjectMemberDrawer } from '../../../features/projects/singleProject/members/projectMembersSlice'; import CustomAvatar from '../../CustomAvatar'; import { colors } from '../../../styles/colors'; -import { PlusOutlined, UsergroupAddOutlined } from '@ant-design/icons'; +import { PlusOutlined, UsergroupAddOutlined } from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; import { ITaskAssignee } from '@/types/tasks/task.types'; diff --git a/worklenz-frontend/src/components/task-list-common/convert-to-subtask-drawer/convert-to-subtask-drawer.tsx b/worklenz-frontend/src/components/task-list-common/convert-to-subtask-drawer/convert-to-subtask-drawer.tsx index b4d53a19..b4398714 100644 --- a/worklenz-frontend/src/components/task-list-common/convert-to-subtask-drawer/convert-to-subtask-drawer.tsx +++ b/worklenz-frontend/src/components/task-list-common/convert-to-subtask-drawer/convert-to-subtask-drawer.tsx @@ -9,7 +9,7 @@ import { setConvertToSubtaskDrawerOpen, updateTaskStatus, } from '@/features/tasks/tasks.slice'; -import { RightOutlined } from '@ant-design/icons'; +import { RightOutlined } from '@/shared/antd-imports'; import CustomSearchbar from '@/components/CustomSearchbar'; import { ITaskListConfigV2, tasksApiService } from '@/api/tasks/tasks.api.service'; import { SocketEvents } from '@/shared/socket-events'; diff --git a/worklenz-frontend/src/components/task-list-common/labelsSelector/color-changed-label.tsx b/worklenz-frontend/src/components/task-list-common/labelsSelector/color-changed-label.tsx index f76e9d8d..ce708d81 100644 --- a/worklenz-frontend/src/components/task-list-common/labelsSelector/color-changed-label.tsx +++ b/worklenz-frontend/src/components/task-list-common/labelsSelector/color-changed-label.tsx @@ -1,4 +1,4 @@ -import { Select, Tag, Tooltip } from 'antd'; +import { Select, Tag, Tooltip } from '@/shared/antd-imports'; import { PhaseColorCodes } from '../../../shared/constants'; import { useTranslation } from 'react-i18next'; import { ITaskLabel } from '@/types/tasks/taskLabel.types'; diff --git a/worklenz-frontend/src/components/task-list-common/labelsSelector/custom-color-label.tsx b/worklenz-frontend/src/components/task-list-common/labelsSelector/custom-color-label.tsx index 29f582dc..aff1f4c4 100644 --- a/worklenz-frontend/src/components/task-list-common/labelsSelector/custom-color-label.tsx +++ b/worklenz-frontend/src/components/task-list-common/labelsSelector/custom-color-label.tsx @@ -1,4 +1,4 @@ -import { Tag, Typography } from 'antd'; +import { Tag, Typography } from '@/shared/antd-imports'; import { colors } from '@/styles/colors'; import { ITaskLabel } from '@/types/tasks/taskLabel.types'; import { ALPHA_CHANNEL } from '@/shared/constants'; diff --git a/worklenz-frontend/src/components/task-list-common/labelsSelector/custom-number-label.tsx b/worklenz-frontend/src/components/task-list-common/labelsSelector/custom-number-label.tsx index 9e8505af..d354ca72 100644 --- a/worklenz-frontend/src/components/task-list-common/labelsSelector/custom-number-label.tsx +++ b/worklenz-frontend/src/components/task-list-common/labelsSelector/custom-number-label.tsx @@ -1,4 +1,4 @@ -import { Tag, Tooltip } from 'antd'; +import { Tag, Tooltip } from '@/shared/antd-imports'; import { ITaskLabel } from '@/types/tasks/taskLabel.types'; const CustomNumberLabel = ({ labelList }: { labelList: ITaskLabel[] | null }) => { diff --git a/worklenz-frontend/src/components/task-list-common/labelsSelector/labels-selector.tsx b/worklenz-frontend/src/components/task-list-common/labelsSelector/labels-selector.tsx index 554236b5..e794ab8b 100644 --- a/worklenz-frontend/src/components/task-list-common/labelsSelector/labels-selector.tsx +++ b/worklenz-frontend/src/components/task-list-common/labelsSelector/labels-selector.tsx @@ -1,5 +1,5 @@ /* eslint-disable react-hooks/exhaustive-deps */ -import { PlusOutlined } from '@ant-design/icons'; +import { PlusOutlined } from '@/shared/antd-imports'; import { Badge, Button, @@ -12,7 +12,7 @@ import { InputRef, List, Typography, -} from 'antd'; +} from '@/shared/antd-imports'; import React, { useMemo, useRef, useState } from 'react'; import { useAppSelector } from '@/hooks/useAppSelector'; import { colors } from '@/styles/colors'; diff --git a/worklenz-frontend/src/components/task-list-common/phaseDropdown/PhaseDropdown.tsx b/worklenz-frontend/src/components/task-list-common/phaseDropdown/PhaseDropdown.tsx index 468f2e24..100e1ffc 100644 --- a/worklenz-frontend/src/components/task-list-common/phaseDropdown/PhaseDropdown.tsx +++ b/worklenz-frontend/src/components/task-list-common/phaseDropdown/PhaseDropdown.tsx @@ -1,4 +1,4 @@ -import { Badge, Flex, Select, Typography } from 'antd'; +import { Badge, Flex, Select, Typography } from '@/shared/antd-imports'; import React, { useState } from 'react'; // custom css file import './phaseDropdown.css'; diff --git a/worklenz-frontend/src/components/task-list-common/priorityDropdown/priority-dropdown.tsx b/worklenz-frontend/src/components/task-list-common/priorityDropdown/priority-dropdown.tsx index 7e7ee9c7..1829e799 100644 --- a/worklenz-frontend/src/components/task-list-common/priorityDropdown/priority-dropdown.tsx +++ b/worklenz-frontend/src/components/task-list-common/priorityDropdown/priority-dropdown.tsx @@ -1,4 +1,4 @@ -import { Flex, Select, Typography } from 'antd'; +import { Flex, Select, Typography } from '@/shared/antd-imports'; import './priority-dropdown.css'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useState, useEffect, useMemo } from 'react'; @@ -7,7 +7,7 @@ import { useSocket } from '@/socket/socketContext'; import { SocketEvents } from '@/shared/socket-events'; import { IProjectTask } from '@/types/project/projectTasksViewModel.types'; import { ITaskPriority } from '@/types/tasks/taskPriority.types'; -import { DoubleLeftOutlined, MinusOutlined, PauseOutlined } from '@ant-design/icons'; +import { DoubleLeftOutlined, MinusOutlined, PauseOutlined } from '@/shared/antd-imports'; type PriorityDropdownProps = { task: IProjectTask; diff --git a/worklenz-frontend/src/components/task-list-common/status-dropdown/status-dropdown.tsx b/worklenz-frontend/src/components/task-list-common/status-dropdown/status-dropdown.tsx index 09f27c8b..92a38e9d 100644 --- a/worklenz-frontend/src/components/task-list-common/status-dropdown/status-dropdown.tsx +++ b/worklenz-frontend/src/components/task-list-common/status-dropdown/status-dropdown.tsx @@ -1,4 +1,4 @@ -import { Flex, Select } from 'antd'; +import { Flex, Select } from '@/shared/antd-imports'; import './status-dropdown.css'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useMemo } from 'react'; diff --git a/worklenz-frontend/src/components/task-list-common/task-row/task-list-due-time-cell/task-row-due-time.tsx b/worklenz-frontend/src/components/task-list-common/task-row/task-list-due-time-cell/task-row-due-time.tsx index 3cdb9a45..7898cf20 100644 --- a/worklenz-frontend/src/components/task-list-common/task-row/task-list-due-time-cell/task-row-due-time.tsx +++ b/worklenz-frontend/src/components/task-list-common/task-row/task-list-due-time-cell/task-row-due-time.tsx @@ -1,4 +1,4 @@ -import { TimePicker, TimePickerProps } from 'antd'; +import { TimePicker, TimePickerProps } from '@/shared/antd-imports'; type TaskRowDueTimeProps = { dueTime: string; diff --git a/worklenz-frontend/src/components/task-list-common/task-row/task-row-description/task-row-description.tsx b/worklenz-frontend/src/components/task-list-common/task-row/task-row-description/task-row-description.tsx index 3deffddc..e90ff63e 100644 --- a/worklenz-frontend/src/components/task-list-common/task-row/task-row-description/task-row-description.tsx +++ b/worklenz-frontend/src/components/task-list-common/task-row/task-row-description/task-row-description.tsx @@ -1,4 +1,4 @@ -import { Typography } from 'antd'; +import { Typography } from '@/shared/antd-imports'; const TaskRowDescription = ({ description }: { description: string }) => { return ( diff --git a/worklenz-frontend/src/components/task-list-common/task-row/task-row-name/task-row-name.tsx b/worklenz-frontend/src/components/task-list-common/task-row/task-row-name/task-row-name.tsx index 11ee8514..5d4f8de8 100644 --- a/worklenz-frontend/src/components/task-list-common/task-row/task-row-name/task-row-name.tsx +++ b/worklenz-frontend/src/components/task-list-common/task-row/task-row-name/task-row-name.tsx @@ -1,12 +1,12 @@ // TaskNameCell.tsx import React, { useCallback } from 'react'; -import { Flex, Typography, Button } from 'antd'; +import { Flex, Typography, Button } from '@/shared/antd-imports'; import { DoubleRightOutlined, DownOutlined, RightOutlined, ExpandAltOutlined, -} from '@ant-design/icons'; +} from '@/shared/antd-imports'; import { colors } from '@/styles/colors'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import { setShowTaskDrawer } from '@/features/task-drawer/task-drawer.slice'; diff --git a/worklenz-frontend/src/components/task-list-common/task-row/task-row-progress/task-row-progress.tsx b/worklenz-frontend/src/components/task-list-common/task-row/task-row-progress/task-row-progress.tsx index 6bfaa7fb..564d0c23 100644 --- a/worklenz-frontend/src/components/task-list-common/task-row/task-row-progress/task-row-progress.tsx +++ b/worklenz-frontend/src/components/task-list-common/task-row/task-row-progress/task-row-progress.tsx @@ -1,4 +1,4 @@ -import { Progress, Tooltip } from 'antd'; +import { Progress, Tooltip } from '@/shared/antd-imports'; import './task-row-progress.css'; import React from 'react'; diff --git a/worklenz-frontend/src/components/task-list-common/task-row/task-row-time-tracking/task-row-time-tracking.tsx b/worklenz-frontend/src/components/task-list-common/task-row/task-row-time-tracking/task-row-time-tracking.tsx index 2d4f7395..2aeafe48 100644 --- a/worklenz-frontend/src/components/task-list-common/task-row/task-row-time-tracking/task-row-time-tracking.tsx +++ b/worklenz-frontend/src/components/task-list-common/task-row/task-row-time-tracking/task-row-time-tracking.tsx @@ -1,6 +1,6 @@ import React, { useMemo } from 'react'; -import { Divider, Empty, Flex, Popover, Typography } from 'antd'; -import { PlayCircleFilled } from '@ant-design/icons'; +import { Divider, Empty, Flex, Popover, Typography } from '@/shared/antd-imports'; +import { PlayCircleFilled } from '@/shared/antd-imports'; import { colors } from '@/styles/colors'; import CustomAvatar from '@components/CustomAvatar'; import { mockTimeLogs } from '@/pages/projects/project-view-1/taskList/taskListTable/taskListTableCells/mockTimeLogs'; diff --git a/worklenz-frontend/src/components/task-list-v2/GroupProgressBar.tsx b/worklenz-frontend/src/components/task-list-v2/GroupProgressBar.tsx index a8623d27..10a89f84 100644 --- a/worklenz-frontend/src/components/task-list-v2/GroupProgressBar.tsx +++ b/worklenz-frontend/src/components/task-list-v2/GroupProgressBar.tsx @@ -1,5 +1,6 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; +import { Tooltip } from '@/shared/antd-imports'; interface GroupProgressBarProps { todoProgress: number; @@ -15,24 +16,34 @@ const GroupProgressBar: React.FC = ({ groupType }) => { const { t } = useTranslation('task-management'); + console.log(todoProgress, doingProgress, doneProgress); // Only show for priority and phase grouping if (groupType !== 'priority' && groupType !== 'phase') { return null; } - const total = todoProgress + doingProgress + doneProgress; + const total = (todoProgress || 0) + (doingProgress || 0) + (doneProgress || 0); // Don't show if no progress values exist if (total === 0) { return null; } + // Tooltip content with all values in rows + const tooltipContent = ( +
+
{t('todo')}: {todoProgress || 0}%
+
{t('inProgress')}: {doingProgress || 0}%
+
{t('done')}: {doneProgress || 0}%
+
+ ); + return (
{/* Compact progress text */} - {doneProgress}% {t('done')} + {doneProgress || 0}% {t('done')} {/* Compact progress bar */} @@ -40,27 +51,30 @@ const GroupProgressBar: React.FC = ({
{/* Todo section - light green */} {todoProgress > 0 && ( -
+ +
+ )} {/* Doing section - medium green */} {doingProgress > 0 && ( -
+ +
+ )} {/* Done section - dark green */} {doneProgress > 0 && ( -
+ +
+ )}
@@ -68,22 +82,25 @@ const GroupProgressBar: React.FC = ({ {/* Small legend dots with better spacing */}
{todoProgress > 0 && ( -
+ +
+ )} {doingProgress > 0 && ( -
+ +
+ )} {doneProgress > 0 && ( -
+ +
+ )}
diff --git a/worklenz-frontend/src/components/task-list-v2/TaskGroupHeader.tsx b/worklenz-frontend/src/components/task-list-v2/TaskGroupHeader.tsx index d3f2e5b7..32a19dd4 100644 --- a/worklenz-frontend/src/components/task-list-v2/TaskGroupHeader.tsx +++ b/worklenz-frontend/src/components/task-list-v2/TaskGroupHeader.tsx @@ -1,15 +1,29 @@ import React, { useMemo, useCallback, useState } from 'react'; import { useDroppable } from '@dnd-kit/core'; // @ts-ignore: Heroicons module types -import { ChevronDownIcon, ChevronRightIcon, EllipsisHorizontalIcon, PencilIcon, ArrowPathIcon } from '@heroicons/react/24/outline'; -import { Checkbox, Dropdown, Menu, Input, Modal, Badge, Flex } from 'antd'; +import { + ChevronDownIcon, + ChevronRightIcon, + EllipsisHorizontalIcon, + PencilIcon, + ArrowPathIcon, +} from '@heroicons/react/24/outline'; +import { Checkbox, Dropdown, Menu, Input, Modal, Badge, Flex } from '@/shared/antd-imports'; import GroupProgressBar from './GroupProgressBar'; import { useTranslation } from 'react-i18next'; import { getContrastColor } from '@/utils/colorUtils'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useAppDispatch } from '@/hooks/useAppDispatch'; -import { selectSelectedTaskIds, selectTask, deselectTask } from '@/features/task-management/selection.slice'; -import { selectGroups, fetchTasksV3, selectAllTasksArray } from '@/features/task-management/task-management.slice'; +import { + selectSelectedTaskIds, + selectTask, + deselectTask, +} from '@/features/task-management/selection.slice'; +import { + selectGroups, + fetchTasksV3, + selectAllTasksArray, +} from '@/features/task-management/task-management.slice'; import { selectCurrentGrouping } from '@/features/task-management/grouping.slice'; import { statusApiService } from '@/api/taskAttributes/status/status.api.service'; import { phasesApiService } from '@/api/taskAttributes/phases/phases.api.service'; @@ -38,7 +52,12 @@ interface TaskGroupHeaderProps { projectId: string; } -const TaskGroupHeader: React.FC = ({ group, isCollapsed, onToggle, projectId }) => { +const TaskGroupHeader: React.FC = ({ + group, + isCollapsed, + onToggle, + projectId, +}) => { const { t } = useTranslation('task-management'); const dispatch = useAppDispatch(); const selectedTaskIds = useAppSelector(selectSelectedTaskIds); @@ -48,14 +67,14 @@ const TaskGroupHeader: React.FC = ({ group, isCollapsed, o const { statusCategories, status: statusList } = useAppSelector(state => state.taskStatusReducer); const { trackMixpanelEvent } = useMixpanelTracking(); const { isOwnerOrAdmin } = useAuthService(); - + const [dropdownVisible, setDropdownVisible] = useState(false); const [isRenaming, setIsRenaming] = useState(false); const [isChangingCategory, setIsChangingCategory] = useState(false); const [isEditingName, setIsEditingName] = useState(false); const [editingName, setEditingName] = useState(group.name); - + const headerBackgroundColor = group.color || '#F0F0F0'; // Default light gray if no color const headerTextColor = getContrastColor(headerBackgroundColor); @@ -85,53 +104,79 @@ const TaskGroupHeader: React.FC = ({ group, isCollapsed, o // If we're grouping by status, show progress based on task completion if (currentGrouping === 'status') { // For status grouping, calculate based on task progress values - const progressStats = tasksInCurrentGroup.reduce((acc, task) => { - const progress = task.progress || 0; - if (progress === 0) { - acc.todo += 1; - } else if (progress === 100) { - acc.done += 1; - } else { - acc.doing += 1; - } - return acc; - }, { todo: 0, doing: 0, done: 0 }); + const progressStats = tasksInCurrentGroup.reduce( + (acc, task) => { + const progress = task.progress || 0; + if (progress === 0) { + acc.todo += 1; + } else if (progress === 100) { + acc.done += 1; + } else { + acc.doing += 1; + } + return acc; + }, + { todo: 0, doing: 0, done: 0 } + ); const totalTasks = tasksInCurrentGroup.length; - + return { - todoProgress: totalTasks > 0 ? Math.round((progressStats.todo / totalTasks) * 100) : 0, - doingProgress: totalTasks > 0 ? Math.round((progressStats.doing / totalTasks) * 100) : 0, - doneProgress: totalTasks > 0 ? Math.round((progressStats.done / totalTasks) * 100) : 0, + todoProgress: totalTasks > 0 ? Math.round((progressStats.todo / totalTasks) * 100) || 0 : 0, + doingProgress: + totalTasks > 0 ? Math.round((progressStats.doing / totalTasks) * 100) || 0 : 0, + doneProgress: totalTasks > 0 ? Math.round((progressStats.done / totalTasks) * 100) || 0 : 0, }; } else { // For priority/phase grouping, show progress based on status distribution // Use a simplified approach based on status names and common patterns - const statusCounts = tasksInCurrentGroup.reduce((acc, task) => { - // Find the status by ID first - const statusInfo = statusList.find(s => s.id === task.status); - const statusName = statusInfo?.name?.toLowerCase() || task.status?.toLowerCase() || ''; - - // Categorize based on common status name patterns - if (statusName.includes('todo') || statusName.includes('to do') || statusName.includes('pending') || statusName.includes('open') || statusName.includes('backlog')) { - acc.todo += 1; - } else if (statusName.includes('doing') || statusName.includes('progress') || statusName.includes('active') || statusName.includes('working') || statusName.includes('development')) { - acc.doing += 1; - } else if (statusName.includes('done') || statusName.includes('completed') || statusName.includes('finished') || statusName.includes('closed') || statusName.includes('resolved')) { - acc.done += 1; - } else { - // Default unknown statuses to "doing" (in progress) - acc.doing += 1; - } - return acc; - }, { todo: 0, doing: 0, done: 0 }); + const statusCounts = tasksInCurrentGroup.reduce( + (acc, task) => { + // Find the status by ID first + const statusInfo = statusList.find(s => s.id === task.status); + const statusName = statusInfo?.name?.toLowerCase() || task.status?.toLowerCase() || ''; + + // Categorize based on common status name patterns + if ( + statusName.includes('todo') || + statusName.includes('to do') || + statusName.includes('pending') || + statusName.includes('open') || + statusName.includes('backlog') + ) { + acc.todo += 1; + } else if ( + statusName.includes('doing') || + statusName.includes('progress') || + statusName.includes('active') || + statusName.includes('working') || + statusName.includes('development') + ) { + acc.doing += 1; + } else if ( + statusName.includes('done') || + statusName.includes('completed') || + statusName.includes('finished') || + statusName.includes('closed') || + statusName.includes('resolved') + ) { + acc.done += 1; + } else { + // Default unknown statuses to "doing" (in progress) + acc.doing += 1; + } + return acc; + }, + { todo: 0, doing: 0, done: 0 } + ); const totalTasks = tasksInCurrentGroup.length; - + return { - todoProgress: totalTasks > 0 ? Math.round((statusCounts.todo / totalTasks) * 100) : 0, - doingProgress: totalTasks > 0 ? Math.round((statusCounts.doing / totalTasks) * 100) : 0, - doneProgress: totalTasks > 0 ? Math.round((statusCounts.done / totalTasks) * 100) : 0, + todoProgress: totalTasks > 0 ? Math.round((statusCounts.todo / totalTasks) * 100) || 0 : 0, + doingProgress: + totalTasks > 0 ? Math.round((statusCounts.doing / totalTasks) * 100) || 0 : 0, + doneProgress: totalTasks > 0 ? Math.round((statusCounts.done / totalTasks) * 100) || 0 : 0, }; } }, [currentGroup, allTasks, statusList, currentGrouping]); @@ -141,30 +186,34 @@ const TaskGroupHeader: React.FC = ({ group, isCollapsed, o if (tasksInGroup.length === 0) { return { isAllSelected: false, isPartiallySelected: false }; } - + const selectedTasksInGroup = tasksInGroup.filter(taskId => selectedTaskIds.includes(taskId)); const allSelected = selectedTasksInGroup.length === tasksInGroup.length; - const partiallySelected = selectedTasksInGroup.length > 0 && selectedTasksInGroup.length < tasksInGroup.length; - + const partiallySelected = + selectedTasksInGroup.length > 0 && selectedTasksInGroup.length < tasksInGroup.length; + return { isAllSelected: allSelected, isPartiallySelected: partiallySelected }; }, [tasksInGroup, selectedTaskIds]); // Handle select all checkbox change - const handleSelectAllChange = useCallback((e: any) => { - e.stopPropagation(); - - if (isAllSelected) { - // Deselect all tasks in this group - tasksInGroup.forEach(taskId => { - dispatch(deselectTask(taskId)); - }); - } else { - // Select all tasks in this group - tasksInGroup.forEach(taskId => { - dispatch(selectTask(taskId)); - }); - } - }, [dispatch, isAllSelected, tasksInGroup]); + const handleSelectAllChange = useCallback( + (e: any) => { + e.stopPropagation(); + + if (isAllSelected) { + // Deselect all tasks in this group + tasksInGroup.forEach(taskId => { + dispatch(deselectTask(taskId)); + }); + } else { + // Select all tasks in this group + tasksInGroup.forEach(taskId => { + dispatch(selectTask(taskId)); + }); + } + }, + [dispatch, isAllSelected, tasksInGroup] + ); // Handle inline name editing const handleNameSave = useCallback(async () => { @@ -184,24 +233,22 @@ const TaskGroupHeader: React.FC = ({ group, isCollapsed, o name: editingName.trim(), project_id: projectId, }; - + await statusApiService.updateNameOfStatus(statusId, body, projectId); trackMixpanelEvent(evt_project_board_column_setting_click, { Rename: 'Status' }); dispatch(fetchStatuses(projectId)); - } else if (currentGrouping === 'phase') { // Extract phase ID from group ID (format: "phase-{phaseId}") const phaseId = group.id.replace('phase-', ''); const body = { id: phaseId, name: editingName.trim() }; - + await phasesApiService.updateNameOfPhase(phaseId, body as ITaskPhase, projectId); trackMixpanelEvent(evt_project_board_column_setting_click, { Rename: 'Phase' }); dispatch(fetchPhasesByProjectId(projectId)); } - + // Refresh task list to get updated group names dispatch(fetchTasksV3(projectId)); - } catch (error) { logger.error('Error renaming group:', error); setEditingName(group.name); @@ -209,24 +256,39 @@ const TaskGroupHeader: React.FC = ({ group, isCollapsed, o setIsEditingName(false); setIsRenaming(false); } - }, [editingName, group.name, group.id, currentGrouping, projectId, dispatch, trackMixpanelEvent, isRenaming]); + }, [ + editingName, + group.name, + group.id, + currentGrouping, + projectId, + dispatch, + trackMixpanelEvent, + isRenaming, + ]); - const handleNameClick = useCallback((e: React.MouseEvent) => { - e.stopPropagation(); - if (!isOwnerOrAdmin) return; - setIsEditingName(true); - setEditingName(group.name); - }, [group.name, isOwnerOrAdmin]); - - const handleNameKeyDown = useCallback((e: React.KeyboardEvent) => { - if (e.key === 'Enter') { - handleNameSave(); - } else if (e.key === 'Escape') { - setIsEditingName(false); + const handleNameClick = useCallback( + (e: React.MouseEvent) => { + e.stopPropagation(); + if (!isOwnerOrAdmin) return; + setIsEditingName(true); setEditingName(group.name); - } - e.stopPropagation(); - }, [group.name, handleNameSave]); + }, + [group.name, isOwnerOrAdmin] + ); + + const handleNameKeyDown = useCallback( + (e: React.KeyboardEvent) => { + if (e.key === 'Enter') { + handleNameSave(); + } else if (e.key === 'Escape') { + setIsEditingName(false); + setEditingName(group.name); + } + e.stopPropagation(); + }, + [group.name, handleNameSave] + ); const handleNameBlur = useCallback(() => { handleNameSave(); @@ -239,31 +301,31 @@ const TaskGroupHeader: React.FC = ({ group, isCollapsed, o setEditingName(group.name); }, [group.name]); - - // Handle category change - const handleCategoryChange = useCallback(async (categoryId: string, e?: React.MouseEvent) => { - e?.stopPropagation(); - if (isChangingCategory) return; + const handleCategoryChange = useCallback( + async (categoryId: string, e?: React.MouseEvent) => { + e?.stopPropagation(); + if (isChangingCategory) return; - setIsChangingCategory(true); - try { - // Extract status ID from group ID (format: "status-{statusId}") - const statusId = group.id.replace('status-', ''); - - await statusApiService.updateStatusCategory(statusId, categoryId, projectId); - trackMixpanelEvent(evt_project_board_column_setting_click, { 'Change category': 'Status' }); - - // Refresh status list and tasks - dispatch(fetchStatuses(projectId)); - dispatch(fetchTasksV3(projectId)); - - } catch (error) { - logger.error('Error changing category:', error); - } finally { - setIsChangingCategory(false); - } - }, [group.id, projectId, dispatch, trackMixpanelEvent, isChangingCategory]); + setIsChangingCategory(true); + try { + // Extract status ID from group ID (format: "status-{statusId}") + const statusId = group.id.replace('status-', ''); + + await statusApiService.updateStatusCategory(statusId, categoryId, projectId); + trackMixpanelEvent(evt_project_board_column_setting_click, { 'Change category': 'Status' }); + + // Refresh status list and tasks + dispatch(fetchStatuses(projectId)); + dispatch(fetchTasksV3(projectId)); + } catch (error) { + logger.error('Error changing category:', error); + } finally { + setIsChangingCategory(false); + } + }, + [group.id, projectId, dispatch, trackMixpanelEvent, isChangingCategory] + ); // Create dropdown menu items const menuItems = useMemo(() => { @@ -273,7 +335,12 @@ const TaskGroupHeader: React.FC = ({ group, isCollapsed, o { key: 'rename', icon: , - label: currentGrouping === 'status' ? t('renameStatus') : currentGrouping === 'phase' ? t('renamePhase') : t('renameGroup'), + label: + currentGrouping === 'status' + ? t('renameStatus') + : currentGrouping === 'phase' + ? t('renamePhase') + : t('renameGroup'), onClick: (e: any) => { e?.domEvent?.stopPropagation(); handleRenameGroup(); @@ -283,7 +350,7 @@ const TaskGroupHeader: React.FC = ({ group, isCollapsed, o // Only show "Change Category" when grouped by status if (currentGrouping === 'status') { - const categorySubMenuItems = statusCategories.map((category) => ({ + const categorySubMenuItems = statusCategories.map(category => ({ key: `category-${category.id}`, label: (
@@ -297,16 +364,23 @@ const TaskGroupHeader: React.FC = ({ group, isCollapsed, o }, })); - items.push({ - key: 'changeCategory', - icon: , - label: t('changeCategory'), - children: categorySubMenuItems, - } as any); + items.push({ + key: 'changeCategory', + icon: , + label: t('changeCategory'), + children: categorySubMenuItems, + } as any); } return items; - }, [currentGrouping, handleRenameGroup, handleCategoryChange, isOwnerOrAdmin, statusCategories, t]); + }, [ + currentGrouping, + handleRenameGroup, + handleCategoryChange, + isOwnerOrAdmin, + statusCategories, + t, + ]); // Make the group header droppable const { isOver, setNodeRef } = useDroppable({ @@ -317,7 +391,7 @@ const TaskGroupHeader: React.FC = ({ group, isCollapsed, o }, }); - return ( + return (
= ({ group, isCollapsed, o zIndex: 25, // Higher than task rows but lower than column headers (z-30) height: '36px', minHeight: '36px', - maxHeight: '36px' + maxHeight: '36px', }} onClick={onToggle} > {/* Drag Handle Space - ultra minimal width */}
{/* Chevron button */} - + +
+ )}
- {/* Three-dot menu - only show for status and phase grouping */} - {menuItems.length > 0 && (currentGrouping === 'status' || currentGrouping === 'phase') && ( -
- - - -
- )} - -
- {/* Progress Bar - sticky to the right edge during horizontal scroll */} - {(currentGrouping === 'priority' || currentGrouping === 'phase') && - (groupProgressValues.todoProgress || groupProgressValues.doingProgress || groupProgressValues.doneProgress) && ( -
- -
- )} + {(currentGrouping === 'priority' || currentGrouping === 'phase') && + !(groupProgressValues.todoProgress === 0 && groupProgressValues.doingProgress === 0 && groupProgressValues.doneProgress === 0) && ( +
+ +
+ )}
); }; -export default TaskGroupHeader; \ No newline at end of file +export default TaskGroupHeader; diff --git a/worklenz-frontend/src/components/task-list-v2/TaskListV2Table.tsx b/worklenz-frontend/src/components/task-list-v2/TaskListV2Table.tsx index 1cc6c680..933a525c 100644 --- a/worklenz-frontend/src/components/task-list-v2/TaskListV2Table.tsx +++ b/worklenz-frontend/src/components/task-list-v2/TaskListV2Table.tsx @@ -19,8 +19,7 @@ import { import { useTranslation } from 'react-i18next'; import { useParams } from 'react-router-dom'; import { createPortal } from 'react-dom'; -import { Skeleton } from 'antd'; -import { HolderOutlined } from '@ant-design/icons'; +import { HolderOutlined } from '@/shared/antd-imports'; // Redux hooks and selectors import { useAppSelector } from '@/hooks/useAppSelector'; @@ -60,13 +59,13 @@ import { fetchPhasesByProjectId } from '@/features/projects/singleProject/phase/ // Components import TaskRowWithSubtasks from './TaskRowWithSubtasks'; import TaskGroupHeader from './TaskGroupHeader'; -import ImprovedTaskFilters from '@/components/task-management/improved-task-filters'; import OptimizedBulkActionBar from '@/components/task-management/optimized-bulk-action-bar'; import CustomColumnModal from '@/pages/projects/projectView/taskList/task-list-table/custom-columns/custom-column-modal/custom-column-modal'; import AddTaskRow from './components/AddTaskRow'; import { AddCustomColumnButton, CustomColumnHeader } from './components/CustomColumnComponents'; import TaskListSkeleton from './components/TaskListSkeleton'; import ConvertToSubtaskDrawer from '@/components/task-list-common/convert-to-subtask-drawer/convert-to-subtask-drawer'; +import EmptyListPlaceholder from '@/components/EmptyListPlaceholder'; // Empty Group Drop Zone Component const EmptyGroupDropZone: React.FC<{ @@ -90,12 +89,28 @@ const EmptyGroupDropZone: React.FC<{ isOver && active ? 'bg-blue-50 dark:bg-blue-900/20' : '' }`} > -
+
{visibleColumns.map((column, index) => { const emptyColumnStyle = { width: column.width, flexShrink: 0, }; + + // Show text in the title column + if (column.id === 'title') { + return ( +
+ + No tasks in this group + +
+ ); + } + return (
-
-
- {isOver && active ? t('dropTaskHere') || 'Drop task here' : t('noTasksInGroup')} -
-
{isOver && active && (
)} @@ -179,6 +183,8 @@ const TaskListV2Section: React.FC = () => { const { projectId: urlProjectId } = useParams(); const { t } = useTranslation('task-list-table'); const { socket, connected } = useSocket(); + const themeMode = useAppSelector(state => state.themeReducer.mode); + const isDarkMode = themeMode === 'dark'; // Redux state selectors const allTasks = useAppSelector(selectAllTasksArray); @@ -492,7 +498,7 @@ const TaskListV2Section: React.FC = () => { isAddTaskRow: true, groupId: group.id, groupType: currentGrouping || 'status', - groupValue: group.id, // Use the actual database ID from backend + groupValue: group.id, // Send the UUID that backend expects projectId: urlProjectId, rowId: `add-task-${group.id}-0`, autoFocus: false, @@ -503,7 +509,7 @@ const TaskListV2Section: React.FC = () => { isAddTaskRow: true, groupId: group.id, groupType: currentGrouping || 'status', - groupValue: group.id, + groupValue: group.id, // Send the UUID that backend expects projectId: urlProjectId, rowId: rowId, autoFocus: index === groupAddRows.length - 1, // Auto-focus the latest row @@ -536,6 +542,7 @@ const TaskListV2Section: React.FC = () => { return virtuosoGroups.flatMap(group => group.tasks); }, [virtuosoGroups]); + // Render functions const renderGroup = useCallback( (groupIndex: number) => { @@ -550,11 +557,7 @@ const TaskListV2Section: React.FC = () => { id: group.id, name: group.title, count: group.actualCount, - color: group.color, - todo_progress: group.todo_progress, - doing_progress: group.doing_progress, - done_progress: group.done_progress, - groupType: group.groupType, + color: isDarkMode ? group.color_code_dark : group.color, }} isCollapsed={isGroupCollapsed} onToggle={() => handleGroupCollapse(group.id)} @@ -685,13 +688,94 @@ const TaskListV2Section: React.FC = () => {
); - // Show message when no data + // Show message when no data - but for phase grouping, create an unmapped group if (groups.length === 0 && !loading) { + // If grouped by phase, show an unmapped group to allow task creation + if (currentGrouping === 'phase') { + const unmappedGroup = { + id: 'Unmapped', + title: 'Unmapped', + groupType: 'phase', + groupValue: 'Unmapped', // Use same ID as groupValue for consistency + collapsed: false, + tasks: [], + taskIds: [], + color: '#fbc84c69', + actualCount: 0, + count: 1, // For the add task row + startIndex: 0 + }; + + return ( + +
+
+
+ {/* Sticky Column Headers */} +
+ {renderColumnHeaders()} +
+ +
+
+ {}} + projectId={urlProjectId || ''} + /> + +
+
+
+
+
+
+ ); + } + + // For other groupings, show the empty state message return (
-
- -
@@ -812,19 +896,17 @@ const TaskListV2Section: React.FC = () => { {/* Drag Overlay */} {activeId ? ( -
-
-
- -
-
- {allTasks.find(task => task.id === activeId)?.name || - allTasks.find(task => task.id === activeId)?.title || - t('emptyStates.dragTaskFallback')} -
-
- {allTasks.find(task => task.id === activeId)?.task_key} -
+
col.id === 'title')?.width || '300px' }} + > +
+
+ +
+ {allTasks.find(task => task.id === activeId)?.name || + allTasks.find(task => task.id === activeId)?.title || + t('emptyStates.dragTaskFallback')}
diff --git a/worklenz-frontend/src/components/task-list-v2/TaskRowWithSubtasks.tsx b/worklenz-frontend/src/components/task-list-v2/TaskRowWithSubtasks.tsx index f6c35cfc..70bbaf70 100644 --- a/worklenz-frontend/src/components/task-list-v2/TaskRowWithSubtasks.tsx +++ b/worklenz-frontend/src/components/task-list-v2/TaskRowWithSubtasks.tsx @@ -5,8 +5,8 @@ import { selectTaskById, createSubtask, selectSubtaskLoading } from '@/features/ import TaskRow from './TaskRow'; import SubtaskLoadingSkeleton from './SubtaskLoadingSkeleton'; import { Task } from '@/types/task-management.types'; -import { Input, Button } from 'antd'; -import { PlusOutlined } from '@ant-design/icons'; +import { Input, Button } from '@/shared/antd-imports'; +import { PlusOutlined } from '@/shared/antd-imports'; import { useSocket } from '@/socket/socketContext'; import { SocketEvents } from '@/shared/socket-events'; import { useTranslation } from 'react-i18next'; diff --git a/worklenz-frontend/src/components/task-list-v2/components/AddTaskRow.tsx b/worklenz-frontend/src/components/task-list-v2/components/AddTaskRow.tsx index 57806e77..9e517f01 100644 --- a/worklenz-frontend/src/components/task-list-v2/components/AddTaskRow.tsx +++ b/worklenz-frontend/src/components/task-list-v2/components/AddTaskRow.tsx @@ -1,6 +1,6 @@ import React, { useState, useCallback, memo, useRef, useEffect } from 'react'; -import { Input } from 'antd'; -import { PlusOutlined } from '@ant-design/icons'; +import { Input } from '@/shared/antd-imports'; +import { PlusOutlined } from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; import { useSocket } from '@/socket/socketContext'; import { SocketEvents } from '@/shared/socket-events'; @@ -125,9 +125,9 @@ const AddTaskRow: React.FC = memo(({ return
; case 'title': return ( -
+
-
+
{!isAdding ? ( {t('orText')} @@ -146,7 +146,7 @@ const ForgotPasswordPage = () => { borderRadius: 4, }} > - {t('returnToLoginButton')} + {t('returnToLoginButton', {defaultValue: 'Return to Login'})} diff --git a/worklenz-frontend/src/pages/auth/logging-out.tsx b/worklenz-frontend/src/pages/auth/LoggingOutPage.tsx similarity index 100% rename from worklenz-frontend/src/pages/auth/logging-out.tsx rename to worklenz-frontend/src/pages/auth/LoggingOutPage.tsx diff --git a/worklenz-frontend/src/pages/auth/login-page.tsx b/worklenz-frontend/src/pages/auth/LoginPage.tsx similarity index 99% rename from worklenz-frontend/src/pages/auth/login-page.tsx rename to worklenz-frontend/src/pages/auth/LoginPage.tsx index df5fa088..1f8b8824 100644 --- a/worklenz-frontend/src/pages/auth/login-page.tsx +++ b/worklenz-frontend/src/pages/auth/LoginPage.tsx @@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useState } from 'react'; import { Card, Input, Flex, Checkbox, Button, Typography, Space, Form, message } from 'antd/es'; import { Rule } from 'antd/es/form'; -import { LockOutlined, UserOutlined } from '@ant-design/icons'; +import { LockOutlined, UserOutlined } from '@/shared/antd-imports'; import { Link, useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { useMediaQuery } from 'react-responsive'; diff --git a/worklenz-frontend/src/pages/auth/signup-page.tsx b/worklenz-frontend/src/pages/auth/SignupPage.tsx similarity index 76% rename from worklenz-frontend/src/pages/auth/signup-page.tsx rename to worklenz-frontend/src/pages/auth/SignupPage.tsx index 68d3f9e7..065989d2 100644 --- a/worklenz-frontend/src/pages/auth/signup-page.tsx +++ b/worklenz-frontend/src/pages/auth/SignupPage.tsx @@ -2,9 +2,11 @@ import { useEffect, useState } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { useMediaQuery } from 'react-responsive'; -import { LockOutlined, MailOutlined, UserOutlined } from '@ant-design/icons'; +import { LockOutlined, MailOutlined, UserOutlined } from '@/shared/antd-imports'; import { Form, Card, Input, Flex, Button, Typography, Space, message } from 'antd/es'; import { Rule } from 'antd/es/form'; +import { CheckCircleTwoTone, CloseCircleTwoTone } from '@/shared/antd-imports'; +import { useAppSelector } from '@/hooks/useAppSelector'; import googleIcon from '@/assets/images/google-icon.png'; import PageHeader from '@components/AuthPageHeader'; @@ -297,6 +299,10 @@ const SignupPage = () => { min: 8, message: t('passwordMinCharacterRequired'), }, + { + max: 32, + message: t('passwordMaxCharacterRequired'), + }, { pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&#])/, message: t('passwordPatternRequired'), @@ -304,6 +310,38 @@ const SignupPage = () => { ], }; + const passwordChecklistItems = [ + { + key: 'minLength', + test: (v: string) => v.length >= 8, + label: t('passwordChecklist.minLength', { defaultValue: 'At least 8 characters' }), + }, + { + key: 'uppercase', + test: (v: string) => /[A-Z]/.test(v), + label: t('passwordChecklist.uppercase', { defaultValue: 'One uppercase letter' }), + }, + { + key: 'lowercase', + test: (v: string) => /[a-z]/.test(v), + label: t('passwordChecklist.lowercase', { defaultValue: 'One lowercase letter' }), + }, + { + key: 'number', + test: (v: string) => /\d/.test(v), + label: t('passwordChecklist.number', { defaultValue: 'One number' }), + }, + { + key: 'special', + test: (v: string) => /[@$!%*?&#]/.test(v), + label: t('passwordChecklist.special', { defaultValue: 'One special character' }), + }, + ]; + + const themeMode = useAppSelector(state => state.themeReducer.mode); + const [passwordValue, setPasswordValue] = useState(''); + const [passwordActive, setPasswordActive] = useState(false); + return ( { }} variant="outlined" > - + { name: urlParams.name, }} > - + } - placeholder={t('namePlaceholder')} + placeholder={t('namePlaceholder', {defaultValue: 'Enter your full name'})} size="large" style={{ borderRadius: 4 }} /> - + } - placeholder={t('emailPlaceholder')} + placeholder={t('emailPlaceholder', {defaultValue: 'Enter your email'})} size="large" style={{ borderRadius: 4 }} /> - +
} - placeholder={t('strongPasswordPlaceholder')} + placeholder={t('strongPasswordPlaceholder', {defaultValue: 'Enter a strong password'})} size="large" style={{ borderRadius: 4 }} + value={passwordValue} + onFocus={() => setPasswordActive(true)} + onChange={e => { + setPasswordValue(e.target.value); + setPasswordActive(true); + }} + onBlur={() => { + if (!passwordValue) setPasswordActive(false); + }} /> - - {t('passwordValidationAltText')} + + {t('passwordGuideline', { + defaultValue: 'Password must be at least 8 characters, include uppercase and lowercase letters, a number, and a special character.' + })} + {passwordActive && ( +
+ {passwordChecklistItems.map(item => { + const passed = item.test(passwordValue); + // Only green if passed, otherwise neutral (never red) + let color = passed + ? (themeMode === 'dark' ? '#52c41a' : '#389e0d') + : (themeMode === 'dark' ? '#b0b3b8' : '#bfbfbf'); + return ( + + {passed ? ( + + ) : ( + + )} + {item.label} + + ); + })} +
+ )}
@@ -416,7 +491,7 @@ const SignupPage = () => { - {t('alreadyHaveAccountText')} + {t('alreadyHaveAccountText', {defaultValue: 'Already have an account?'})} { const { t } = useTranslation('auth/verify-reset-email'); const isMobile = useMediaQuery({ query: '(max-width: 576px)' }); + const themeMode = useAppSelector(state => state.themeReducer.mode); + const [passwordValue, setPasswordValue] = useState(''); + const [passwordTouched, setPasswordTouched] = useState(false); + const passwordChecklistItems = [ + { + key: 'minLength', + test: (v: string) => v.length >= 8, + label: t('passwordChecklist.minLength', { defaultValue: 'At least 8 characters' }), + }, + { + key: 'uppercase', + test: (v: string) => /[A-Z]/.test(v), + label: t('passwordChecklist.uppercase', { defaultValue: 'One uppercase letter' }), + }, + { + key: 'lowercase', + test: (v: string) => /[a-z]/.test(v), + label: t('passwordChecklist.lowercase', { defaultValue: 'One lowercase letter' }), + }, + { + key: 'number', + test: (v: string) => /\d/.test(v), + label: t('passwordChecklist.number', { defaultValue: 'One number' }), + }, + { + key: 'special', + test: (v: string) => /[@$!%*?&#]/.test(v), + label: t('passwordChecklist.special', { defaultValue: 'One special character' }), + }, + ]; useEffect(() => { trackMixpanelEvent(evt_verify_reset_email_page_visit); @@ -104,12 +136,38 @@ const VerifyResetEmailPage = () => { }, ]} > - } - placeholder={t('placeholder')} - size="large" - style={{ borderRadius: 4 }} - /> +
+ } + placeholder={t('placeholder')} + size="large" + style={{ borderRadius: 4 }} + value={passwordValue} + onChange={e => { + setPasswordValue(e.target.value); + if (!passwordTouched) setPasswordTouched(true); + }} + onBlur={() => setPasswordTouched(true)} + /> +
+ {passwordChecklistItems.map(item => { + const passed = item.test(passwordValue); + let color = passed + ? (themeMode === 'dark' ? '#52c41a' : '#389e0d') + : (themeMode === 'dark' ? '#b0b3b8' : '#bfbfbf'); + return ( + + {passed ? ( + + ) : ( + + )} + {item.label} + + ); + })} +
+
{ placeholder={t('confirmPasswordPlaceholder')} size="large" style={{ borderRadius: 4 }} + value={form.getFieldValue('confirmPassword') || ''} + onChange={e => form.setFieldsValue({ confirmPassword: e.target.value })} /> diff --git a/worklenz-frontend/src/pages/home/recent-and-favourite-project-list/add-favourite-project-button.tsx b/worklenz-frontend/src/pages/home/recent-and-favourite-project-list/add-favourite-project-button.tsx index 43262a78..ca781ecd 100644 --- a/worklenz-frontend/src/pages/home/recent-and-favourite-project-list/add-favourite-project-button.tsx +++ b/worklenz-frontend/src/pages/home/recent-and-favourite-project-list/add-favourite-project-button.tsx @@ -1,5 +1,5 @@ -import { StarFilled } from '@ant-design/icons'; -import { Button, ConfigProvider, Tooltip } from 'antd'; +import { StarFilled } from '@/shared/antd-imports'; +import { Button, ConfigProvider, Tooltip } from '@/shared/antd-imports'; import { useMemo } from 'react'; import { colors } from '@/styles/colors'; import { IProjectViewModel } from '@/types/project/projectViewModel.types'; diff --git a/worklenz-frontend/src/pages/home/recent-and-favourite-project-list/recent-and-favourite-project-list.tsx b/worklenz-frontend/src/pages/home/recent-and-favourite-project-list/recent-and-favourite-project-list.tsx index ff7d70cc..198808a4 100644 --- a/worklenz-frontend/src/pages/home/recent-and-favourite-project-list/recent-and-favourite-project-list.tsx +++ b/worklenz-frontend/src/pages/home/recent-and-favourite-project-list/recent-and-favourite-project-list.tsx @@ -1,4 +1,4 @@ -import { SyncOutlined } from '@ant-design/icons'; +import { SyncOutlined } from '@/shared/antd-imports'; import { Badge, Button, @@ -10,7 +10,7 @@ import { TableProps, Tooltip, Typography, -} from 'antd'; +} from '@/shared/antd-imports'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; diff --git a/worklenz-frontend/src/pages/home/task-list/add-task-inline-form.tsx b/worklenz-frontend/src/pages/home/task-list/add-task-inline-form.tsx index caff5f7f..8e806fe2 100644 --- a/worklenz-frontend/src/pages/home/task-list/add-task-inline-form.tsx +++ b/worklenz-frontend/src/pages/home/task-list/add-task-inline-form.tsx @@ -1,4 +1,4 @@ -import { Alert, DatePicker, Flex, Form, Input, InputRef, Select, Typography } from 'antd'; +import { Alert, DatePicker, Flex, Form, Input, InputRef, Select, Typography } from '@/shared/antd-imports'; import { useEffect, useRef, useState } from 'react'; import { useAppSelector } from '@/hooks/useAppSelector'; import { TFunction } from 'i18next'; diff --git a/worklenz-frontend/src/pages/home/task-list/calendar-view.tsx b/worklenz-frontend/src/pages/home/task-list/calendar-view.tsx index c0bfac8f..32a5fdb2 100644 --- a/worklenz-frontend/src/pages/home/task-list/calendar-view.tsx +++ b/worklenz-frontend/src/pages/home/task-list/calendar-view.tsx @@ -1,6 +1,6 @@ import HomeCalendar from '../../../components/calendars/homeCalendar/HomeCalendar'; -import { Tag, Typography } from 'antd'; -import { ClockCircleOutlined } from '@ant-design/icons'; +import { Tag, Typography } from '@/shared/antd-imports'; +import { ClockCircleOutlined } from '@/shared/antd-imports'; import { useAppSelector } from '@/hooks/useAppSelector'; import AddTaskInlineForm from './add-task-inline-form'; import { useTranslation } from 'react-i18next'; diff --git a/worklenz-frontend/src/pages/home/task-list/list-view.tsx b/worklenz-frontend/src/pages/home/task-list/list-view.tsx index 255a650c..cef270c5 100644 --- a/worklenz-frontend/src/pages/home/task-list/list-view.tsx +++ b/worklenz-frontend/src/pages/home/task-list/list-view.tsx @@ -1,4 +1,4 @@ -import { Tabs } from 'antd'; +import { Tabs } from '@/shared/antd-imports'; import AddTaskInlineForm from './add-task-inline-form'; import { useAppSelector } from '@/hooks/useAppSelector'; import { useTranslation } from 'react-i18next'; diff --git a/worklenz-frontend/src/pages/home/task-list/tasks-list.css b/worklenz-frontend/src/pages/home/task-list/tasks-list.css index 698cfcdc..bb9c82ce 100644 --- a/worklenz-frontend/src/pages/home/task-list/tasks-list.css +++ b/worklenz-frontend/src/pages/home/task-list/tasks-list.css @@ -6,3 +6,81 @@ .ant-table-row:hover .row-action-button { opacity: 1; } + +/* Responsive styles for task list */ +@media (max-width: 768px) { + .task-list-card .ant-card-head { + flex-direction: column; + gap: 12px; + } + + .task-list-card .ant-card-head-title { + flex: 1; + width: 100%; + } + + .task-list-card .ant-card-extra { + width: 100%; + justify-content: space-between; + } + + .task-list-mobile-header { + flex-direction: column; + gap: 8px; + align-items: stretch !important; + } + + .task-list-mobile-controls { + flex-direction: column; + gap: 8px; + align-items: stretch !important; + } + + .task-list-mobile-select { + width: 100% !important; + } + + .task-list-mobile-segmented { + width: 100% !important; + } +} + +@media (max-width: 576px) { + .task-list-card .ant-table { + font-size: 12px; + } + + .task-list-card .ant-table-thead > tr > th { + padding: 8px 4px; + font-size: 12px; + } + + .task-list-card .ant-table-tbody > tr > td { + padding: 8px 4px; + } + + .row-action-button { + opacity: 1; /* Always show on mobile */ + } + + /* Hide project column on very small screens */ + .task-list-card .ant-table-thead > tr > th:nth-child(2), + .task-list-card .ant-table-tbody > tr > td:nth-child(2) { + display: none; + } +} + +/* Table responsive container */ +.task-list-card .ant-table-container { + overflow-x: auto; +} + +@media (max-width: 768px) { + .task-list-card .ant-table-wrapper { + overflow-x: auto; + } + + .task-list-card .ant-table { + min-width: 600px; + } +} diff --git a/worklenz-frontend/src/pages/home/task-list/tasks-list.tsx b/worklenz-frontend/src/pages/home/task-list/tasks-list.tsx index 01e7706c..d8ce0bed 100644 --- a/worklenz-frontend/src/pages/home/task-list/tasks-list.tsx +++ b/worklenz-frontend/src/pages/home/task-list/tasks-list.tsx @@ -1,4 +1,4 @@ -import { ExpandAltOutlined, SyncOutlined } from '@ant-design/icons'; +import { ExpandAltOutlined, SyncOutlined } from '@/shared/antd-imports'; import { Badge, Button, @@ -12,9 +12,10 @@ import { Tooltip, Typography, Pagination, -} from 'antd'; +} from '@/shared/antd-imports'; import React, { useState, useMemo, useCallback, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; +import { useMediaQuery } from 'react-responsive'; import ListView from './list-view'; import CalendarView from './calendar-view'; @@ -61,21 +62,22 @@ const TasksList: React.FC = React.memo(() => { refetchOnFocus: false, }); - const { t } = useTranslation('home'); + const { t, ready } = useTranslation('home'); const { model } = useAppSelector(state => state.homePageReducer); + const isMobile = useMediaQuery({ maxWidth: 768 }); const taskModes = useMemo( () => [ { value: 0, - label: t('home:tasks.assignedToMe'), + label: ready ? t('tasks.assignedToMe') : 'Assigned to me', }, { value: 1, - label: t('home:tasks.assignedByMe'), + label: ready ? t('tasks.assignedByMe') : 'Assigned by me', }, ], - [t] + [t, ready] ); const handleSegmentChange = (value: 'List' | 'Calendar') => { @@ -123,7 +125,7 @@ const TasksList: React.FC = React.memo(() => { {t('tasks.name')} ), - width: '40%', + width: isMobile ? '50%' : '40%', render: (_, record) => (
@@ -155,7 +157,7 @@ const TasksList: React.FC = React.memo(() => { { key: 'project', title: t('tasks.project'), - width: '25%', + width: isMobile ? '30%' : '25%', render: (_, record) => { return ( @@ -185,7 +187,7 @@ const TasksList: React.FC = React.memo(() => { render: (_, record) => , }, ], - [t, data?.body?.total, currentPage, pageSize, handlePageChange] + [t, data?.body?.total, currentPage, pageSize, handlePageChange, isMobile] ); const handleTaskModeChange = (value: number) => { @@ -210,23 +212,27 @@ const TasksList: React.FC = React.memo(() => { ); }, [dispatch]); + return ( + {t('tasks.tasks')}