Skip to content

Fix/kanban url#77

Merged
Jieunsse merged 2 commits into
mainfrom
fix/kanban-url
Feb 23, 2026
Merged

Fix/kanban url#77
Jieunsse merged 2 commits into
mainfrom
fix/kanban-url

Conversation

@Jieunsse

Copy link
Copy Markdown
Contributor

Summary

  • 폴더를 옮기는 과정에서 소스코드가 누락되어 전부 업로드합니다.

Issue

  • Closes #

Scope

  • 포함

    • 변경한 내용
  • 특이사항

This commit introduces the main team dashboard page, including:
- Integrated Kanban board for task management with drag-and-drop functionality.
- Member section to view and manage team members.
- API integrations and TanStack Query hooks for group, task, and task list operations.
- Responsive design for various screen sizes (desktop, tablet, mobile).
- Updated .gitignore to exclude dev-specific session injection route.
@Jieunsse Jieunsse merged commit ac2d72e into main Feb 23, 2026
1 check passed
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello @Jieunsse, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request primarily addresses a large-scale file and folder restructuring, seemingly to recover or re-upload source code that was previously missing after a folder move. Beyond this structural change, it significantly enhances the Kanban board's user experience by preventing unintended drag-and-drop actions on interactive elements and refining the task management logic with optimistic updates for checkbox changes. Additionally, it improves sidebar navigation by enabling direct access to the user's profile page.

Highlights

  • Extensive File Restructuring/Recovery: A significant number of files across _domain/apis, _domain/components, _domain/hooks, _domain/interfaces, _domain/queries, _domain/styles, and other directories have been moved or re-uploaded, indicating a major reorganization or recovery of source code.
  • Enhanced Kanban Drag-and-Drop Experience: Introduced a SmartPointerSensor to prevent accidental drag initiation when interacting with form elements (inputs, buttons, etc.) within Kanban items, improving user experience.
  • Refined Kanban Task Management: Implemented optimistic updates for task item checkbox changes, ensuring a responsive UI while synchronizing with the server. The logic for handling Kanban column status changes during drag-and-drop was simplified to only store the position locally, decoupling it from immediate API calls for task completion status.
  • Sidebar Profile Navigation: Added functionality to the sidebar allowing users to navigate to their 'mypage' by clicking on their profile, improving user accessibility.
  • Minor Styling and Gitignore Updates: Adjusted font styles in Kanban item CSS and added a new file to the .gitignore list.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • .gitignore
    • Added src/app/api/dev/inject-session/route.ts to the ignore list.
  • src/app/(root)/[teamid]/_domain/apis/group.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/apis/task.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/apis/taskList.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/apis/types.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Kanban/KanbanBoard.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Kanban/KanbanBoard.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Kanban/KanbanColumn.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Kanban/KanbanColumn.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Kanban/KanbanItem.module.css
    • Renamed file as part of a larger folder restructuring.
    • Updated font size and weight for the Kanban item title.
  • src/app/(root)/[teamid]/_domain/components/Kanban/KanbanItem.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Member/MemberCard.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Member/MemberCard.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Member/MemberKebabMenu.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Member/MemberKebabMenu.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Member/MemberSection.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Member/MemberSection.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Team/SidebarWrapper.tsx
    • Renamed file as part of a larger folder restructuring.
    • Integrated useRouter and added a profile click handler to navigate to /mypage.
  • src/app/(root)/[teamid]/_domain/components/Team/TeamDashboard.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Team/TeamDashboard.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Team/TeamNavClient.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Team/TeamNavClient.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Team/TeamSidebarDropdown.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Team/TeamSidebarDropdown.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Team/TeamTabletHeader.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/Team/TeamTabletHeader.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/TodayReport/TodayReport.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/components/TodayReport/TodayReport.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/constants/mockData.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/hooks/useKanbanDnd.ts
    • Renamed file as part of a larger folder restructuring.
    • Imported React type, defined a SmartPointerSensor to prevent drag activation on interactive elements, and configured useSensors to utilize it.
  • src/app/(root)/[teamid]/_domain/hooks/useKanbanTasks.ts
    • Renamed file as part of a larger folder restructuring.
    • Implemented optimistic updates for task item checkbox changes with server synchronization, and simplified the handleStatusChange function to only update local storage for column position.
  • src/app/(root)/[teamid]/_domain/interfaces/team.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/queries/queryKeys.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/queries/useCreateTaskListMutation.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/queries/useDeleteGroupMutation.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/queries/useDeleteTaskListMutation.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/queries/useGroupInvitationQuery.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/queries/useGroupQuery.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/queries/useGroupTasksQuery.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/queries/useRemoveMemberMutation.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/queries/useTaskListQuery.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/queries/useUpdateGroupMutation.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/_domain/styles/common.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/layout.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/page.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/[teamid]/page.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/apis/image.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/components/AddTeamSidebarWrapper.tsx
    • Added a new component to encapsulate the Sidebar for the add team page, including profile navigation.
  • src/app/(root)/addteam/_domain/components/CreateTeamCard.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/components/CreateTeamCard.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/components/FeedbackMessage.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/components/FeedbackMessage.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/components/JoinTeamCard.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/components/JoinTeamCard.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/components/NoTeamState.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/components/NoTeamState.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/constants/createTeam.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/hooks/useCreateTeam.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/hooks/useJoinTeam.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/interfaces/feedback.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/queries/useUploadImageMutation.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/styles/common.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/svg/noTeamImg.svg
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/utils/duplicationCalculator.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/_domain/utils/getCreateTeamFailureMessage.ts
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/create/page.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/join/page.tsx
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/layout.tsx
    • Renamed file as part of a larger folder restructuring.
    • Replaced the direct Sidebar component with the new AddTeamSidebarWrapper.
  • src/app/(root)/addteam/page.module.css
    • Renamed file as part of a larger folder restructuring.
  • src/app/(root)/addteam/page.tsx
    • Renamed file as part of a larger folder restructuring.
Activity
  • The author re-uploaded missing source code after a folder move, as indicated in the pull request description.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

The pull request primarily focuses on renaming files and making minor adjustments to Kanban board functionality and sidebar navigation. The file renames are extensive, suggesting a restructuring of the project. There are also changes to how Kanban tasks are handled, specifically regarding optimistic updates for item checked states and simplified status changes. Additionally, a new AddTeamSidebarWrapper component was introduced and integrated into the addteam layout, and the main SidebarWrapper now includes navigation to the user's mypage. The changes are generally well-implemented, but some areas could benefit from minor improvements in code clarity and consistency.

Comment on lines +173 to 178
// 드래그로 컬럼 이동 시 컬럼 위치만 localStorage에 저장 (체크박스 상태는 변경하지 않음)
const handleStatusChange = useCallback(
async (taskId: string, fromStatus: KanbanStatus, toStatus: KanbanStatus) => {
(taskId: string, fromStatus: KanbanStatus, toStatus: KanbanStatus) => {
if (fromStatus === toStatus) return;

const task = tasks.find((t) => t.id === taskId);
const taskListId = Number(taskId);

// 항목 유무와 관계없이 컬럼 위치를 localStorage에 저장
setStoredStatus(groupId, taskListId, toStatus);

// 진행중으로 이동하거나 항목이 없으면 API 호출 없이 종료 (위치는 이미 저장됨)
if (!task || task.items.length === 0 || toStatus === 'inProgress') return;

try {
if (toStatus === 'done') {
// 모든 항목 완료 처리
await Promise.all(
task.items.map((item) =>
updateTask(groupId, taskListId, Number(item.id), { done: true }),
),
);
} else if (toStatus === 'todo') {
// 모든 항목 미완료 처리
await Promise.all(
task.items.map((item) =>
updateTask(groupId, taskListId, Number(item.id), { done: false }),
),
);
}
} finally {
// 성공/실패 관계없이 쿼리를 무효화하여 실제 서버 상태로 동기화
await queryClient.invalidateQueries({
queryKey: taskListKeys.detail(groupId, taskListId, today),
});
}
setStoredStatus(groupId, Number(taskId), toStatus);
},

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

The previous implementation of handleStatusChange included logic to update task items' done status via API calls when moving tasks between 'done' and 'todo' columns. The current change removes this logic, making handleStatusChange solely responsible for updating the local storage status. This means that moving a task to 'done' or 'todo' will no longer automatically update the done status of its items on the backend. This could lead to a discrepancy between the UI's representation of task completion and the actual backend state, potentially causing data inconsistencies or unexpected behavior for users. If the intention is to only update the local storage, this should be clearly documented or the API calls should be re-introduced if the backend state needs to reflect the column change.

  const handleStatusChange = useCallback(
    async (taskId: string, fromStatus: KanbanStatus, toStatus: KanbanStatus) => {
      if (fromStatus === toStatus) return;
      setStoredStatus(groupId, Number(taskId), toStatus);

      // Re-introduce API calls if backend state needs to reflect column changes
      const task = tasks.find((t) => t.id === taskId);
      const taskListId = Number(taskId);

      if (!task || task.items.length === 0 || toStatus === 'inProgress') return;

      try {
        if (toStatus === 'done') {
          await Promise.all(
            task.items.map((item) =>
              updateTask(groupId, taskListId, Number(item.id), { done: true }),
            ),
          );
        } else if (toStatus === 'todo') {
          await Promise.all(
            task.items.map((item) =>
              updateTask(groupId, taskListId, Number(item.id), { done: false }),
            ),
          );
        }
      } finally {
        await queryClient.invalidateQueries({
          queryKey: taskListKeys.detail(groupId, taskListId, today),
        });
      }
    },
    [groupId, tasks, today, queryClient]
  );

Comment on lines +141 to +142
[groupId, today, queryClient],
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The dependency array for handleItemCheckedChange includes groupId, today, and queryClient. While groupId and queryClient are stable, today is derived from new Date().toISOString().split('T')[0] and will change on every render, causing handleItemCheckedChange to be recreated unnecessarily. This can lead to performance issues or unexpected behavior if handleItemCheckedChange is used as a dependency in other hooks. Consider memoizing today or passing it as an argument if it's meant to be dynamic.

Suggested change
[groupId, today, queryClient],
);
[groupId, queryClient]
);

Comment on lines +30 to +31
font-size: 12px;
font-weight: 400;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

It's generally a good practice to define font sizes and weights in a more centralized theme or utility file rather than directly in component-specific CSS modules. This helps maintain consistency across the application and makes it easier to manage design tokens.

@@ -1,4 +1,5 @@
import { useState } from 'react';
import type React from 'react';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

While type React from 'react' is technically correct, the more common and idiomatic way to import types from React is import type { PointerEvent } from 'react'; or import type { ReactNode } from 'react'; if you need specific types. Importing the entire React namespace as a type is less common.

import { useState } from 'react';
import type { PointerEvent } from 'react';

Comment on lines +1 to +10
'use client';

import { useRouter } from 'next/navigation';
import { Sidebar } from '@/components/sidebar';

export default function AddTeamSidebarWrapper() {
const router = useRouter();

return <Sidebar onProfileClick={() => router.push('/mypage')} />;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The AddTeamSidebarWrapper component is a very thin wrapper around Sidebar that only passes onProfileClick. If this is the only difference, consider if this wrapper is truly necessary. It might be more straightforward to pass the onProfileClick prop directly where Sidebar is used in AddTeamLayout, or to abstract the onProfileClick logic into a custom hook if it's reused across multiple sidebar instances with different behaviors.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant