Skip to content

Add accessible multi-feed selection with header actions and throttled batch move/delete in feed settings#3728

Merged
Grotax merged 1 commit into
masterfrom
copilot/add-feed-settings-multiple-selection
May 10, 2026
Merged

Add accessible multi-feed selection with header actions and throttled batch move/delete in feed settings#3728
Grotax merged 1 commit into
masterfrom
copilot/add-feed-settings-multiple-selection

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented May 9, 2026

Summary

This PR adds bulk feed management in Feed settings by allowing users to select multiple feeds and run move/delete actions in one flow. Because the backend has no batch endpoints, operations are executed sequentially with a short delay between requests to avoid server overload.

  • Bulk selection in Feed settings

    • Added per-row selection checkboxes and a select-all control.
    • Added selected-feed count and preserved selection consistency when feed data refreshes.
    • Added accessibility labels for the select-all and per-row selection checkboxes.
    • Reworked the selected state UI to replace the table header with a files-app-style selection action row.
  • Batch move for selected feeds

    • Added Move selected action in the selection header.
    • Reused the existing MoveFeed.vue dialog for batch moves (instead of an always-visible folder select).
    • Sends one move request per feed, sequentially.
    • Skips no-op moves (already in target folder), refreshes feeds after processing, and surfaces partial-failure feedback.
  • Batch delete for selected feeds

    • Added Delete selected action with count-aware confirmation text.
    • Sends one delete request per feed, sequentially, with throttling between requests.
    • Reports partial failures and logs per-feed failures for diagnosis.
  • Test coverage and changelog

    • Extended FeedInfoTable unit tests for bulk selection, batch move/delete success and failure paths, and delay behavior.
    • Updated tests after the batch-move dialog refactor to verify dialog-opening behavior.
    • Updated test cleanup to restore and clear mocks between tests.
    • Added an Unreleased changelog entry for bulk feed settings under Added and corrected grammar.

Checklist

@codecov
Copy link
Copy Markdown

codecov Bot commented May 9, 2026

Codecov Report

❌ Patch coverage is 50.00000% with 54 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/components/modals/FeedInfoTable.vue 62.33% 19 Missing and 10 partials ⚠️
src/components/MoveFeed.vue 19.35% 22 Missing and 3 partials ⚠️

📢 Thoughts on this report? Let us know!

@Grotax Grotax force-pushed the copilot/add-feed-settings-multiple-selection branch from b81f83f to 0edae25 Compare May 9, 2026 12:21
@Grotax Grotax requested a review from Copilot May 9, 2026 12:21
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds bulk feed management controls to the Feed settings modal, enabling multi-select and sequential (throttled) batch move/delete operations when no backend batch endpoints exist.

Changes:

  • Introduces multi-feed selection UI (per-row checkboxes + select-all) and batch action controls (move/delete).
  • Implements sequential, throttled batch move/delete flows with partial-failure reporting.
  • Extends unit tests for new batch behaviors and updates the Unreleased changelog entry.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 6 comments.

File Description
src/components/modals/FeedInfoTable.vue Adds selection UI, batch actions, throttling helper, and move/delete batch methods.
tests/javascript/unit/components/modals/FeedInfoTable.spec.ts Adds unit tests covering select-all, batch move/delete, and error handling.
CHANGELOG.md Documents the new bulk feed settings capability in Unreleased notes.

Comment thread src/components/modals/FeedInfoTable.vue
Comment thread src/components/modals/FeedInfoTable.vue
Comment thread src/components/modals/FeedInfoTable.vue Outdated
Comment thread CHANGELOG.md Outdated
Comment thread src/components/modals/FeedInfoTable.vue
Comment thread tests/javascript/unit/components/modals/FeedInfoTable.spec.ts
@Grotax
Copy link
Copy Markdown
Member

Grotax commented May 9, 2026

@copilot respond to the review comments and fix the things

Copy link
Copy Markdown
Contributor Author

Copilot AI commented May 9, 2026

@copilot respond to the review comments and fix the things

Done in commit d18dd82.

I addressed the requested review items:

  • added aria-label for select-all and per-row feed checkboxes,
  • stabilized folder selection with trackBy="id" and a stable noFolderOption,
  • removed duplicate NcButton registration,
  • moved the bulk feed feature changelog line to Added,
  • updated tests to use both vi.restoreAllMocks() and vi.clearAllMocks().

Screenshot of the updated UI controls:
Feed settings batch actions preview

Copilot AI changed the title Add multi-feed selection and throttled batch move/delete in feed settings Add accessible multi-feed selection and throttled batch move/delete in feed settings May 9, 2026
Copilot finished work on behalf of Grotax May 9, 2026 12:33
Copilot AI requested a review from Grotax May 9, 2026 12:33
@Grotax Grotax requested a review from Copilot May 9, 2026 12:42
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

Comment thread CHANGELOG.md Outdated
@Grotax Grotax marked this pull request as ready for review May 9, 2026 17:22
@wofferl
Copy link
Copy Markdown
Collaborator

wofferl commented May 9, 2026

I think the batch actions are currently a bit out of place. We could do the same like the files app and replace the table header when selecting feeds.
For move I think the dialog from MoveFeed.vue could than be reused, instead of showing always the select, than there is also enough place to add the other actions (sync, etc) too.

Here an example mockup:

grafik

@Grotax
Copy link
Copy Markdown
Member

Grotax commented May 10, 2026

Screencast_20260510_115227.webm
looks like this now

@Grotax
Copy link
Copy Markdown
Member

Grotax commented May 10, 2026

@copilot fix the failing tests

@wofferl
Copy link
Copy Markdown
Collaborator

wofferl commented May 10, 2026

Screencast_20260510_115227.webm looks like this now

looks good, but you should consider using NcCheckboxRadioSwitch as checkbox, to fix styling with light/dark theme

Copy link
Copy Markdown
Contributor Author

Copilot AI commented May 10, 2026

@copilot fix the failing tests

Fixed in 0380f83.

I updated FeedInfoTable.spec.ts to match the current batch-move flow (dialog-based), replacing calls to removed moveSelectedFeeds() with assertions around openMoveSelectedFeedsDialog(). I also fixed the changelog grammar issue (supportssupport).

All frontend checks are passing now (lint, stylelint, test, build).

I think the batch actions are currently a bit out of place. We could do the same like the files app and replace the table header when selecting feeds.
For move I think the dialog from MoveFeed.vue co...

Implemented in dd578a4.

Batch actions now switch the table header into a selection-action row (files-app style), and batch move reuses MoveFeed.vue instead of the always-visible folder select.

Screenshot:
Updated selection header and batch actions

Copilot AI changed the title Add accessible multi-feed selection and throttled batch move/delete in feed settings Add accessible multi-feed selection with header actions and throttled batch move/delete in feed settings May 10, 2026
Copilot finished work on behalf of Grotax May 10, 2026 10:32
@Grotax Grotax requested a review from Copilot May 10, 2026 12:46
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.

Comment thread src/components/MoveFeed.vue Outdated
@@ -39,6 +39,7 @@ import { ACTIONS } from '../store/index.ts'

type MoveFeedState = {
folder?: Folder
Comment thread src/components/MoveFeed.vue
Comment thread src/components/modals/FeedInfoTable.vue Outdated
- show selection count and batch actions in the table header while feeds are selected
- restore normal sortable headers when no feeds are selected
- reuse MoveFeed dialog for bulk moves and remove inline batch folder select
- throttle sequential batch move requests to avoid request bursts
- keep modal/table dimensions stable when toggling selection to prevent visual jumps
- retain indeterminate select-all state for partial selections

Signed-off-by: Benjamin Brahmer <info@b-brahmer.de>
Co-authored-by: Grotax <5429298+Grotax@users.noreply.github.com>
@Grotax Grotax force-pushed the copilot/add-feed-settings-multiple-selection branch from 31d5a37 to 8baad25 Compare May 10, 2026 15:21
@Grotax Grotax merged commit 50d0cf1 into master May 10, 2026
27 of 28 checks passed
@Grotax Grotax deleted the copilot/add-feed-settings-multiple-selection branch May 10, 2026 15:25
@Grotax Grotax mentioned this pull request May 10, 2026
Grotax added a commit that referenced this pull request May 10, 2026
Changed
- Feed keyword filtering: hide articles matching keywords in title, body, or URL (#3711)

  New occ commands:
  ```bash
  news:feed:filter:get
  news:feed:filter:set
  news:feed:filter:delete
  ```
  Added API v1-3 `GET|POST|DELETE /api/v1-3/feeds/{feedId}/filter`

- Feed settings now support selecting multiple feeds and moving/deleting them in throttled, sequential requests. (#3728)
- Replace `arthurhoaro/favicon` with `php-feed-io/favicon-io` for favicon discovery, using PSR-based HTTP interfaces and Symfony-backed discovery caching (#3710)

Signed-off-by: Benjamin Brahmer <info@b-brahmer.de>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants