🤔 Problem It Solves
Right now data is displayed across multiple pages without a shared table component. Each view likely implements its own ad-hoc table structure with no sorting, no filtering, and no consistency. As the app grows and more data needs to be displayed this becomes harder to maintain and creates an inconsistent experience for users. A shared reusable DataTable component solves all of this in one place and becomes the foundation for every data view in the app going forward.
💡 Proposed Solution
- Build a reusable
DataTable component that accepts columns and data as props.
- Sorting — clicking a column header sorts the table by that column in ascending or descending order with a visual indicator.
- Filtering — a search input above the table filters rows in real time based on any matching field.
- Pagination — display a configurable number of rows per page with next/previous controls.
- Keep the component fully typed if the project uses TypeScript.
- Style it consistently with the existing OPSCORD design system.
🔄 Alternatives Considered
A third-party library like TanStack Table or AG Grid could be used but they add significant bundle size and complexity. A lightweight custom component built for this project's specific needs is cleaner, more maintainable and keeps full control over styling and behavior.
📸 Mockups / Examples
Similar reusable table components are used across Linear, Notion databases, Airtable and most modern dashboards where data is displayed in sortable, filterable grids.
✅ Acceptance Criteria
📋 Additional Context
This is a frontend engineering task that will have long-term value for the entire codebase. Once this component exists, every new data view in the app can simply drop in <DataTable /> instead of building a new table from scratch each time. It is one of those contributions that keeps giving well beyond the initial PR.
🌱 Contributor Checklist
🤔 Problem It Solves
Right now data is displayed across multiple pages without a shared table component. Each view likely implements its own ad-hoc table structure with no sorting, no filtering, and no consistency. As the app grows and more data needs to be displayed this becomes harder to maintain and creates an inconsistent experience for users. A shared reusable DataTable component solves all of this in one place and becomes the foundation for every data view in the app going forward.
💡 Proposed Solution
DataTablecomponent that acceptscolumnsanddataas props.🔄 Alternatives Considered
A third-party library like TanStack Table or AG Grid could be used but they add significant bundle size and complexity. A lightweight custom component built for this project's specific needs is cleaner, more maintainable and keeps full control over styling and behavior.
📸 Mockups / Examples
Similar reusable table components are used across Linear, Notion databases, Airtable and most modern dashboards where data is displayed in sortable, filterable grids.
✅ Acceptance Criteria
DataTablecomponent created and acceptscolumnsanddataas props.📋 Additional Context
This is a frontend engineering task that will have long-term value for the entire codebase. Once this component exists, every new data view in the app can simply drop in
<DataTable />instead of building a new table from scratch each time. It is one of those contributions that keeps giving well beyond the initial PR.🌱 Contributor Checklist