Skip to main content
Version: 3.0.1

Tables & Filters Design

Document Type: Domain Design (Tier 2) Domain: TABLES, FILTERS Domain Character: Thin orchestration SRS Reference: tables.md, filters.md Status: Draft Last Updated: 2026-01-25


1. Overview

1.1 Purpose

The Tables & Filters subsystem provides reusable infrastructure for displaying, sorting, filtering, and paginating tabular data throughout the application. It defines the generic patterns that all domain-specific table implementations consume.

This is a thin orchestration domain that:

  • Provides generic table display components (headers, rows, selection)
  • Provides pagination infrastructure (page navigation, items per page)
  • Provides sorting infrastructure (column-based ordering)
  • Provides filtering infrastructure (criteria-based data constraint)
  • Coordinates backend traits and frontend components

Individual table implementations (Runs, Audits, Wells, etc.) define context-specific behaviors by consuming these generic patterns.

1.2 Requirements Covered

REQ IDTitlePriority
REQ-TABLES-001Display Data in Tabular FormatMust
REQ-TABLES-002Sort Table Data by ColumnMust
REQ-TABLES-003Select and Interact with Table RowsMust
REQ-TABLES-004Navigate Paginated DataMust
REQ-TABLES-005Handle Large Data ExportsMust
REQ-TABLES-006Configure Column VisibilityMust
REQ-FILTERS-001Filter Data by CriteriaMust

1.3 Constraints

Tier 2 Constraint: This document describes ownership, patterns, and design rationale. Domain-specific table configurations are owned by their respective domains. See Database Reference for schema details.

1.4 Dependencies

DirectionDomain/ComponentPurpose
Provides toAll table-using domainsSorting, filtering, pagination infrastructure
ConsumesLaravel FrameworkLengthAwarePaginator, Query Builder
ConsumesBackground JobsLarge export handling

2. Component Architecture

2.1 Component Diagram

2.2 Component Responsibilities

ComponentLayerResponsibilityREQ Trace
SortableBackend TraitApplies column-based ordering to queriesREQ-TABLES-002
FilterableBackend TraitDelegates filter application to filter classesREQ-FILTERS-001
BaseFiltersBackend ClassRequest-to-query filter dispatch infrastructureREQ-FILTERS-001
LengthAwarePaginatorLaravelProvides pagination metadata (total, per_page, current_page)REQ-TABLES-004
TableHandlerFrontend ViewOrchestrates paginator/infinite loader selectionREQ-TABLES-004, 005
NewPaginatorFrontend ComponentPage navigation controls, items per pageREQ-TABLES-004
FlexTableHeaderFrontend ComponentSticky column headersREQ-TABLES-001
FlexTableRowFrontend ComponentRow display, selection stateREQ-TABLES-001, 003
ColumnVisibilityPickerFrontend ComponentColumn show/hide dialogREQ-TABLES-006
PaginatorRowsPerPagePickerFrontend ComponentItems per page dropdown (10, 20, 30, 50, All)REQ-TABLES-004
PaginatorGoToPageFrontend ComponentDirect page number inputREQ-TABLES-004

3. Data Design

3.1 Entities

This domain does not own persistent entities. It provides infrastructure consumed by other domains.

3.2 Data Structures

Pagination Response (Backend → Frontend)

interface PaginatedResponse<T> {
data: T[];
current_page: number;
last_page: number;
per_page: number;
total: number;
}

Pagination State (Frontend)

interface PaginatedData<T> {
data: T[];
current_page: number;
per_page: number;
total: number;
rangeOfRecords: string; // e.g., "1-20"
}

Column Visibility State

interface ColumnVisibility {
[columnKey: string]: boolean;
}

Sort Direction Convention

Ascending:  field_name      (no prefix)
Descending: -field_name (hyphen prefix)

3.3 State Transitions

This domain is stateless. Pagination, sort, and filter state are request-scoped parameters.


4. Interface Design

4.1 APIs Provided

Query Parameter Conventions (consumed by all table endpoints)

ParameterFormatPurpose
sortfield or -fieldColumn to sort by, descending if prefixed with -
per_pageintegerItems per page (default: 20)
pageintegerCurrent page number
[filter_name]variesFilter-specific criteria

4.2 APIs Consumed

All domain-specific endpoints consuming table infrastructure use Laravel's standard pagination response format.

4.3 Events

EventDirectionPurpose
@inputColumnVisibilityPicker → ParentVisibility changes confirmed
@changed-per-pageNewPaginator → ParentUser changed items per page
@requested-all-recordsNewPaginator → TableHandlerUser requested all records

5. Behavioral Design

5.1 Sort Application

Algorithm: Apply Sort to Query

Inputs:
- query: Eloquent Builder
- order: string - Field name, optionally prefixed with '-'
- table: string (optional) - Table name for qualified column

Outputs:
- query: Eloquent Builder with ORDER BY applied

Steps:
1. If order starts with '-':
a. direction = 'desc'
b. field = order without leading '-'
2. Else:
a. direction = 'asc'
b. field = order
3. Apply ORDER BY table.field direction to query
4. Return query

Notes:
- Table name defaults to model's table if not specified
- Single-column sort only (new sort clears previous)

5.2 Filter Application

Algorithm: Apply Filters to Query

Inputs:
- builder: Eloquent Builder
- request: HTTP Request containing filter parameters

Outputs:
- builder: Eloquent Builder with WHERE clauses applied

Steps:
1. For each request parameter (name, value):
a. Convert name to camelCase
b. If method exists on filter class:
- If value is set: call method(value)
- Else: call method()
c. Else: skip parameter
2. Return modified builder

Notes:
- Multiple filters combine with AND logic
- Domain-specific filter classes extend BaseFilters
- Filter methods modify $this->builder directly

5.3 Pagination Flow

5.4 Column Visibility

Algorithm: Toggle Column Visibility

Inputs:
- columnVisibility: Record<string, boolean> - Current state
- columnKey: string - Column to toggle

Outputs:
- Updated visibility state (on confirm only)

Steps:
1. User opens column visibility picker
2. Clone current visibility state to local state
3. User toggles individual columns
4. On Save: emit updated state to parent
5. On Cancel: discard local changes

Notes:
- Visibility persisted in component state (not server)
- Hidden columns remain filterable

6. Error Handling

ConditionDetectionResponseUser Impact
API timeoutNetwork errorDisplay error messageTable shows error state
Invalid page numberPage > last_pageNavigate to page 1First page displayed
Export timeoutLarge datasetOffer truncate/background optionsUser chooses export strategy
Filter timeoutComplex criteriaDisplay timeout messageUser refines criteria

7. Configuration

SettingLocationDefaultEffect
paginator_per_pageUser settings20User's preferred items per page
max_realtime_export_recordsApplication1000Threshold for synchronous export

See Configuration Reference for details.


8. Implementation Mapping

8.1 Code Locations

Backend Components

ComponentTypePath
SortableTraitcode/app/Sortable.php
FilterableTraitcode/app/Filterable.php
BaseFiltersClasscode/app/Filters/BaseFilters.php
RunFiltersClasscode/app/Filters/RunFilters.php
AuditFiltersClasscode/app/Filters/AuditFilters.php
WellFiltersClasscode/app/Filters/WellFilters.php
ReportFilters*ControllersControllerscode/app/Http/Controllers/ReportFilters/

Frontend Components

ComponentTypePath
TableHandlerViewcode/resources/frontend/src/views/TableHandler.vue
NewPaginatorComponentcode/resources/frontend/src/components/paginator/NewPaginator.vue
PaginatorRowsPerPagePickerComponentcode/resources/frontend/src/components/paginator/PaginatorRowsPerPagePicker.vue
PaginatorGoToPageComponentcode/resources/frontend/src/components/paginator/PaginatorGoToPage.vue
FlexTableHeaderComponentcode/resources/frontend/src/components/table-components/FlexTableHeader.vue
FlexTableRowComponentcode/resources/frontend/src/components/table-components/FlexTableRow.vue
ColumnVisibilityPickerComponentcode/resources/frontend/src/components/column-visibility/ColumnVisibilityPicker.vue
TableWrapperComponentcode/resources/frontend/src/components/common/TableWrapper.vue

8.2 Requirement Traceability

REQ IDDesign SectionCode Location
REQ-TABLES-001§2.2 Component ResponsibilitiesFlexTableHeader.vue, FlexTableRow.vue, TableWrapper.vue
REQ-TABLES-002§5.1 Sort ApplicationSortable.php
REQ-TABLES-003§2.2 (FlexTableRow)FlexTableRow.vue (isSelected prop, @click handler)
REQ-TABLES-004§5.3 Pagination FlowNewPaginator.vue, PaginatorRowsPerPagePicker.vue, PaginatorGoToPage.vue
REQ-TABLES-005§6 Error HandlingTableHandler.vue (handleRequestAllRecords), domain-specific export jobs
REQ-TABLES-006§5.4 Column VisibilityColumnVisibilityPicker.vue
REQ-FILTERS-001§5.2 Filter ApplicationFilterable.php, BaseFilters.php, domain-specific filter classes

9. Design Decisions

DecisionRationaleAlternatives Considered
Trait-based sorting/filteringComposable; models opt-in to capabilitiesBase model class (rejected: less flexible)
Backend filtering with frontend displayLarge datasets require server-side processingClient-side filtering (rejected: memory limits)
Single-column sortSimplicity; multi-column rarely neededMulti-column sort (rejected: complexity)
Items per page in user settingsUser preference persistenceSession storage (rejected: less persistent)
Sort direction via hyphen prefixCompact URL representationSeparate direction param (rejected: more verbose)

DocumentRelevant Sections
SRS: tables.mdRequirements source for TABLES
SRS: filters.mdRequirements source for FILTERS
SDS: ArchitectureComponent patterns
SDS: RUNFILE DomainExample consumer (Runs table)
SDS: AUDIT DomainExample consumer (Audits table)
SDS: REPORTS DomainExample consumer (LJ/Trends reports)