This plan splits the 55,000+ line Content List PR into 18 reviewable PRs organized by feature. Each PR delivers a complete feature across all layers (provider, hooks, components, tests), making reviews focused and incremental.
Approach:
- 12 sequential feature PRs build the Content List architecture incrementally
- 6 migration PRs replace
TableListViewin existing consumers (Graph, Maps, Files, Event Annotations, Visualizations, Dashboard) - 4 milestones define when each consumer can be migrated
- Migration PRs can be developed in parallel once their milestone is reached
New packages: @kbn/content-list-provider, @kbn/content-list-provider-client, @kbn/content-list-table, @kbn/content-list-toolbar, @kbn/content-list-mock-data
- The server provider (
@kbn/content-list-provider-server) and/internal/content_management/listendpoint are not included in this plan.- They can be added as a parallel PR after PR 3.
- Milestones 2 and 3 can be easily swapped, based on feedback or prioritization.
- Data Streams could be an additional milestone, as a custom consumer, based on where it fits in the Feature Requirements matrix.
- Feature Requirements
- Packages Overview
- PR Sequence
- Timeline
- PR and Milestone Details
- Review Strategy
Before diving into PRs, here's what each TableListView consumer needs:
| Consumer | Core | Tags | Custom Cols | Users | Starred | Editor | Migration |
|---|---|---|---|---|---|---|---|
| Graph | Yes | MS1 | |||||
| Maps | Yes | Yes | MS2 | ||||
| Files Mgmt | Yes | Yes | MS3 | ||||
| Event Annotations | Yes | Yes | Yes | Yes | MS4.1 | ||
| Visualizations | Yes | Yes | Yes | Yes | MS4.2 | ||
| Dashboard | Yes | Yes | Yes | Yes | Yes | MS4.3 |
Core = Search + Sort + Pagination + UpdatedAt + Actions + Selection (PRs 1-7)
The Content List system is organized into provider packages (state management and data fetching), component packages (UI rendering), and support packages (testing and documentation).
flowchart TB
subgraph providers [Providers]
base[kbn-content-list-provider]
client[kbn-content-list-provider-client]
end
subgraph components [Components]
table[kbn-content-list-table]
toolbar[kbn-content-list-toolbar]
grid[kbn-content-list-grid]
footer[kbn-content-list-footer]
end
subgraph support [Support]
mock[kbn-content-list-mock-data]
docs[kbn-content-list-docs]
end
consumers[Consumers]
base --> client
base --> table
base --> toolbar
base --> grid
base --> footer
client --> consumers
Feature PRs are merged sequentially. Migration PRs can begin in parallel once their milestone is reached.
| ID | Type | Description | Est. Files |
|---|---|---|---|
| PR 1 | Feature | Provider Foundation | ~25 |
| PR 2 | Feature | UI Foundation | ~25 |
| PR 3 | Feature | Pagination | ~15 |
| PR 4 | Feature | Search | ~10 |
| PR 5 | Feature | UpdatedAt Column + Sort | ~8 |
| PR 6 | Feature | Actions Column | ~10 |
| PR 7 | Feature | Selection | ~15 |
| MS1 | Milestone | Graph Migration | ~5 |
| PR 8 | Feature | Tags | ~20 |
| MS2 | Milestone | Maps Migration | ~10 |
| PR 9 | Feature | Custom Columns | ~15 |
| MS3 | Milestone | Files Mgmt Migration | ~10 |
| PR 10 | Feature | Users + CreatedBy | ~20 |
| PR 11 | Feature | Starred | ~15 |
| PR 12 | Feature | Content Editor | ~20 |
| MS4.1 | Milestone | Event Annotations Migration | ~10 |
| MS4.2 | Milestone | Visualizations Migration | ~15 |
| MS4.3 | Milestone | Dashboard Migration | ~20 |
Visual overview of the PR sequence and migration opportunities.
flowchart TB
subgraph foundation [Foundation PRs 1-7]
pr1[PR1: Provider] --> pr2[PR2: UI]
pr2 --> pr3[PR3: Pagination]
pr3 --> pr4[PR4: Search]
pr4 --> pr5[PR5: UpdatedAt]
pr5 --> pr6[PR6: Actions]
pr6 --> pr7[PR7: Selection]
end
pr7 --> ms1((MS1))
ms1 --> pr8[PR8: Tags]
pr8 --> ms2((MS2))
ms2 --> pr9[PR9: Custom Cols]
pr9 --> ms3((MS3))
ms3 --> pr10[PR10: Users]
pr10 --> pr11[PR11: Starred]
pr11 --> pr12[PR12: Editor]
pr12 --> ms4((MS4))
ms1 -.-> graphMig[Graph]
ms2 -.-> mapsMig[Maps]
ms3 -.-> filesMig[Files Mgmt]
ms4 -.-> eventMig[Event Annotations]
ms4 -.-> visMig[Visualizations]
ms4 -.-> dashMig[Dashboard]
Key: Solid lines = sequential dependencies. Dotted lines = parallel migration work.
Detailed scope for each feature PR and migration milestone.
Goal: Core state management and data fetching infrastructure
Packages to create:
@kbn/content-list-provider(minimal core)src/context/- Config and state contextssrc/state/- Reducer and state managementsrc/datasource/- Data fetching interfacesrc/query/- React Query integrationsrc/features/sorting/- Sort feature onlysrc/item/- Item types and transformsrc/services/- Services skeleton (types, context)
@kbn/content-list-provider-client(skeleton)provider.tsx- Provider componentstrategy.ts- Client-side adapter (no caching yet)
@kbn/content-list-mock-data(minimal)- Basic mock data for tests
Estimated files: ~25 files
Goal: Table, toolbar, and footer components with sorting
Packages to create:
@kbn/content-list-table(name column only)content_list_table.tsx- Table componentcolumns/column.tsx- Column basecolumns/name/- Name columnhooks/use_sorting.ts- Table sorting hookempty_state/- Basic empty states
@kbn/content-list-toolbar- Toolbar container
- Sort order selector component
@kbn/content-list-footer(skeleton)- Footer container
- Item count display
Estimated files: ~25 files
Goal: Add pagination controls
Changes:
@kbn/content-list-providersrc/features/pagination/- Pagination state and hooks
@kbn/content-list-footer- Pagination controls (page size selector, page navigation)
@kbn/content-list-provider-client- Client-side pagination logic
Estimated files: ~15 files
Goal: Add search capability to the toolbar
Changes:
@kbn/content-list-providersrc/features/search/- Search state and hooks
@kbn/content-list-toolbar- Search input component added to toolbar
Estimated files: ~10 files
Goal: Add timestamp column and "Last updated" sort option
Changes:
@kbn/content-list-tablecolumns/updated_at/- UpdatedAt column with relative time formatting
@kbn/content-list-toolbar- Add "Last updated" sort option to sort order selector
Estimated files: ~8 files
Goal: Add row actions (edit, delete)
Changes:
@kbn/content-list-tablecolumns/actions/- Actions columnAction.EditcomponentAction.Deletecomponent with confirmation
Estimated files: ~10 files
Goal: Add multi-select with bulk delete capability
Changes:
@kbn/content-list-providersrc/features/selection/- Selection state and hooks
@kbn/content-list-tablehooks/use_selection.ts- Selection integration- Checkbox column for rows
@kbn/content-list-toolbar- Selection actions bar (delete selected, count display)
Estimated files: ~15 files
x-pack/platform/plugins/private/graph/public/apps/listing_route.tsx- Simple migration: basic CRUD, custom empty prompt
- Estimated files: ~5 files
Goal: Add tags filtering and display
Changes:
@kbn/content-list-providersrc/features/filtering/tags/- Tags Filteringsrc/services/tags/- Tags service adapter
@kbn/content-list-tablecolumns/name/- AddshowTagsprop to Name column
@kbn/content-list-toolbar- Tags filter popover (include/exclude)
- Filter pills display
Estimated files: ~20 files
x-pack/platform/plugins/shared/maps/public/routes/list_page/maps_list_view.tsx- Needs: Core + Tags
- Estimated files: ~10 files
Goal: Add support for custom columns with custom rendering and sorting options
Changes:
@kbn/content-list-tableColumn.Customcomponent for arbitrary custom columns- Custom
renderfunction support:(field, record) => ReactNode - Custom
fieldpath support (e.g.,'attributes.size') - Custom
widthandsortableoptions customSortingOptionsfor custom sort labels (e.g., "Type A-Z", "Type Z-A")
API (matching existing TableListView):
// Custom column definition
customTableColumn={{
field: 'attributes.size',
name: 'Size',
sortable: true,
width: '150px',
render: (value, record) => numeral(value).format('0[.]0 b'),
}}
// Custom sorting options
customSortingOptions={{
field: 'typeTitle',
sortingLabels: [
{ label: 'Type A-Z', direction: 'asc' },
{ label: 'Type Z-A', direction: 'desc' },
],
}}Estimated files: ~15 files
src/platform/plugins/private/files_management/public/app.tsx- Needs: Core + Custom Columns (file size column)
- Estimated files: ~10 files
Goal: Add user profile filtering and CreatedBy column
Changes:
@kbn/content-list-providersrc/features/filtering/user_profile/- Add user filteringsrc/services/user_profile/- User profile service
@kbn/content-list-tablecolumns/created_by/- CreatedBy column with avatar
@kbn/content-list-toolbar- Created by filter popover
Estimated files: ~20 files
Goal: Add favorites support with starred filter
Changes:
@kbn/content-list-providersrc/features/filtering/starred/- Starred filtering (is:starred)src/services/favorites/- Favorites service integration
@kbn/content-list-tablecolumns/name/- Starred button in Name column
@kbn/content-list-toolbar- Starred filter toggle
Estimated files: ~15 files
Goal: Add metadata editing flyout
Milestone: After this PR, MS4 enables Event Annotations, Visualizations, and Dashboard migrations
Changes:
@kbn/content-list-providersrc/features/content_editor/- Content editor configContentEditorActionProvidercomponent
@kbn/content-list-tablecolumns/actions/- View Details actioncolumns/expander/- Expandable rows
Depends on existing @kbn/content-management-content-editor package.
Estimated files: ~20 files
src/platform/plugins/private/event_annotation_listing/public/components/table_list.tsx- Needs: Core + Tags + Custom Columns + Content Editor
- Estimated files: ~10 files
src/platform/plugins/shared/visualizations/public/visualize_app/components/visualize_listing.tsx- Needs: Core + Tags + Custom Columns + Content Editor + Custom Sorting
- Note: Tabbed interface (
TabbedTableListView) may require additional work - Estimated files: ~15 files
src/platform/plugins/shared/dashboard/public/dashboard_listing/dashboard_content_list.tsx- Needs: All features (Users, Starred, Content Editor)
- Dashboard-specific: Unsaved changes listing, content insights, access control
- Estimated files: ~20 files
Feature PRs should include:
- Package code with unit tests
- Storybook stories for visual components
- Updated README documentation
- Jest config and tsconfig updates
Migration PRs should include:
- Functional tests
- Side-by-side comparison (if needed during transition)
- Migration guide updates
@clintandrewhall
I realized the plan is missing recently viewed sorting and url state URL sync for the dashboard feature parity and rollout
Not sure if URL sync is a good built in feature for table, maybe it should just move outside to dashboard level and we can provide some helpers/adapters (like we did with localstorage and page size)