Changelog¶
2.1.1 — 2026-10-13¶
Added¶
- AG Grid date and datetime columns support
DateTimeFormatterwith escaped invalid-value fallbacks and locale-aware rendering.
2.1.0¶
Added¶
CurrencyFormatterconfigures locale-aware currency formatting for both table backends. Per-row currency metadata, currency-specific precision, optional symbol colors, strict parsing, and empty-value handling are supported.- Browser-local
GridView.PageStatenamespaces persist page layout and table state byGridViewSpec.id, with optionalGridViewConfig.page_state_scope. GridViewGalleryadds a package-owned lightbox with thumbnails, overlay, keyboard controls, and optional datasource loading.- Named view presets can store host-owned
pageStatethroughPageStateHooks; existing column-only presets remain supported.
Changed¶
- Table adapters migrate supported legacy browser grid keys once, clear the old
keys, and then persist table state through
GridView.PageState. ExistingGridPreferencedata and its server API remain unchanged. - Charts adapt to light and dark themes and use compact layouts on narrow screens.
Fixed¶
- Column settings use a viewport-limited dialog width, and toolbar stacking keeps idle search below filter panels while focused search and menus remain accessible above them.
- Chart renderers handle empty, missing, and custom-bound data without replacing valid chart state.
2.0.4 — 2026-09-03¶
Added & Improved¶
- Column Presets: active preset checkmark indicator in dropdown and more menu; instructional empty state when no presets saved (
column_settings.no_presets_hint). - Toolbar & Responsive Layout: unified mobile breakpoint at 640px; scoped mobile filter header and vertical layout strictly to popover; preserved inline filter triggers when toolbar has no search field.
- KPI Cards & Filters Alignment: dynamic KPI card grid sizing (
repeat(auto-fit)) across viewport widths; aligned filter controls to content start (justify-content: flex-start) on toolbars without search. - Filter Dropdown Widths: flexible multiselect dropdown panel width on mobile (
min-width: max(100%, 180px)) preventing label text truncation. - Backend Views: handle optional request in
api_column_filter_dictionary.
2.0.3 — 2026-08-30¶
Documentation & Tooling¶
- Updated agent skills and repository adapter configuration (
.acdd/kilo.yaml,.agents/skills/*). - Added portfolio routing and planner documentation updates.
2.0.2 — 2026-08-03¶
Fixed¶
- In a multi-table spec, client-side simple-table filtering refreshes static charts only from the primary simple table. Later summary tables no longer overwrite a worklist chart with unrelated or zero-valued data.
2.0.1 — 2026-08-03¶
Added¶
- Faceted filtering:
GridViewFilters.facetsrecompute each filter's options + counts on the currently filtered table (exclude-own).FacetSourceregistry +compute_row_facets(rows) /compute_queryset_facets(Django ORM) + package routeapi_column_filter_dictionaryfor AG-Grid set filters.GridViewFilterOption.count/.disabledcarry counts; wire round-trips. See Faceted filtering. - CSS unification across table backends: one
--cm-*/--cm-table-*/--ag-*token bridge; bothsimpleandag_gridtables follow the same palette. See Theming with CSS tokens. GridViewFilters:navigate_on_change,fragment_endpoint/fragment_target/fragment_swapfor HTMX fragment refresh.GridViewTable.hide_sole_section_header(defaultTrue): when filtering leaves rows in exactly one section the section header is automatically hidden (it is redundant). Set toFalseto keep the header visible. See Simple table § Section rows.- Documented
__section__/section_labelrow keys for group-header rows in simple tables. GridViewToolbar.clear_all: built-in “clear all filters and search” action.- JSON Schema (
grid-view-spec.v2.json):GridViewFilterOptiondef (value,label,children,exclusive,meta,count,disabled);GridViewFilters.facets/navigate_on_change/fragment_*. - MCP
gridview_catalog:api_column_filter_dictionaryroute + facet rules. - Generated TypeScript types from
schema/grid-view-spec.v2.json(single source of truth):npm run gen:types→frontend/src/types/generated/, re-exported fromfrontend/src/types/spec.ts. Drift gate:npm run gen:types:check(inscripts/ci-gate.sh) +tests/test_ts_schema_parity.py. - Schema ↔ types sync:
$defsforGridViewCounter,GridViewFilterOption,GridViewTablePagination,GridViewCardGroup(s),GridViewValidator,GridViewFieldCondition,GridViewFieldset,GridViewField;GridViewToolbar.reload/clear_all; headerpresentation="section"; chartdata_sourcevaluegrid_filtered; set-filtermatchenum aligned toexact/any_token. - Validation diagnostics:
editable_without_edit,edit_commit_xor,gallery_no_source(warning),image_no_url,unknown_validator_kind,pattern_requires_value,custom_validator_missing_name,form_field_duplicate_name,fieldset_unknown_field,invalid_block_target,trusted_css_vars_denied.
Fixed¶
- MCP catalog now advertises all package-builtin renderers (
chip,period_pills,select); these are recognized byvalidate_spec(BUILTIN_RENDERERS). Guarded by a catalog↔builtin test. - Commerce stock grid: the “Wholesale prices” selector rebuilds columns via
column_source(no full page reload); toolbar facet filters refresh the AG datasource with fresh URL state (filter-bar syncs the URL before notifying listeners). Computed price columns are not server-filterable (agFilter: "none"), and unresolvable column filters no-op instead of erroring.
2.0.0¶
2026-06-11 — GridViewSpec release.
Changed¶
- Published the package as
grid-view-spec. - Standardized the public Python module as
grid_view_spec. - Consolidated pages, rendering, assets, validation, and export around the typed
GridViewSpeccontract. - Moved Django integration under
grid_view_spec.backends.django. - Updated template tags to
{% load grid_view_spec %}. - Shipped PDF/XLSX export through package-owned export pipelines.
- Django preferences use the
grid_view_spec_gridpreferencetable.