Skip to content

feat: add mass edit feature for backlog kanban cards#360

Merged
webdevcody merged 5 commits intomainfrom
feat/mass-edit-backlog-features
Jan 6, 2026
Merged

feat: add mass edit feature for backlog kanban cards#360
webdevcody merged 5 commits intomainfrom
feat/mass-edit-backlog-features

Conversation

@Shironex
Copy link
Collaborator

@Shironex Shironex commented Jan 4, 2026

Add ability to select multiple backlog features and edit their configuration
in bulk. Selection is limited to backlog column features in the current
branch/worktree only.

Changes:

  • Add selection mode toggle in board controls
  • Add checkbox selection on kanban cards (backlog only)
  • Disable drag and drop during selection mode
  • Hide action buttons during selection mode
  • Add floating selection action bar with Edit/Clear/Select All
  • Add mass edit dialog with all configuration options in single scroll view
  • Add server endpoint for bulk feature updates

Preview

image image image

Summary by CodeRabbit

Release Notes

  • New Features

    • Added bulk feature editing: select multiple items on the board and edit them together with a convenient dialog interface
    • Introduced selection mode toggle with multi-select checkboxes and floating action bar for managing selections
    • New API endpoint for batch feature updates
  • Development & Deployment

    • Enhanced Docker development setup with live-reload support for faster iteration
    • Updated development workflow documentation to prioritize live development environment
    • Improved build tracking and container image management
  • Documentation

    • Streamlined README setup instructions with clearer authentication options and development guidelines
    • Removed outdated production build workflow references

✏️ Tip: You can customize this high-level summary in your review settings.

Add ability to select multiple backlog features and edit their configuration
in bulk. Selection is limited to backlog column features in the current
branch/worktree only.

Changes:
- Add selection mode toggle in board controls
- Add checkbox selection on kanban cards (backlog only)
- Disable drag and drop during selection mode
- Hide action buttons during selection mode
- Add floating selection action bar with Edit/Clear/Select All
- Add mass edit dialog with all configuration options in single scroll view
- Add server endpoint for bulk feature updates
@Shironex Shironex self-assigned this Jan 4, 2026
@Shironex Shironex added Enhancement Improvements to existing functionality or UI. Do Not Merge Use this label if something should not be merged. labels Jan 4, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 4, 2026

Caution

Review failed

The pull request is closed.

📝 Walkthrough

Walkthrough

Adds bulk-update capability for features via a new server API endpoint and mass-edit UI flow. Introduces selection mode to the board view, enabling users to select multiple features and apply batch updates. Adds Docker development infrastructure (Dockerfile.dev, docker-compose.dev.yml, launcher updates) supporting live-reload development. Removes production-start script and updates documentation to reflect development-first workflows.

Changes

Cohort / File(s) Summary
Docker Development Infrastructure
Dockerfile, Dockerfile.dev, docker-compose.dev.yml, dev.mjs, start.mjs, scripts/launcher-utils.mjs, package.json
Adds build-time commit SHA labeling to Dockerfile production stages; introduces Dockerfile.dev for live-reload development with node:22-slim, CLI tooling (GitHub CLI, Claude CLI, Cursor CLI), and non-root user setup; adds docker-compose.dev.yml with server and ui services, volume mounts, health checks, and dev environment config; replaces start.mjs (deleted) with dev.mjs for development mode; updates launcher-utils.mjs with SHA-based rebuild detection and new launchDockerDevContainers function; adds dev scripts to package.json.
Server Bulk Update API
apps/server/src/routes/features/index.ts, apps/server/src/routes/features/routes/bulk-update.ts
Registers new POST /bulk-update endpoint; implements createBulkUpdateHandler with per-feature iteration, error isolation, and aggregated response (success/failure counts, updated features).
UI API Integration
apps/ui/src/lib/http-api-client.ts
Adds bulkUpdate(projectPath, featureIds, updates) method to features API, invoking POST /api/features/bulk-update.
UI Selection Mode Infrastructure
apps/ui/src/components/views/board-view/hooks/use-selection-mode.ts, apps/ui/src/components/views/board-view/hooks/index.ts
Introduces useSelectionMode hook managing isSelectionMode state, selectedFeatureIds set, and actions (toggleSelectionMode, toggleFeatureSelection, selectAll, clearSelection); exports via index barrel.
UI Mass Edit Dialog
apps/ui/src/components/views/board-view/dialogs/mass-edit-dialog.tsx, apps/ui/src/components/views/board-view/dialogs/index.ts
Adds MassEditDialog component with per-field apply flags, mixed-value detection, profile/model selection, planning mode, priority, and testing options; applies updates via onApply with loading state; exports via barrel.
UI Board View & Kanban Integration
apps/ui/src/components/views/board-view.tsx, apps/ui/src/components/views/board-view/kanban-board.tsx
Integrates useSelectionMode, SelectionActionBar, and MassEditDialog into BoardView; updates KanbanBoard props (removes onCommit, shortcuts, onStartNextFeatures; adds isSelectionMode, selectedFeatureIds, onToggleFeatureSelection, onToggleSelectionMode); replaces legacy "Make" button with selection/drag toggle.
UI Card Components
apps/ui/src/components/views/board-view/components/kanban-card/kanban-card.tsx, apps/ui/src/components/views/board-view/components/kanban-card/card-header.tsx, apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx, apps/ui/src/components/views/board-view/components/selection-action-bar.tsx, apps/ui/src/components/views/board-view/components/index.ts
Extends KanbanCard with isSelectionMode, isSelected, onToggleSelect props; adds selection checkbox rendering; disables drag and action buttons in selection mode; updates CardHeader and CardActions to skip rendering when isSelectionMode=true; introduces SelectionActionBar component displaying selected count and batch actions (Edit, Select All, Clear); exports SelectionActionBar via barrel.
UI Selection & Configuration Shared Components
apps/ui/src/components/views/board-view/shared/profile-select.tsx, apps/ui/src/components/views/board-view/shared/priority-select.tsx, apps/ui/src/components/views/board-view/shared/planning-mode-select.tsx, apps/ui/src/components/views/board-view/shared/index.ts
Adds three new dropdown select components for profile (icon+label, model/thinking details), priority (High/Medium/Low with icons), and planning mode (skip/lite/spec/full with icons and approval checkbox); exports all via barrel for use in MassEditDialog.
Documentation & Configuration
README.md
Removes production-start workflow; clarifies npm run dev as primary start path; expands authentication section with multiple options (Claude CLI, API key, environment variables); streamlines production/build instructions.

Sequence Diagrams

sequenceDiagram
    participant User
    participant UI as BoardView UI
    participant Hook as useSelectionMode
    participant Dialog as MassEditDialog
    participant Client as HttpApiClient
    participant Server as API Server

    User->>UI: Toggles selection mode
    UI->>Hook: toggleSelectionMode()
    Hook-->>UI: isSelectionMode=true
    
    User->>UI: Clicks feature checkboxes
    UI->>Hook: toggleFeatureSelection(featureId)
    Hook-->>UI: selectedFeatureIds updated

    User->>UI: Clicks "Edit Selected" in ActionBar
    UI->>Dialog: Opens with selectedFeatures
    
    User->>Dialog: Selects profile & planning mode
    Dialog->>Dialog: Updates field apply flags & values
    
    User->>Dialog: Clicks "Apply"
    Dialog->>Client: bulkUpdate(projectPath, featureIds, updates)
    Client->>Server: POST /api/features/bulk-update
    Server->>Server: Iterate featureIds, update each
    Server-->>Client: { success, updatedCount, features[] }
    
    Client-->>Dialog: Result received
    Dialog->>UI: onApply called
    UI->>Hook: exitSelectionMode()
    Hook-->>UI: isSelectionMode=false, selections cleared
    
    UI-->>User: Show success toast, refresh board
Loading
sequenceDiagram
    participant Docker
    participant Shell as dev.mjs
    participant Launcher as launcher-utils.mjs
    participant Compose as docker-compose.dev

    Shell->>Launcher: launchDockerDevContainers({ baseDir })
    
    Launcher->>Launcher: Check Dockerfile.dev exists
    Launcher->>Docker: Build server & ui images
    Docker-->>Launcher: Build complete
    
    Launcher->>Compose: docker-compose up (dev config)
    Compose->>Docker: Start server container
    Docker->>Docker: Mount volumes, set NODE_ENV=dev
    Compose->>Docker: Start ui container
    Docker->>Docker: Mount src/, watch for changes
    
    Docker-->>Launcher: Containers running
    Launcher->>Launcher: Poll healthcheck
    Docker-->>Launcher: /api/health OK
    
    Launcher-->>Shell: Ready (live reload active)
    
    User->>User: Edit source files
    Docker->>Docker: Detect volume changes
    Docker-->>User: HMR updates (Vite) / watch rebuild (tsx)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

Poem

🐰 A fluffy hop through selection's dance,
Mass-edit dreams in Docker's expanse,
Bulk updates flowing with grace so divine,
Live-reload dev—oh, how tests align!
The board now sparkles with checkboxes bright.

✨ Finishing touches
  • 📝 Generate docstrings

📜 Recent review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fe7bc95 and 5f7cbd3.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (26)
  • Dockerfile
  • Dockerfile.dev
  • README.md
  • apps/server/src/routes/features/index.ts
  • apps/server/src/routes/features/routes/bulk-update.ts
  • apps/ui/src/components/views/board-view.tsx
  • apps/ui/src/components/views/board-view/components/index.ts
  • apps/ui/src/components/views/board-view/components/kanban-card/card-actions.tsx
  • apps/ui/src/components/views/board-view/components/kanban-card/card-header.tsx
  • apps/ui/src/components/views/board-view/components/kanban-card/kanban-card.tsx
  • apps/ui/src/components/views/board-view/components/selection-action-bar.tsx
  • apps/ui/src/components/views/board-view/dialogs/index.ts
  • apps/ui/src/components/views/board-view/dialogs/mass-edit-dialog.tsx
  • apps/ui/src/components/views/board-view/hooks/index.ts
  • apps/ui/src/components/views/board-view/hooks/use-selection-mode.ts
  • apps/ui/src/components/views/board-view/kanban-board.tsx
  • apps/ui/src/components/views/board-view/shared/index.ts
  • apps/ui/src/components/views/board-view/shared/planning-mode-select.tsx
  • apps/ui/src/components/views/board-view/shared/priority-select.tsx
  • apps/ui/src/components/views/board-view/shared/profile-select.tsx
  • apps/ui/src/lib/http-api-client.ts
  • dev.mjs
  • docker-compose.dev.yml
  • package.json
  • scripts/launcher-utils.mjs
  • start.mjs

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @Shironex, 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 delivers a highly requested feature: mass editing for backlog Kanban cards. It allows users to efficiently manage multiple features by selecting them and applying configuration changes in bulk through a new, intuitive user interface. This significantly reduces the manual effort required for updating individual cards, thereby boosting productivity.

Highlights

  • Mass Edit Feature: Introduced the ability to select multiple backlog Kanban cards and perform bulk edits on their configurations.
  • Selection Mode UI: Added a selection mode toggle in board controls, checkboxes on backlog Kanban cards for selection, a floating action bar for selected items, and a dedicated mass edit dialog.
  • Backend API for Bulk Updates: Implemented a new server endpoint (/api/features/bulk-update) to handle the simultaneous update of multiple features.
  • Enhanced User Experience: Disabled drag-and-drop and hid action buttons on Kanban cards during selection mode to prevent conflicts and streamline the mass editing workflow.

🧠 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.

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 introduces a valuable mass edit feature for backlog items, which is a great enhancement for user productivity. The implementation is well-structured, including a new backend endpoint, a custom hook for selection management, and several new UI components for the selection and editing process. I've identified two key areas for improvement: one on the backend to enhance performance by parallelizing the update operations, and a correctness issue on the frontend to properly handle partial success scenarios during bulk updates. Addressing these points will make the feature more robust and performant.

Comment on lines +43 to +61
const results: BulkUpdateResult[] = [];
const updatedFeatures: Feature[] = [];

for (const featureId of featureIds) {
try {
const updated = await featureLoader.update(projectPath, featureId, updates);
results.push({ featureId, success: true });
updatedFeatures.push(updated);
} catch (error) {
results.push({
featureId,
success: false,
error: getErrorMessage(error),
});
}
}

const successCount = results.filter((r) => r.success).length;
const failureCount = results.filter((r) => !r.success).length;
Copy link
Contributor

Choose a reason for hiding this comment

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

high

The current implementation updates features sequentially in a for...of loop. For a bulk update operation, this can be inefficient if many features are being updated at once, as each update will wait for the previous one to complete. Since featureLoader.update is likely I/O-bound, these operations can be parallelized to improve performance significantly. I suggest using Promise.allSettled to run all update operations in parallel and then process the results. This also allows for calculating success and failure counts in a single pass.

      const updatePromises = featureIds.map((featureId) =>
        featureLoader.update(projectPath, featureId, updates)
      );

      const settledResults = await Promise.allSettled(updatePromises);

      const results: BulkUpdateResult[] = [];
      const updatedFeatures: Feature[] = [];
      let successCount = 0;

      settledResults.forEach((result, index) => {
        const featureId = featureIds[index];
        if (result.status === 'fulfilled') {
          results.push({ featureId, success: true });
          updatedFeatures.push(result.value);
          successCount++;
        } else {
          results.push({
            featureId,
            success: false,
            error: getErrorMessage(result.reason),
          });
        }
      });

      const failureCount = featureIds.length - successCount;

Comment on lines +477 to +488
// Update local state
featureIds.forEach((featureId) => {
updateFeature(featureId, updates);
});
toast.success(`Updated ${result.updatedCount} features`);
exitSelectionMode();
} else {
toast.error('Failed to update some features', {
description: `${result.failedCount} features failed to update`,
});
}
} catch (error) {
Copy link
Contributor

Choose a reason for hiding this comment

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

high

The current logic for handling the bulk update response only updates the UI if the entire operation was successful (result.success is true). In cases of partial success, where some features are updated but others fail, the UI does not reflect the successful updates, leading to a state mismatch between the frontend and backend. The backend API conveniently returns a features array containing the successfully updated features. You should use this array to update the local state for successful updates, regardless of the overall result.success flag. I've also updated the error toast to be more informative in case of partial failure.

        if (result.features && result.features.length > 0) {
          // Update local state for successfully updated features
          result.features.forEach((feature) => {
            updateFeature(feature.id, updates);
          });
        }

        if (result.success) {
          toast.success(`Updated ${result.updatedCount} features`);
          exitSelectionMode();
        } else {
          toast.error('Failed to update some features', {
            description: `${result.failedCount} features failed to update, while ${result.updatedCount} succeeded.`,
          });
        }

- Removed advanced options toggle and related state from the mass edit dialog for a cleaner UI.
- Replaced ProfileQuickSelect with ProfileSelect for better profile management.
- Introduced new PlanningModeSelect and PrioritySelect components for streamlined selection of planning modes and priorities.
- Updated imports in shared index to include new select components.
- Enhanced the mass edit dialog to utilize the new components, improving user experience during bulk edits.
Base automatically changed from v0.8.0rc to main January 5, 2026 21:28
…ovements

- Introduced a new `docker-compose.dev.yml` for development mode, enabling live reload and improved container management.
- Updated `dev.mjs` to utilize `launchDockerDevContainers` for starting development containers with live reload capabilities.
- Refactored `printModeMenu` to differentiate between development and production Docker options.
- Enhanced the `BoardView` and `KanbanBoard` components by streamlining props and improving UI interactions.
- Removed the `start.mjs` script, consolidating production launch logic into `dev.mjs` for a more unified approach.
- Updated the logging format in the launchDockerContainers function to enhance readability by breaking long lines into multiple lines. This change improves the clarity of log messages when starting Docker containers.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Do Not Merge Use this label if something should not be merged. Enhancement Improvements to existing functionality or UI.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants