Repository navigation
Add Status multiselect filter to the Content Drive toolbar #37067
Description
Description
Add a Status filter to the Content Drive toolbar so users can narrow results to Archived, Unpublished or Locked content. This is the frontend half of the Status filter; the backend clauses are a separate ticket and this one is blocked by it.
Design: a multiselect chip filter with three options (Archived, Unpublished, Locked), sitting alongside the existing content type / base type / language / workflow filters. Nothing selected means today's behavior: archived hidden, everything else returned.
Semantics: AND. Unlike the existing multiselects (base type, content type, language), which are OR within the facet, the three statuses are independent boolean flags on the same content row. Selecting several narrows the result set.
Why multiselect rather than a single select: Unpublished + Locked ("drafts currently checked out by someone") is a real question content teams ask, and a single select cannot express it. The legacy Content Search portlet exposes these as a mutually exclusive dropdown (view_contentlets.jsp:695-698), but that was a UI simplification, not a domain constraint: its backend has always ANDed the three flags independently (ContentletAjax.java:1010-1021).
Current state: archived: false is hardcoded in the search request at dot-content-drive.store.ts:135. That pin is removed and driven by the new filter instead.
Two behaviors worth knowing before building the UI:
Archived + Unpublishedwill always return the same count asArchivedalone. Archiving removes the live version (ESContentletAPIImpl.java:3833), so every archived item is already unpublished. The combination is redundant, not broken, and should not look like a bug to the user.Archived + Lockedis reachable but uncommon (it needs a self-lock or a CMS Admin archive), so an empty result there is legitimate.
Folders carry no status. When any status is selected, folders must drop out of the results, consistent with how the store already handles the other narrowing filters (dot-content-drive.store.ts:137-146) and how ContentDriveHelper sets showFolders(false) for the workflow filter.
Acceptance Criteria
- Status multiselect renders in the Content Drive toolbar with options Archived, Unpublished and Locked
- Options use i18n keys via
DotMessagePipe, following thecontent-drive.*key convention - Selecting one or more statuses sends them on the drive-search request and the results narrow accordingly
-
Unpublished + Lockedreturns content that is both (the driving use case for a multiselect) - Empty selection sends no status and preserves current behavior (archived content stays hidden)
-
archived: falseis no longer hardcoded in the request atdot-content-drive.store.ts:135 - Selections round-trip through the URL like every other filter (encode/decode via the shared filter bag) so a filtered view is shareable and survives reload
- Selections are cleared by the existing "Clear all" action
- Folders are excluded from results whenever any status is selected
- The active selection is reflected as chips, consistent with the other toolbar filters
-
Archived + Unpublishedreturning the same count asArchivedalone does not render as an error or empty state - An empty result set (e.g.
Archived + Lockedwith no matches) shows the standard empty state, not an error -
data-testidon the control and its options;[attr.aria-label]on the control - Jest/Spectator tests cover: single selection, multiple selection, clearing, URL round-trip, and folders being excluded when a status is active
Priority
Medium
Additional Context
Blocked by #37066, which adds the Archived / Unpublished / Locked clauses to POST /api/v1/drive/search. The three predicates do not exist on the endpoint today, so this cannot ship first.
Not in scope: the Shared Assets / System Host toggle, tracked separately in #34760.
Reference: the workflow filter (dot-content-drive-workflow-filter.component.ts) is the closest existing toolbar filter for chip rendering, URL encoding and the folder-exclusion pattern.
Metadata
Metadata
Assignees
Type
Projects
- StatusShow more project fieldsDone
Activity
[-]Add Status multiselect filter to the Content Drive toolbar[/-][+]Add Status filter to the Content Drive toolbar[/+][-]Add Status filter to the Content Drive toolbar[/-][+]Add Status multiselect filter to the Content Drive toolbar[/+]zJaaal commentedon Aug 24, 2026
Merged into #37066, which now carries both the backend clauses and this toolbar multiselect as one vertical slice.
Rationale: the two tickets were one capability split across layers, and each restated the same contract independently (AND rather than OR semantics, the
Archived + Unpublishedredundancy, folders dropping out when a status is active). Duplicated contract text across two tickets is where drift starts. Under the spec-driven flow it also meant two spec approvals and two planning cycles for a filter whose backend plumbing is ~65 lines by thebeaf846d51precedent.Every acceptance criterion from this ticket is carried over verbatim under the Frontend heading on #37066. Nothing was dropped.
Closing as merged, not as rejected.
Analysis and edit by Claude (Claude Code), posted from @zJaaal's account.