@jielga/tmdatagrid 2.0.0-beta.11 → 2.0.0-beta.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/index.d.ts +285 -22
  2. package/dist/index.js +2857 -2376
  3. package/dist/index.js.map +1 -1
  4. package/dist/styles.css +1 -1
  5. package/package.json +1 -2
  6. package/skills/appearance/SKILL.md +1 -1
  7. package/skills/cell-selection/SKILL.md +1 -1
  8. package/skills/columns/SKILL.md +2 -2
  9. package/skills/data/SKILL.md +5 -2
  10. package/skills/editing/SKILL.md +1 -1
  11. package/skills/filtering/SKILL.md +112 -26
  12. package/skills/getting-started/SKILL.md +4 -4
  13. package/skills/grouping/SKILL.md +1 -1
  14. package/skills/options/SKILL.md +3 -1
  15. package/skills/rows/SKILL.md +1 -1
  16. package/skills/server-side/SKILL.md +44 -15
  17. package/skills/testing/SKILL.md +6 -3
  18. package/src/tmdatagrid/components/TMDataGrid.tsx +3 -0
  19. package/src/tmdatagrid/components/TMDataGridEditColumn.tsx +1 -1
  20. package/src/tmdatagrid/components/TMDataGridFilterPanel.module.css +37 -18
  21. package/src/tmdatagrid/components/TMDataGridFilterPanel.tsx +138 -160
  22. package/src/tmdatagrid/components/TMDataGridFilterSurface.module.css +54 -0
  23. package/src/tmdatagrid/components/TMDataGridFilterSurface.tsx +162 -0
  24. package/src/tmdatagrid/components/TMDataGridFooter.tsx +28 -1
  25. package/src/tmdatagrid/components/TMDataGridHeaderCell.module.css +10 -0
  26. package/src/tmdatagrid/components/TMDataGridHeaderCell.tsx +12 -3
  27. package/src/tmdatagrid/components/TMDataGridHeaderFilterRow.module.css +51 -0
  28. package/src/tmdatagrid/components/TMDataGridHeaderFilterRow.tsx +303 -0
  29. package/src/tmdatagrid/components/TMDataGridTable.module.css +9 -41
  30. package/src/tmdatagrid/components/TMDataGridTable.tsx +84 -15
  31. package/src/tmdatagrid/components/TMDataGridToolbar.tsx +37 -11
  32. package/src/tmdatagrid/components/filters/DgAutocompleteFilter.tsx +5 -4
  33. package/src/tmdatagrid/components/filters/DgDateRangeFilter.tsx +22 -5
  34. package/src/tmdatagrid/components/filters/DgRangeSliderFilter.tsx +5 -1
  35. package/src/tmdatagrid/components/filters/DgTriStateFilter.tsx +5 -1
  36. package/src/tmdatagrid/components/filters/TMDataGridFilterValueInput.tsx +44 -28
  37. package/src/tmdatagrid/components/filters/controlLayout.ts +32 -0
  38. package/src/tmdatagrid/components/filters/filterControlFor.ts +65 -0
  39. package/src/tmdatagrid/components/sticky.module.css +44 -0
  40. package/src/tmdatagrid/core/columnOptions.ts +46 -0
  41. package/src/tmdatagrid/core/controlledStateSync.ts +108 -0
  42. package/src/tmdatagrid/core/editEngine.ts +68 -12
  43. package/src/tmdatagrid/core/filterControls.ts +28 -0
  44. package/src/tmdatagrid/core/filterOperators.ts +64 -1
  45. package/src/tmdatagrid/core/filterSurface.ts +99 -0
  46. package/src/tmdatagrid/core/labels.ts +7 -0
  47. package/src/tmdatagrid/core/labelsSv.ts +3 -0
  48. package/src/tmdatagrid/core/pageReset.ts +115 -0
  49. package/src/tmdatagrid/index.ts +13 -0
  50. package/src/tmdatagrid/useTMDataGrid.tsx +191 -11
package/dist/styles.css CHANGED
@@ -1,2 +1,2 @@
1
- ._root_1kqd2_8[data-size=xs]{--dg-row-height:34px;--dg-header-height:32px;--dg-font-size:var(--mantine-font-size-xs);--dg-padding:6px}._root_1kqd2_8[data-size=sm]{--dg-row-height:42px;--dg-header-height:38px;--dg-font-size:var(--mantine-font-size-sm);--dg-padding:8px}._root_1kqd2_8[data-size=md]{--dg-row-height:52px;--dg-header-height:44px;--dg-font-size:var(--mantine-font-size-sm);--dg-padding:10px}._root_1kqd2_8[data-size=lg]{--dg-row-height:62px;--dg-header-height:52px;--dg-font-size:var(--mantine-font-size-md);--dg-padding:14px}._root_1kqd2_8[data-size=xl]{--dg-row-height:72px;--dg-header-height:60px;--dg-font-size:var(--mantine-font-size-lg);--dg-padding:18px}._root_1kqd2_8{--dg-radius:var(--mantine-radius-md);--dg-row-height:52px;--dg-header-height:44px;--dg-font-size:var(--mantine-font-size-sm);--dg-padding:10px;--dg-row-selected-bg:var(--mantine-primary-color-light);--dg-row-highlight-bg:var(--mantine-primary-color-light-hover);--dg-row-group-bg:var(--mantine-color-body);--dg-row-striped-bg:color-mix(in srgb, var(--mantine-color-text) 3.5%, var(--mantine-color-body));--dg-row-new-bg:color-mix(in srgb, var(--mantine-color-green-6) 8%, var(--mantine-color-body));--dg-z-focused-cell:1;--dg-z-pinned-cell:2;--dg-z-pinned-focused-cell:3;--dg-z-pinned-row:4;--dg-z-pinned-row-pinned-cell:5;--dg-z-summary-row:4;--dg-z-summary-pinned-cell:5;--dg-z-header:6;--dg-z-header-pinned-cell:7;text-align:left;border:1px solid var(--mantine-color-default-border);border-radius:var(--dg-radius);background-color:var(--mantine-color-body);flex-direction:column;min-height:0;display:flex;overflow:hidden}._columnsPanel_1492o_1{flex-direction:column;width:280px;display:flex}._columnsPanelSearch_1492o_7{padding:var(--mantine-spacing-sm)}._columnsPanelList_1492o_11{gap:var(--mantine-spacing-sm);padding:0 var(--mantine-spacing-sm) var(--mantine-spacing-sm);flex-direction:column;display:flex}._columnsPanelFooter_1492o_18{justify-content:space-between;align-items:center;gap:var(--mantine-spacing-sm);padding:var(--mantine-spacing-sm);border-top:1px solid var(--mantine-color-default-border);display:flex}._detailsToggle_n39tz_3{width:100%;height:100%;color:inherit;justify-content:center;align-items:center;display:flex}._detailsToggle_n39tz_3:hover ._chevron_n39tz_12{color:var(--mantine-color-text)}._chevron_n39tz_12{color:var(--mantine-color-dimmed);align-items:center;transition:transform .12s;display:flex}._chevron_n39tz_12[data-expanded=true]{transform:rotate(90deg)}@media (prefers-reduced-motion:reduce){._chevron_n39tz_12{transition:none}}._tableWrapper_yga2l_2{flex-direction:column;flex:1;min-height:0;display:flex;position:relative}._scrollContainer_yga2l_10{flex:1;min-height:0;position:relative;overflow:auto;container-type:inline-size}._grid_yga2l_21{align-content:start;min-height:100%;display:grid}._tabGuard_yga2l_36{outline:none;width:0;height:0;position:absolute;overflow:hidden}._headerRow_yga2l_46{grid-column:1/-1;grid-template-columns:subgrid;z-index:var(--dg-z-header,6);display:grid;position:sticky;top:0}._headerRow_yga2l_46[data-dg-header-last]:after{content:"";pointer-events:none;background:linear-gradient(to bottom, var(--dg-header-shadow-color,#00000024), transparent);opacity:0;height:6px;position:absolute;inset:100% 0 auto}@supports (animation-timeline:scroll()){._headerRow_yga2l_46[data-dg-header-last]:after{animation:linear both _dg-header-shadow_yga2l_1;animation-timeline:scroll();animation-range:0 24px}}@keyframes _dg-header-shadow_yga2l_1{0%{opacity:0}to{opacity:1}}._bodyRow_yga2l_95{--row-bg:var(--mantine-color-body);grid-column:1/-1;grid-template-columns:subgrid;align-items:stretch;display:grid}._bodyRow_yga2l_95[data-striped=true]{--row-bg:var(--dg-row-striped-bg)}._bodyRow_yga2l_95[data-new=true]{--row-bg:var(--dg-row-new-bg,var(--mantine-color-body))}._bodyRow_yga2l_95:hover{--row-bg:var(--mantine-color-default-hover)}._bodyRow_yga2l_95[data-grouped=true]{--row-bg:var(--dg-row-group-bg)}._bodyRow_yga2l_95[data-context-menu=true]{--row-bg:var(--mantine-color-default-hover)}._bodyRow_yga2l_95[data-selected-bg=true]{--row-bg:var(--dg-row-selected-bg)}._bodyRow_yga2l_95[data-highlighted=true]{--row-bg:var(--dg-row-highlight-bg)}._bodyRow_yga2l_95[data-selects-on-click=true]{-webkit-user-select:none;user-select:none}._bodyRow_yga2l_95:focus-visible{outline:2px solid var(--mantine-primary-color-filled);outline-offset:-2px}._bodyCell_yga2l_169{padding:0 var(--dg-padding);border-bottom:1px solid var(--mantine-color-default-border);background-color:var(--mantine-color-body);background-image:linear-gradient(var(--row-bg), var(--row-bg));font-size:var(--dg-font-size);align-items:center;display:flex}._bodyCell_yga2l_169[data-control-column=true]{padding:0}._grid_yga2l_21[data-range-dragging]{-webkit-user-select:none;user-select:none}._bodyCell_yga2l_169[data-selected=true]{--dg-range-tint:color-mix(in srgb, var(--mantine-primary-color-filled) 14%, var(--row-bg));background-image:linear-gradient(var(--dg-range-tint), var(--dg-range-tint));--dg-edge-top:transparent;--dg-edge-bottom:transparent;--dg-edge-left:transparent;--dg-edge-right:transparent;box-shadow:inset 0 1px 0 0 var(--dg-edge-top), inset 0 -1px 0 0 var(--dg-edge-bottom), inset 1px 0 0 0 var(--dg-edge-left), inset -1px 0 0 0 var(--dg-edge-right)}._bodyCell_yga2l_169[data-edge-top=true]{--dg-edge-top:var(--mantine-primary-color-filled)}._bodyCell_yga2l_169[data-edge-bottom=true]{--dg-edge-bottom:var(--mantine-primary-color-filled)}._bodyCell_yga2l_169[data-edge-left=true]{--dg-edge-left:var(--mantine-primary-color-filled)}._bodyCell_yga2l_169[data-edge-right=true]{--dg-edge-right:var(--mantine-primary-color-filled)}._bodyCell_yga2l_169[data-focused=true]{outline:2px solid var(--mantine-primary-color-filled);outline-offset:-2px}._cellContent_yga2l_167{white-space:nowrap;text-overflow:ellipsis;min-width:0;overflow:hidden}._bodyCell_yga2l_169[data-editing]{padding:0 calc(var(--dg-padding) / 2)}._cellEditor_yga2l_276{align-items:center;gap:2px;width:100%;min-width:0;display:flex}._cellEditorField_yga2l_286{flex:auto;align-items:center;min-width:0;display:flex}._cellEditorActions_yga2l_294{flex:none;align-items:center;display:flex}._bodyCell_yga2l_169[data-dirty],._bodyCell_yga2l_169[data-invalid]{position:relative}._bodyCell_yga2l_169[data-dirty]:after,._bodyCell_yga2l_169[data-invalid]:after{content:"";border:5px solid #0000;border-top-color:var(--mantine-primary-color-filled);border-right-color:var(--mantine-primary-color-filled);position:absolute;top:0;right:0}._bodyCell_yga2l_169[data-invalid]:after{border-top-color:var(--mantine-color-error);border-right-color:var(--mantine-color-error)}._bodyCell_yga2l_169[data-align=right]{justify-content:flex-end}._bodyCell_yga2l_169[data-align=center]{justify-content:center}._bodyCell_yga2l_169[data-align=left] ._cellContent_yga2l_167{flex:auto}._detailsCell_yga2l_345{border-bottom:1px solid var(--mantine-color-default-border);background-color:var(--mantine-color-body);background-image:linear-gradient(var(--row-bg), var(--row-bg));padding:var(--dg-padding);-webkit-user-select:text;user-select:text;cursor:auto;grid-column:1/-1}._messageRow_yga2l_15{justify-content:center;justify-self:start;align-items:center;gap:var(--mantine-spacing-xs);width:100cqi;padding:var(--mantine-spacing-xl);flex-direction:column;grid-column:1/-1;display:flex;position:sticky;left:0}._bodyRow_yga2l_95[data-deleted=true]{opacity:.55;text-decoration:line-through}._bodyRow_yga2l_95[data-deleted=true] ._bodyCell_yga2l_169:not([data-control-column=true]){pointer-events:none}._entryBlock_yga2l_397{grid-column:1/-1;grid-template-columns:subgrid;top:var(--dg-header-height,0px);z-index:var(--dg-z-pinned-row,4);display:grid;position:sticky}._entryRow_yga2l_406{grid-column:1/-1;grid-template-columns:subgrid;display:grid}._pinnedTopBlock_yga2l_419{grid-column:1/-1;grid-template-columns:subgrid;top:calc(var(--dg-header-height,0px) + var(--dg-entry-height,0px));z-index:var(--dg-z-pinned-row,4);display:grid;position:sticky}._pinnedTopBlock_yga2l_419>:last-child>[role=cell]{border-bottom:2px solid var(--mantine-color-default-border)}._pinnedBottomBlock_yga2l_432{grid-column:1/-1;grid-template-columns:subgrid;bottom:var(--dg-summary-height,0px);z-index:var(--dg-z-pinned-row,4);display:grid;position:sticky}._pinnedBottomBlock_yga2l_432>:first-child>[role=cell]{border-top:2px solid var(--mantine-color-default-border)}._entryCell_yga2l_445{padding:0 calc(var(--dg-padding) / 2);border-bottom:2px solid var(--mantine-primary-color-filled);background-color:var(--mantine-color-body);font-size:var(--dg-font-size);align-items:center;display:flex}._entryCell_yga2l_445[data-control-column=true]{justify-content:center;padding:0}._entryRow_yga2l_406[data-committed=true] ._entryCell_yga2l_445{padding:0 var(--dg-padding);border-bottom:1px solid var(--mantine-color-default-border);background-image:linear-gradient(var(--dg-row-new-bg,transparent), var(--dg-row-new-bg,transparent))}._entryRow_yga2l_406[data-committed=true] ._entryCell_yga2l_445[data-control-column=true]{padding:0}._rowStateIndicator_yga2l_481{width:22px;height:22px;color:var(--mantine-color-dimmed);flex:none;justify-content:center;align-items:center;display:inline-flex}._rowStateIndicator_yga2l_481[data-error]{color:var(--mantine-color-error)}._entryCell_yga2l_445[data-align=right]{justify-content:flex-end}._entryCell_yga2l_445[data-align=center]{justify-content:center}._matchHighlight_yga2l_507{background-color:var(--dg-match-highlight-bg,var(--lightningcss-light,var(--mantine-color-yellow-2))var(--lightningcss-dark,#fab00559));color:inherit;border-radius:2px}._summaryRow_yga2l_528{grid-column:1/-1;grid-template-columns:subgrid;top:calc(100% - var(--dg-summary-height,0px));z-index:var(--dg-z-summary-row,4);display:grid;position:sticky;bottom:0}._summaryCell_yga2l_538{padding:0 var(--dg-padding);border-top:1px solid var(--mantine-color-default-border);background-color:var(--mantine-color-body);font-size:var(--dg-font-size);align-items:center;font-weight:600;display:flex}._summaryCell_yga2l_538[data-control-column=true]{padding:0}._summaryCell_yga2l_538[data-align=right]{justify-content:flex-end}._summaryCell_yga2l_538[data-align=center]{justify-content:center}._groupToggle_1954o_4{width:100%;min-width:0;font-size:var(--dg-font-size);color:inherit;align-items:center;gap:6px;display:flex}._chevron_1954o_14{color:var(--mantine-color-dimmed);flex:none;align-items:center;transition:transform .12s;display:flex}._chevron_1954o_14[data-expanded=true]{transform:rotate(90deg)}@media (prefers-reduced-motion:reduce){._chevron_1954o_14{transition:none}}._groupLabel_1954o_34{white-space:nowrap;text-overflow:ellipsis;min-width:0;font-weight:600;overflow:hidden}._groupCount_1954o_44{color:var(--mantine-color-dimmed);font-variant-numeric:tabular-nums;flex:none}._filterPanel_izakx_4{top:calc(var(--dg-header-height) + 2px);left:var(--mantine-spacing-md);z-index:5;padding:var(--mantine-spacing-sm);border-radius:var(--mantine-radius-md);border:1px solid var(--mantine-color-default-border);background-color:var(--mantine-color-body);box-shadow:var(--mantine-shadow-md);position:absolute}._filterRow_izakx_16{align-items:flex-end;gap:var(--mantine-spacing-xs);display:flex}._filterPanelHeader_izakx_22{justify-content:space-between;align-items:center;gap:var(--mantine-spacing-md);padding-bottom:var(--mantine-spacing-xs);display:flex}._filterPanelFooter_izakx_30{justify-content:space-between;align-items:center;gap:var(--mantine-spacing-md);display:flex}._filterPills_14wl0_3{align-items:center;gap:var(--mantine-spacing-xs);flex-wrap:wrap;display:flex}._filterPills_14wl0_3 ._pill_14wl0_15{background-color:var(--lightningcss-light,var(--mantine-color-gray-1))var(--lightningcss-dark,var(--mantine-color-dark-5));color:var(--lightningcss-light,var(--mantine-color-black))var(--lightningcss-dark,var(--mantine-color-dark-0));border:1px solid var(--lightningcss-light,var(--mantine-color-gray-3))var(--lightningcss-dark,var(--mantine-color-dark-3))}._pillLabel_14wl0_27{font:inherit;color:inherit;cursor:pointer}._pillLabel_14wl0_27:hover{text-decoration:underline}._footer_te0a3_1{justify-content:flex-end;align-items:center;gap:var(--mantine-spacing-lg);padding:4px var(--mantine-spacing-sm);border-top:1px solid var(--mantine-color-default-border);flex-shrink:0;min-height:48px;display:flex}._footer_te0a3_1[data-paging-suspended=true]{opacity:.55}._stickyLeft_1vw51_16:after,._stickyRight_1vw51_17:after{content:"";pointer-events:none;width:8px;position:absolute;top:0;bottom:0}._stickyLeft_1vw51_16:after{background:linear-gradient(90deg,var(--lightningcss-light,#00000012)var(--lightningcss-dark,#00000042),var(--lightningcss-light,#00000006)var(--lightningcss-dark,#00000017) 45%,#0000);left:100%}._stickyRight_1vw51_17:after{background:linear-gradient(270deg,var(--lightningcss-light,#00000012)var(--lightningcss-dark,#00000042),var(--lightningcss-light,#00000006)var(--lightningcss-dark,#00000017) 45%,#0000);right:100%}@supports (animation-timeline:scroll()){._stickyLeft_1vw51_16:after,._stickyRight_1vw51_17:after{--dg-sticky-edge-range:20px;opacity:0;animation-timing-function:linear;animation-fill-mode:both;animation-timeline:scroll(inline)}._stickyLeft_1vw51_16:after{animation-name:_stickyEdgeIn_1vw51_1;animation-range:0 var(--dg-sticky-edge-range)}._stickyRight_1vw51_17:after{animation-name:_stickyEdgeOut_1vw51_1;animation-range:calc(100% - var(--dg-sticky-edge-range)) 100%}}@keyframes _stickyEdgeIn_1vw51_1{0%{opacity:0}to{opacity:1}}@keyframes _stickyEdgeOut_1vw51_1{0%{opacity:1}to{opacity:0}}._headerCell_188ed_1{padding:0 var(--dg-padding);min-width:0;min-height:var(--dg-header-height);font-weight:600;font-size:var(--dg-font-size);background-color:var(--mantine-color-body);border-bottom:1px solid var(--mantine-color-default-border);-webkit-user-select:none;user-select:none;align-items:center;gap:2px;display:flex;position:relative}._headerCell_188ed_1[data-align=right]{justify-content:flex-end}._headerCell_188ed_1[data-align=center]{justify-content:center}._headerCell_188ed_1[data-control-column=true]{padding:0}._headerCellFiltered_188ed_35 ._headerTitle_188ed_35{color:var(--mantine-primary-color-filled)}._headerTitle_188ed_35{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}._headerCell_188ed_1[data-align=right] ._headerTitle_188ed_35{text-align:right}._headerCell_188ed_1[data-align=center] ._headerTitle_188ed_35{justify-content:center;display:flex}._headerActions_188ed_58{flex-shrink:0;align-items:center;gap:0;margin-left:auto;display:flex}._headerCell_188ed_1[data-align=right] ._headerActions_188ed_58{order:-1;margin-left:0;margin-right:auto}._headerAction_188ed_58{display:none}._headerCell_188ed_1:hover ._headerAction_188ed_58,._headerCell_188ed_1:focus-within ._headerAction_188ed_58,._headerAction_188ed_58[data-pinned-visible=true]{display:flex}._headerCellSortable_188ed_87{cursor:pointer}._sortAction_188ed_93[data-sorted=false]{opacity:.55}._sortAction_188ed_93[data-sorted=false]:hover{opacity:1}._sortIndex_188ed_103{color:var(--mantine-color-dimmed);text-align:center;min-width:10px;font-size:10px;font-weight:600;line-height:1}._headerCellDragging_188ed_115{opacity:.4}._headerCellDropBefore_188ed_119:before,._headerCellDropAfter_188ed_120:before{content:"";background-color:var(--mantine-primary-color-filled);z-index:5;pointer-events:none;width:2px;position:absolute;top:0;bottom:0}._headerCellDropBefore_188ed_119:before{left:0}._headerCellDropAfter_188ed_120:before{right:0}._columnSeparator_188ed_140{z-index:1;justify-content:center;width:10px;height:50%;display:flex;position:absolute;top:25%;right:0;transform:translate(50%)}._columnSeparatorResizable_188ed_152{cursor:col-resize;touch-action:none}._columnSeparator_188ed_140:after{content:"";background-color:#0000;width:1px;height:100%;transition:background-color .12s,width .12s}._headerCell_188ed_1:hover ._columnSeparator_188ed_140:after,._headerCell_188ed_1:focus-within ._columnSeparator_188ed_140:after{background-color:var(--mantine-color-default-border)}._columnSeparatorResizable_188ed_152:hover:after,._columnSeparatorActive_188ed_175:after{background-color:var(--mantine-primary-color-filled);width:2px}._menuItemActive_188ed_181{background-color:var(--mantine-color-default-hover);font-weight:600}._toolbar_1459c_1{align-items:center;gap:var(--mantine-spacing-xs);padding:6px var(--mantine-spacing-xs);flex-shrink:0;min-height:42px;display:flex}._toolbarSpacer_1459c_10{flex:1}._summaryCount_1459c_14{white-space:nowrap}
1
+ ._root_1kqd2_8[data-size=xs]{--dg-row-height:34px;--dg-header-height:32px;--dg-font-size:var(--mantine-font-size-xs);--dg-padding:6px}._root_1kqd2_8[data-size=sm]{--dg-row-height:42px;--dg-header-height:38px;--dg-font-size:var(--mantine-font-size-sm);--dg-padding:8px}._root_1kqd2_8[data-size=md]{--dg-row-height:52px;--dg-header-height:44px;--dg-font-size:var(--mantine-font-size-sm);--dg-padding:10px}._root_1kqd2_8[data-size=lg]{--dg-row-height:62px;--dg-header-height:52px;--dg-font-size:var(--mantine-font-size-md);--dg-padding:14px}._root_1kqd2_8[data-size=xl]{--dg-row-height:72px;--dg-header-height:60px;--dg-font-size:var(--mantine-font-size-lg);--dg-padding:18px}._root_1kqd2_8{--dg-radius:var(--mantine-radius-md);--dg-row-height:52px;--dg-header-height:44px;--dg-font-size:var(--mantine-font-size-sm);--dg-padding:10px;--dg-row-selected-bg:var(--mantine-primary-color-light);--dg-row-highlight-bg:var(--mantine-primary-color-light-hover);--dg-row-group-bg:var(--mantine-color-body);--dg-row-striped-bg:color-mix(in srgb, var(--mantine-color-text) 3.5%, var(--mantine-color-body));--dg-row-new-bg:color-mix(in srgb, var(--mantine-color-green-6) 8%, var(--mantine-color-body));--dg-z-focused-cell:1;--dg-z-pinned-cell:2;--dg-z-pinned-focused-cell:3;--dg-z-pinned-row:4;--dg-z-pinned-row-pinned-cell:5;--dg-z-summary-row:4;--dg-z-summary-pinned-cell:5;--dg-z-header:6;--dg-z-header-pinned-cell:7;text-align:left;border:1px solid var(--mantine-color-default-border);border-radius:var(--dg-radius);background-color:var(--mantine-color-body);flex-direction:column;min-height:0;display:flex;overflow:hidden}._columnsPanel_1492o_1{flex-direction:column;width:280px;display:flex}._columnsPanelSearch_1492o_7{padding:var(--mantine-spacing-sm)}._columnsPanelList_1492o_11{gap:var(--mantine-spacing-sm);padding:0 var(--mantine-spacing-sm) var(--mantine-spacing-sm);flex-direction:column;display:flex}._columnsPanelFooter_1492o_18{justify-content:space-between;align-items:center;gap:var(--mantine-spacing-sm);padding:var(--mantine-spacing-sm);border-top:1px solid var(--mantine-color-default-border);display:flex}._detailsToggle_n39tz_3{width:100%;height:100%;color:inherit;justify-content:center;align-items:center;display:flex}._detailsToggle_n39tz_3:hover ._chevron_n39tz_12{color:var(--mantine-color-text)}._chevron_n39tz_12{color:var(--mantine-color-dimmed);align-items:center;transition:transform .12s;display:flex}._chevron_n39tz_12[data-expanded=true]{transform:rotate(90deg)}@media (prefers-reduced-motion:reduce){._chevron_n39tz_12{transition:none}}._tableWrapper_8hvcb_2{flex-direction:column;flex:1;min-height:0;display:flex;position:relative}._tableWrapper_8hvcb_2[data-dg-filter-sidebar]{flex-direction:row}._scrollContainer_8hvcb_17{flex:1;min-width:0;min-height:0;position:relative;overflow:auto;container-type:inline-size}._grid_8hvcb_29{align-content:start;min-height:100%;display:grid}._tabGuard_8hvcb_44{outline:none;width:0;height:0;position:absolute;overflow:hidden}._headerRow_8hvcb_54{grid-column:1/-1;grid-template-columns:subgrid;z-index:var(--dg-z-header,6);display:grid;position:sticky;top:0}._bodyRow_8hvcb_63{--row-bg:var(--mantine-color-body);grid-column:1/-1;grid-template-columns:subgrid;align-items:stretch;display:grid}._bodyRow_8hvcb_63[data-striped=true]{--row-bg:var(--dg-row-striped-bg)}._bodyRow_8hvcb_63[data-new=true]{--row-bg:var(--dg-row-new-bg,var(--mantine-color-body))}._bodyRow_8hvcb_63:hover{--row-bg:var(--mantine-color-default-hover)}._bodyRow_8hvcb_63[data-grouped=true]{--row-bg:var(--dg-row-group-bg)}._bodyRow_8hvcb_63[data-context-menu=true]{--row-bg:var(--mantine-color-default-hover)}._bodyRow_8hvcb_63[data-selected-bg=true]{--row-bg:var(--dg-row-selected-bg)}._bodyRow_8hvcb_63[data-highlighted=true]{--row-bg:var(--dg-row-highlight-bg)}._bodyRow_8hvcb_63[data-selects-on-click=true]{-webkit-user-select:none;user-select:none}._bodyRow_8hvcb_63:focus-visible{outline:2px solid var(--mantine-primary-color-filled);outline-offset:-2px}._bodyCell_8hvcb_137{padding:0 var(--dg-padding);border-bottom:1px solid var(--mantine-color-default-border);background-color:var(--mantine-color-body);background-image:linear-gradient(var(--row-bg), var(--row-bg));font-size:var(--dg-font-size);align-items:center;display:flex}._bodyCell_8hvcb_137[data-control-column=true]{padding:0}._grid_8hvcb_29[data-range-dragging]{-webkit-user-select:none;user-select:none}._bodyCell_8hvcb_137[data-selected=true]{--dg-range-tint:color-mix(in srgb, var(--mantine-primary-color-filled) 14%, var(--row-bg));background-image:linear-gradient(var(--dg-range-tint), var(--dg-range-tint));--dg-edge-top:transparent;--dg-edge-bottom:transparent;--dg-edge-left:transparent;--dg-edge-right:transparent;box-shadow:inset 0 1px 0 0 var(--dg-edge-top), inset 0 -1px 0 0 var(--dg-edge-bottom), inset 1px 0 0 0 var(--dg-edge-left), inset -1px 0 0 0 var(--dg-edge-right)}._bodyCell_8hvcb_137[data-edge-top=true]{--dg-edge-top:var(--mantine-primary-color-filled)}._bodyCell_8hvcb_137[data-edge-bottom=true]{--dg-edge-bottom:var(--mantine-primary-color-filled)}._bodyCell_8hvcb_137[data-edge-left=true]{--dg-edge-left:var(--mantine-primary-color-filled)}._bodyCell_8hvcb_137[data-edge-right=true]{--dg-edge-right:var(--mantine-primary-color-filled)}._bodyCell_8hvcb_137[data-focused=true]{outline:2px solid var(--mantine-primary-color-filled);outline-offset:-2px}._cellContent_8hvcb_135{white-space:nowrap;text-overflow:ellipsis;min-width:0;overflow:hidden}._bodyCell_8hvcb_137[data-editing]{padding:0 calc(var(--dg-padding) / 2)}._cellEditor_8hvcb_244{align-items:center;gap:2px;width:100%;min-width:0;display:flex}._cellEditorField_8hvcb_254{flex:auto;align-items:center;min-width:0;display:flex}._cellEditorActions_8hvcb_262{flex:none;align-items:center;display:flex}._bodyCell_8hvcb_137[data-dirty],._bodyCell_8hvcb_137[data-invalid]{position:relative}._bodyCell_8hvcb_137[data-dirty]:after,._bodyCell_8hvcb_137[data-invalid]:after{content:"";border:5px solid #0000;border-top-color:var(--mantine-primary-color-filled);border-right-color:var(--mantine-primary-color-filled);position:absolute;top:0;right:0}._bodyCell_8hvcb_137[data-invalid]:after{border-top-color:var(--mantine-color-error);border-right-color:var(--mantine-color-error)}._bodyCell_8hvcb_137[data-align=right]{justify-content:flex-end}._bodyCell_8hvcb_137[data-align=center]{justify-content:center}._bodyCell_8hvcb_137[data-align=left] ._cellContent_8hvcb_135{flex:auto}._detailsCell_8hvcb_313{border-bottom:1px solid var(--mantine-color-default-border);background-color:var(--mantine-color-body);background-image:linear-gradient(var(--row-bg), var(--row-bg));padding:var(--dg-padding);-webkit-user-select:text;user-select:text;cursor:auto;grid-column:1/-1}._messageRow_8hvcb_23{justify-content:center;justify-self:start;align-items:center;gap:var(--mantine-spacing-xs);width:100cqi;padding:var(--mantine-spacing-xl);flex-direction:column;grid-column:1/-1;display:flex;position:sticky;left:0}._bodyRow_8hvcb_63[data-deleted=true]{opacity:.55;text-decoration:line-through}._bodyRow_8hvcb_63[data-deleted=true] ._bodyCell_8hvcb_137:not([data-control-column=true]){pointer-events:none}._entryBlock_8hvcb_365{grid-column:1/-1;grid-template-columns:subgrid;top:var(--dg-header-height,0px);z-index:var(--dg-z-pinned-row,4);display:grid;position:sticky}._entryRow_8hvcb_374{grid-column:1/-1;grid-template-columns:subgrid;display:grid}._pinnedTopBlock_8hvcb_387{grid-column:1/-1;grid-template-columns:subgrid;top:calc(var(--dg-header-height,0px) + var(--dg-entry-height,0px));z-index:var(--dg-z-pinned-row,4);display:grid;position:sticky}._pinnedTopBlock_8hvcb_387>:last-child>[role=cell]{border-bottom:2px solid var(--mantine-color-default-border)}._pinnedBottomBlock_8hvcb_400{grid-column:1/-1;grid-template-columns:subgrid;bottom:var(--dg-summary-height,0px);z-index:var(--dg-z-pinned-row,4);display:grid;position:sticky}._pinnedBottomBlock_8hvcb_400>:first-child>[role=cell]{border-top:2px solid var(--mantine-color-default-border)}._entryCell_8hvcb_413{padding:0 calc(var(--dg-padding) / 2);border-bottom:2px solid var(--mantine-primary-color-filled);background-color:var(--mantine-color-body);font-size:var(--dg-font-size);align-items:center;display:flex}._entryCell_8hvcb_413[data-control-column=true]{justify-content:center;padding:0}._entryRow_8hvcb_374[data-committed=true] ._entryCell_8hvcb_413{padding:0 var(--dg-padding);border-bottom:1px solid var(--mantine-color-default-border);background-image:linear-gradient(var(--dg-row-new-bg,transparent), var(--dg-row-new-bg,transparent))}._entryRow_8hvcb_374[data-committed=true] ._entryCell_8hvcb_413[data-control-column=true]{padding:0}._rowStateIndicator_8hvcb_449{width:22px;height:22px;color:var(--mantine-color-dimmed);flex:none;justify-content:center;align-items:center;display:inline-flex}._rowStateIndicator_8hvcb_449[data-error]{color:var(--mantine-color-error)}._entryCell_8hvcb_413[data-align=right]{justify-content:flex-end}._entryCell_8hvcb_413[data-align=center]{justify-content:center}._matchHighlight_8hvcb_475{background-color:var(--dg-match-highlight-bg,var(--lightningcss-light,var(--mantine-color-yellow-2))var(--lightningcss-dark,#fab00559));color:inherit;border-radius:2px}._summaryRow_8hvcb_496{grid-column:1/-1;grid-template-columns:subgrid;top:calc(100% - var(--dg-summary-height,0px));z-index:var(--dg-z-summary-row,4);display:grid;position:sticky;bottom:0}._summaryCell_8hvcb_506{padding:0 var(--dg-padding);border-top:1px solid var(--mantine-color-default-border);background-color:var(--mantine-color-body);font-size:var(--dg-font-size);align-items:center;font-weight:600;display:flex}._summaryCell_8hvcb_506[data-control-column=true]{padding:0}._summaryCell_8hvcb_506[data-align=right]{justify-content:flex-end}._summaryCell_8hvcb_506[data-align=center]{justify-content:center}._groupToggle_1954o_4{width:100%;min-width:0;font-size:var(--dg-font-size);color:inherit;align-items:center;gap:6px;display:flex}._chevron_1954o_14{color:var(--mantine-color-dimmed);flex:none;align-items:center;transition:transform .12s;display:flex}._chevron_1954o_14[data-expanded=true]{transform:rotate(90deg)}@media (prefers-reduced-motion:reduce){._chevron_1954o_14{transition:none}}._groupLabel_1954o_34{white-space:nowrap;text-overflow:ellipsis;min-width:0;font-weight:600;overflow:hidden}._groupCount_1954o_44{color:var(--mantine-color-dimmed);font-variant-numeric:tabular-nums;flex:none}._filterPanel_wm77f_4{gap:var(--mantine-spacing-xs);flex-direction:column;display:flex}._filterRow_wm77f_12{align-items:flex-end;gap:var(--mantine-spacing-xs);display:flex}._filterRow_wm77f_12[data-layout=stacked]{align-items:end;gap:6px var(--mantine-spacing-xs);padding:var(--mantine-spacing-xs);border:1px solid var(--mantine-color-default-border);border-radius:var(--mantine-radius-sm);grid-template-columns:1fr auto;display:grid}._filterRow_wm77f_12[data-layout=stacked] ._filterRemove_wm77f_32{grid-area:1/2}._filterRow_wm77f_12[data-layout=stacked] ._filterColumnSlot_wm77f_37{grid-area:1/1;min-width:0}._filterRow_wm77f_12[data-layout=stacked] ._filterOperatorSlot_wm77f_43,._filterRow_wm77f_12[data-layout=stacked] ._filterValueSlot_wm77f_44{grid-column:1/-1;min-width:0}._filterPanelFooter_wm77f_49{justify-content:space-between;align-items:center;gap:var(--mantine-spacing-md);display:flex}._filterPills_14wl0_3{align-items:center;gap:var(--mantine-spacing-xs);flex-wrap:wrap;display:flex}._filterPills_14wl0_3 ._pill_14wl0_15{background-color:var(--lightningcss-light,var(--mantine-color-gray-1))var(--lightningcss-dark,var(--mantine-color-dark-5));color:var(--lightningcss-light,var(--mantine-color-black))var(--lightningcss-dark,var(--mantine-color-dark-0));border:1px solid var(--lightningcss-light,var(--mantine-color-gray-3))var(--lightningcss-dark,var(--mantine-color-dark-3))}._pillLabel_14wl0_27{font:inherit;color:inherit;cursor:pointer}._pillLabel_14wl0_27:hover{text-decoration:underline}._footer_te0a3_1{justify-content:flex-end;align-items:center;gap:var(--mantine-spacing-lg);padding:4px var(--mantine-spacing-sm);border-top:1px solid var(--mantine-color-default-border);flex-shrink:0;min-height:48px;display:flex}._footer_te0a3_1[data-paging-suspended=true]{opacity:.55}._stickyLeft_1jwnm_16:after,._stickyRight_1jwnm_17:after{content:"";pointer-events:none;width:8px;position:absolute;top:0;bottom:0}._stickyLeft_1jwnm_16:after{background:linear-gradient(90deg,var(--lightningcss-light,#00000012)var(--lightningcss-dark,#00000042),var(--lightningcss-light,#00000006)var(--lightningcss-dark,#00000017) 45%,#0000);left:100%}._stickyRight_1jwnm_17:after{background:linear-gradient(270deg,var(--lightningcss-light,#00000012)var(--lightningcss-dark,#00000042),var(--lightningcss-light,#00000006)var(--lightningcss-dark,#00000017) 45%,#0000);right:100%}@supports (animation-timeline:scroll()){._stickyLeft_1jwnm_16:after,._stickyRight_1jwnm_17:after{--dg-sticky-edge-range:20px;opacity:0;animation-timing-function:linear;animation-fill-mode:both;animation-timeline:scroll(inline)}._stickyLeft_1jwnm_16:after{animation-name:_stickyEdgeIn_1jwnm_1;animation-range:0 var(--dg-sticky-edge-range)}._stickyRight_1jwnm_17:after{animation-name:_stickyEdgeOut_1jwnm_1;animation-range:calc(100% - var(--dg-sticky-edge-range)) 100%}}@keyframes _stickyEdgeIn_1jwnm_1{0%{opacity:0}to{opacity:1}}@keyframes _stickyEdgeOut_1jwnm_1{0%{opacity:1}to{opacity:0}}._headerBoundary_1jwnm_120:after{content:"";pointer-events:none;background:linear-gradient(to bottom, var(--dg-header-shadow-color,#00000024), transparent);opacity:0;height:6px;position:absolute;inset:100% 0 auto}@supports (animation-timeline:scroll()){._headerBoundary_1jwnm_120:after{animation:linear both _dgHeaderShadow_1jwnm_1;animation-timeline:scroll();animation-range:0 24px}}@keyframes _dgHeaderShadow_1jwnm_1{0%{opacity:0}to{opacity:1}}._surfaceHeader_10bcx_5{justify-content:space-between;align-items:center;gap:var(--mantine-spacing-md);padding-bottom:var(--mantine-spacing-xs);display:flex}._filterPopup_10bcx_18{top:calc(var(--dg-header-stack-height,var(--dg-header-height)) + 2px);left:var(--mantine-spacing-md);z-index:var(--dg-z-filter-popup,20);padding:var(--mantine-spacing-sm);border-radius:var(--mantine-radius-md);border:1px solid var(--mantine-color-default-border);background-color:var(--mantine-color-body);box-shadow:var(--mantine-shadow-md);position:absolute}._filterSidebar_10bcx_33{min-width:0;padding:var(--mantine-spacing-sm);background-color:var(--mantine-color-body);border-left:1px solid var(--mantine-color-default-border);flex-direction:column;flex:none;display:flex}._filterSidebar_10bcx_33[data-side=left]{border-left:none;border-right:1px solid var(--mantine-color-default-border);order:-1}._filterSidebarBody_10bcx_51{flex:1;min-height:0}._headerFilterRow_h1geg_9{grid-column:1/-1;grid-template-columns:subgrid;top:var(--dg-header-height);z-index:var(--dg-z-header,6);display:grid;position:sticky}._headerFilterCell_h1geg_18{min-width:0;padding:calc(var(--dg-padding) / 2);background-color:var(--mantine-color-body);border-bottom:1px solid var(--mantine-color-default-border);align-items:center;gap:2px;display:flex;overflow:hidden}._headerFilterCell_h1geg_18[data-control-column=true]{padding:0}._headerFilterValue_h1geg_39{flex:1;min-width:0}._headerFilterOperator_h1geg_44{flex:none}._operatorItemActive_h1geg_48{color:var(--mantine-primary-color-filled);font-weight:600}._headerCell_apk7q_1{padding:0 var(--dg-padding);min-width:0;min-height:var(--dg-header-height);font-weight:600;font-size:var(--dg-font-size);background-color:var(--mantine-color-body);border-bottom:1px solid var(--mantine-color-default-border);-webkit-user-select:none;user-select:none;align-items:center;gap:2px;display:flex;position:relative}._headerCell_apk7q_1[data-align=right]{justify-content:flex-end}._headerCell_apk7q_1[data-align=center]{justify-content:center}._headerCell_apk7q_1[data-control-column=true]{padding:0}._headerCellFiltered_apk7q_35 ._headerTitle_apk7q_35{color:var(--mantine-primary-color-filled)}._headerTitle_apk7q_35{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}._headerCell_apk7q_1[data-align=right] ._headerTitle_apk7q_35{text-align:right}._headerCell_apk7q_1[data-align=center] ._headerTitle_apk7q_35{justify-content:center;display:flex}._headerActions_apk7q_58{flex-shrink:0;align-items:center;gap:0;margin-left:auto;display:flex}._headerCell_apk7q_1[data-align=right] ._headerActions_apk7q_58{order:-1;margin-left:0;margin-right:auto}._headerAction_apk7q_58{display:none}._headerCell_apk7q_1:hover ._headerAction_apk7q_58,._headerCell_apk7q_1:focus-within ._headerAction_apk7q_58,._headerAction_apk7q_58[data-pinned-visible=true]{display:flex}._headerCellSortable_apk7q_87{cursor:pointer}._sortAction_apk7q_93[data-sorted=false]{opacity:.55}._sortAction_apk7q_93[data-sorted=false]:hover{opacity:1}._sortIndex_apk7q_103{color:var(--mantine-color-dimmed);text-align:center;min-width:10px;font-size:10px;font-weight:600;line-height:1}._headerCellDragging_apk7q_115{opacity:.4}._headerCellDropBefore_apk7q_119:before,._headerCellDropAfter_apk7q_120:before{content:"";background-color:var(--mantine-primary-color-filled);z-index:5;pointer-events:none;width:2px;position:absolute;top:0;bottom:0}._headerCellDropBefore_apk7q_119:before{left:0}._headerCellDropAfter_apk7q_120:before{right:0}._columnSeparator_apk7q_140{z-index:1;justify-content:center;width:10px;height:50%;display:flex;position:absolute;top:25%;right:0;transform:translate(50%)}._headerCell_apk7q_1:last-child ._columnSeparator_apk7q_140{justify-content:flex-end;transform:none}._columnSeparatorResizable_apk7q_162{cursor:col-resize;touch-action:none}._columnSeparator_apk7q_140:after{content:"";background-color:#0000;width:1px;height:100%;transition:background-color .12s,width .12s}._headerCell_apk7q_1:hover ._columnSeparator_apk7q_140:after,._headerCell_apk7q_1:focus-within ._columnSeparator_apk7q_140:after{background-color:var(--mantine-color-default-border)}._columnSeparatorResizable_apk7q_162:hover:after,._columnSeparatorActive_apk7q_185:after{background-color:var(--mantine-primary-color-filled);width:2px}._menuItemActive_apk7q_191{background-color:var(--mantine-color-default-hover);font-weight:600}._toolbar_1459c_1{align-items:center;gap:var(--mantine-spacing-xs);padding:6px var(--mantine-spacing-xs);flex-shrink:0;min-height:42px;display:flex}._toolbarSpacer_1459c_10{flex:1}._summaryCount_1459c_14{white-space:nowrap}
2
2
  /*$vite$:1*/
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jielga/tmdatagrid",
3
- "version": "2.0.0-beta.11",
3
+ "version": "2.0.0-beta.13",
4
4
  "description": "A React data grid built on TanStack Table v9 and Mantine - always virtualized, with resizable, reorderable, sortable, filterable, hideable and pinnable columns.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -60,7 +60,6 @@
60
60
  "build": "tsc -b && vite build",
61
61
  "build:lib": "vite build --config vite.lib.config.ts && tsc -p tsconfig.lib.json && rolldown -c rolldown.dts.config.mjs",
62
62
  "lint": "oxlint",
63
- "check:style": "node scripts/check-house-style.mjs",
64
63
  "check:skills": "node scripts/intent.mjs validate",
65
64
  "test": "vitest run",
66
65
  "test:watch": "vitest",
@@ -17,7 +17,7 @@ description: >
17
17
  metadata:
18
18
  type: core
19
19
  library: '@jielga/tmdatagrid'
20
- library_version: '2.0.0-beta.11'
20
+ library_version: '2.0.0-beta.13'
21
21
  sources:
22
22
  - 'Jielga/TMDataGrid:src/docs/styling.md'
23
23
  - 'Jielga/TMDataGrid:src/docs/toolbar.md'
@@ -14,7 +14,7 @@ description: >
14
14
  metadata:
15
15
  type: core
16
16
  library: '@jielga/tmdatagrid'
17
- library_version: '2.0.0-beta.11'
17
+ library_version: '2.0.0-beta.13'
18
18
  sources:
19
19
  - 'Jielga/TMDataGrid:src/docs/cell-selection.md'
20
20
  - 'Jielga/TMDataGrid:src/tmdatagrid/core/cellNavigation.ts'
@@ -16,7 +16,7 @@ description: >
16
16
  metadata:
17
17
  type: core
18
18
  library: '@jielga/tmdatagrid'
19
- library_version: '2.0.0-beta.11'
19
+ library_version: '2.0.0-beta.13'
20
20
  sources:
21
21
  - 'Jielga/TMDataGrid:src/docs/columns.md'
22
22
  - 'Jielga/TMDataGrid:src/docs/column-layout.md'
@@ -249,7 +249,7 @@ Standard TanStack column options. Each also removes the corresponding interface.
249
249
  | Option | Effect when `false` |
250
250
  | --- | --- |
251
251
  | `enableSorting` | No sort indicator, no sort menu items, no click-to-sort. |
252
- | `enableColumnFilter` | No filter menu item. Excluded from the filter panel's column list. |
252
+ | `enableColumnFilter` | No filter menu item. Excluded from the filter panel's column list, and its header filter cell is empty. |
253
253
  | `enableHiding` | No hide menu item. Checkbox disabled in the column manager. |
254
254
  | `enablePinning` | No pin menu items. |
255
255
  | `enableResizing` | The divider is displayed but cannot be dragged. |
@@ -15,7 +15,7 @@ description: >
15
15
  metadata:
16
16
  type: core
17
17
  library: '@jielga/tmdatagrid'
18
- library_version: '2.0.0-beta.11'
18
+ library_version: '2.0.0-beta.13'
19
19
  sources:
20
20
  - 'Jielga/TMDataGrid:src/docs/pagination.md'
21
21
  - 'Jielga/TMDataGrid:src/docs/scrolling.md'
@@ -77,7 +77,10 @@ pieces, already wired.
77
77
  `Controls.PageSize`, `Controls.Range` and `Controls.Pager` are what the default
78
78
  footer renders, in that order, so a custom layout can keep the parts it wants
79
79
  instead of rebuilding them. They behave exactly as before, including greying out
80
- under a suspended pager.
80
+ under a suspended pager. `Controls.PageNumber` - the "Page 3 of 200" label a
81
+ server-paged grid usually shows in place of a row range - is a fourth control,
82
+ not in the default footer; put it in through the slot rather than writing it by
83
+ hand.
81
84
 
82
85
  `state` carries `pageIndex`, `pageSize`, `pageCount`, `rowCount`,
83
86
  `canPreviousPage`, `canNextPage`, `from`, `to` and `isPagingActive`. `actions`
@@ -18,7 +18,7 @@ description: >
18
18
  metadata:
19
19
  type: core
20
20
  library: '@jielga/tmdatagrid'
21
- library_version: '2.0.0-beta.11'
21
+ library_version: '2.0.0-beta.13'
22
22
  sources:
23
23
  - 'Jielga/TMDataGrid:src/docs/editing.md'
24
24
  - 'Jielga/TMDataGrid:src/docs/query-builder.md'
@@ -4,18 +4,20 @@ description: >
4
4
  Narrow the rows a TMDataGrid shows. Covers the shared tmDataGrid filter
5
5
  function and its {operator, value} model, the eighteen operators and which
6
6
  meta.type offers each, meta.filter.defaultOperator, isFilterActive and the
7
- half-typed filter, the filter panel, TMDataGrid.FilterButton,
8
- TMDataGrid.FilterPills with its api prop, openColumnFilter, replacing a value
9
- control with DgRangeSliderFilter / DgDateRangeFilter / DgAutocompleteFilter /
10
- DgTriStateFilter or a meta.filter.control component, per-column filterFn, and
11
- the quick search: TMDataGrid.Search, quickSearchMode fuzzy or contains,
12
- fuzzyGlobalFilterFn, enableMatchHighlighting and enableGlobalFilter. Load when
13
- adding filters, choosing operators, building a filter control, showing active
14
- filters outside the grid, or wiring a search box.
7
+ half-typed filter, the filters option and its surfaces (popup, sidebar, none,
8
+ plus inHeader for header filters), TMDataGrid.FilterPanel and its layout prop,
9
+ TMDataGrid.FilterButton, TMDataGrid.FilterPills with its api prop,
10
+ openColumnFilter, replacing a value control with DgRangeSliderFilter /
11
+ DgDateRangeFilter / DgAutocompleteFilter / DgTriStateFilter or a
12
+ meta.filter.control component, per-column filterFn, and the quick search:
13
+ TMDataGrid.Search, quickSearchMode fuzzy or contains, fuzzyGlobalFilterFn,
14
+ enableMatchHighlighting and enableGlobalFilter. Load when adding filters,
15
+ choosing operators, building a filter control, showing active filters outside
16
+ the grid, or wiring a search box.
15
17
  metadata:
16
18
  type: core
17
19
  library: '@jielga/tmdatagrid'
18
- library_version: '2.0.0-beta.11'
20
+ library_version: '2.0.0-beta.13'
19
21
  sources:
20
22
  - 'Jielga/TMDataGrid:src/docs/filtering.md'
21
23
  - 'Jielga/TMDataGrid:src/docs/quick-search.md'
@@ -48,7 +50,9 @@ leaving that end open).
48
50
 
49
51
  A filter with an empty value **stays in state** so the panel keeps its row while
50
52
  the user types. It matches every row, does not set the header indicator and
51
- produces no pill. `isFilterActive(value)` tests for that state; presence in
53
+ produces no pill. `isFilterActive(value)` tests for that state, and
54
+ `activeColumnFilters(columnFilters | table)` applies it across the slice and
55
+ types what it hands back (entries in any other value shape are dropped); presence in
52
56
  `columnFilters` does not.
53
57
 
54
58
  ## Operators
@@ -80,16 +84,86 @@ columnHelper.accessor("salary", {
80
84
  });
81
85
  ```
82
86
 
83
- ## The panel and the pills
87
+ ## The filters option
84
88
 
85
- `TMDataGrid.FilterPanel` is column, operator and value rows under a "Filters"
86
- header, above "Add filter" and "Clear all". It is rendered by
87
- `TMDataGrid.Table`; Escape and a click outside close it, with `FilterButton`
88
- exempt from the click-away so it stays a toggle. Closing only hides it; the
89
- filters stay. **Clear all** drops every filter, half-typed ones included.
89
+ `filters` on `useTMDataGrid` picks the surface. It is read field by field, so a
90
+ literal is fine.
90
91
 
91
- `TMDataGrid.FilterPills` takes the grid as an `api` prop instead of reading
92
- context, so active filters can live in a page header or anywhere else:
92
+ | Option | Type | Default | What it does |
93
+ | --- | --- | --- | --- |
94
+ | `surface` | `"popup" \| "sidebar" \| "none"` | `"popup"` | What `TMDataGrid.Table` renders and `FilterButton` toggles. |
95
+ | `sidebarSide` | `"left" \| "right"` | `"right"` | Which side the sidebar sits on. Ignored by the other surfaces. |
96
+ | `sidebarWidth` | `string` | `"280px"` | Sidebar width, any CSS length. Ignored by the other surfaces. |
97
+ | `defaultOpen` | `boolean` | `true` under `"sidebar"`, else `false` | Whether the surface starts open. Read once, at mount. Under `"none"`, the starting value of `ui.state.filterPanelOpen`. |
98
+ | `inHeader` | `boolean` | `false` | A second header row of per-column controls. Independent of `surface`. |
99
+
100
+ `surface` and `inHeader` are separate choices: `{ surface: "none", inHeader: true }`
101
+ is header filters alone, `{ inHeader: true }` keeps the popup as well.
102
+
103
+ ```tsx
104
+ useTMDataGrid({ data, columns, filters: { surface: "sidebar", inHeader: true } });
105
+ ```
106
+
107
+ **Popup** - the default. Floats over the first body rows. A pointerdown
108
+ outside, Escape, and emptying it (the last row removed, or **Clear all**) all
109
+ close it; `FilterButton` is exempt from the click-away so it stays a toggle.
110
+
111
+ **Sidebar** - the same panel beside the rows, inside the grid frame and under
112
+ the toolbar. The rows give up the width rather than being covered, a click in
113
+ the table does not dismiss it, and clearing the filters leaves it standing.
114
+ Escape closes it. It starts open, being a layout choice; its rows are
115
+ `layout="stacked"`, since 280px has no room for the triple.
116
+
117
+ **Header filters** - `inHeader: true` adds a header row of value controls, one
118
+ per filterable column, on the same column tracks as everything else. The
119
+ column and operator dropdowns are not there: the column is the one the cell
120
+ sits over, and the operator is a funnel button beside the input, tinted off its
121
+ default. The column menu's Filter item and the funnel indicator both come off,
122
+ having nothing left to reveal; the filtered column's tinted title stays. A
123
+ narrow column clips its control - give it a `minSize`.
124
+
125
+ Clearing a header control removes the column's `columnFilters` entry rather
126
+ than leaving an empty one, unless the user also picked a non-default operator,
127
+ which is kept. Panel rows still keep their empty filters.
128
+
129
+ `FilterButton` still toggles whatever `surface` names. `openColumnFilter` does
130
+ not: under `inHeader` it always focuses the header control and leaves the
131
+ surface closed.
132
+
133
+ **None** - `surface: "none"` renders no panel and no `FilterButton`, so a
134
+ hand-placed `TMDataGrid.FilterPanel` is the only one. Read
135
+ `ui.state.filterPanelOpen` if it belongs behind a control of your own.
136
+
137
+ ## TMDataGrid.FilterPanel
138
+
139
+ The panel of filter rows - one column / operator / value triple per filter, over "Add filter" and "Clear all".
140
+ A plain block with no title, no close button and no open state: it renders wherever it is mounted, and the popup and sidebar surfaces are wrappers around it.
141
+ It must be inside `<TMDataGrid>` (it reads the grid from context) and it only reads and writes `columnFilters`, so a `manualFiltering` grid gets it for free.
142
+ Closing a surface only hides it; the filters stay.
143
+ **Clear all** drops every filter, half-typed ones included.
144
+
145
+ | Prop | Type | Default | Description |
146
+ | --- | --- | --- | --- |
147
+ | `layout` | `"row" \| "stacked"` | `"row"` | `"row"` is side by side and wants about 550px; `"stacked"` fills a narrow host. Passed to every value control as its `layout`. |
148
+
149
+ ```tsx
150
+ <Drawer opened={open} onClose={close}>
151
+ <TMDataGrid.FilterPanel layout="stacked" />
152
+ </Drawer>
153
+ ```
154
+
155
+ ## TMDataGrid.FilterButton
156
+
157
+ The toolbar button that toggles the filter surface, tinted with the count of active filters.
158
+ Opening an empty panel seeds a filter row on the first filterable column; with filters already in state it opens on those.
159
+ Renders nothing when no column can be filtered, and nothing under `surface: "none"`.
160
+ No props.
161
+
162
+ ## TMDataGrid.FilterPills
163
+
164
+ One pill per **active** filter, `First name: Sofia ✕`, where the ✕ clears it and a click on the label calls `openColumnFilter`.
165
+ The label spells the operator out unless it is the type's default: `Age is greater than 30`, but `First name: Sofia`.
166
+ It takes the grid as an `api` prop instead of reading context, so it renders anywhere on the page.
93
167
 
94
168
  ```tsx
95
169
  import { TMDataGridFilterPills } from "@jielga/tmdatagrid";
@@ -97,11 +171,18 @@ import { TMDataGridFilterPills } from "@jielga/tmdatagrid";
97
171
  <TMDataGridFilterPills api={grid} onPillClick={(columnId) => focus(columnId)} />;
98
172
  ```
99
173
 
100
- One pill per **active** filter, `First name: Sofia ✕`, where ✕ clears it and a
101
- click on the label reopens the panel on its column. The label spells the
102
- operator out unless it is the type's default: `Age is greater than 30`, but
103
- `First name: Sofia`. `openColumnFilter(api, columnId)` does the same reopening
104
- from anywhere, seeding an empty row if the column has none.
174
+ | Prop | Type | Default | Description |
175
+ | --- | --- | --- | --- |
176
+ | `api` | `TMDataGridApi<TData>` | - | The object returned by `useTMDataGrid`. |
177
+ | `size` | `MantineSize` | `"sm"` | Pill size. |
178
+ | `showClearAll` | `boolean` | `true` | "Clear all", shown once two filters are active. |
179
+ | `onPillClick` | `(columnId: string) => void` | - | Replaces the default click behaviour. |
180
+ | `className` | `string` | - | Added to the wrapper class. |
181
+
182
+ ## openColumnFilter
183
+
184
+ `openColumnFilter(api, columnId)` seeds an empty filter if the column has none, then opens the surface on that column's panel row - or, under `inHeader`, scrolls the column's header control into view and focuses it, leaving the surface closed.
185
+ It is what a pill's label and the column menu's Filter item both call.
105
186
 
106
187
  ## Replacing the value control
107
188
 
@@ -220,9 +301,10 @@ const activeCount = columnFilters.length;
220
301
  Correct:
221
302
 
222
303
  ```tsx
223
- import { isFilterActive } from "@jielga/tmdatagrid";
304
+ import { activeColumnFilters } from "@jielga/tmdatagrid";
224
305
 
225
- const active = columnFilters.filter((filter) => isFilterActive(filter.value));
306
+ // The entries that narrow anything, with `value` typed rather than `unknown`.
307
+ const active = activeColumnFilters(columnFilters);
226
308
  ```
227
309
 
228
310
  Source: `src/docs/filtering.md` (How a filter is stored).
@@ -325,12 +407,16 @@ Source: `src/docs/quick-search.md` (Fuzzy by default).
325
407
  | `enableMatchHighlighting` | Option | `boolean` | `false` | Mark matched text in default-rendered cells. |
326
408
  | `enableGlobalFilter` | Table option | `boolean` | `true` | Also a column option. Removes the input, or one column's participation. |
327
409
  | `globalFilterFn` | Table option | filter fn | fuzzy | Overrides the matching, and the ranking with it. |
328
- | `TMDataGrid.FilterPanel` | Component | – | – | The panel of filter rows. |
410
+ | `TMDataGrid.FilterPanel` | Component | `layout: "row" \| "stacked"` | `"row"` | The panel of filter rows, as a plain block. |
411
+ | `filters` | Table option | `TMDataGridFiltersOptions` | `{ surface: "popup" }` | Which surface holds the filter controls. |
412
+ | `TMDataGridFilterControlArgs.layout` | Type | `"row" \| "stacked" \| "header"` | – | How much room a value control has, and whether it names itself. |
413
+ | `filterValueShape` | Export | `(operator) => "scalar" \| "set" \| "range"` | – | Which shape an operator's value takes. |
329
414
  | `TMDataGrid.FilterButton` | Component | – | – | Toolbar button opening the panel, with an active count. |
330
415
  | `TMDataGrid.FilterPills` | Component | `api`, `size`, `showClearAll`, `onPillClick`, `className` | – | Active filters as removable pills, renderable anywhere. |
331
416
  | `TMDataGrid.Search` | Component | `placeholder`, `debounce` (`250`), `w` (`220`) | – | The debounced quick-search input. |
332
417
  | `openColumnFilter` | Export | `(api, columnId) => void` | – | Opens the panel on a column. |
333
418
  | `isFilterActive` | Export | `(value) => boolean` | – | Whether a filter value narrows anything. |
419
+ | `activeColumnFilters` | Export | `(columnFilters \| table) => Array<{ id, value }>` | – | The filters in the grid's own value shape that narrow anything, typed. |
334
420
  | `getOperatorsForType` | Export | `(type) => operators` | – | The operator list a type offers. |
335
421
  | `FILTER_OPERATOR_LABELS` | Export | record | – | The label shown for each operator. |
336
422
  | `formatFilterLabel` | Export | `({ label, type, filter }) => string` | – | The one-line description used on the pills. |
@@ -11,7 +11,7 @@ description: >
11
11
  metadata:
12
12
  type: core
13
13
  library: '@jielga/tmdatagrid'
14
- library_version: '2.0.0-beta.11'
14
+ library_version: '2.0.0-beta.13'
15
15
  sources:
16
16
  - 'Jielga/TMDataGrid:src/docs/getting-started.md'
17
17
  - 'Jielga/TMDataGrid:src/docs/anatomy.md'
@@ -151,7 +151,7 @@ flex column.
151
151
  | Component | Props | Notes |
152
152
  | --- | --- | --- |
153
153
  | `TMDataGrid` | `table`, `ui`, `features`, `size`, `className`, `style` | Root. Provides context. `style` also takes CSS variables: `--dg-row-selected-bg`, `--dg-row-height`, `--dg-header-height`, `--dg-font-size`, `--dg-padding`. |
154
- | `TMDataGrid.Table` | `onRowClick(row)`, `renderRowContextMenu`, `renderColumnMenuItems`, `rowContextMenuProps` | Header, virtualized body, filter panel. `onRowClick` runs in addition to selection under `selectionMode: "row"`. |
154
+ | `TMDataGrid.Table` | `onRowClick(row)`, `renderRowContextMenu`, `renderColumnMenuItems`, `rowContextMenuProps` | Header, virtualized body, and whichever filter surface the `filters` option asks for. `onRowClick` runs in addition to selection under `selectionMode: "row"`. |
155
155
  | `TMDataGrid.Footer` | `pageSizeOptions` (default `[10, 25, 50, 100]`), `pagination` render prop | Pagination controls. Renders nothing unless pagination is enabled. |
156
156
  | `TMDataGrid.Toolbar` | `children` | Flex row above the grid. |
157
157
  | `TMDataGrid.Spacer` | - | Pushes later toolbar items right. |
@@ -159,9 +159,9 @@ flex column.
159
159
  | `TMDataGrid.Search` | `placeholder`, `debounce` (default `250`), `w` (default `220`) | Quick search over every column, debounced into `globalFilter`. Renders nothing under `enableGlobalFilter: false`. |
160
160
  | `TMDataGrid.LoadingIndicator` | - | Small spinner while `meta.loading` is `true` and rows stay on screen. |
161
161
  | `TMDataGrid.DraftActions` | `renderActions` | Save with the pending count, and Discard. Renders nothing while editing is off - see the `editing` skill. |
162
- | `TMDataGrid.FilterButton` | - | Toggles filter panel. Renders nothing if no column is filterable. |
162
+ | `TMDataGrid.FilterButton` | - | Toggles the filter surface, seeding a filter row on the first filterable column. Renders nothing if no column is filterable, or under `filters.surface: "none"`. |
163
163
  | `TMDataGrid.Menu` | `children`, `icon`, `label`, Mantine `MenuProps` | The burger and its dropdown: your own `Menu.Item`s, and `TMDataGrid.Menu.Columns`, the column chooser as menu items (renders nothing if no column is hideable). See the `appearance` skill. |
164
- | `TMDataGrid.FilterPanel` | - | Rendered by `.Table`; exported for custom layouts. Header close button, Escape, click-away, "Add filter" and "Clear all". |
164
+ | `TMDataGrid.FilterPanel` | `layout` (`"row"` \| `"stacked"`, default `"row"`) | Filter rows over "Add filter" / "Clear all", as a plain block. Rendered by `.Table` inside the popup and the sidebar; place it yourself under `filters.surface: "none"`. See the `filtering` skill. |
165
165
  | `TMDataGrid.ColumnsPanel` | - | The column chooser as plain controls, for a Popover or a Drawer. |
166
166
  | `TMDataGrid.FilterPills` | `api`, `size` (default `"sm"`), `showClearAll` (default `true`), `onPillClick(columnId)`, `className` | One pill per active filter, ✕ to clear it. Takes the api as a prop, so it can be rendered outside the grid. Also exported as `TMDataGridFilterPills`. |
167
167
 
@@ -14,7 +14,7 @@ description: >
14
14
  metadata:
15
15
  type: core
16
16
  library: '@jielga/tmdatagrid'
17
- library_version: '2.0.0-beta.11'
17
+ library_version: '2.0.0-beta.13'
18
18
  sources:
19
19
  - 'Jielga/TMDataGrid:src/docs/grouping.md'
20
20
  - 'Jielga/TMDataGrid:src/docs/summary-row.md'
@@ -14,7 +14,7 @@ description: >
14
14
  metadata:
15
15
  type: core
16
16
  library: '@jielga/tmdatagrid'
17
- library_version: '2.0.0-beta.11'
17
+ library_version: '2.0.0-beta.13'
18
18
  sources:
19
19
  - 'Jielga/TMDataGrid:src/docs/use-tm-data-grid.md'
20
20
  - 'Jielga/TMDataGrid:src/tmdatagrid/useTMDataGrid.tsx'
@@ -208,6 +208,8 @@ const filterPanelOpen = useSelector(grid.ui, (state) => state.filterPanelOpen);
208
208
  | --- | --- |
209
209
  | `openFilterPanel` | `(columnId?: string \| null) => void` |
210
210
  | `closeFilterPanel` | `() => void` |
211
+ | `focusPanelFilter` | `(columnId: string \| null) => void` |
212
+ | `focusHeaderFilter` | `(columnId: string \| null) => void` |
211
213
  | `startColumnDrag` | `(columnId: string) => void` |
212
214
  | `endColumnDrag` | `() => void` |
213
215
  | `setHighlightedRow` | `(rowId: string \| null) => void` |
@@ -17,7 +17,7 @@ description: >
17
17
  metadata:
18
18
  type: core
19
19
  library: '@jielga/tmdatagrid'
20
- library_version: '2.0.0-beta.11'
20
+ library_version: '2.0.0-beta.13'
21
21
  sources:
22
22
  - 'Jielga/TMDataGrid:src/docs/row-selection.md'
23
23
  - 'Jielga/TMDataGrid:src/docs/row-interaction.md'
@@ -4,13 +4,14 @@ description: >
4
4
  Drive TMDataGrid from a server with TanStack manual modes - manualPagination,
5
5
  manualSorting, manualFiltering, rowCount, controlled state and onXChange
6
6
  callbacks. Covers the loading and totalRowCount meta fields, forwarding the
7
- plain-JSON columnFilters model to an API with isFilterActive, persistence
8
- interaction, and row selection across pages. Load when the grid is backed by a
9
- paginated API rather than a local array.
7
+ plain-JSON columnFilters model to an API with activeColumnFilters, the
8
+ first-page reset on a query change, persistence interaction, and row selection
9
+ across pages. Load when the grid is backed by a paginated API rather than a
10
+ local array.
10
11
  metadata:
11
12
  type: core
12
13
  library: '@jielga/tmdatagrid'
13
- library_version: '2.0.0-beta.11'
14
+ library_version: '2.0.0-beta.13'
14
15
  sources:
15
16
  - 'Jielga/TMDataGrid:src/docs/server-side.md'
16
17
  - 'Jielga/TMDataGrid:src/tmdatagrid/useTMDataGrid.tsx'
@@ -68,12 +69,32 @@ const grid = useTMDataGrid({
68
69
  | --- | --- | --- |
69
70
  | Rendered rows | The current page, sliced locally | The rows returned by the server |
70
71
  | Footer total | Pre-paginated row count | `options.rowCount` |
71
- | `SummaryCount` total | Pre-filtered row count | `meta.totalRowCount` |
72
+ | `SummaryCount` total | Pre-filtered row count | `meta.totalRowCount`; the count alone without it |
72
73
  | Loading state | Not applicable | `meta.loading` |
73
74
 
74
75
  Column menus, the filter panel and the column manager behave identically in both
75
76
  modes.
76
77
 
78
+ ## The page index
79
+
80
+ Under `manualPagination` the grid resets `pageIndex` to 0 whenever the query
81
+ changes - a column filter, the quick search or the sort - so the next request
82
+ never asks for page 8 of a result set that now has three. The reset lands in
83
+ the same event as the change, so one request goes out. Pass the plain setters
84
+ as the change callbacks; do not pair them with a page reset of your own.
85
+
86
+ `resetPageOnQueryChange: false` switches it off. TanStack's
87
+ `autoResetPageIndex` is a different rule: it defaults to `!manualPagination`
88
+ and fires on a change to `data`, which server-side is the response landing.
89
+
90
+ ## Column options
91
+
92
+ `meta.options: "faceted"` reads the distinct values in `data`, which
93
+ server-side is one page of them - the dropdown then offers whatever was on the
94
+ page the user is looking at. Declare the set as a list or a function instead.
95
+ The grid warns once per column when a faceted column resolves under
96
+ `manualFiltering` or `manualPagination`.
97
+
77
98
  ## Sending filters
78
99
 
79
100
  Filter values are plain JSON, so `columnFilters` forwards without transformation:
@@ -85,15 +106,22 @@ Filter values are plain JSON, so `columnFilters` forwards without transformation
85
106
  ]
86
107
  ```
87
108
 
88
- Translate at the API boundary, and skip entries whose value is still empty -
89
- those match all rows:
109
+ Translate at the API boundary. `activeColumnFilters` hands back the entries
110
+ that narrow anything, typed - `ColumnFiltersState` types `value` as `unknown`,
111
+ and an entry whose value is still empty matches all rows:
90
112
 
91
113
  ```ts
92
- import { isFilterActive } from "@jielga/tmdatagrid";
114
+ import { activeColumnFilters } from "@jielga/tmdatagrid";
93
115
 
94
- const active = columnFilters.filter((filter) => isFilterActive(filter.value));
116
+ const active = activeColumnFilters(columnFilters);
117
+ // [{ id: "lastName", value: { operator: "contains", value: "holm" } }]
95
118
  ```
96
119
 
120
+ It takes the `columnFilters` array, or the table where the grid owns the slice.
121
+ `isFilterActive(value)` is the single-value test it is built on. Only the
122
+ grid's own `{ operator, value }` shape is read: an entry holding some other
123
+ value - a custom filter control writing raw values - is dropped.
124
+
97
125
  Debounce requests. The filter value input updates on every keystroke.
98
126
 
99
127
  ## Persistence
@@ -126,18 +154,19 @@ Without `rowCount` the table derives the total from the rows it was handed -
126
154
  one page - so `getPageCount()` returns 1. The footer shows "1–25 of 25" and the
127
155
  next-page button is disabled, with no error. Pass the server total.
128
156
 
129
- ### Filters sent without isFilterActive
157
+ ### Filters sent without activeColumnFilters
130
158
 
131
159
  An empty filter value stays in `columnFilters` while the user is still typing.
132
160
  Forwarded verbatim it becomes `operator: "contains", value: ""` at the API,
133
- which most backends translate into a real predicate. Filter with
134
- `isFilterActive` first.
161
+ which most backends translate into a real predicate. Map over
162
+ `activeColumnFilters(columnFilters)` instead of over the slice.
135
163
 
136
164
  ### SummaryCount without meta.totalRowCount
137
165
 
138
- `SummaryCount` falls back to the pre-filtered row count, which under manual
139
- filtering is just the current page. It reads "25 of 25" regardless of how many
140
- rows the server holds. Pass the unfiltered total as `meta.totalRowCount`.
166
+ Without it there is no denominator to show: the pre-filtered row count is the
167
+ current page, so the grid renders the matched count alone rather than a
168
+ plausible-looking wrong total. Pass the unfiltered total as
169
+ `meta.totalRowCount` to get the "42 / 5000" form back.
141
170
 
142
171
  ### Unstable getRowId across pages
143
172
 
@@ -11,7 +11,7 @@ description: >
11
11
  metadata:
12
12
  type: core
13
13
  library: '@jielga/tmdatagrid'
14
- library_version: '2.0.0-beta.11'
14
+ library_version: '2.0.0-beta.13'
15
15
  sources:
16
16
  - 'Jielga/TMDataGrid:src/docs/testing.md'
17
17
  - 'Jielga/TMDataGrid:src/tmdatagrid/components/TMDataGrid.tsx'
@@ -62,7 +62,8 @@ Body cells carry no `data-dg-part` - the coordinate pair already names them.
62
62
 
63
63
  **Whole-grid** (unique, no coordinate needed): `toolbar`, `summary-count`,
64
64
  `loading`, `search`, `search-clear`, `filter-button`, `filter-panel`,
65
- `filter-panel-close`, `filter-add`, `filter-clear-all`, `filter-pills`,
65
+ `filter-popup`, `filter-sidebar`, `filter-panel-close`, `filter-add`,
66
+ `filter-clear-all`, `filter-pills`, `header-filter-row`,
66
67
  `menu-button`, `columns-panel`, `columns-search`, `columns-toggle-all`,
67
68
  `columns-reset`, `footer`, `page-size`, `page-range`, `page-prev`, `page-next`,
68
69
  `summary-row`, `pinned-top`, `pinned-bottom`, `select-all`,
@@ -75,7 +76,9 @@ Body cells carry no `data-dg-part` - the coordinate pair already names them.
75
76
  `discard-new-row`.
76
77
 
77
78
  **Keyed by `data-column-id`**: `header`, `header-sort`, `header-menu`,
78
- `header-filter`, `filter-row`, `filter-pill`, `columns-toggle`.
79
+ `header-filter` (absent under `filters.inHeader`), `header-filter-cell`,
80
+ `header-filter-operator`, `filter-row`,
81
+ `filter-pill`, `columns-toggle`.
79
82
 
80
83
  **Keyed by both**: `editor`.
81
84
 
@@ -80,6 +80,7 @@ function TMDataGridRoot<TData extends RowData>({
80
80
  ui,
81
81
  edit,
82
82
  features,
83
+ filters,
83
84
  labels,
84
85
  renderDetails,
85
86
  renderDetailsEstHeight,
@@ -102,6 +103,7 @@ function TMDataGridRoot<TData extends RowData>({
102
103
  ui,
103
104
  edit,
104
105
  features,
106
+ filters,
105
107
  labels,
106
108
  renderDetails,
107
109
  renderDetailsEstHeight,
@@ -118,6 +120,7 @@ function TMDataGridRoot<TData extends RowData>({
118
120
  ui,
119
121
  edit,
120
122
  features,
123
+ filters,
121
124
  labels,
122
125
  renderDetails,
123
126
  renderDetailsEstHeight,
@@ -239,7 +239,7 @@ function EditLaneCell<TData extends RowData>({
239
239
  data-row-id={rowId}
240
240
  onClick={(event) => {
241
241
  event.stopPropagation();
242
- edit.deleteRow(rowId);
242
+ edit.restoreRow(rowId);
243
243
  }}
244
244
  >
245
245
  <RestoreIcon size={16} stroke={1.6} />