refactor(task-list): improve layout and styling for better usability
- Removed unnecessary padding from task filters for a cleaner look. - Adjusted height calculations to optimize space usage in the task list. - Added padding to the content area to ensure the horizontal scrollbar is visible. - Updated subtask count checks for clarity and consistency. - Modified gap and margin values in project view header for improved alignment.
This commit is contained in:
@@ -525,7 +525,7 @@ const TaskListV2: React.FC = () => {
|
|||||||
if (groups.length === 0 && !loading) {
|
if (groups.length === 0 && !loading) {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col bg-white dark:bg-gray-900 h-full">
|
<div className="flex flex-col bg-white dark:bg-gray-900 h-full">
|
||||||
<div className="flex-none px-6 py-4" style={{ height: '74px', flexShrink: 0 }}>
|
<div className="flex-none" style={{ height: '74px', flexShrink: 0 }}>
|
||||||
<ImprovedTaskFilters position="list" />
|
<ImprovedTaskFilters position="list" />
|
||||||
</div>
|
</div>
|
||||||
<div className="flex-1 flex items-center justify-center">
|
<div className="flex-1 flex items-center justify-center">
|
||||||
@@ -552,18 +552,15 @@ const TaskListV2: React.FC = () => {
|
|||||||
>
|
>
|
||||||
<div className="flex flex-col bg-white dark:bg-gray-900 h-full overflow-hidden">
|
<div className="flex flex-col bg-white dark:bg-gray-900 h-full overflow-hidden">
|
||||||
{/* Task Filters */}
|
{/* Task Filters */}
|
||||||
<div className="flex-none px-6 py-4" style={{ height: '74px', flexShrink: 0 }}>
|
<div className="flex-none" style={{ height: '74px', flexShrink: 0 }}>
|
||||||
<ImprovedTaskFilters position="list" />
|
<ImprovedTaskFilters position="list" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Spacing between filters and table */}
|
|
||||||
<div className="flex-none h-4" style={{ flexShrink: 0 }}></div>
|
|
||||||
|
|
||||||
{/* Table Container */}
|
{/* Table Container */}
|
||||||
<div
|
<div
|
||||||
className="border border-gray-200 dark:border-gray-700 mx-6 rounded-lg"
|
className="border border-gray-200 dark:border-gray-700 rounded-lg"
|
||||||
style={{
|
style={{
|
||||||
height: 'calc(100vh - 140px)',
|
height: 'calc(100vh - 130px)',
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
flexDirection: 'column',
|
flexDirection: 'column',
|
||||||
overflow: 'hidden'
|
overflow: 'hidden'
|
||||||
@@ -573,7 +570,12 @@ const TaskListV2: React.FC = () => {
|
|||||||
<div
|
<div
|
||||||
ref={contentScrollRef}
|
ref={contentScrollRef}
|
||||||
className="flex-1 bg-white dark:bg-gray-900 relative"
|
className="flex-1 bg-white dark:bg-gray-900 relative"
|
||||||
style={{ overflowX: 'auto', overflowY: 'auto', minHeight: 0 }}
|
style={{
|
||||||
|
overflowX: 'auto',
|
||||||
|
overflowY: 'auto',
|
||||||
|
minHeight: 0,
|
||||||
|
paddingBottom: '20px' // Add padding to ensure horizontal scrollbar is visible
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
{/* Sticky Column Headers */}
|
{/* Sticky Column Headers */}
|
||||||
<div className="sticky top-0 z-30 bg-gray-50 dark:bg-gray-800" style={{ width: '100%', minWidth: 'max-content' }}>
|
<div className="sticky top-0 z-30 bg-gray-50 dark:bg-gray-800" style={{ width: '100%', minWidth: 'max-content' }}>
|
||||||
|
|||||||
@@ -301,7 +301,7 @@ const TaskRow: React.FC<TaskRowProps> = memo(({ taskId, projectId, visibleColumn
|
|||||||
<button
|
<button
|
||||||
onClick={handleToggleExpansion}
|
onClick={handleToggleExpansion}
|
||||||
className={`flex h-4 w-4 items-center justify-center rounded-sm text-xs mr-1 hover:border hover:border-blue-500 hover:bg-blue-50 dark:hover:bg-blue-900/20 hover:scale-110 transition-all duration-300 ease-out flex-shrink-0 ${
|
className={`flex h-4 w-4 items-center justify-center rounded-sm text-xs mr-1 hover:border hover:border-blue-500 hover:bg-blue-50 dark:hover:bg-blue-900/20 hover:scale-110 transition-all duration-300 ease-out flex-shrink-0 ${
|
||||||
task.sub_tasks_count != null && Number(task.sub_tasks_count) > 0
|
task.sub_tasks_count != null && task.sub_tasks_count > 0
|
||||||
? 'opacity-100'
|
? 'opacity-100'
|
||||||
: 'opacity-0 group-hover:opacity-100'
|
: 'opacity-0 group-hover:opacity-100'
|
||||||
}`}
|
}`}
|
||||||
@@ -341,7 +341,7 @@ const TaskRow: React.FC<TaskRowProps> = memo(({ taskId, projectId, visibleColumn
|
|||||||
{/* Indicators container - flex-shrink-0 to prevent compression */}
|
{/* Indicators container - flex-shrink-0 to prevent compression */}
|
||||||
<div className="flex items-center gap-1 flex-shrink-0">
|
<div className="flex items-center gap-1 flex-shrink-0">
|
||||||
{/* Subtask count indicator - only show if count > 0 */}
|
{/* Subtask count indicator - only show if count > 0 */}
|
||||||
{!isSubtask && task.sub_tasks_count != null && task.sub_tasks_count !== 0 && (
|
{!isSubtask && task.sub_tasks_count != null && task.sub_tasks_count > 0 && (
|
||||||
<Tooltip title={t(`indicators.tooltips.subtasks${task.sub_tasks_count === 1 ? '' : '_plural'}`, { count: task.sub_tasks_count })}>
|
<Tooltip title={t(`indicators.tooltips.subtasks${task.sub_tasks_count === 1 ? '' : '_plural'}`, { count: task.sub_tasks_count })}>
|
||||||
<div className="flex items-center gap-1 px-1.5 py-0.5 bg-blue-50 dark:bg-blue-900/20 rounded text-xs">
|
<div className="flex items-center gap-1 px-1.5 py-0.5 bg-blue-50 dark:bg-blue-900/20 rounded text-xs">
|
||||||
<span className="text-blue-600 dark:text-blue-400 font-medium">
|
<span className="text-blue-600 dark:text-blue-400 font-medium">
|
||||||
@@ -446,7 +446,7 @@ const TaskRow: React.FC<TaskRowProps> = memo(({ taskId, projectId, visibleColumn
|
|||||||
|
|
||||||
case 'assignees':
|
case 'assignees':
|
||||||
return (
|
return (
|
||||||
<div className="flex items-center gap-1" style={baseStyle}>
|
<div className="flex items-center gap-1 px-2" style={baseStyle}>
|
||||||
<AvatarGroup
|
<AvatarGroup
|
||||||
members={task.assignee_names || []}
|
members={task.assignee_names || []}
|
||||||
maxCount={3}
|
maxCount={3}
|
||||||
|
|||||||
@@ -340,7 +340,7 @@ const ProjectViewHeader = memo(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Flex gap={8} align="center">
|
<Flex gap={4} align="center">
|
||||||
{elements}
|
{elements}
|
||||||
</Flex>
|
</Flex>
|
||||||
);
|
);
|
||||||
@@ -436,7 +436,7 @@ const ProjectViewHeader = memo(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Flex gap={8} align="center">
|
<Flex gap={4} align="center">
|
||||||
{actions}
|
{actions}
|
||||||
</Flex>
|
</Flex>
|
||||||
);
|
);
|
||||||
@@ -460,11 +460,11 @@ const ProjectViewHeader = memo(() => {
|
|||||||
// Memoized page header title
|
// Memoized page header title
|
||||||
const pageHeaderTitle = useMemo(
|
const pageHeaderTitle = useMemo(
|
||||||
() => (
|
() => (
|
||||||
<Flex gap={8} align="center">
|
<Flex gap={4} align="center">
|
||||||
<Tooltip title={t('navigateBackTooltip')}>
|
<Tooltip title={t('navigateBackTooltip')}>
|
||||||
<ArrowLeftOutlined style={{ fontSize: 16, cursor: 'pointer' }} onClick={handleNavigateToProjects} />
|
<ArrowLeftOutlined style={{ fontSize: 16, cursor: 'pointer' }} onClick={handleNavigateToProjects} />
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Typography.Title level={4} style={{ marginBlockEnd: 0, marginInlineStart: 12 }}>
|
<Typography.Title level={4} style={{ marginBlockEnd: 0, marginInlineStart: 8 }}>
|
||||||
{selectedProject?.name}
|
{selectedProject?.name}
|
||||||
</Typography.Title>
|
</Typography.Title>
|
||||||
{projectAttributes}
|
{projectAttributes}
|
||||||
@@ -477,7 +477,7 @@ const ProjectViewHeader = memo(() => {
|
|||||||
const pageHeaderStyle = useMemo(
|
const pageHeaderStyle = useMemo(
|
||||||
() => ({
|
() => ({
|
||||||
paddingInline: 0,
|
paddingInline: 0,
|
||||||
marginBlockEnd: 12,
|
marginBlockEnd: 8,
|
||||||
}),
|
}),
|
||||||
[]
|
[]
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -344,14 +344,14 @@ const ProjectView = React.memo(() => {
|
|||||||
// Show loading state while project is being fetched
|
// Show loading state while project is being fetched
|
||||||
if (projectLoading || !isInitialized) {
|
if (projectLoading || !isInitialized) {
|
||||||
return (
|
return (
|
||||||
<div style={{ marginBlockStart: 80, marginBlockEnd: 16, minHeight: '80vh' }}>
|
<div style={{ marginBlockStart: 70, marginBlockEnd: 12, minHeight: '80vh' }}>
|
||||||
<SuspenseFallback />
|
<SuspenseFallback />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div style={{ marginBlockStart: 80, marginBlockEnd: 16, minHeight: '80vh' }}>
|
<div style={{ marginBlockStart: 70, marginBlockEnd: 12, minHeight: '80vh' }}>
|
||||||
<ProjectViewHeader />
|
<ProjectViewHeader />
|
||||||
|
|
||||||
<Tabs
|
<Tabs
|
||||||
|
|||||||
Reference in New Issue
Block a user