Skip to content

feat: implement completed features management in BoardView and Kanban…#97

Merged
webdevcody merged 6 commits intomainfrom
ui-tweaks
Dec 15, 2025
Merged

feat: implement completed features management in BoardView and Kanban…#97
webdevcody merged 6 commits intomainfrom
ui-tweaks

Conversation

@webdevcody
Copy link
Collaborator

@webdevcody webdevcody commented Dec 15, 2025

…Card

  • Added functionality to complete and unarchive features, allowing users to manage feature statuses effectively.
  • Introduced a modal to display completed features, enhancing user experience by providing a dedicated view for archived items.
  • Updated KanbanCard to include buttons for completing features and managing their states, improving interactivity and workflow.
  • Modified the Feature interface to include a new "completed" status, ensuring comprehensive state management across the application.

resolve

…Card

- Added functionality to complete and unarchive features, allowing users to manage feature statuses effectively.
- Introduced a modal to display completed features, enhancing user experience by providing a dedicated view for archived items.
- Updated KanbanCard to include buttons for completing features and managing their states, improving interactivity and workflow.
- Modified the Feature interface to include a new "completed" status, ensuring comprehensive state management across the application.
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @webdevcody, 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 introduces a robust system for managing the lifecycle of features, specifically focusing on the completion and archiving process. It provides users with the ability to mark features as done, view them in a centralized archive, and restore them if necessary, significantly improving task organization and workflow flexibility within the application.

Highlights

  • Feature Completion and Archiving: Users can now mark features as 'completed' and view them in a dedicated archive modal, providing better organization for finished tasks.
  • Unarchive Functionality: Completed features can be unarchived, moving them back to the 'verified' status if further work or review is needed.
  • Dedicated Completed Features Modal: A new modal has been introduced in the BoardView to display all completed features, offering options to restore or permanently delete them.
  • Kanban Card Enhancements: Kanban cards now include 'Complete' buttons for verified features and 'Implement' buttons for backlog features, streamlining workflow actions.
  • Feature Status Expansion: The Feature interface has been updated to include a 'completed' status, ensuring comprehensive state management across the application.
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.

Copy link
Contributor

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

Choose a reason for hiding this comment

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

Code Review

This pull request successfully implements the management of completed features, including archiving, restoring, and deleting them through a new modal. The Kanban card has been updated with new actions to support this workflow. The code is generally well-structured, but I've identified a couple of areas with code duplication that could be refactored for better maintainability. I've also suggested a small improvement to the user experience in the delete confirmation dialog. Overall, this is a great addition to the application.

Comment on lines 552 to 647
{!isCurrentAutoTask && feature.status === "waiting_approval" && (
<div className="absolute top-2 right-2 flex items-center gap-1">
<Button
variant="ghost"
size="sm"
className="h-6 w-6 p-0 hover:bg-white/10 text-muted-foreground hover:text-foreground"
onClick={(e) => {
e.stopPropagation();
onEdit();
}}
onPointerDown={(e) => e.stopPropagation()}
data-testid={`edit-waiting-${feature.id}`}
title="Edit"
>
<Edit className="w-4 h-4" />
</Button>
{onViewOutput && (
<Button
variant="ghost"
size="sm"
className="h-6 w-6 p-0 hover:bg-white/10 text-muted-foreground hover:text-foreground"
onClick={(e) => {
e.stopPropagation();
onViewOutput();
}}
onPointerDown={(e) => e.stopPropagation()}
data-testid={`logs-waiting-${feature.id}`}
title="Logs"
>
<FileText className="w-4 h-4" />
</Button>
)}
<Button
variant="ghost"
size="sm"
className="h-6 w-6 p-0 hover:bg-white/10 text-muted-foreground hover:text-destructive"
onClick={(e) => {
e.stopPropagation();
handleDeleteClick(e);
}}
onPointerDown={(e) => e.stopPropagation()}
data-testid={`delete-waiting-${feature.id}`}
title="Delete"
>
<Trash2 className="w-4 h-4" />
</Button>
</div>
)}
{!isCurrentAutoTask && feature.status === "verified" && (
<div className="absolute top-2 right-2 flex items-center gap-1">
<Button
variant="ghost"
size="sm"
className="h-6 w-6 p-0 hover:bg-white/10 text-muted-foreground hover:text-foreground"
onClick={(e) => {
e.stopPropagation();
onEdit();
}}
onPointerDown={(e) => e.stopPropagation()}
data-testid={`edit-verified-${feature.id}`}
title="Edit"
>
<Edit className="w-4 h-4" />
</Button>
{onViewOutput && (
<Button
variant="ghost"
size="sm"
className="h-6 w-6 p-0 hover:bg-white/10 text-muted-foreground hover:text-foreground"
onClick={(e) => {
e.stopPropagation();
onViewOutput();
}}
onPointerDown={(e) => e.stopPropagation()}
data-testid={`logs-verified-${feature.id}`}
title="Logs"
>
<FileText className="w-4 h-4" />
</Button>
)}
<Button
variant="ghost"
size="sm"
className="h-6 w-6 p-0 hover:bg-white/10 text-muted-foreground hover:text-destructive"
onClick={(e) => {
e.stopPropagation();
handleDeleteClick(e);
}}
onPointerDown={(e) => e.stopPropagation()}
data-testid={`delete-verified-${feature.id}`}
title="Delete"
>
<Trash2 className="w-4 h-4" />
</Button>
</div>
)}
Copy link
Contributor

Choose a reason for hiding this comment

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

high

There's significant code duplication here for handling actions on waiting_approval and verified cards. The JSX for the action buttons is identical in both blocks. You can combine these into a single conditional block using || to improve maintainability and reduce redundancy.

        {!isCurrentAutoTask && (feature.status === "waiting_approval" || feature.status === "verified") && (
          <div className="absolute top-2 right-2 flex items-center gap-1">
            <Button
              variant="ghost"
              size="sm"
              className="h-6 w-6 p-0 hover:bg-white/10 text-muted-foreground hover:text-foreground"
              onClick={(e) => {
                e.stopPropagation();
                onEdit();
              }}
              onPointerDown={(e) => e.stopPropagation()}
              data-testid={`edit-${feature.status === "waiting_approval" ? "waiting" : "verified"}-${feature.id}`}
              title="Edit"
            >
              <Edit className="w-4 h-4" />
            </Button>
            {onViewOutput && (
              <Button
                variant="ghost"
                size="sm"
                className="h-6 w-6 p-0 hover:bg-white/10 text-muted-foreground hover:text-foreground"
                onClick={(e) => {
                  e.stopPropagation();
                  onViewOutput();
                }}
                onPointerDown={(e) => e.stopPropagation()}
                data-testid={`logs-${feature.status === "waiting_approval" ? "waiting" : "verified"}-${feature.id}`}
                title="Logs"
              >
                <FileText className="w-4 h-4" />
              </Button>
            )}
            <Button
              variant="ghost"
              size="sm"
              className="h-6 w-6 p-0 hover:bg-white/10 text-muted-foreground hover:text-destructive"
              onClick={(e) => {
                e.stopPropagation();
                handleDeleteClick(e);
              }}
              onPointerDown={(e) => e.stopPropagation()}
              data-testid={`delete-${feature.status === "waiting_approval" ? "waiting" : "verified"}-${feature.id}`}
              title="Delete"
            >
              <Trash2 className="w-4 h-4" />
            </Button>
          </div>
        )}

Comment on lines 2190 to 2213
onImplement={async () => {
// Check concurrency limit
if (!autoMode.canStartNewTask) {
toast.error("Concurrency limit reached", {
description: `You can only have ${
autoMode.maxConcurrency
} task${
autoMode.maxConcurrency > 1 ? "s" : ""
} running at a time. Wait for a task to complete or increase the limit.`,
});
return;
}
// Update with startedAt timestamp
const updates = {
status: "in_progress" as const,
startedAt: new Date().toISOString(),
};
updateFeature(feature.id, updates);
persistFeatureUpdate(feature.id, updates);
console.log(
"[Board] Feature moved to in_progress via Implement button, starting agent..."
);
await handleRunFeature(feature);
}}
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

The logic for implementing a feature is duplicated here and in handleDragEnd. To improve maintainability and reduce code duplication, you could extract this logic into a new helper function, for example handleStartImplementation(feature).

This new function could look like this:

const handleStartImplementation = async (feature: Feature) => {
  if (!autoMode.canStartNewTask) {
    toast.error("Concurrency limit reached", {
      description: `You can only have ${
        autoMode.maxConcurrency
      } task${
        autoMode.maxConcurrency > 1 ? "s" : ""
      } running at a time. Wait for a task to complete or increase the limit.`,
    });
    return;
  }

  const updates = {
    status: "in_progress" as const,
    startedAt: new Date().toISOString(),
  };
  updateFeature(feature.id, updates);
  persistFeatureUpdate(feature.id, updates);
  console.log(
    "[Board] Feature moved to in_progress, starting agent..."
  );
  await handleRunFeature(feature);
};

This new function could then be called from both onImplement and handleDragEnd.

Comment on lines 2379 to 2384
onClick={() => {
if (deleteCompletedFeature) {
handleDeleteFeature(deleteCompletedFeature.id);
setDeleteCompletedFeature(null);
}
}}
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

The handleDeleteFeature function is async and can be slow if it needs to stop a running agent. However, it's not being awaited here. This can lead to a confusing user experience where the confirmation dialog closes instantly, but the feature item might linger in the UI until the async operation completes. It would be better to await the function call so the dialog remains open until the deletion is fully processed. You might also consider adding a loading state to the button for better user feedback.

Suggested change
onClick={() => {
if (deleteCompletedFeature) {
handleDeleteFeature(deleteCompletedFeature.id);
setDeleteCompletedFeature(null);
}
}}
onClick={async () => {
if (deleteCompletedFeature) {
await handleDeleteFeature(deleteCompletedFeature.id);
setDeleteCompletedFeature(null);
}
}}

… KanbanCard

- Introduced a helper function, handleStartImplementation, to manage concurrency checks and feature status updates when moving features from backlog to in_progress.
- Simplified the onImplement callback in KanbanCard to utilize the new helper function, enhancing code readability and maintainability.
- Removed redundant concurrency checks from multiple locations, centralizing the logic for better consistency and reducing code duplication.
- Added a new ProjectSetupDialog component to facilitate project specification generation, enhancing user experience by guiding users through project setup.
- Refactored the Sidebar component to integrate the new ProjectSetupDialog, replacing the previous inline dialog implementation for improved code organization and maintainability.
- Updated the sidebar to handle project overview and feature generation options, streamlining the project setup process.
- Removed the old dialog implementation from the Sidebar, reducing code duplication and improving clarity.
…rove BoardView layout

- Added missing onOpenChange call in ProjectSetupDialog to ensure proper state management.
- Reformatted the COLUMNS array in BoardView for improved readability and consistency.
- Adjusted DragOverlay component's formatting for better code clarity.
- Simplified the sidebar button's class structure by removing unnecessary overflow styling.
- Enhanced the visual representation of the trashed projects count with updated styling for better visibility.
- Wrapped the dropdown menu's subcontent in a portal for improved rendering and performance.
@webdevcody webdevcody merged commit 00e098e into main Dec 15, 2025
3 checks passed
@webdevcody webdevcody deleted the ui-tweaks branch December 15, 2025 15:06
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