@ishibashi0112/spreadsheet-grid-core 0.39.0 → 0.41.0

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 (53) hide show
  1. package/dist/controllers/asyncSelectOptionsSource.cjs +1 -0
  2. package/dist/controllers/asyncSelectOptionsSource.d.ts +32 -0
  3. package/dist/controllers/asyncSelectOptionsSource.js +90 -0
  4. package/dist/controllers/autoHeightMeasurer.cjs +1 -1
  5. package/dist/controllers/autoHeightMeasurer.js +19 -19
  6. package/dist/controllers/clipboardController.cjs +2 -2
  7. package/dist/controllers/clipboardController.js +54 -47
  8. package/dist/controllers/columnAutosizeRunner.cjs +1 -1
  9. package/dist/controllers/columnAutosizeRunner.js +7 -7
  10. package/dist/controllers/filterPopoverController.cjs +1 -1
  11. package/dist/controllers/filterPopoverController.js +7 -7
  12. package/dist/controllers/keyboardController.cjs +1 -1
  13. package/dist/controllers/keyboardController.js +10 -4
  14. package/dist/controllers/pointerInteractionsController.cjs +1 -1
  15. package/dist/controllers/pointerInteractionsController.js +71 -71
  16. package/dist/controllers/selectOptionsCollector.cjs +1 -1
  17. package/dist/controllers/selectOptionsCollector.d.ts +4 -1
  18. package/dist/controllers/selectOptionsCollector.js +7 -7
  19. package/dist/engine/columnCommands.cjs +1 -1
  20. package/dist/engine/columnCommands.js +54 -54
  21. package/dist/engine/filterPopoverCommands.cjs +1 -1
  22. package/dist/engine/filterPopoverCommands.d.ts +5 -2
  23. package/dist/engine/filterPopoverCommands.js +12 -12
  24. package/dist/engine/gridApi.cjs +1 -1
  25. package/dist/engine/gridApi.d.ts +6 -0
  26. package/dist/engine/gridApi.js +75 -56
  27. package/dist/engine/notifiers.cjs +1 -1
  28. package/dist/engine/notifiers.d.ts +3 -1
  29. package/dist/engine/notifiers.js +11 -11
  30. package/dist/engine/rowPipeline.cjs +1 -1
  31. package/dist/engine/rowPipeline.d.ts +13 -2
  32. package/dist/engine/rowPipeline.js +51 -39
  33. package/dist/engine/verticalLayout.cjs +1 -1
  34. package/dist/engine/verticalLayout.d.ts +4 -0
  35. package/dist/engine/verticalLayout.js +40 -28
  36. package/dist/logic/exportCsv.cjs +2 -2
  37. package/dist/logic/exportCsv.d.ts +4 -1
  38. package/dist/logic/exportCsv.js +16 -11
  39. package/dist/logic/exportData.cjs +1 -1
  40. package/dist/logic/exportData.d.ts +3 -1
  41. package/dist/logic/exportData.js +29 -13
  42. package/dist/logic/gridState.cjs +1 -1
  43. package/dist/logic/gridState.d.ts +5 -0
  44. package/dist/logic/gridState.js +10 -7
  45. package/dist/logic/labelRows.cjs +1 -0
  46. package/dist/logic/labelRows.d.ts +45 -0
  47. package/dist/logic/labelRows.js +157 -0
  48. package/dist/logic/verticalGeometry.cjs +1 -1
  49. package/dist/logic/verticalGeometry.d.ts +5 -0
  50. package/dist/logic/verticalGeometry.js +39 -5
  51. package/dist/model/gridTypes.core.d.ts +50 -0
  52. package/dist/model/gridTypes.unbound.d.ts +1 -0
  53. package/package.json +1 -1
@@ -195,22 +195,22 @@ var h = (e, t) => {
195
195
  return;
196
196
  }
197
197
  a(e.setColumnFilter(o, n(s)));
198
- }, D = (e) => {
199
- let { updateNumberDraft: t, openedFilterType: n } = m();
200
- if (t(e), n !== "numberSet") return;
201
- let r = s(e);
202
- E(r !== null, (e) => ({
198
+ }, D = (e, t) => {
199
+ let { updateNumberDraft: n, openedFilterType: r } = m();
200
+ if (n(e), r !== "numberSet" || t?.commit === !1) return;
201
+ let i = s(e);
202
+ E(i !== null, (e) => ({
203
203
  kind: "numberSet",
204
- condition: r,
204
+ condition: i,
205
205
  set: e
206
206
  }));
207
- }, O = (e) => {
208
- let { updateTextDraft: t, openedFilterType: n } = m();
209
- if (t(e), n !== "textSet") return;
210
- let r = l(e);
211
- E(r !== null, (e) => ({
207
+ }, O = (e, t) => {
208
+ let { updateTextDraft: n, openedFilterType: r } = m();
209
+ if (n(e), r !== "textSet" || t?.commit === !1) return;
210
+ let i = l(e);
211
+ E(i !== null, (e) => ({
212
212
  kind: "textSet",
213
- condition: r,
213
+ condition: i,
214
214
  set: e
215
215
  }));
216
216
  }, k = (e) => {
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../logic/grouping.cjs"),t=require("../logic/detailRow.cjs"),n=require("../model/gridActions.cjs"),r=require("../logic/geometry.cjs"),i=require("../model/gridSelectors.cjs"),a=require("../logic/validation.cjs"),o=require("../logic/verticalGeometry.cjs"),s=require("../logic/rowSelection.cjs"),c=require("../logic/gridState.cjs"),l=require("../logic/scrollTargets.cjs"),u=require("../logic/exportCsv.cjs"),d=require("../logic/exportData.cjs"),f=require("../logic/exportScope.cjs");var p=()=>{let p=null,m=(e,t,n=`auto`)=>{let r=Math.max(e.scrollHeight-e.clientHeight,0),i=Math.max(e.scrollWidth-e.clientWidth,0),a=Math.min(Math.max(t.top,0),r),o=Math.min(Math.max(t.left,0),i);(Math.round(a)!==Math.round(e.scrollTop)||Math.round(o)!==Math.round(e.scrollLeft))&&p?.markApiScroll(),e.scrollTo({top:a,left:o,behavior:n})},h=(e,t)=>{let n=p?.scrollContainerRef.current??null,r=p;!n||!r||m(n,{top:e===null?n.scrollTop:o.logicalToPhysicalScrollTop(e,r.verticalScaleFactor),left:t===null?n.scrollLeft:t})},g=(e,t)=>{let n=p?.scrollContainerRef.current??null,r=p;if(!n||!r||r.viewRowCount===0)return null;let i=Math.min(Math.max(e,0),r.viewRowCount-1);return l.computeVerticalScrollTarget({rowTop:r.rowMetrics.rowTop(i),rowHeight:r.rowMetrics.cellHeight(i),headerHeight:r.headerHeight,viewportHeight:n.clientHeight,currentScrollTop:o.physicalToLogicalScrollTop(n.scrollTop,r.verticalScaleFactor),align:t})},_=(e,t)=>{let n=p?.scrollContainerRef.current??null,i=p;if(!n||!i)return null;let a=r.computeSinglePaneColumnExtent(i.paneLayout,e);return!a||a.pane!==`center`?null:l.computeHorizontalScrollTarget({cellLeft:i.leftPaneTotalWidth+i.centerLeadingWidth+a.extent.start,cellWidth:a.extent.width,leftPaneWidth:i.leftPaneTotalWidth,rightPaneWidth:i.rightPaneTotalWidth,viewportWidth:n.clientWidth,currentScrollLeft:n.scrollLeft,align:t})},v=(e,t,n)=>{h(g(e,n),_(t,n))},y=e=>{let t=p;if(!t)return null;let n=e=>t.rowModel.getRow(e),r=t.isRowExportable,a=r?(e,n)=>r(e,{viewRowIndex:n,rowKey:t.rowModel.getRowKey(n)??n}):void 0,o=r?(e,n)=>r(e,{viewRowIndex:n,rowKey:t.resolvedRowKeyGetter(e,n)}):void 0,s=f.normalizeExportScope(e);if(s===`raw`)return t.isServerSide?(console.warn(`SpreadsheetGrid: scope 'raw' は serverSide では未ロード行を取得できないため、'view'(ロード済みビュー行)として扱います。全件エクスポートはサーバ側での実施を推奨します。`),{getRow:n,startRow:0,endRow:t.viewRowCount,columns:t.orderedColumns,isRowIncluded:a}):{getRow:e=>t.rows[e],startRow:0,endRow:t.rows.length,columns:t.orderedColumns,isRowIncluded:o};if(s===`rendered`)return{getRow:n,startRow:t.windowFirstRow,endRow:t.windowLastRow>=t.windowFirstRow?t.windowLastRow+1:t.windowFirstRow,columns:t.orderedColumns,isRowIncluded:a};if(s===`selection`){let e=t.uiState.selection;if(!e)return null;if(e.type===`cell`){let r=i.normalizeCellRange(e.range);return{getRow:n,startRow:r.start.row,endRow:r.end.row+1,columns:t.orderedColumns.slice(r.start.col,r.end.col+1),isRowIncluded:a}}if(e.type===`row`){let r=i.normalizeRowRange(e.startRow,e.endRow);return{getRow:n,startRow:r.startRow,endRow:r.endRow+1,columns:t.orderedColumns,isRowIncluded:a}}let r=i.normalizeColumnRange(e.startCol,e.endCol);return{getRow:n,startRow:0,endRow:t.viewRowCount,columns:t.orderedColumns.slice(r.startCol,r.endCol+1),isRowIncluded:a}}return{getRow:n,startRow:0,endRow:t.viewRowCount,columns:t.orderedColumns,isRowIncluded:a}},b=e=>e.filter(e=>!t.isSyntheticColumnKey(e.key)),x=e=>{let t=y(e?.scope??`view`);return t?u.serializeRowsToCsv({getRow:t.getRow,startRow:t.startRow,endRow:t.endRow,columns:b(t.columns),delimiter:e?.delimiter,includeHeaders:e?.includeHeaders,bom:e?.bom,isRowIncluded:t.isRowIncluded}):e?.bom?``:``},S=e=>{let t=y(e?.scope??`view`);return t?d.buildGridExportData({getRow:t.getRow,startRow:t.startRow,endRow:t.endRow,columns:b(t.columns),isRowIncluded:t.isRowIncluded}):{columns:[],rows:[]}};return{update:e=>{p=e},handle:{scrollToRow:(e,t)=>h(g(e,t?.align??`auto`),null),scrollToCell:(e,t,n)=>v(e,t,n?.align??`auto`),scrollToTop:()=>{let e=p?.scrollContainerRef.current??null;e&&m(e,{top:0,left:e.scrollLeft})},scrollToBottom:()=>{let e=p?.scrollContainerRef.current??null,t=p;!e||!t||m(e,{top:Math.max(t.headerHeight+t.physicalBodyHeight-e.clientHeight,0),left:e.scrollLeft})},getScrollPosition:()=>{let e=p?.scrollContainerRef.current??null;return e?{top:e.scrollTop,left:e.scrollLeft}:null},setScrollPosition:(e,t)=>{let n=p?.scrollContainerRef.current??null;n&&m(n,{top:e.top??n.scrollTop,left:e.left??n.scrollLeft},t?.behavior??`auto`)},getVisibleRowRange:()=>{let e=p;return!e||e.windowLastRow<e.windowFirstRow?null:{startIndex:e.windowFirstRow,endIndex:e.windowLastRow+1}},getActiveCell:()=>{let e=p?.uiState.activeCell;return e?{row:e.row,col:e.col}:null},setActiveCell:(e,t)=>{let r=p;r&&(r.dispatch(n.gridActions.activateCell(e)),e&&t?.scrollIntoView&&v(e.row,e.col,`auto`))},getSelection:()=>p?.uiState.selection??null,selectCell:(e,t,r)=>{let i=p;if(!i)return;let a={row:e,col:t};i.dispatch(n.gridActions.startSelection(a)),i.dispatch(n.gridActions.endSelection()),r?.scrollIntoView&&v(e,t,`auto`)},selectRange:(e,t)=>{let r=p;r&&(r.dispatch(n.gridActions.startSelection(e.start)),r.dispatch(n.gridActions.updateSelection(e.end)),r.dispatch(n.gridActions.endSelection()),t?.scrollIntoView&&v(e.end.row,e.end.col,`auto`))},clearSelection:()=>{p?.dispatch(n.gridActions.clearSelection())},getSelectedRows:()=>{let e=p;if(!e)return[];let t=e.uiState.selection;if(!t)return[];let n=[],r=t=>{let r=e.rowModel.getRow(t);r&&n.push(r)};if(t.type===`cell`){let e=i.normalizeCellRange(t.range);for(let t=e.start.row;t<=e.end.row;t+=1)r(t)}else if(t.type===`row`){let e=i.normalizeRowRange(t.startRow,t.endRow);for(let t=e.startRow;t<=e.endRow;t+=1)r(t)}else for(let t=0;t<e.viewRowCount;t+=1)r(t);return n},exportCsv:e=>x(e),downloadCsv:(e,t)=>{if(typeof document>`u`)return;let n=x({...t,bom:t?.bom??!0}),r=new Blob([n],{type:`text/csv;charset=utf-8;`}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=e??`export.csv`,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(i)},getExportData:e=>S(e),getState:()=>{let e=p;return e?c.buildGridState(e.uiState.columnWidths,e.uiState.filters,e.uiState.sort,c.extractColumnState(e.columns)):c.buildGridState({},{globalText:``,columnFilters:{}},[],[])},applyState:e=>{let t=p;if(!t)return;let r=c.migrateGridState(e);t.onColumnsChange&&r.columns&&t.onColumnsChange(c.applyColumnState(t.columns,r.columns,r.columnWidths)),t.dispatch(n.gridActions.resetColumnWidths(r.columnWidths)),t.dispatch(n.gridActions.setAllFilters(r.filters)),t.dispatch(n.gridActions.setSort(r.sort))},getRowSelection:()=>{let e=p;return e?s.rowSelectionToModel(e.uiState.rowSelection):{type:`include`,rowKeys:[]}},setRowSelection:e=>{p?.commitRowSelection(s.rowSelectionFromModel(e))},getSelectedRowKeys:()=>{let e=p;if(!e)return[];let t=e.uiState.rowSelection;if(t.mode===`include`)return Array.from(t.keys);let n=[],r=e.rowModel.getRowCount();for(let i=0;i<r;i+=1){if(!e.rowModel.getRow(i))continue;let r=e.rowModel.getRowKey(i)??i;t.keys.has(r)||n.push(r)}return n},getSelectedRowData:()=>{let e=p;if(!e)return[];let t=e.uiState.rowSelection,n=[],r=e.rowModel.getRowCount();for(let i=0;i<r;i+=1){let r=e.rowModel.getRow(i);r&&s.resolveIsRowSelected(t,e.rowModel.getRowKey(i)??i)&&n.push(r)}return n},getSelectedRowCount:()=>{let e=p;return e?s.countSelectedRows(e.uiState.rowSelection,e.leafRowCount):0},isRowSelected:e=>{let t=p;return t?s.resolveIsRowSelected(t.uiState.rowSelection,e):!1},selectAllRows:()=>{p?.commitRowSelection(s.selectAllRows())},clearRowSelection:()=>{p?.commitRowSelection(s.clearRowSelection())},undo:()=>{p?.undoRows()},redo:()=>{p?.redoRows()},canUndo:()=>p?.canUndoRows()??!1,canRedo:()=>p?.canRedoRows()??!1,clearUndoHistory:()=>{p?.clearUndoHistory()},setGroupCollapsed:(e,t)=>{p?.dispatch(n.gridActions.setGroupCollapsed(e,t))},expandAllGroups:()=>{p?.dispatch(n.gridActions.setCollapsedGroupKeys(new Set))},collapseAllGroups:()=>{let t=p;!t||!t.groupTree||t.dispatch(n.gridActions.setCollapsedGroupKeys(new Set(e.collectAllGroupKeys(t.groupTree))))},getGroupRows:()=>{let t=p;return t?.groupTree?e.collectAllGroupRows(t.groupTree):[]},setDetailRowExpanded:(e,r)=>{let i=p;if(!(!i||!i.detailRowEnabled)){if(r&&i.detailIsExpandable){let n=t.findDetailRowIndex(i.rowModel,e,i.detailIndexCacheRef.current,!i.isServerSide);if(n>=0){let t=i.rowModel.getRow(n);if(t!=null&&!i.detailIsExpandable(t,{rowKey:e,sourceRowIndex:i.rowModel.getSourceIndex(n)}))return}}i.dispatch(n.gridActions.setDetailRowExpanded(e,r))}},getExpandedDetailRowKeys:()=>{let e=p;return e&&e.detailRowEnabled?Array.from(e.uiState.expandedDetailRowKeys):[]},collapseAllDetailRows:()=>{let e=p;!e||!e.detailRowEnabled||e.dispatch(n.gridActions.setExpandedDetailRowKeys(new Set))},moveRow:(e,t)=>{p?.moveRowByKey(e,t)},getInvalidCells:()=>{let e=p;return e?e.isServerSide?(console.warn(`[SpreadsheetGrid] getInvalidCells は serverSide モードでは利用できません(空配列を返します)。`),[]):a.scanInvalidCells(e.rows,e.columns,e.resolvedRowKeyGetter):[]},refreshServerSide:()=>{let e=p;if(e){if(!e.isServerSide){console.warn(`[SpreadsheetGrid] refreshServerSide は clientSide(rows)モードでは何もしません(dataSource 指定時のみ有効です)。`);return}e.serverSideRefresh()}},openFilterManager:()=>{p?.openToolPanel(`filter`)},closeFilterManager:()=>{let e=p;e&&e.activeToolPanelTab===`filter`&&e.closeToolPanel()}},applyScroll:h,verticalTargetFor:g,horizontalTargetFor:_,scrollToCellInternal:v}};exports.createGridApi=p;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../logic/grouping.cjs"),t=require("../logic/detailRow.cjs"),n=require("../model/gridActions.cjs"),r=require("../logic/geometry.cjs"),i=require("../model/gridSelectors.cjs"),a=require("../logic/validation.cjs"),o=require("../logic/verticalGeometry.cjs"),s=require("../logic/rowSelection.cjs"),c=require("../logic/gridState.cjs"),l=require("../logic/scrollTargets.cjs"),u=require("../logic/exportCsv.cjs"),d=require("../logic/exportData.cjs"),f=require("../logic/exportScope.cjs");var p=()=>{let p=null,m=(e,t,n=`auto`)=>{let r=Math.max(e.scrollHeight-e.clientHeight,0),i=Math.max(e.scrollWidth-e.clientWidth,0),a=Math.min(Math.max(t.top,0),r),o=Math.min(Math.max(t.left,0),i);(Math.round(a)!==Math.round(e.scrollTop)||Math.round(o)!==Math.round(e.scrollLeft))&&p?.markApiScroll(),e.scrollTo({top:a,left:o,behavior:n})},h=(e,t)=>{let n=p?.scrollContainerRef.current??null,r=p;!n||!r||m(n,{top:e===null?n.scrollTop:o.logicalToPhysicalScrollTop(e,r.verticalScaleFactor),left:t===null?n.scrollLeft:t})},g=(e,t)=>{let n=p?.scrollContainerRef.current??null,r=p;if(!n||!r||r.viewRowCount===0)return null;let i=Math.min(Math.max(e,0),r.viewRowCount-1);return l.computeVerticalScrollTarget({rowTop:r.rowMetrics.rowTop(i),rowHeight:r.rowMetrics.cellHeight(i),headerHeight:r.headerHeight,viewportHeight:n.clientHeight,currentScrollTop:o.physicalToLogicalScrollTop(n.scrollTop,r.verticalScaleFactor),align:t})},_=(e,t)=>{let n=p?.scrollContainerRef.current??null,i=p;if(!n||!i)return null;let a=r.computeSinglePaneColumnExtent(i.paneLayout,e);return!a||a.pane!==`center`?null:l.computeHorizontalScrollTarget({cellLeft:i.leftPaneTotalWidth+i.centerLeadingWidth+a.extent.start,cellWidth:a.extent.width,leftPaneWidth:i.leftPaneTotalWidth,rightPaneWidth:i.rightPaneTotalWidth,viewportWidth:n.clientWidth,currentScrollLeft:n.scrollLeft,align:t})},v=(e,t,n)=>{h(g(e,n),_(t,n))},y=(e,t=!1)=>{let n=p;if(!n)return null;let r=e=>n.rowModel.getRow(e),a=n.labelRowExport,o=e=>{if(!a)return[];let t=a.exportText?a.exportText(e):a.getLabel(e);return typeof t==`string`?[t]:t},s=t&&a&&n.rowModel.getLabelRow?e=>{let t=n.rowModel.getLabelRow?.(e);return t?o(t.row):void 0}:void 0,c=n.isRowExportable,l=c?(e,t)=>c(e,{viewRowIndex:t,rowKey:n.rowModel.getRowKey(t)??t}):void 0,u=c?(e,t)=>c(e,{viewRowIndex:t,rowKey:n.resolvedRowKeyGetter(e,t)}):void 0,d=f.normalizeExportScope(e);if(d===`raw`){if(n.isServerSide)return console.warn(`SpreadsheetGrid: scope 'raw' は serverSide では未ロード行を取得できないため、'view'(ロード済みビュー行)として扱います。全件エクスポートはサーバ側での実施を推奨します。`),{getRow:r,startRow:0,endRow:n.viewRowCount,columns:n.orderedColumns,isRowIncluded:l};let e=e=>a!==void 0&&n.rows[e]!==void 0&&a.isLabelRow(n.rows[e],e);return{getRow:t=>e(t)?void 0:n.rows[t],startRow:0,endRow:n.rows.length,columns:n.orderedColumns,isRowIncluded:u,getLabelLine:t&&a?t=>e(t)?o(n.rows[t]):void 0:void 0}}if(d===`rendered`)return{getRow:r,startRow:n.windowFirstRow,endRow:n.windowLastRow>=n.windowFirstRow?n.windowLastRow+1:n.windowFirstRow,columns:n.orderedColumns,isRowIncluded:l,getLabelLine:s};if(d===`selection`){let e=n.uiState.selection;if(!e)return null;if(e.type===`cell`){let t=i.normalizeCellRange(e.range);return{getRow:r,startRow:t.start.row,endRow:t.end.row+1,columns:n.orderedColumns.slice(t.start.col,t.end.col+1),isRowIncluded:l,getLabelLine:s}}if(e.type===`row`){let t=i.normalizeRowRange(e.startRow,e.endRow);return{getRow:r,startRow:t.startRow,endRow:t.endRow+1,columns:n.orderedColumns,isRowIncluded:l,getLabelLine:s}}let t=i.normalizeColumnRange(e.startCol,e.endCol);return{getRow:r,startRow:0,endRow:n.viewRowCount,columns:n.orderedColumns.slice(t.startCol,t.endCol+1),isRowIncluded:l,getLabelLine:s}}return{getRow:r,startRow:0,endRow:n.viewRowCount,columns:n.orderedColumns,isRowIncluded:l,getLabelLine:s}},b=e=>e.filter(e=>!t.isSyntheticColumnKey(e.key)),x=e=>{let t=y(e?.scope??`view`,e?.includeLabelRows===!0);return t?u.serializeRowsToCsv({getRow:t.getRow,startRow:t.startRow,endRow:t.endRow,columns:b(t.columns),delimiter:e?.delimiter,includeHeaders:e?.includeHeaders,bom:e?.bom,isRowIncluded:t.isRowIncluded,getLabelLine:t.getLabelLine}):e?.bom?``:``},S=e=>{let t=y(e?.scope??`view`,e?.includeLabelRows===!0);return t?d.buildGridExportData({getRow:t.getRow,startRow:t.startRow,endRow:t.endRow,columns:b(t.columns),isRowIncluded:t.isRowIncluded,getLabelLine:t.getLabelLine}):{columns:[],rows:[]}};return{update:e=>{p=e},handle:{scrollToRow:(e,t)=>h(g(e,t?.align??`auto`),null),scrollToCell:(e,t,n)=>v(e,t,n?.align??`auto`),scrollToTop:()=>{let e=p?.scrollContainerRef.current??null;e&&m(e,{top:0,left:e.scrollLeft})},scrollToBottom:()=>{let e=p?.scrollContainerRef.current??null,t=p;!e||!t||m(e,{top:Math.max(t.headerHeight+t.physicalBodyHeight-e.clientHeight,0),left:e.scrollLeft})},getScrollPosition:()=>{let e=p?.scrollContainerRef.current??null;return e?{top:e.scrollTop,left:e.scrollLeft}:null},setScrollPosition:(e,t)=>{let n=p?.scrollContainerRef.current??null;n&&m(n,{top:e.top??n.scrollTop,left:e.left??n.scrollLeft},t?.behavior??`auto`)},getVisibleRowRange:()=>{let e=p;return!e||e.windowLastRow<e.windowFirstRow?null:{startIndex:e.windowFirstRow,endIndex:e.windowLastRow+1}},getActiveCell:()=>{let e=p?.uiState.activeCell;return e?{row:e.row,col:e.col}:null},setActiveCell:(e,t)=>{let r=p;r&&(r.dispatch(n.gridActions.activateCell(e)),e&&t?.scrollIntoView&&v(e.row,e.col,`auto`))},getSelection:()=>p?.uiState.selection??null,selectCell:(e,t,r)=>{let i=p;if(!i)return;let a={row:e,col:t};i.dispatch(n.gridActions.startSelection(a)),i.dispatch(n.gridActions.endSelection()),r?.scrollIntoView&&v(e,t,`auto`)},selectRange:(e,t)=>{let r=p;r&&(r.dispatch(n.gridActions.startSelection(e.start)),r.dispatch(n.gridActions.updateSelection(e.end)),r.dispatch(n.gridActions.endSelection()),t?.scrollIntoView&&v(e.end.row,e.end.col,`auto`))},clearSelection:()=>{p?.dispatch(n.gridActions.clearSelection())},getSelectedRows:()=>{let e=p;if(!e)return[];let t=e.uiState.selection;if(!t)return[];let n=[],r=t=>{let r=e.rowModel.getRow(t);r&&n.push(r)};if(t.type===`cell`){let e=i.normalizeCellRange(t.range);for(let t=e.start.row;t<=e.end.row;t+=1)r(t)}else if(t.type===`row`){let e=i.normalizeRowRange(t.startRow,t.endRow);for(let t=e.startRow;t<=e.endRow;t+=1)r(t)}else for(let t=0;t<e.viewRowCount;t+=1)r(t);return n},exportCsv:e=>x(e),downloadCsv:(e,t)=>{if(typeof document>`u`)return;let n=x({...t,bom:t?.bom??!0}),r=new Blob([n],{type:`text/csv;charset=utf-8;`}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=e??`export.csv`,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(i)},getExportData:e=>S(e),getState:()=>{let e=p;return e?c.buildGridState(e.uiState.columnWidths,e.uiState.filters,e.uiState.sort,c.extractColumnState(e.columns)):c.buildGridState({},{globalText:``,columnFilters:{}},[],[])},applyState:e=>{let t=p;if(!t)return;let r=c.migrateGridState(e);t.onColumnsChange&&r.columns&&t.onColumnsChange(c.applyColumnState(t.columns,r.columns,r.columnWidths)),t.dispatch(n.gridActions.resetColumnWidths(r.columnWidths)),t.dispatch(n.gridActions.setAllFilters(r.filters)),t.dispatch(n.gridActions.setSort(r.sort))},getRowSelection:()=>{let e=p;return e?s.rowSelectionToModel(e.uiState.rowSelection):{type:`include`,rowKeys:[]}},setRowSelection:e=>{p?.commitRowSelection(s.rowSelectionFromModel(e))},getSelectedRowKeys:()=>{let e=p;if(!e)return[];let t=e.uiState.rowSelection;if(t.mode===`include`)return Array.from(t.keys);let n=[],r=e.rowModel.getRowCount();for(let i=0;i<r;i+=1){if(!e.rowModel.getRow(i))continue;let r=e.rowModel.getRowKey(i)??i;t.keys.has(r)||n.push(r)}return n},getSelectedRowData:()=>{let e=p;if(!e)return[];let t=e.uiState.rowSelection,n=[],r=e.rowModel.getRowCount();for(let i=0;i<r;i+=1){let r=e.rowModel.getRow(i);r&&s.resolveIsRowSelected(t,e.rowModel.getRowKey(i)??i)&&n.push(r)}return n},getSelectedRowCount:()=>{let e=p;return e?s.countSelectedRows(e.uiState.rowSelection,e.leafRowCount):0},isRowSelected:e=>{let t=p;return t?s.resolveIsRowSelected(t.uiState.rowSelection,e):!1},selectAllRows:()=>{p?.commitRowSelection(s.selectAllRows())},clearRowSelection:()=>{p?.commitRowSelection(s.clearRowSelection())},undo:()=>{p?.undoRows()},redo:()=>{p?.redoRows()},canUndo:()=>p?.canUndoRows()??!1,canRedo:()=>p?.canRedoRows()??!1,clearUndoHistory:()=>{p?.clearUndoHistory()},setGroupCollapsed:(e,t)=>{p?.dispatch(n.gridActions.setGroupCollapsed(e,t))},expandAllGroups:()=>{p?.dispatch(n.gridActions.setCollapsedGroupKeys(new Set))},collapseAllGroups:()=>{let t=p;!t||!t.groupTree||t.dispatch(n.gridActions.setCollapsedGroupKeys(new Set(e.collectAllGroupKeys(t.groupTree))))},getGroupRows:()=>{let t=p;return t?.groupTree?e.collectAllGroupRows(t.groupTree):[]},setDetailRowExpanded:(e,r)=>{let i=p;if(!(!i||!i.detailRowEnabled)){if(r&&i.detailIsExpandable){let n=t.findDetailRowIndex(i.rowModel,e,i.detailIndexCacheRef.current,!i.isServerSide);if(n>=0){let t=i.rowModel.getRow(n);if(t!=null&&!i.detailIsExpandable(t,{rowKey:e,sourceRowIndex:i.rowModel.getSourceIndex(n)}))return}}i.dispatch(n.gridActions.setDetailRowExpanded(e,r))}},getExpandedDetailRowKeys:()=>{let e=p;return e&&e.detailRowEnabled?Array.from(e.uiState.expandedDetailRowKeys):[]},collapseAllDetailRows:()=>{let e=p;!e||!e.detailRowEnabled||e.dispatch(n.gridActions.setExpandedDetailRowKeys(new Set))},moveRow:(e,t)=>{p?.moveRowByKey(e,t)},getInvalidCells:()=>{let e=p;return e?e.isServerSide?(console.warn(`[SpreadsheetGrid] getInvalidCells は serverSide モードでは利用できません(空配列を返します)。`),[]):a.scanInvalidCells(e.rows,e.columns,e.resolvedRowKeyGetter):[]},refreshServerSide:()=>{let e=p;if(e){if(!e.isServerSide){console.warn(`[SpreadsheetGrid] refreshServerSide は clientSide(rows)モードでは何もしません(dataSource 指定時のみ有効です)。`);return}e.serverSideRefresh()}},openFilterManager:()=>{p?.openToolPanel(`filter`)},closeFilterManager:()=>{let e=p;e&&e.activeToolPanelTab===`filter`&&e.closeToolPanel()}},applyScroll:h,verticalTargetFor:g,horizontalTargetFor:_,scrollToCellInternal:v}};exports.createGridApi=p;
@@ -4,6 +4,7 @@ import { type GridPaneLayout } from '../logic/geometry';
4
4
  import { type RowMetrics } from '../logic/verticalGeometry';
5
5
  import { type DetailIndexCache } from '../logic/detailRow';
6
6
  import { type GroupTree } from '../logic/grouping';
7
+ import { type LabelExportLine } from '../logic/exportCsv';
7
8
  import type { ToolPanelTab } from '../controllers/toolPanelController';
8
9
  type ReadonlyRef<V> = {
9
10
  readonly current: V;
@@ -34,6 +35,11 @@ export type GridApiArgs<T> = {
34
35
  serverSideRefresh: () => void;
35
36
  resolvedRowKeyGetter: (row: T, sourceRowIndex: number) => GridRowKey;
36
37
  isRowExportable: SpreadsheetGridProps<T>['isRowExportable'];
38
+ labelRowExport?: {
39
+ isLabelRow: (row: T, sourceIndex: number) => boolean;
40
+ getLabel: (row: T) => string;
41
+ exportText: ((row: T) => string | LabelExportLine) | undefined;
42
+ } | undefined;
37
43
  activeToolPanelTab: ToolPanelTab | null;
38
44
  openToolPanel: (tab: ToolPanelTab) => void;
39
45
  closeToolPanel: () => void;
@@ -53,77 +53,94 @@ var D = () => {
53
53
  });
54
54
  }, M = (e, t, n) => {
55
55
  k(A(e, n), j(t, n));
56
- }, N = (e) => {
57
- let t = D;
58
- if (!t) return null;
59
- let n = (e) => t.rowModel.getRow(e), r = t.isRowExportable, i = r ? (e, n) => r(e, {
60
- viewRowIndex: n,
61
- rowKey: t.rowModel.getRowKey(n) ?? n
62
- }) : void 0, a = r ? (e, n) => r(e, {
63
- viewRowIndex: n,
64
- rowKey: t.resolvedRowKeyGetter(e, n)
65
- }) : void 0, l = E(e);
66
- if (l === "raw") return t.isServerSide ? (console.warn("SpreadsheetGrid: scope 'raw' は serverSide では未ロード行を取得できないため、'view'(ロード済みビュー行)として扱います。全件エクスポートはサーバ側での実施を推奨します。"), {
67
- getRow: n,
68
- startRow: 0,
69
- endRow: t.viewRowCount,
70
- columns: t.orderedColumns,
71
- isRowIncluded: i
72
- }) : {
73
- getRow: (e) => t.rows[e],
74
- startRow: 0,
75
- endRow: t.rows.length,
76
- columns: t.orderedColumns,
77
- isRowIncluded: a
78
- };
79
- if (l === "rendered") return {
80
- getRow: n,
81
- startRow: t.windowFirstRow,
82
- endRow: t.windowLastRow >= t.windowFirstRow ? t.windowLastRow + 1 : t.windowFirstRow,
83
- columns: t.orderedColumns,
84
- isRowIncluded: i
56
+ }, N = (e, t = !1) => {
57
+ let n = D;
58
+ if (!n) return null;
59
+ let r = (e) => n.rowModel.getRow(e), i = n.labelRowExport, a = (e) => {
60
+ if (!i) return [];
61
+ let t = i.exportText ? i.exportText(e) : i.getLabel(e);
62
+ return typeof t == "string" ? [t] : t;
63
+ }, l = t && i && n.rowModel.getLabelRow ? (e) => {
64
+ let t = n.rowModel.getLabelRow?.(e);
65
+ return t ? a(t.row) : void 0;
66
+ } : void 0, u = n.isRowExportable, d = u ? (e, t) => u(e, {
67
+ viewRowIndex: t,
68
+ rowKey: n.rowModel.getRowKey(t) ?? t
69
+ }) : void 0, f = u ? (e, t) => u(e, {
70
+ viewRowIndex: t,
71
+ rowKey: n.resolvedRowKeyGetter(e, t)
72
+ }) : void 0, p = E(e);
73
+ if (p === "raw") {
74
+ if (n.isServerSide) return console.warn("SpreadsheetGrid: scope 'raw' は serverSide では未ロード行を取得できないため、'view'(ロード済みビュー行)として扱います。全件エクスポートはサーバ側での実施を推奨します。"), {
75
+ getRow: r,
76
+ startRow: 0,
77
+ endRow: n.viewRowCount,
78
+ columns: n.orderedColumns,
79
+ isRowIncluded: d
80
+ };
81
+ let e = (e) => i !== void 0 && n.rows[e] !== void 0 && i.isLabelRow(n.rows[e], e);
82
+ return {
83
+ getRow: (t) => e(t) ? void 0 : n.rows[t],
84
+ startRow: 0,
85
+ endRow: n.rows.length,
86
+ columns: n.orderedColumns,
87
+ isRowIncluded: f,
88
+ getLabelLine: t && i ? (t) => e(t) ? a(n.rows[t]) : void 0 : void 0
89
+ };
90
+ }
91
+ if (p === "rendered") return {
92
+ getRow: r,
93
+ startRow: n.windowFirstRow,
94
+ endRow: n.windowLastRow >= n.windowFirstRow ? n.windowLastRow + 1 : n.windowFirstRow,
95
+ columns: n.orderedColumns,
96
+ isRowIncluded: d,
97
+ getLabelLine: l
85
98
  };
86
- if (l === "selection") {
87
- let e = t.uiState.selection;
99
+ if (p === "selection") {
100
+ let e = n.uiState.selection;
88
101
  if (!e) return null;
89
102
  if (e.type === "cell") {
90
- let r = o(e.range);
103
+ let t = o(e.range);
91
104
  return {
92
- getRow: n,
93
- startRow: r.start.row,
94
- endRow: r.end.row + 1,
95
- columns: t.orderedColumns.slice(r.start.col, r.end.col + 1),
96
- isRowIncluded: i
105
+ getRow: r,
106
+ startRow: t.start.row,
107
+ endRow: t.end.row + 1,
108
+ columns: n.orderedColumns.slice(t.start.col, t.end.col + 1),
109
+ isRowIncluded: d,
110
+ getLabelLine: l
97
111
  };
98
112
  }
99
113
  if (e.type === "row") {
100
- let r = c(e.startRow, e.endRow);
114
+ let t = c(e.startRow, e.endRow);
101
115
  return {
102
- getRow: n,
103
- startRow: r.startRow,
104
- endRow: r.endRow + 1,
105
- columns: t.orderedColumns,
106
- isRowIncluded: i
116
+ getRow: r,
117
+ startRow: t.startRow,
118
+ endRow: t.endRow + 1,
119
+ columns: n.orderedColumns,
120
+ isRowIncluded: d,
121
+ getLabelLine: l
107
122
  };
108
123
  }
109
- let r = s(e.startCol, e.endCol);
124
+ let t = s(e.startCol, e.endCol);
110
125
  return {
111
- getRow: n,
126
+ getRow: r,
112
127
  startRow: 0,
113
- endRow: t.viewRowCount,
114
- columns: t.orderedColumns.slice(r.startCol, r.endCol + 1),
115
- isRowIncluded: i
128
+ endRow: n.viewRowCount,
129
+ columns: n.orderedColumns.slice(t.startCol, t.endCol + 1),
130
+ isRowIncluded: d,
131
+ getLabelLine: l
116
132
  };
117
133
  }
118
134
  return {
119
- getRow: n,
135
+ getRow: r,
120
136
  startRow: 0,
121
- endRow: t.viewRowCount,
122
- columns: t.orderedColumns,
123
- isRowIncluded: i
137
+ endRow: n.viewRowCount,
138
+ columns: n.orderedColumns,
139
+ isRowIncluded: d,
140
+ getLabelLine: l
124
141
  };
125
142
  }, P = (e) => e.filter((e) => !r(e.key)), F = (e) => {
126
- let t = N(e?.scope ?? "view");
143
+ let t = N(e?.scope ?? "view", e?.includeLabelRows === !0);
127
144
  return t ? w({
128
145
  getRow: t.getRow,
129
146
  startRow: t.startRow,
@@ -132,16 +149,18 @@ var D = () => {
132
149
  delimiter: e?.delimiter,
133
150
  includeHeaders: e?.includeHeaders,
134
151
  bom: e?.bom,
135
- isRowIncluded: t.isRowIncluded
152
+ isRowIncluded: t.isRowIncluded,
153
+ getLabelLine: t.getLabelLine
136
154
  }) : e?.bom ? "" : "";
137
155
  }, I = (e) => {
138
- let t = N(e?.scope ?? "view");
156
+ let t = N(e?.scope ?? "view", e?.includeLabelRows === !0);
139
157
  return t ? T({
140
158
  getRow: t.getRow,
141
159
  startRow: t.startRow,
142
160
  endRow: t.endRow,
143
161
  columns: P(t.columns),
144
- isRowIncluded: t.isRowIncluded
162
+ isRowIncluded: t.isRowIncluded,
163
+ getLabelLine: t.getLabelLine
145
164
  }) : {
146
165
  columns: [],
147
166
  rows: []
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../logic/gridState.cjs");var t=()=>{let e=null,t=null;return{update:t=>{e=t},applyHoveredRowChange:n=>{if(e===null||!e.enableRowHover)return;let r=t,i=typeof n==`function`?n(r):n;i!==r&&(t=i,e.isHoverControlled||e.setHoveredRowIndex(i),e.onHoveredRowChange?.(i,{source:`pointer`}))}}},n=()=>{let e=null;return{update:({expandedKeys:t,onChange:n})=>{if(e===null){e=t;return}Object.is(e,t)||(e=t,n?.(Array.from(t)))}}},r=()=>{let t=null,n=null,r=(e,t)=>Object.is(e.columnWidths,t.columnWidths)&&Object.is(e.filters,t.filters)&&Object.is(e.sort,t.sort)&&Object.is(e.dragState,t.dragState)&&Object.is(e.columns,t.columns);return{update:i=>{let a=t===null||!r(t,i);if(t=i,!a||!i.onStateChange)return;let o=e.buildGridState(i.columnWidths,i.filters,i.sort,e.extractColumnState(i.columns)),s=e.decideStateChangeEmit(n,o,i.dragState!==null);n=s.nextLast,s.emit&&i.onStateChange(o)}}};exports.createDetailKeysNotifier=n,exports.createHoverRowNotifier=t,exports.createStateChangeNotifier=r;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../logic/gridState.cjs");var t=()=>{let e=null,t=null;return{update:t=>{e=t},applyHoveredRowChange:n=>{if(e===null||!e.enableRowHover)return;let r=t,i=typeof n==`function`?n(r):n;i!==r&&(t=i,e.isHoverControlled||e.setHoveredRowIndex(i),e.onHoveredRowChange?.(i,{source:`pointer`}))}}},n=()=>{let e=null;return{update:({expandedKeys:t,onChange:n})=>{if(e===null){e=t;return}Object.is(e,t)||(e=t,n?.(Array.from(t)))}}},r=()=>{let t=null,n=null,r=(e,t)=>Object.is(e.columnWidths,t.columnWidths)&&Object.is(e.filters,t.filters)&&Object.is(e.sort,t.sort)&&Object.is(e.dragState,t.dragState)&&Object.is(e.columns,t.columns);return{update:i=>{let a=t,o=a===null||!r(a,i);if(t=i,!o||(a!==null&&(i.onFiltersChange&&!Object.is(a.filters,i.filters)&&!e.isSameFilterState(a.filters,i.filters)&&i.onFiltersChange(e.cloneFilterState(i.filters)),i.onSortChange&&!Object.is(a.sort,i.sort)&&!e.isSameSortState(a.sort,i.sort)&&i.onSortChange(e.cloneSortState(i.sort))),!i.onStateChange))return;let s=e.buildGridState(i.columnWidths,i.filters,i.sort,e.extractColumnState(i.columns)),c=e.decideStateChangeEmit(n,s,i.dragState!==null);n=c.nextLast,c.emit&&i.onStateChange(s)}}};exports.createDetailKeysNotifier=n,exports.createHoverRowNotifier=t,exports.createStateChangeNotifier=r;
@@ -1,4 +1,4 @@
1
- import type { GridColumn, GridRowKey, GridSortState, GridState, GridUiState } from '../model/gridTypes.unbound';
1
+ import type { GridColumn, GridFilterState, GridRowKey, GridSortState, GridState, GridUiState } from '../model/gridTypes.unbound';
2
2
  export type HoverRowNotifierArgs = {
3
3
  enableRowHover: boolean;
4
4
  isHoverControlled: boolean;
@@ -28,6 +28,8 @@ export type StateChangeNotifierArgs<T> = {
28
28
  dragState: GridUiState['dragState'];
29
29
  columns: GridColumn<T>[];
30
30
  onStateChange: ((state: GridState) => void) | undefined;
31
+ onFiltersChange?: ((filters: GridFilterState) => void) | undefined;
32
+ onSortChange?: ((sort: GridSortState) => void) | undefined;
31
33
  };
32
34
  export type StateChangeNotifier<T> = {
33
35
  update: (args: StateChangeNotifierArgs<T>) => void;
@@ -1,6 +1,6 @@
1
- import { buildGridState as e, decideStateChangeEmit as t, extractColumnState as n } from "../logic/gridState.js";
1
+ import { buildGridState as e, cloneFilterState as t, cloneSortState as n, decideStateChangeEmit as r, extractColumnState as i, isSameFilterState as a, isSameSortState as o } from "../logic/gridState.js";
2
2
  //#region src/engine/notifiers.ts
3
- var r = () => {
3
+ var s = () => {
4
4
  let e = null, t = null;
5
5
  return {
6
6
  update: (t) => {
@@ -12,7 +12,7 @@ var r = () => {
12
12
  i !== r && (t = i, e.isHoverControlled || e.setHoveredRowIndex(i), e.onHoveredRowChange?.(i, { source: "pointer" }));
13
13
  }
14
14
  };
15
- }, i = () => {
15
+ }, c = () => {
16
16
  let e = null;
17
17
  return { update: ({ expandedKeys: t, onChange: n }) => {
18
18
  if (e === null) {
@@ -21,14 +21,14 @@ var r = () => {
21
21
  }
22
22
  Object.is(e, t) || (e = t, n?.(Array.from(t)));
23
23
  } };
24
- }, a = () => {
25
- let r = null, i = null, a = (e, t) => Object.is(e.columnWidths, t.columnWidths) && Object.is(e.filters, t.filters) && Object.is(e.sort, t.sort) && Object.is(e.dragState, t.dragState) && Object.is(e.columns, t.columns);
26
- return { update: (o) => {
27
- let s = r === null || !a(r, o);
28
- if (r = o, !s || !o.onStateChange) return;
29
- let c = e(o.columnWidths, o.filters, o.sort, n(o.columns)), l = t(i, c, o.dragState !== null);
30
- i = l.nextLast, l.emit && o.onStateChange(c);
24
+ }, l = () => {
25
+ let s = null, c = null, l = (e, t) => Object.is(e.columnWidths, t.columnWidths) && Object.is(e.filters, t.filters) && Object.is(e.sort, t.sort) && Object.is(e.dragState, t.dragState) && Object.is(e.columns, t.columns);
26
+ return { update: (u) => {
27
+ let d = s, f = d === null || !l(d, u);
28
+ if (s = u, !f || (d !== null && (u.onFiltersChange && !Object.is(d.filters, u.filters) && !a(d.filters, u.filters) && u.onFiltersChange(t(u.filters)), u.onSortChange && !Object.is(d.sort, u.sort) && !o(d.sort, u.sort) && u.onSortChange(n(u.sort))), !u.onStateChange)) return;
29
+ let p = e(u.columnWidths, u.filters, u.sort, i(u.columns)), m = r(c, p, u.dragState !== null);
30
+ c = m.nextLast, m.emit && u.onStateChange(p);
31
31
  } };
32
32
  };
33
33
  //#endregion
34
- export { i as createDetailKeysNotifier, r as createHoverRowNotifier, a as createStateChangeNotifier };
34
+ export { c as createDetailKeysNotifier, s as createHoverRowNotifier, l as createStateChangeNotifier };
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../utils/permissions.cjs"),t=require("../logic/grouping.cjs"),n=require("../logic/rowReorder.cjs"),r=require("../logic/filtering.cjs"),i=require("../logic/sorting.cjs"),a=require("./memo.cjs"),o=require("../logic/serverSideQuery.cjs");var s={},c={},l=[],u=`\0`,d=()=>{let d=a.createMemo(e=>r.createSourceOrder(e)),f=a.createMemo((e,t)=>{let n=[];for(let i of e)r.columnFilterUsesNumericKey(t[i.key])&&n.push(i.key);return n.join(u)}),p=a.createMemo((t,n,i)=>{let a=new Map;if(i.length===0)return a;let o=new Set(i.split(u)),s=t.length;for(let i of n){if(!o.has(i.key))continue;let n=new Float64Array(s);for(let a=0;a<s;a+=1)n[a]=r.coerceNumberFilterCellValue(e.getCellValue(t[a],i));a.set(i.key,n)}return a}),m=a.createMemo((e,t,n,i,a)=>r.filterOrderByColumns(e,t,n,i,a)),h=a.createMemo((e,t,n,r)=>i.sortOrder(e,t,n,r)),g=a.createMemo((e,t,r)=>e&&n.isIdentityOrder(t,r)),_=a.createMemo((e,n,r,i,a)=>e?t.buildGroupTree(n,r,i,a):null),v=a.createMemo((e,n)=>e?t.flattenGroupTree(e,n):null),y=a.createMemo((e,n,r,i)=>{if(e){let{displayOrder:n,groups:a}=e;return{getRowCount:()=>n.length,getRow:e=>r[n[e]],getSourceIndex:e=>{let t=n[e];return t>=0?t:void 0},getRowKey:e=>{let o=n[e];return t.isGroupOrderValue(o)?t.groupRowKey(a[t.groupIndexOfOrderValue(o)]):i(r[o],o)},getGroupRow:e=>{let r=n[e];return t.isGroupOrderValue(r)?a[t.groupIndexOfOrderValue(r)]:void 0}}}return{getRowCount:()=>n.length,getRow:e=>r[n[e]],getSourceIndex:e=>n[e],getRowKey:e=>i(r[n[e]],n[e])}}),b=a.createMemo((e,t,n,r,i,a,u)=>e?o.buildServerSideQuery({globalText:t?n:``,columnFilters:r?i:c,sort:a?u:l}):s),x=a.createMemo((e,t)=>e?o.serializeServerSideQuery(t):``),S=a.createMemo((e,t)=>({query:e,queryKey:t}));return{resolveBaseOrder:e=>d(e),resolveOrder:e=>{let{rows:t,visibleColumns:r,columnFilters:i,globalFilteredOrder:a,sort:o,rowDragAvailable:s}=e,c=f(r,i),l=p(t,r,c),u=m(t,a,r,i,l),d=h(t,u,r,o),_=g(s,d,t.length);return{order:d,orderIsIdentity:_,rowDragOperable:n.isRowDragOperable(s,_)}},resolveClientSideRowModel:e=>{let{rows:t,order:n,rowGroupingActive:r,groupColumns:i,aggColumns:a,collapsedGroupKeys:o,rowKeyGetter:s}=e,c=_(r,t,n,i,a),l=v(c,o);return{groupTree:c,groupedDisplay:l,rowModel:y(l,n,t,s)}},resolveServerSideQuery:e=>{let{isServerSide:t,globalFilterEnabled:n,globalText:r,columnFilterEnabled:i,columnFilters:a,sortingEnabled:o,sort:s}=e,c=b(t,n,r,i,a,o,s);return S(c,x(t,c))}}};exports.createRowPipelineResolver=d;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../utils/permissions.cjs"),t=require("../logic/sorting.cjs"),n=require("../logic/grouping.cjs"),r=require("../logic/rowReorder.cjs"),i=require("../logic/labelRows.cjs"),a=require("../logic/filtering.cjs"),o=require("./memo.cjs"),s=require("../logic/serverSideQuery.cjs");var c={},l={},u=[],d=`\0`,f=()=>{let f=o.createMemo(e=>a.createSourceOrder(e)),p=o.createMemo((e,t)=>t?i.resolveLabelRowLayout(e,t):null),m=o.createMemo((e,t)=>i.createLabelFreeOrder(e,t)),h=o.createMemo((e,t)=>{let n=[];for(let r of e)a.columnFilterUsesNumericKey(t[r.key])&&n.push(r.key);return n.join(d)}),g=o.createMemo((t,n,r)=>{let i=new Map;if(r.length===0)return i;let o=new Set(r.split(d)),s=t.length;for(let r of n){if(!o.has(r.key))continue;let n=new Float64Array(s);for(let i=0;i<s;i+=1)n[i]=a.coerceNumberFilterCellValue(e.getCellValue(t[i],r));i.set(r.key,n)}return i}),_=o.createMemo((e,t,n,r,i)=>a.filterOrderByColumns(e,t,n,r,i)),v=o.createMemo((e,n,r,i)=>t.sortOrder(e,n,r,i)),y=o.createMemo((e,t,n)=>e&&r.isIdentityOrder(t,n)),b=o.createMemo((e,t,n)=>e&&i.isSameOrder(t,n)),x=o.createMemo((e,t,r,i,a)=>e?n.buildGroupTree(t,r,i,a):null),S=o.createMemo((e,t)=>e?n.flattenGroupTree(e,t):null),C=o.createMemo((e,t,n,r,a,o,s)=>e&&s?i.buildLabelDisplay({rows:t,order:n,layout:e,sortMode:r,keepEmptySections:a,sortActive:o,getLabel:s}):null),w=o.createMemo((e,t,r,a,o)=>{if(t)return i.createLabelRowModel(t,a,o);if(e){let{displayOrder:t,groups:r}=e;return{getRowCount:()=>t.length,getRow:e=>a[t[e]],getSourceIndex:e=>{let n=t[e];return n>=0?n:void 0},getRowKey:e=>{let i=t[e];return n.isGroupOrderValue(i)?n.groupRowKey(r[n.groupIndexOfOrderValue(i)]):o(a[i],i)},getGroupRow:e=>{let i=t[e];return n.isGroupOrderValue(i)?r[n.groupIndexOfOrderValue(i)]:void 0}}}return{getRowCount:()=>r.length,getRow:e=>a[r[e]],getSourceIndex:e=>r[e],getRowKey:e=>o(a[r[e]],r[e])}}),T=o.createMemo((e,t,n,r,i,a,o)=>e?s.buildServerSideQuery({globalText:t?n:``,columnFilters:r?i:l,sort:a?o:u}):c),E=o.createMemo((e,t)=>e?s.serializeServerSideQuery(t):``),D=o.createMemo((e,t)=>({query:e,queryKey:t}));return{resolveLabelRowLayout:(e,t)=>p(e,t),resolveBaseOrder:(e,t)=>t?m(t,e):f(e),resolveOrder:e=>{let{rows:t,visibleColumns:n,globalFilteredOrder:i,rowDragAvailable:a,labelLayout:o}=e,s=e.manualFiltering?l:e.columnFilters,c=e.manualSorting?u:e.sort,d=h(n,s),f=g(t,n,d),p=_(t,i,n,s,f),x=v(t,p,n,c),S=o?b(a,x,m(o,t.length)):y(a,x,t.length);return{order:x,orderIsIdentity:S,rowDragOperable:r.isRowDragOperable(a,S)}},resolveClientSideRowModel:e=>{let{rows:t,order:n,rowGroupingActive:r,groupColumns:i,aggColumns:a,collapsedGroupKeys:o,rowKeyGetter:s,labelLayout:c,labelSortMode:l=`section`,keepEmptySections:u=!1,sortActive:d=!1,getLabel:f}=e,p=x(r,t,n,i,a),m=S(p,o),h=C(r?null:c??null,t,n,l,u,d,f);return{groupTree:p,groupedDisplay:m,labelDisplay:h,rowModel:w(m,h,n,t,s)}},resolveServerSideQuery:e=>{let{isServerSide:t,globalFilterEnabled:n,globalText:r,columnFilterEnabled:i,columnFilters:a,sortingEnabled:o,sort:s}=e,c=T(t,n,r,i,a,o,s);return D(c,E(t,c))}}};exports.createRowPipelineResolver=f;
@@ -1,13 +1,17 @@
1
- import type { ColumnFilterValue, GridColumn, GridRowKey, GridSortState, RowModel, ServerSideQuery } from '../model/gridTypes.unbound';
1
+ import type { ColumnFilterValue, GridColumn, GridRowKey, GridSortState, LabelRowSortMode, RowModel, ServerSideQuery } from '../model/gridTypes.unbound';
2
2
  import { type RowOrder } from '../logic/filtering';
3
3
  import { type GroupTree, type GroupedDisplay } from '../logic/grouping';
4
+ import { type LabelDisplay, type LabelRowLayout } from '../logic/labelRows';
4
5
  export type RowOrderInputs<T> = {
5
6
  rows: T[];
7
+ labelLayout?: LabelRowLayout | null;
6
8
  visibleColumns: GridColumn<T>[];
7
9
  columnFilters: Record<string, ColumnFilterValue>;
8
10
  globalFilteredOrder: RowOrder;
9
11
  sort: GridSortState;
10
12
  rowDragAvailable: boolean;
13
+ manualFiltering?: boolean;
14
+ manualSorting?: boolean;
11
15
  };
12
16
  export type RowOrderResolution = {
13
17
  order: RowOrder;
@@ -18,6 +22,11 @@ export type ClientSideRowModelInputs<T> = {
18
22
  rows: T[];
19
23
  order: RowOrder;
20
24
  rowGroupingActive: boolean;
25
+ labelLayout?: LabelRowLayout | null;
26
+ labelSortMode?: LabelRowSortMode;
27
+ keepEmptySections?: boolean;
28
+ sortActive?: boolean;
29
+ getLabel?: (row: T) => string;
21
30
  groupColumns: GridColumn<T>[];
22
31
  aggColumns: GridColumn<T>[];
23
32
  collapsedGroupKeys: ReadonlySet<string>;
@@ -26,6 +35,7 @@ export type ClientSideRowModelInputs<T> = {
26
35
  export type ClientSideRowModelResolution<T> = {
27
36
  groupTree: GroupTree<T> | null;
28
37
  groupedDisplay: GroupedDisplay | null;
38
+ labelDisplay: LabelDisplay<T> | null;
29
39
  rowModel: RowModel<T>;
30
40
  };
31
41
  export type ServerSideQueryInputs = {
@@ -42,7 +52,8 @@ export type ServerSideQueryResolution = {
42
52
  queryKey: string;
43
53
  };
44
54
  export declare const createRowPipelineResolver: <T>() => {
45
- resolveBaseOrder: (rowCount: number) => RowOrder;
55
+ resolveLabelRowLayout: (rows: T[], isLabelRow: ((row: T, sourceIndex: number) => boolean) | undefined) => LabelRowLayout | null;
56
+ resolveBaseOrder: (rowCount: number, labelLayout?: LabelRowLayout | null) => RowOrder;
46
57
  resolveOrder: (inputs: RowOrderInputs<T>) => RowOrderResolution;
47
58
  resolveClientSideRowModel: (inputs: ClientSideRowModelInputs<T>) => ClientSideRowModelResolution<T>;
48
59
  resolveServerSideQuery: (inputs: ServerSideQueryInputs) => ServerSideQueryResolution;
@@ -1,84 +1,96 @@
1
1
  import { getCellValue as e } from "../utils/permissions.js";
2
- import { buildGroupTree as t, flattenGroupTree as n, groupIndexOfOrderValue as r, groupRowKey as i, isGroupOrderValue as a } from "../logic/grouping.js";
3
- import { isIdentityOrder as o, isRowDragOperable as s } from "../logic/rowReorder.js";
4
- import { coerceNumberFilterCellValue as c, columnFilterUsesNumericKey as l, createSourceOrder as u, filterOrderByColumns as d } from "../logic/filtering.js";
5
- import { sortOrder as f } from "../logic/sorting.js";
6
- import { createMemo as p } from "./memo.js";
7
- import { buildServerSideQuery as m, serializeServerSideQuery as h } from "../logic/serverSideQuery.js";
2
+ import { sortOrder as t } from "../logic/sorting.js";
3
+ import { buildGroupTree as n, flattenGroupTree as r, groupIndexOfOrderValue as i, groupRowKey as a, isGroupOrderValue as o } from "../logic/grouping.js";
4
+ import { isIdentityOrder as s, isRowDragOperable as c } from "../logic/rowReorder.js";
5
+ import { buildLabelDisplay as l, createLabelFreeOrder as u, createLabelRowModel as d, isSameOrder as f, resolveLabelRowLayout as p } from "../logic/labelRows.js";
6
+ import { coerceNumberFilterCellValue as m, columnFilterUsesNumericKey as h, createSourceOrder as g, filterOrderByColumns as _ } from "../logic/filtering.js";
7
+ import { createMemo as v } from "./memo.js";
8
+ import { buildServerSideQuery as y, serializeServerSideQuery as b } from "../logic/serverSideQuery.js";
8
9
  //#region src/engine/rowPipeline.ts
9
- var g = {}, _ = {}, v = [], y = "\0", b = () => {
10
- let b = p((e) => u(e)), x = p((e, t) => {
10
+ var x = {}, S = {}, C = [], w = "\0", T = () => {
11
+ let T = v((e) => g(e)), E = v((e, t) => t ? p(e, t) : null), D = v((e, t) => u(e, t)), O = v((e, t) => {
11
12
  let n = [];
12
- for (let r of e) l(t[r.key]) && n.push(r.key);
13
- return n.join(y);
14
- }), S = p((t, n, r) => {
13
+ for (let r of e) h(t[r.key]) && n.push(r.key);
14
+ return n.join(w);
15
+ }), k = v((t, n, r) => {
15
16
  let i = /* @__PURE__ */ new Map();
16
17
  if (r.length === 0) return i;
17
- let a = new Set(r.split(y)), o = t.length;
18
+ let a = new Set(r.split(w)), o = t.length;
18
19
  for (let r of n) {
19
20
  if (!a.has(r.key)) continue;
20
21
  let n = new Float64Array(o);
21
- for (let i = 0; i < o; i += 1) n[i] = c(e(t[i], r));
22
+ for (let i = 0; i < o; i += 1) n[i] = m(e(t[i], r));
22
23
  i.set(r.key, n);
23
24
  }
24
25
  return i;
25
- }), C = p((e, t, n, r, i) => d(e, t, n, r, i)), w = p((e, t, n, r) => f(e, t, n, r)), T = p((e, t, n) => e && o(t, n)), E = p((e, n, r, i, a) => e ? t(n, r, i, a) : null), D = p((e, t) => e ? n(e, t) : null), O = p((e, t, n, o) => {
26
+ }), A = v((e, t, n, r, i) => _(e, t, n, r, i)), j = v((e, n, r, i) => t(e, n, r, i)), M = v((e, t, n) => e && s(t, n)), N = v((e, t, n) => e && f(t, n)), P = v((e, t, r, i, a) => e ? n(t, r, i, a) : null), F = v((e, t) => e ? r(e, t) : null), I = v((e, t, n, r, i, a, o) => e && o ? l({
27
+ rows: t,
28
+ order: n,
29
+ layout: e,
30
+ sortMode: r,
31
+ keepEmptySections: i,
32
+ sortActive: a,
33
+ getLabel: o
34
+ }) : null), L = v((e, t, n, r, s) => {
35
+ if (t) return d(t, r, s);
26
36
  if (e) {
27
- let { displayOrder: t, groups: s } = e;
37
+ let { displayOrder: t, groups: n } = e;
28
38
  return {
29
39
  getRowCount: () => t.length,
30
- getRow: (e) => n[t[e]],
40
+ getRow: (e) => r[t[e]],
31
41
  getSourceIndex: (e) => {
32
42
  let n = t[e];
33
43
  return n >= 0 ? n : void 0;
34
44
  },
35
45
  getRowKey: (e) => {
36
46
  let c = t[e];
37
- return a(c) ? i(s[r(c)]) : o(n[c], c);
47
+ return o(c) ? a(n[i(c)]) : s(r[c], c);
38
48
  },
39
49
  getGroupRow: (e) => {
40
- let n = t[e];
41
- return a(n) ? s[r(n)] : void 0;
50
+ let r = t[e];
51
+ return o(r) ? n[i(r)] : void 0;
42
52
  }
43
53
  };
44
54
  }
45
55
  return {
46
- getRowCount: () => t.length,
47
- getRow: (e) => n[t[e]],
48
- getSourceIndex: (e) => t[e],
49
- getRowKey: (e) => o(n[t[e]], t[e])
56
+ getRowCount: () => n.length,
57
+ getRow: (e) => r[n[e]],
58
+ getSourceIndex: (e) => n[e],
59
+ getRowKey: (e) => s(r[n[e]], n[e])
50
60
  };
51
- }), k = p((e, t, n, r, i, a, o) => e ? m({
61
+ }), R = v((e, t, n, r, i, a, o) => e ? y({
52
62
  globalText: t ? n : "",
53
- columnFilters: r ? i : _,
54
- sort: a ? o : v
55
- }) : g), A = p((e, t) => e ? h(t) : ""), j = p((e, t) => ({
63
+ columnFilters: r ? i : S,
64
+ sort: a ? o : C
65
+ }) : x), z = v((e, t) => e ? b(t) : ""), B = v((e, t) => ({
56
66
  query: e,
57
67
  queryKey: t
58
68
  }));
59
69
  return {
60
- resolveBaseOrder: (e) => b(e),
70
+ resolveLabelRowLayout: (e, t) => E(e, t),
71
+ resolveBaseOrder: (e, t) => t ? D(t, e) : T(e),
61
72
  resolveOrder: (e) => {
62
- let { rows: t, visibleColumns: n, columnFilters: r, globalFilteredOrder: i, sort: a, rowDragAvailable: o } = e, c = x(n, r), l = S(t, n, c), u = C(t, i, n, r, l), d = w(t, u, n, a), f = T(o, d, t.length);
73
+ let { rows: t, visibleColumns: n, globalFilteredOrder: r, rowDragAvailable: i, labelLayout: a } = e, o = e.manualFiltering ? S : e.columnFilters, s = e.manualSorting ? C : e.sort, l = O(n, o), u = k(t, n, l), d = A(t, r, n, o, u), f = j(t, d, n, s), p = a ? N(i, f, D(a, t.length)) : M(i, f, t.length);
63
74
  return {
64
- order: d,
65
- orderIsIdentity: f,
66
- rowDragOperable: s(o, f)
75
+ order: f,
76
+ orderIsIdentity: p,
77
+ rowDragOperable: c(i, p)
67
78
  };
68
79
  },
69
80
  resolveClientSideRowModel: (e) => {
70
- let { rows: t, order: n, rowGroupingActive: r, groupColumns: i, aggColumns: a, collapsedGroupKeys: o, rowKeyGetter: s } = e, c = E(r, t, n, i, a), l = D(c, o);
81
+ let { rows: t, order: n, rowGroupingActive: r, groupColumns: i, aggColumns: a, collapsedGroupKeys: o, rowKeyGetter: s, labelLayout: c, labelSortMode: l = "section", keepEmptySections: u = !1, sortActive: d = !1, getLabel: f } = e, p = P(r, t, n, i, a), m = F(p, o), h = I(r ? null : c ?? null, t, n, l, u, d, f);
71
82
  return {
72
- groupTree: c,
73
- groupedDisplay: l,
74
- rowModel: O(l, n, t, s)
83
+ groupTree: p,
84
+ groupedDisplay: m,
85
+ labelDisplay: h,
86
+ rowModel: L(m, h, n, t, s)
75
87
  };
76
88
  },
77
89
  resolveServerSideQuery: (e) => {
78
- let { isServerSide: t, globalFilterEnabled: n, globalText: r, columnFilterEnabled: i, columnFilters: a, sortingEnabled: o, sort: s } = e, c = k(t, n, r, i, a, o, s);
79
- return j(c, A(t, c));
90
+ let { isServerSide: t, globalFilterEnabled: n, globalText: r, columnFilterEnabled: i, columnFilters: a, sortingEnabled: o, sort: s } = e, c = R(t, n, r, i, a, o, s);
91
+ return B(c, z(t, c));
80
92
  }
81
93
  };
82
94
  };
83
95
  //#endregion
84
- export { b as createRowPipelineResolver };
96
+ export { T as createRowPipelineResolver };
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../logic/rowHeightStore.cjs"),t=require("../logic/detailRow.cjs"),n=require("../logic/verticalGeometry.cjs"),r=require("./memo.cjs");var i=[],a=[],o=20,s=()=>{let s=r.createMemo(e=>e.some(e=>e.autoHeight===!0)),c=r.createMemo((t,n,r,i,a)=>t?e.buildRowHeightStore(n,r,i.getRowKey,a):null),l=r.createMemo((t,r,i,a,o)=>t&&r?e.createAutoHeightRowMetrics(r):n.createUniformRowMetrics(a,o)),u=r.createMemo((e,n,r,a,o,s,c)=>e?t.resolveDetailRowExtras({expandedKeys:n,rowModel:r,height:a,isExpandable:o,cache:s.current,allowScan:!c}):i),d=r.createMemo((e,t,r)=>e?n.createDetailRowMetrics(t,r):t),f=r.createMemo((e,t,r,i,a,s,c)=>e?n.computeAutoHeightVerticalGeometry({headerHeight:a,viewportHeight:s,scrollTop:c,overscan:o},t):n.computeVerticalGeometry({rowCount:r,rowHeight:i,headerHeight:a,viewportHeight:s,scrollTop:c,overscan:o,maxBodyPx:n.MAX_BODY_PX})),p=r.createMemo((e,t,n)=>{if(!e)return a;let r=[];for(let e of t)e.detailSize!==void 0&&e.detailSize>0&&r.push({rowKey:n.getRowKey(e.index)??e.index,virtualRow:e});return r});return e=>{let{isServerSide:t,autoHeight:r,visibleColumns:i,viewRowCount:a,estimateRowHeight:o,rowHeight:m,headerHeight:h,viewportHeight:g,scrollTop:_,rowModel:v,measuredHeights:y,autoHeightVersion:b,detailRowEnabled:x,expandedDetailRowKeys:S,detailHeight:C,detailIsExpandable:w,detailIndexCacheRef:T}=e,E=s(i),D=!t&&n.shouldUseAutoHeight(r,E,a,5e4),O=c(D,a,o,v,y),k=l(D,O,b,a,m),A=u(x,S,v,C,w,T,t),j=A.length>0&&k.totalBodyHeight+A.reduce((e,t)=>e+t.height,0)<=15e6,M=d(j,k,A),N=f(D||j,M,a,m,h,g,_),P=N.rows,F=p(j,P,v);return{hasAutoHeightColumn:E,autoHeightActive:D,rowHeightStore:O,baseRowMetrics:k,detailExtras:A,detailActive:j,rowMetrics:M,verticalGeometry:N,virtualRows:P,virtualRowIndexes:N.rowIndexSet,detailEntries:F,windowFirstRow:P.length>0?P[0].index:0,windowLastRow:P.length>0?P[P.length-1].index:-1,physicalBodyHeight:N.physicalBodyHeight,bodyLayerTransform:N.translateY===0?void 0:`translateY(${N.translateY}px)`,verticalScaleFactor:N.scaleFactor,overlayBaseOffset:N.windowBaseOffsetPx}}};exports.createVerticalLayoutResolver=s;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../logic/rowHeightStore.cjs"),t=require("../logic/detailRow.cjs"),n=require("../logic/verticalGeometry.cjs"),r=require("./memo.cjs");var i=[],a=[],o=[],s=20,c=()=>{let c=r.createMemo(e=>e.some(e=>e.autoHeight===!0)),l=r.createMemo((t,n,r,i,a)=>t?e.buildRowHeightStore(n,r,i.getRowKey,a):null),u=r.createMemo((t,r,i,a,o)=>t&&r?e.createAutoHeightRowMetrics(r):n.createUniformRowMetrics(a,o)),d=r.createMemo((e,n,r,a,o,s,c)=>e?t.resolveDetailRowExtras({expandedKeys:n,rowModel:r,height:a,isExpandable:o,cache:s.current,allowScan:!c}):i),f=r.createMemo((e,t)=>{if(!e||t===void 0||e.labels.length===0)return a;let n=[];for(let r=0;r<e.labels.length;r+=1){let i=e.labels[r];n.push({index:e.labelViewIndexes[r],height:typeof t==`function`?t(i.row):t})}return n}),p=r.createMemo((e,t)=>t.length>0?n.createRowHeightOverrideMetrics(e,t):e),m=r.createMemo((e,t,r)=>e?n.createDetailRowMetrics(t,r):t),h=r.createMemo((e,t,r,i,a,o,c)=>e?n.computeAutoHeightVerticalGeometry({headerHeight:a,viewportHeight:o,scrollTop:c,overscan:s},t):n.computeVerticalGeometry({rowCount:r,rowHeight:i,headerHeight:a,viewportHeight:o,scrollTop:c,overscan:s,maxBodyPx:n.MAX_BODY_PX})),g=r.createMemo((e,t,n)=>{if(!e)return o;let r=[];for(let e of t)e.detailSize!==void 0&&e.detailSize>0&&r.push({rowKey:n.getRowKey(e.index)??e.index,virtualRow:e});return r});return e=>{let{isServerSide:t,autoHeight:r,visibleColumns:i,viewRowCount:a,estimateRowHeight:o,rowHeight:s,headerHeight:_,viewportHeight:v,scrollTop:y,rowModel:b,measuredHeights:x,autoHeightVersion:S,detailRowEnabled:C,expandedDetailRowKeys:w,detailHeight:T,detailIsExpandable:E,detailIndexCacheRef:D,labelDisplay:O,labelRowHeight:k}=e,A=c(i),j=!t&&n.shouldUseAutoHeight(r,A,a,5e4),M=l(j,a,o,b,x),N=u(j,M,S,a,s),P=d(C,w,b,T,E,D,t),F=f(t?null:O,k),I=p(N,F),L=I!==N&&I.totalBodyHeight<=15e6,R=L?I:N,z=P.length>0&&R.totalBodyHeight+P.reduce((e,t)=>e+t.height,0)<=15e6,B=m(z,R,P),V=h(j||z||L,B,a,s,_,v,y),H=V.rows,U=g(z,H,b);return{hasAutoHeightColumn:A,autoHeightActive:j,rowHeightStore:M,baseRowMetrics:N,labelHeightActive:L,detailExtras:P,detailActive:z,rowMetrics:B,verticalGeometry:V,virtualRows:H,virtualRowIndexes:V.rowIndexSet,detailEntries:U,windowFirstRow:H.length>0?H[0].index:0,windowLastRow:H.length>0?H[H.length-1].index:-1,physicalBodyHeight:V.physicalBodyHeight,bodyLayerTransform:V.translateY===0?void 0:`translateY(${V.translateY}px)`,verticalScaleFactor:V.scaleFactor,overlayBaseOffset:V.windowBaseOffsetPx}}};exports.createVerticalLayoutResolver=c;
@@ -2,6 +2,7 @@ import type { GridColumn, GridRowKey, RowModel } from '../model/gridTypes.unboun
2
2
  import { type DetailRowExtra, type RowMetrics, type VerticalGeometry, type VerticalRow } from '../logic/verticalGeometry';
3
3
  import { type RowHeightStore } from '../logic/rowHeightStore';
4
4
  import { resolveDetailRowExtras, type DetailIndexCache } from '../logic/detailRow';
5
+ import type { LabelDisplay } from '../logic/labelRows';
5
6
  type ReadonlyRef<V> = {
6
7
  readonly current: V;
7
8
  };
@@ -28,12 +29,15 @@ export type VerticalLayoutInputs<T> = {
28
29
  detailHeight: number;
29
30
  detailIsExpandable: DetailIsExpandable<T>;
30
31
  detailIndexCacheRef: ReadonlyRef<DetailIndexCache>;
32
+ labelDisplay?: LabelDisplay<T> | null;
33
+ labelRowHeight?: number | ((row: T) => number);
31
34
  };
32
35
  export type VerticalLayoutResolution = {
33
36
  hasAutoHeightColumn: boolean;
34
37
  autoHeightActive: boolean;
35
38
  rowHeightStore: RowHeightStore | null;
36
39
  baseRowMetrics: RowMetrics;
40
+ labelHeightActive: boolean;
37
41
  detailExtras: readonly DetailRowExtra[];
38
42
  detailActive: boolean;
39
43
  rowMetrics: RowMetrics;