@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.
- package/dist/index.d.ts +285 -22
- package/dist/index.js +2857 -2376
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -2
- package/skills/appearance/SKILL.md +1 -1
- package/skills/cell-selection/SKILL.md +1 -1
- package/skills/columns/SKILL.md +2 -2
- package/skills/data/SKILL.md +5 -2
- package/skills/editing/SKILL.md +1 -1
- package/skills/filtering/SKILL.md +112 -26
- package/skills/getting-started/SKILL.md +4 -4
- package/skills/grouping/SKILL.md +1 -1
- package/skills/options/SKILL.md +3 -1
- package/skills/rows/SKILL.md +1 -1
- package/skills/server-side/SKILL.md +44 -15
- package/skills/testing/SKILL.md +6 -3
- package/src/tmdatagrid/components/TMDataGrid.tsx +3 -0
- package/src/tmdatagrid/components/TMDataGridEditColumn.tsx +1 -1
- package/src/tmdatagrid/components/TMDataGridFilterPanel.module.css +37 -18
- package/src/tmdatagrid/components/TMDataGridFilterPanel.tsx +138 -160
- package/src/tmdatagrid/components/TMDataGridFilterSurface.module.css +54 -0
- package/src/tmdatagrid/components/TMDataGridFilterSurface.tsx +162 -0
- package/src/tmdatagrid/components/TMDataGridFooter.tsx +28 -1
- package/src/tmdatagrid/components/TMDataGridHeaderCell.module.css +10 -0
- package/src/tmdatagrid/components/TMDataGridHeaderCell.tsx +12 -3
- package/src/tmdatagrid/components/TMDataGridHeaderFilterRow.module.css +51 -0
- package/src/tmdatagrid/components/TMDataGridHeaderFilterRow.tsx +303 -0
- package/src/tmdatagrid/components/TMDataGridTable.module.css +9 -41
- package/src/tmdatagrid/components/TMDataGridTable.tsx +84 -15
- package/src/tmdatagrid/components/TMDataGridToolbar.tsx +37 -11
- package/src/tmdatagrid/components/filters/DgAutocompleteFilter.tsx +5 -4
- package/src/tmdatagrid/components/filters/DgDateRangeFilter.tsx +22 -5
- package/src/tmdatagrid/components/filters/DgRangeSliderFilter.tsx +5 -1
- package/src/tmdatagrid/components/filters/DgTriStateFilter.tsx +5 -1
- package/src/tmdatagrid/components/filters/TMDataGridFilterValueInput.tsx +44 -28
- package/src/tmdatagrid/components/filters/controlLayout.ts +32 -0
- package/src/tmdatagrid/components/filters/filterControlFor.ts +65 -0
- package/src/tmdatagrid/components/sticky.module.css +44 -0
- package/src/tmdatagrid/core/columnOptions.ts +46 -0
- package/src/tmdatagrid/core/controlledStateSync.ts +108 -0
- package/src/tmdatagrid/core/editEngine.ts +68 -12
- package/src/tmdatagrid/core/filterControls.ts +28 -0
- package/src/tmdatagrid/core/filterOperators.ts +64 -1
- package/src/tmdatagrid/core/filterSurface.ts +99 -0
- package/src/tmdatagrid/core/labels.ts +7 -0
- package/src/tmdatagrid/core/labelsSv.ts +3 -0
- package/src/tmdatagrid/core/pageReset.ts +115 -0
- package/src/tmdatagrid/index.ts +13 -0
- 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.
|
|
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",
|
|
@@ -14,7 +14,7 @@ description: >
|
|
|
14
14
|
metadata:
|
|
15
15
|
type: core
|
|
16
16
|
library: '@jielga/tmdatagrid'
|
|
17
|
-
library_version: '2.0.0-beta.
|
|
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'
|
package/skills/columns/SKILL.md
CHANGED
|
@@ -16,7 +16,7 @@ description: >
|
|
|
16
16
|
metadata:
|
|
17
17
|
type: core
|
|
18
18
|
library: '@jielga/tmdatagrid'
|
|
19
|
-
library_version: '2.0.0-beta.
|
|
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. |
|
package/skills/data/SKILL.md
CHANGED
|
@@ -15,7 +15,7 @@ description: >
|
|
|
15
15
|
metadata:
|
|
16
16
|
type: core
|
|
17
17
|
library: '@jielga/tmdatagrid'
|
|
18
|
-
library_version: '2.0.0-beta.
|
|
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`
|
package/skills/editing/SKILL.md
CHANGED
|
@@ -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
|
|
8
|
-
TMDataGrid.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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.
|
|
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
|
|
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
|
|
87
|
+
## The filters option
|
|
84
88
|
|
|
85
|
-
`
|
|
86
|
-
|
|
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
|
-
|
|
92
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
`
|
|
104
|
-
|
|
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 {
|
|
304
|
+
import { activeColumnFilters } from "@jielga/tmdatagrid";
|
|
224
305
|
|
|
225
|
-
|
|
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 |
|
|
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.
|
|
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
|
|
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
|
|
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` |
|
|
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
|
|
package/skills/grouping/SKILL.md
CHANGED
package/skills/options/SKILL.md
CHANGED
|
@@ -14,7 +14,7 @@ description: >
|
|
|
14
14
|
metadata:
|
|
15
15
|
type: core
|
|
16
16
|
library: '@jielga/tmdatagrid'
|
|
17
|
-
library_version: '2.0.0-beta.
|
|
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` |
|
package/skills/rows/SKILL.md
CHANGED
|
@@ -17,7 +17,7 @@ description: >
|
|
|
17
17
|
metadata:
|
|
18
18
|
type: core
|
|
19
19
|
library: '@jielga/tmdatagrid'
|
|
20
|
-
library_version: '2.0.0-beta.
|
|
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
|
|
8
|
-
|
|
9
|
-
paginated API rather than a
|
|
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.
|
|
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
|
|
89
|
-
|
|
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 {
|
|
114
|
+
import { activeColumnFilters } from "@jielga/tmdatagrid";
|
|
93
115
|
|
|
94
|
-
const active = columnFilters
|
|
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
|
|
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.
|
|
134
|
-
`
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
|
package/skills/testing/SKILL.md
CHANGED
|
@@ -11,7 +11,7 @@ description: >
|
|
|
11
11
|
metadata:
|
|
12
12
|
type: core
|
|
13
13
|
library: '@jielga/tmdatagrid'
|
|
14
|
-
library_version: '2.0.0-beta.
|
|
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-
|
|
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
|
|
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,
|