Changelogs

Version 3.0.0
16 April, 2026
Architecture
  • Extracted all logic from monolithic custom-table.vue (~800 → ~200 lines) into single-responsibility composables
  • New composables: usePagination, useSorting, useFiltering, useSelection, useRowClick
  • Introduced filter-strategies.ts — strategy pattern replacing 130+ line if-else chain for column filtering
  • Extracted pure utility helpers into utils.ts (cellValue, dateFormat, stringFormat)
  • Zero prop mutations enforced — column filter state managed via internal columnFilterState reactive Map
  • normalizedColumns computed applies defaults immutably — used everywhere instead of raw props.columns
Events — Breaking Changes
  • Renamed @change@changeServer for clarity (server mode aggregate event)
  • New event @reset — fires when reset() called. Only event emitted during reset; all others suppressed
  • @pageChange now fires only from explicit user pagination clicks — silent on programmatic resets (filter/search/pagesize/reset)
  • Removed internal suppressPageEvent flag — replaced with explicit onUserPageChange() handler pattern
Selection
  • Rewrote selection system — removed fragile suppressEmit flag and watcher-based emit
  • selectedAll is now a computed reactive to both selected and visible rows (was ref + watcher)
  • Row checkbox uses explicit @change handler instead of v-model — single emit per interaction, no double-fire
  • Added toggleRow() method for cleaner row click selection
Column Filtering
  • Boolean column filter defaults to "All" (empty) instead of "equal"
  • Auto-set filter condition when user types with "No filter" selected — defaults to contain (string) or equal (number/date)
  • Filter dropdown width increased (bh-w-[180px]) with whitespace-normal for better readability
  • column-header.vue refactored — flat individual props instead of :all="props" pattern
  • column-filter.vue emits conditionChange instead of mutating props
  • Debounced text/number filter inputs (300ms) in column header
  • getColumnsWithFilterState() now defaults type to 'string' when not explicitly set
New Props
  • skeletonRowCount — number of skeleton loader rows (default: 10)
  • Skeleton loader now renders one <td> per visible column instead of single colspan
New Slots
  • #noData — custom empty state slot alongside noDataContent text prop
  • #firstArrow, #previousArrow, #nextArrow, #lastArrow — custom pagination arrow slots
i18n / Localization
  • Added all, true, false keys to columnFilterLang for boolean filter dropdown translation
Bug Fixes
  • Fixed pagination breaking after page size change when already on page 1 (stale suppressPageEvent flag)
  • Fixed selection checkbox not updating properly in client-side mode (stale suppressEmit flag)
  • Fixed double @rowSelect emit when selectRowOnClick enabled
  • Fixed @pageChange event firing during filter/search/pagesize resets
  • Fixed reset emitting @searchChange, @pageSizeChange etc. — now only emits @reset
  • Fixed selectedAll not reacting to visible row changes (page/filter/sort)
Version 2.0.1
30 January, 2025
  • Fixed a global CSS issue
  • Added getVisibleRows method
  • Fixed column filtering to apply only when enabled
  • Fixed sorting to apply only when enabled