@ishibashi0112/spreadsheet-grid-core 0.39.0 → 0.40.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.
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../utils/permissions.cjs"),t=require("../model/gridActions.cjs"),n=require("../logic/geometry.cjs"),r=require("../utils/clipboard.cjs");var i=(e,t,n)=>{if(t===0||n===0||e?.type!==`cell`)return!1;let{start:r,end:i}=e.range,a=Math.min(r.row,i.row),o=Math.min(r.col,i.col),s=Math.max(r.row,i.row),c=Math.max(r.col,i.col);return a===0&&o===0&&s===t-1&&c===n-1},a=()=>{let a=null,o=e=>{a=e},s=e=>{let{isRowExportable:t,rowModel:n}=e;if(t)return(e,r)=>t(e,{viewRowIndex:r,rowKey:n.getRowKey(r)??r})},c=t=>{let{rowModel:n,visibleColumns:r}=t,i=n.getRowCount();if(i===0||r.length===0)return``;let a=s(t),o=[];for(let t=0;t<i;t+=1){let i=n.getRow(t);if(!i||a&&!a(i,t))continue;let s=r.map(t=>{let n=e.getCellValue(i,t);return t.formatClipboardValue?t.formatClipboardValue(n,i):String(n??``)});o.push(s.join(` `))}return o.join(`
2
- `)};return{update:o,handleCopy:async()=>{if(a===null)return;let e=a,{rowModel:t,visibleColumns:n,uiState:o}=e,l=i(o.selection,t.getRowCount(),n.length)?c(e):r.serializeSelectionToTsv(t.getRow,t.getRowCount(),n,o.selection,s(e));l&&await r.writeTextToClipboard(l)},handlePaste:i=>{if(a===null)return;let{rows:o,rowModel:s,visibleColumns:c,uiState:l,readOnly:u,canEditCell:d,createRow:f,createOverflowColumn:p,onRowsChange:m,onColumnsChange:h,applyServerSideCellEdits:g,dispatch:_}=a;if(u||!m&&!g||!l.activeCell)return;let v=i.clipboardData?.getData(`text/plain`)??``;if(!v)return;i.preventDefault();let y=r.parseClipboardText(v);if(y.length===0)return;let b=y.reduce((e,t)=>Math.max(e,t.length),0);if(b===0)return;let x=l.activeCell.row,S=l.activeCell.col;if(g){let i=r.buildClipboardCellEdits(e=>s.getRow(e),c,y,x,S,(t,n,r,i)=>e.isCellEditable({readOnly:u,canEditCell:d},t,n,r,i));i.length>0&&g(i);let a=n.clamp(l.activeCell.row+Math.max(y.length-1,0),0,Math.max(s.getRowCount()-1,0)),o=n.clamp(l.activeCell.col+Math.max(b-1,0),0,Math.max(c.length-1,0));_(t.gridActions.startSelection(l.activeCell)),_(t.gridActions.updateSelection({row:a,col:o})),_(t.gridActions.endSelection()),_(t.gridActions.activateCell(l.activeCell));return}if(!m)return;let C=s.getSourceIndex(x);if(C===void 0)return;let w=l.activeCell.col,T=[...o],E=[...c],D=s.getRowCount(),O=T.length,k=e=>e<D?s.getSourceIndex(e):O+(e-D),A=C+y.length;if(A>T.length&&f)for(;T.length<A;)T.push(f());let j=w+b;if(j>E.length&&h&&p){for(;E.length<j;)E.push(p(E.length));h(E)}let M=r.applyClipboardMatrixToRows(T,k,E,y,x,w,(t,n,r,i)=>e.isCellEditable({readOnly:u,canEditCell:d},t,n,r,i)),N=n.clamp(l.activeCell.row+Math.max(y.length-1,0),0,Math.max(Math.max(s.getRowCount()-1,0),x+y.length-1)),P=n.clamp(l.activeCell.col+Math.max((y[0]?.length??1)-1,0),0,Math.max(Math.max(E.length-1,0),w+b-1));m(M),_(t.gridActions.startSelection(l.activeCell)),_(t.gridActions.updateSelection({row:N,col:P})),_(t.gridActions.endSelection()),_(t.gridActions.activateCell(l.activeCell))}}};exports.computeIsWholeGridSelected=i,exports.createClipboardController=a;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../utils/permissions.cjs"),t=require("../model/gridActions.cjs"),n=require("../logic/geometry.cjs"),r=require("../utils/clipboard.cjs"),i=require("../logic/labelRows.cjs");var a=(e,t,n)=>{if(t===0||n===0||e?.type!==`cell`)return!1;let{start:r,end:i}=e.range,a=Math.min(r.row,i.row),o=Math.min(r.col,i.col),s=Math.max(r.row,i.row),c=Math.max(r.col,i.col);return a===0&&o===0&&s===t-1&&c===n-1},o=()=>{let o=null,s=e=>{o=e},c=e=>{let{isRowExportable:t,rowModel:n}=e;if(t)return(e,r)=>t(e,{viewRowIndex:r,rowKey:n.getRowKey(r)??r})},l=t=>{let{rowModel:n,visibleColumns:r}=t,i=n.getRowCount();if(i===0||r.length===0)return``;let a=c(t),o=[];for(let t=0;t<i;t+=1){let i=n.getRow(t);if(!i||a&&!a(i,t))continue;let s=r.map(t=>{let n=e.getCellValue(i,t);return t.formatClipboardValue?t.formatClipboardValue(n,i):String(n??``)});o.push(s.join(` `))}return o.join(`
2
+ `)};return{update:s,handleCopy:async()=>{if(o===null)return;let e=o,{rowModel:t,visibleColumns:n,uiState:i}=e,s=a(i.selection,t.getRowCount(),n.length)?l(e):r.serializeSelectionToTsv(t.getRow,t.getRowCount(),n,i.selection,c(e));s&&await r.writeTextToClipboard(s)},handlePaste:a=>{if(o===null)return;let{rows:s,rowModel:c,visibleColumns:l,uiState:u,readOnly:d,canEditCell:f,createRow:p,createOverflowColumn:m,onRowsChange:h,onColumnsChange:g,applyServerSideCellEdits:_,dispatch:v}=o;if(d||!h&&!_||!u.activeCell)return;let y=a.clipboardData?.getData(`text/plain`)??``;if(!y)return;a.preventDefault();let b=r.parseClipboardText(y);if(b.length===0)return;let x=b.reduce((e,t)=>Math.max(e,t.length),0);if(x===0)return;let S=u.activeCell.row,C=u.activeCell.col,w=c.getLabelRow===void 0?null:i.resolvePasteTargetViewIndexes(c,S,b.length),T=e=>w?w[e-S]:e,E=w?w[w.length-1]:u.activeCell.row+Math.max(b.length-1,0);if(_){let i=r.buildClipboardCellEdits(e=>c.getRow(T(e)),l,b,S,C,(t,n,r,i)=>e.isCellEditable({readOnly:d,canEditCell:f},T(t),n,r,i)).map(e=>({...e,viewIndex:T(e.viewIndex)}));i.length>0&&_(i);let a=n.clamp(E,0,Math.max(c.getRowCount()-1,0)),o=n.clamp(u.activeCell.col+Math.max(x-1,0),0,Math.max(l.length-1,0));v(t.gridActions.startSelection(u.activeCell)),v(t.gridActions.updateSelection({row:a,col:o})),v(t.gridActions.endSelection()),v(t.gridActions.activateCell(u.activeCell));return}if(!h)return;let D=c.getSourceIndex(S);if(D===void 0)return;let O=u.activeCell.col,k=[...s],A=[...l],j=c.getRowCount(),M=k.length,N=e=>{let t=T(e);return t<j?c.getSourceIndex(t):M+(t-j)},P=Math.max(E+1-j,0),F=w?k.length+P:D+b.length;if(F>k.length&&p)for(;k.length<F;)k.push(p());let I=O+x;if(I>A.length&&g&&m){for(;A.length<I;)A.push(m(A.length));g(A)}let L=r.applyClipboardMatrixToRows(k,N,A,b,S,O,(t,n,r,i)=>e.isCellEditable({readOnly:d,canEditCell:f},t,n,r,i)),R=n.clamp(E,0,Math.max(Math.max(c.getRowCount()-1,0),E)),z=n.clamp(u.activeCell.col+Math.max((b[0]?.length??1)-1,0),0,Math.max(Math.max(A.length-1,0),O+x-1));h(L),v(t.gridActions.startSelection(u.activeCell)),v(t.gridActions.updateSelection({row:R,col:z})),v(t.gridActions.endSelection()),v(t.gridActions.activateCell(u.activeCell))}}};exports.computeIsWholeGridSelected=a,exports.createClipboardController=o;
@@ -2,24 +2,25 @@ import { getCellValue as e, isCellEditable as t } from "../utils/permissions.js"
2
2
  import { gridActions as n } from "../model/gridActions.js";
3
3
  import { clamp as r } from "../logic/geometry.js";
4
4
  import { applyClipboardMatrixToRows as i, buildClipboardCellEdits as a, parseClipboardText as o, serializeSelectionToTsv as s, writeTextToClipboard as c } from "../utils/clipboard.js";
5
+ import { resolvePasteTargetViewIndexes as l } from "../logic/labelRows.js";
5
6
  //#region src/controllers/clipboardController.ts
6
- var l = (e, t, n) => {
7
+ var u = (e, t, n) => {
7
8
  if (t === 0 || n === 0 || e?.type !== "cell") return !1;
8
9
  let { start: r, end: i } = e.range, a = Math.min(r.row, i.row), o = Math.min(r.col, i.col), s = Math.max(r.row, i.row), c = Math.max(r.col, i.col);
9
10
  return a === 0 && o === 0 && s === t - 1 && c === n - 1;
10
- }, u = () => {
11
- let u = null, d = (e) => {
12
- u = e;
13
- }, f = (e) => {
11
+ }, d = () => {
12
+ let d = null, f = (e) => {
13
+ d = e;
14
+ }, p = (e) => {
14
15
  let { isRowExportable: t, rowModel: n } = e;
15
16
  if (t) return (e, r) => t(e, {
16
17
  viewRowIndex: r,
17
18
  rowKey: n.getRowKey(r) ?? r
18
19
  });
19
- }, p = (t) => {
20
+ }, m = (t) => {
20
21
  let { rowModel: n, visibleColumns: r } = t, i = n.getRowCount();
21
22
  if (i === 0 || r.length === 0) return "";
22
- let a = f(t), o = [];
23
+ let a = p(t), o = [];
23
24
  for (let t = 0; t < i; t += 1) {
24
25
  let i = n.getRow(t);
25
26
  if (!i || a && !a(i, t)) continue;
@@ -32,57 +33,63 @@ var l = (e, t, n) => {
32
33
  return o.join("\n");
33
34
  };
34
35
  return {
35
- update: d,
36
+ update: f,
36
37
  handleCopy: async () => {
37
- if (u === null) return;
38
- let e = u, { rowModel: t, visibleColumns: n, uiState: r } = e, i = l(r.selection, t.getRowCount(), n.length) ? p(e) : s(t.getRow, t.getRowCount(), n, r.selection, f(e));
38
+ if (d === null) return;
39
+ let e = d, { rowModel: t, visibleColumns: n, uiState: r } = e, i = u(r.selection, t.getRowCount(), n.length) ? m(e) : s(t.getRow, t.getRowCount(), n, r.selection, p(e));
39
40
  i && await c(i);
40
41
  },
41
42
  handlePaste: (e) => {
42
- if (u === null) return;
43
- let { rows: s, rowModel: c, visibleColumns: l, uiState: d, readOnly: f, canEditCell: p, createRow: m, createOverflowColumn: h, onRowsChange: g, onColumnsChange: _, applyServerSideCellEdits: v, dispatch: y } = u;
44
- if (f || !g && !v || !d.activeCell) return;
45
- let b = e.clipboardData?.getData("text/plain") ?? "";
46
- if (!b) return;
43
+ if (d === null) return;
44
+ let { rows: s, rowModel: c, visibleColumns: u, uiState: f, readOnly: p, canEditCell: m, createRow: h, createOverflowColumn: g, onRowsChange: _, onColumnsChange: v, applyServerSideCellEdits: y, dispatch: b } = d;
45
+ if (p || !_ && !y || !f.activeCell) return;
46
+ let x = e.clipboardData?.getData("text/plain") ?? "";
47
+ if (!x) return;
47
48
  e.preventDefault();
48
- let x = o(b);
49
- if (x.length === 0) return;
50
- let S = x.reduce((e, t) => Math.max(e, t.length), 0);
51
- if (S === 0) return;
52
- let C = d.activeCell.row, w = d.activeCell.col;
53
- if (v) {
54
- let e = a((e) => c.getRow(e), l, x, C, w, (e, n, r, i) => t({
55
- readOnly: f,
56
- canEditCell: p
57
- }, e, n, r, i));
58
- e.length > 0 && v(e);
59
- let i = r(d.activeCell.row + Math.max(x.length - 1, 0), 0, Math.max(c.getRowCount() - 1, 0)), o = r(d.activeCell.col + Math.max(S - 1, 0), 0, Math.max(l.length - 1, 0));
60
- y(n.startSelection(d.activeCell)), y(n.updateSelection({
49
+ let S = o(x);
50
+ if (S.length === 0) return;
51
+ let C = S.reduce((e, t) => Math.max(e, t.length), 0);
52
+ if (C === 0) return;
53
+ let w = f.activeCell.row, T = f.activeCell.col, E = c.getLabelRow === void 0 ? null : l(c, w, S.length), D = (e) => E ? E[e - w] : e, O = E ? E[E.length - 1] : f.activeCell.row + Math.max(S.length - 1, 0);
54
+ if (y) {
55
+ let e = a((e) => c.getRow(D(e)), u, S, w, T, (e, n, r, i) => t({
56
+ readOnly: p,
57
+ canEditCell: m
58
+ }, D(e), n, r, i)).map((e) => ({
59
+ ...e,
60
+ viewIndex: D(e.viewIndex)
61
+ }));
62
+ e.length > 0 && y(e);
63
+ let i = r(O, 0, Math.max(c.getRowCount() - 1, 0)), o = r(f.activeCell.col + Math.max(C - 1, 0), 0, Math.max(u.length - 1, 0));
64
+ b(n.startSelection(f.activeCell)), b(n.updateSelection({
61
65
  row: i,
62
66
  col: o
63
- })), y(n.endSelection()), y(n.activateCell(d.activeCell));
67
+ })), b(n.endSelection()), b(n.activateCell(f.activeCell));
64
68
  return;
65
69
  }
66
- if (!g) return;
67
- let T = c.getSourceIndex(C);
68
- if (T === void 0) return;
69
- let E = d.activeCell.col, D = [...s], O = [...l], k = c.getRowCount(), A = D.length, j = (e) => e < k ? c.getSourceIndex(e) : A + (e - k), M = T + x.length;
70
- if (M > D.length && m) for (; D.length < M;) D.push(m());
71
- let N = E + S;
72
- if (N > O.length && _ && h) {
73
- for (; O.length < N;) O.push(h(O.length));
74
- _(O);
70
+ if (!_) return;
71
+ let k = c.getSourceIndex(w);
72
+ if (k === void 0) return;
73
+ let A = f.activeCell.col, j = [...s], M = [...u], N = c.getRowCount(), P = j.length, F = (e) => {
74
+ let t = D(e);
75
+ return t < N ? c.getSourceIndex(t) : P + (t - N);
76
+ }, I = Math.max(O + 1 - N, 0), L = E ? j.length + I : k + S.length;
77
+ if (L > j.length && h) for (; j.length < L;) j.push(h());
78
+ let R = A + C;
79
+ if (R > M.length && v && g) {
80
+ for (; M.length < R;) M.push(g(M.length));
81
+ v(M);
75
82
  }
76
- let P = i(D, j, O, x, C, E, (e, n, r, i) => t({
77
- readOnly: f,
78
- canEditCell: p
79
- }, e, n, r, i)), F = r(d.activeCell.row + Math.max(x.length - 1, 0), 0, Math.max(Math.max(c.getRowCount() - 1, 0), C + x.length - 1)), I = r(d.activeCell.col + Math.max((x[0]?.length ?? 1) - 1, 0), 0, Math.max(Math.max(O.length - 1, 0), E + S - 1));
80
- g(P), y(n.startSelection(d.activeCell)), y(n.updateSelection({
81
- row: F,
82
- col: I
83
- })), y(n.endSelection()), y(n.activateCell(d.activeCell));
83
+ let z = i(j, F, M, S, w, A, (e, n, r, i) => t({
84
+ readOnly: p,
85
+ canEditCell: m
86
+ }, e, n, r, i)), B = r(O, 0, Math.max(Math.max(c.getRowCount() - 1, 0), O)), V = r(f.activeCell.col + Math.max((S[0]?.length ?? 1) - 1, 0), 0, Math.max(Math.max(M.length - 1, 0), A + C - 1));
87
+ _(z), b(n.startSelection(f.activeCell)), b(n.updateSelection({
88
+ row: B,
89
+ col: V
90
+ })), b(n.endSelection()), b(n.activateCell(f.activeCell));
84
91
  }
85
92
  };
86
93
  };
87
94
  //#endregion
88
- export { l as computeIsWholeGridSelected, u as createClipboardController };
95
+ export { u as computeIsWholeGridSelected, d as createClipboardController };
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../utils/permissions.cjs"),t=require("../model/gridActions.cjs"),n=require("../logic/geometry.cjs"),r=require("../logic/domGuards.cjs");var i=()=>{let i=null,a=e=>{i=e},o=(e,r,a)=>{if(i===null)return;let{uiState:o,rowModel:s,visibleColumns:c,dispatch:l}=i,u=s.getRowCount();if(u===0||c.length===0)return;let d=o.activeCell??{row:0,col:0},f={row:n.clamp(d.row+e,0,u-1),col:n.clamp(d.col+r,0,c.length-1)};if(a){let e=o.selection?.type===`cell`?o.selection.range.start:d;l(t.gridActions.startSelection(e)),l(t.gridActions.updateSelection(f)),l(t.gridActions.endSelection()),l(t.gridActions.activateCell(f));return}l(t.gridActions.startSelection(f)),l(t.gridActions.endSelection()),l(t.gridActions.activateCell(f))};return{update:a,handleKeyDown:async n=>{if(i===null)return;let{uiState:a,rowModel:s,visibleColumns:c,readOnly:l,canEditCell:u,setEditorInitialValue:d,dispatch:f,handleCopy:p,handleCellDoubleClick:m,isWholeGridSelected:h,selectEntireGrid:g,onUndo:_,onRedo:v,onClearSelection:y,enableClearOnDelete:b,onToggleCheckboxCell:x,onToggleGroup:S}=i;if(!r.shouldIgnoreGridKeydown(n.target)&&!a.editingCell){if((n.ctrlKey||n.metaKey)&&n.key.toLowerCase()===`c`){n.preventDefault(),await p();return}if((n.ctrlKey||n.metaKey)&&n.key.toLowerCase()===`a`){if(n.preventDefault(),h){f(t.gridActions.clearSelection()),f(t.gridActions.activateCell(null));return}g();return}if((n.ctrlKey||n.metaKey)&&!n.isComposing){if(n.key.toLowerCase()===`z`){n.preventDefault(),n.shiftKey?v():_();return}if(n.key.toLowerCase()===`y`&&!n.shiftKey){n.preventDefault(),v();return}}if(n.key===`ArrowUp`){n.preventDefault(),o(-1,0,n.shiftKey);return}if(n.key===`ArrowDown`){n.preventDefault(),o(1,0,n.shiftKey);return}if(n.key===`ArrowLeft`){n.preventDefault(),o(0,-1,n.shiftKey);return}if(n.key===`ArrowRight`){n.preventDefault(),o(0,1,n.shiftKey);return}if(n.key===`Tab`){n.preventDefault(),o(0,n.shiftKey?-1:1,!1);return}if(n.key===`Escape`){n.preventDefault(),f(t.gridActions.clearSelection());return}if((n.key===`Delete`||n.key===`Backspace`)&&b){n.preventDefault(),y();return}if((n.key===`Enter`||n.key===` `)&&a.activeCell){let e=s.getGroupRow?.(a.activeCell.row);if(e){n.preventDefault(),S(e.groupKey);return}}if(n.key===`Enter`||n.key===`F2`){n.preventDefault(),a.activeCell&&m(a.activeCell);return}if(r.isPrintableKey(n)&&a.activeCell){let r=s.getRow(a.activeCell.row),i=c[a.activeCell.col];if(!r||!i||!e.isCellEditable({readOnly:l,canEditCell:u},a.activeCell.row,a.activeCell.col,r,i))return;if(i.editor?.type===`checkbox`){n.preventDefault(),n.key===` `&&x(a.activeCell);return}n.preventDefault(),d(n.key),f(t.gridActions.startEdit(a.activeCell))}}}}};exports.createKeyboardController=i;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../utils/permissions.cjs"),t=require("../model/gridActions.cjs"),n=require("../logic/geometry.cjs"),r=require("../logic/domGuards.cjs");var i=()=>{let i=null,a=e=>{i=e},o=(e,r,a)=>{if(i===null)return;let{uiState:o,rowModel:s,visibleColumns:c,dispatch:l}=i,u=s.getRowCount();if(u===0||c.length===0)return;let d=o.activeCell??{row:0,col:0},f=n.clamp(d.row+e,0,u-1);if(e!==0&&s.getLabelRow){let t=e>0?1:-1,n=f;for(;n>=0&&n<u&&s.getLabelRow(n);)n+=t;f=n>=0&&n<u?n:d.row}let p={row:f,col:n.clamp(d.col+r,0,c.length-1)};if(a){let e=o.selection?.type===`cell`?o.selection.range.start:d;l(t.gridActions.startSelection(e)),l(t.gridActions.updateSelection(p)),l(t.gridActions.endSelection()),l(t.gridActions.activateCell(p));return}l(t.gridActions.startSelection(p)),l(t.gridActions.endSelection()),l(t.gridActions.activateCell(p))};return{update:a,handleKeyDown:async n=>{if(i===null)return;let{uiState:a,rowModel:s,visibleColumns:c,readOnly:l,canEditCell:u,setEditorInitialValue:d,dispatch:f,handleCopy:p,handleCellDoubleClick:m,isWholeGridSelected:h,selectEntireGrid:g,onUndo:_,onRedo:v,onClearSelection:y,enableClearOnDelete:b,onToggleCheckboxCell:x,onToggleGroup:S}=i;if(!r.shouldIgnoreGridKeydown(n.target)&&!a.editingCell){if((n.ctrlKey||n.metaKey)&&n.key.toLowerCase()===`c`){n.preventDefault(),await p();return}if((n.ctrlKey||n.metaKey)&&n.key.toLowerCase()===`a`){if(n.preventDefault(),h){f(t.gridActions.clearSelection()),f(t.gridActions.activateCell(null));return}g();return}if((n.ctrlKey||n.metaKey)&&!n.isComposing){if(n.key.toLowerCase()===`z`){n.preventDefault(),n.shiftKey?v():_();return}if(n.key.toLowerCase()===`y`&&!n.shiftKey){n.preventDefault(),v();return}}if(n.key===`ArrowUp`){n.preventDefault(),o(-1,0,n.shiftKey);return}if(n.key===`ArrowDown`){n.preventDefault(),o(1,0,n.shiftKey);return}if(n.key===`ArrowLeft`){n.preventDefault(),o(0,-1,n.shiftKey);return}if(n.key===`ArrowRight`){n.preventDefault(),o(0,1,n.shiftKey);return}if(n.key===`Tab`){n.preventDefault(),o(0,n.shiftKey?-1:1,!1);return}if(n.key===`Escape`){n.preventDefault(),f(t.gridActions.clearSelection());return}if((n.key===`Delete`||n.key===`Backspace`)&&b){n.preventDefault(),y();return}if((n.key===`Enter`||n.key===` `)&&a.activeCell){let e=s.getGroupRow?.(a.activeCell.row);if(e){n.preventDefault(),S(e.groupKey);return}}if(n.key===`Enter`||n.key===`F2`){n.preventDefault(),a.activeCell&&m(a.activeCell);return}if(r.isPrintableKey(n)&&a.activeCell){let r=s.getRow(a.activeCell.row),i=c[a.activeCell.col];if(!r||!i||!e.isCellEditable({readOnly:l,canEditCell:u},a.activeCell.row,a.activeCell.col,r,i))return;if(i.editor?.type===`checkbox`){n.preventDefault(),n.key===` `&&x(a.activeCell);return}n.preventDefault(),d(n.key),f(t.gridActions.startEdit(a.activeCell))}}}}};exports.createKeyboardController=i;
@@ -13,16 +13,22 @@ var a = () => {
13
13
  let d = o.activeCell ?? {
14
14
  row: 0,
15
15
  col: 0
16
- }, f = {
17
- row: n(d.row + e, 0, u - 1),
16
+ }, f = n(d.row + e, 0, u - 1);
17
+ if (e !== 0 && s.getLabelRow) {
18
+ let t = e > 0 ? 1 : -1, n = f;
19
+ for (; n >= 0 && n < u && s.getLabelRow(n);) n += t;
20
+ f = n >= 0 && n < u ? n : d.row;
21
+ }
22
+ let p = {
23
+ row: f,
18
24
  col: n(d.col + r, 0, c.length - 1)
19
25
  };
20
26
  if (i) {
21
27
  let e = o.selection?.type === "cell" ? o.selection.range.start : d;
22
- l(t.startSelection(e)), l(t.updateSelection(f)), l(t.endSelection()), l(t.activateCell(f));
28
+ l(t.startSelection(e)), l(t.updateSelection(p)), l(t.endSelection()), l(t.activateCell(p));
23
29
  return;
24
30
  }
25
- l(t.startSelection(f)), l(t.endSelection()), l(t.activateCell(f));
31
+ l(t.startSelection(p)), l(t.endSelection()), l(t.activateCell(p));
26
32
  };
27
33
  return {
28
34
  update: o,
@@ -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("../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/grouping.cjs"),n=require("../logic/rowReorder.cjs"),r=require("../logic/labelRows.cjs"),i=require("../logic/filtering.cjs"),a=require("../logic/sorting.cjs"),o=require("./memo.cjs"),s=require("../logic/serverSideQuery.cjs");var c={},l={},u=[],d=`\0`,f=()=>{let f=o.createMemo(e=>i.createSourceOrder(e)),p=o.createMemo((e,t)=>t?r.resolveLabelRowLayout(e,t):null),m=o.createMemo((e,t)=>r.createLabelFreeOrder(e,t)),h=o.createMemo((e,t)=>{let n=[];for(let r of e)i.columnFilterUsesNumericKey(t[r.key])&&n.push(r.key);return n.join(d)}),g=o.createMemo((t,n,r)=>{let a=new Map;if(r.length===0)return a;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 a=0;a<s;a+=1)n[a]=i.coerceNumberFilterCellValue(e.getCellValue(t[a],r));a.set(r.key,n)}return a}),_=o.createMemo((e,t,n,r,a)=>i.filterOrderByColumns(e,t,n,r,a)),v=o.createMemo((e,t,n,r)=>a.sortOrder(e,t,n,r)),y=o.createMemo((e,t,r)=>e&&n.isIdentityOrder(t,r)),b=o.createMemo((e,t,n)=>e&&r.isSameOrder(t,n)),x=o.createMemo((e,n,r,i,a)=>e?t.buildGroupTree(n,r,i,a):null),S=o.createMemo((e,n)=>e?t.flattenGroupTree(e,n):null),C=o.createMemo((e,t,n,i,a,o,s)=>e&&s?r.buildLabelDisplay({rows:t,order:n,layout:e,sortMode:i,keepEmptySections:a,sortActive:o,getLabel:s}):null),w=o.createMemo((e,n,i,a,o)=>{if(n)return r.createLabelRowModel(n,a,o);if(e){let{displayOrder:n,groups:r}=e;return{getRowCount:()=>n.length,getRow:e=>a[n[e]],getSourceIndex:e=>{let t=n[e];return t>=0?t:void 0},getRowKey:e=>{let i=n[e];return t.isGroupOrderValue(i)?t.groupRowKey(r[t.groupIndexOfOrderValue(i)]):o(a[i],i)},getGroupRow:e=>{let i=n[e];return t.isGroupOrderValue(i)?r[t.groupIndexOfOrderValue(i)]:void 0}}}return{getRowCount:()=>i.length,getRow:e=>a[i[e]],getSourceIndex:e=>i[e],getRowKey:e=>o(a[i[e]],i[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:r,columnFilters:i,globalFilteredOrder:a,sort:o,rowDragAvailable:s,labelLayout:c}=e,l=h(r,i),u=g(t,r,l),d=_(t,a,r,i,u),f=v(t,d,r,o),p=c?b(s,f,m(c,t.length)):y(s,f,t.length);return{order:f,orderIsIdentity:p,rowDragOperable:n.isRowDragOperable(s,p)}},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,8 +1,10 @@
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;
@@ -18,6 +20,11 @@ export type ClientSideRowModelInputs<T> = {
18
20
  rows: T[];
19
21
  order: RowOrder;
20
22
  rowGroupingActive: boolean;
23
+ labelLayout?: LabelRowLayout | null;
24
+ labelSortMode?: LabelRowSortMode;
25
+ keepEmptySections?: boolean;
26
+ sortActive?: boolean;
27
+ getLabel?: (row: T) => string;
21
28
  groupColumns: GridColumn<T>[];
22
29
  aggColumns: GridColumn<T>[];
23
30
  collapsedGroupKeys: ReadonlySet<string>;
@@ -26,6 +33,7 @@ export type ClientSideRowModelInputs<T> = {
26
33
  export type ClientSideRowModelResolution<T> = {
27
34
  groupTree: GroupTree<T> | null;
28
35
  groupedDisplay: GroupedDisplay | null;
36
+ labelDisplay: LabelDisplay<T> | null;
29
37
  rowModel: RowModel<T>;
30
38
  };
31
39
  export type ServerSideQueryInputs = {
@@ -42,7 +50,8 @@ export type ServerSideQueryResolution = {
42
50
  queryKey: string;
43
51
  };
44
52
  export declare const createRowPipelineResolver: <T>() => {
45
- resolveBaseOrder: (rowCount: number) => RowOrder;
53
+ resolveLabelRowLayout: (rows: T[], isLabelRow: ((row: T, sourceIndex: number) => boolean) | undefined) => LabelRowLayout | null;
54
+ resolveBaseOrder: (rowCount: number, labelLayout?: LabelRowLayout | null) => RowOrder;
46
55
  resolveOrder: (inputs: RowOrderInputs<T>) => RowOrderResolution;
47
56
  resolveClientSideRowModel: (inputs: ClientSideRowModelInputs<T>) => ClientSideRowModelResolution<T>;
48
57
  resolveServerSideQuery: (inputs: ServerSideQueryInputs) => ServerSideQueryResolution;