cenitu-table 0.3.0 → 0.4.0-beta.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.
package/README.md CHANGED
@@ -19,6 +19,7 @@ A spreadsheet-like data grid with a built-in, multi-sheet formula engine. Writte
19
19
  - **Formatting:** bold, italic, underline, strike-through, colors, alignment, wrapping (Ctrl+B / I / U), conditional formatting for cells or whole rows.
20
20
  - **Layout:** frozen rows and columns, merged cells, hidden columns, column drag-and-drop.
21
21
  - **Formula engine:** 100+ functions (SUM, IF, XLOOKUP, SUMIFS, TEXT, date functions…), dynamic arrays that spill (FILTER, SORT, UNIQUE, SEQUENCE), cross-sheet references (`'Other sheet'!A1`), named expressions, incremental recalculation, cycle detection.
22
+ - **Server mode:** paging, sorting and filtering on your backend, with a page bar and text, list, date and yes/no filters.
22
23
  - **Data binding:** rows as arrays or as objects bound to columns by property path; edits are written back to your objects.
23
24
  - **Import and export:** read and write XLSX (formulas, formats, styles, frozen panes, merges), export CSV with protection against formula injection, all without any library.
24
25
  - **Accessibility:** ARIA grid roles and an announced active cell for screen readers.
@@ -114,6 +115,58 @@ book.sheets.forEach((sheet, i) => {
114
115
 
115
116
  Read: values, formulas, number formats, fonts, fills, alignment, column widths, row heights, hidden columns, frozen panes, merges and defined names. Not read: charts, images, comments, conditional formats, data validation and hidden rows (they are shown). Pass `formulas: 'values'` to take the results stored in the file instead of formulas, for example when a file uses functions the engine does not have.
116
117
 
118
+ ### Server mode
119
+
120
+ For lists too large to load, the grid describes the rows it needs and your application fetches them. It never sorts or filters on its own.
121
+
122
+ ```tsx
123
+ <CenituTable
124
+ dataMode="server"
125
+ rowKey="id"
126
+ data={page.items}
127
+ totalCount={page.totalCount}
128
+ loading={isFetching}
129
+ loadError={isError}
130
+ query={query}
131
+ onQueryChange={setQuery}
132
+ columns={[
133
+ { id: 'orderDate', data: 'orderDate', sortable: true, serverFilter: { kind: 'date' } },
134
+ { id: 'status', data: 'status', serverFilter: { kind: 'list', options: statusOptions } },
135
+ { id: 'partner', data: 'partner.name' },
136
+ ]}
137
+ />
138
+ ```
139
+
140
+ `query` holds `page`, `pageSize`, `sort: [{ field, desc }]`, `filters` and `search`, always with column ids, so hiding or moving columns cannot break it. Filters are `text`, `list`, `date` (`from`, `to`) or `boolean`. Without React, listen to the `afterQueryChange` hook and pass rows to `grid.setPageRows(rows, total)`.
141
+
142
+ Rules worth knowing:
143
+
144
+ - Only columns with `sortable` or `serverFilter` get a menu.
145
+ - Sort, filter and page size changes return to page 1.
146
+ - New rows keep the sort marks, filters, column layout, scroll position and, by `rowKey`, the selection.
147
+ - Ignoring outdated responses is up to the application, since it makes the requests.
148
+ - Change events carry `rowKey` and `columnId`; saving edits, also before a page change, is up to the application.
149
+ - Undo history ends with each new page.
150
+ - Formulas are off unless `formulas` is set, and they then see only the loaded page.
151
+ - Select all, find and replace, and CSV/XLSX export cover the loaded page only.
152
+ - Rows cannot be added or removed locally. A paste that does not fit is cut off and reported by `afterPasteClipped`.
153
+
154
+ ### Row events and saved column layout
155
+
156
+ ```tsx
157
+ <CenituTable
158
+ rowKey="id"
159
+ columnLayout={saved}
160
+ onColumnLayoutChange={(layout) => localStorage.setItem('orders', JSON.stringify(layout))}
161
+ onRowDoubleClick={({ rowKey }) => {
162
+ openOrder(rowKey);
163
+ return false; // keeps the cell editor closed
164
+ }}
165
+ />
166
+ ```
167
+
168
+ Layouts need column ids (`columns[i].id` or `data`). Removed columns are skipped when restoring, and new ones stay after the saved ones. A double click also fires two row clicks, as in the browser. `setColumnLayout` clears undo history when it moves columns.
169
+
117
170
  ### Find, formula bar, sorting by several columns
118
171
 
119
172
  ```ts
package/README.tr.md CHANGED
@@ -15,6 +15,7 @@ Spreadsheet benzeri bir data grid ve ona bağlı, çok sayfalı bir formül moto
15
15
  - **Biçimlendirme:** kalın, italik, altı çizili, üstü çizili, renkler, hizalama, metin kaydırma (Ctrl+B / I / U); hücre ya da tüm satır için koşullu biçimlendirme.
16
16
  - **Yerleşim:** sabit satır ve sütunlar, birleştirilmiş hücreler, gizli sütunlar, sürükleyerek sütun taşıma.
17
17
  - **Formül motoru:** 100'den fazla fonksiyon (SUM, IF, XLOOKUP, SUMIFS, TEXT, tarih fonksiyonları…), taşan dinamik diziler (FILTER, SORT, UNIQUE, SEQUENCE), sayfalar arası referanslar (`'Diğer Sayfa'!A1`), isimli ifadeler, artımlı yeniden hesaplama, döngü tespiti.
18
+ - **Sunucu modu:** sayfalama, sıralama ve süzme arka uçta; sayfa çubuğu ile metin, liste, tarih ve evet/hayır süzgeçleri.
18
19
  - **Veri bağlama:** satırlar dizi ya da nesne olarak verilebilir. Nesnelerde sütunlar alan yoluna bağlanır ve düzenlemeler nesnelerinize geri yazılır.
19
20
  - **İçe ve dışa aktarma:** XLSX okuma ve yazma (formüller, biçimler, stiller, sabit bölmeler, birleştirmeler), formül enjeksiyonuna karşı korumalı CSV; hiçbir kütüphane kullanmadan.
20
21
  - **Erişilebilirlik:** ARIA grid rolleri, ekran okuyucuya duyurulan aktif hücre.
@@ -112,6 +113,58 @@ kitap.sheets.forEach((sayfa, i) => {
112
113
 
113
114
  Okunanlar: değerler, formüller, sayı biçimleri, yazı tipleri, dolgular, hizalama, sütun genişlikleri, satır yükseklikleri, gizli sütunlar, sabit bölmeler, birleştirmeler ve tanımlı adlar. Okunmayanlar: grafikler, resimler, yorumlar, koşullu biçimler, veri doğrulama ve gizli satırlar (görünür hale gelir). Dosyada motorun bilmediği fonksiyonlar varsa `formulas: 'values'` ile formüller yerine dosyadaki sonuçları alabilirsiniz.
114
115
 
116
+ ### Sunucu modu
117
+
118
+ Tarayıcıya sığmayacak listelerde grid hangi satırlara ihtiyacı olduğunu bildirir, veriyi uygulamanız getirir. Grid kendi başına sıralama ya da süzme yapmaz.
119
+
120
+ ```tsx
121
+ <CenituTable
122
+ dataMode="server"
123
+ rowKey="id"
124
+ data={sayfa.items}
125
+ totalCount={sayfa.totalCount}
126
+ loading={yukleniyor}
127
+ loadError={hataVar}
128
+ query={sorgu}
129
+ onQueryChange={setSorgu}
130
+ columns={[
131
+ { id: 'orderDate', data: 'orderDate', sortable: true, serverFilter: { kind: 'date' } },
132
+ { id: 'status', data: 'status', serverFilter: { kind: 'list', options: durumlar } },
133
+ { id: 'partner', data: 'partner.name' },
134
+ ]}
135
+ />
136
+ ```
137
+
138
+ `query` içinde `page`, `pageSize`, `sort: [{ field, desc }]`, `filters` ve `search` bulunur. Alanlar her zaman kolon kimliğidir, bu yüzden kolon gizlemek ya da taşımak sorguyu bozmaz. Süzgeç türleri `text`, `list`, `date` (`from`, `to`) ve `boolean`'dır. React olmadan `afterQueryChange` olayını dinleyip satırları `grid.setPageRows(satirlar, toplam)` ile verin.
139
+
140
+ Bilmeniz gerekenler:
141
+
142
+ - Yalnızca `sortable` ya da `serverFilter` tanımlı kolonlarda menü çıkar.
143
+ - Sıralama, süzgeç ve sayfa boyutu değişince 1. sayfaya dönülür.
144
+ - Yeni satırlar gelince sıralama işaretleri, süzgeçler, kolon düzeni, kaydırma konumu ve `rowKey` ile seçim korunur.
145
+ - İstekleri uygulama yaptığı için eski yanıtları yok saymak da uygulamanın işidir.
146
+ - Değişiklik olayları `rowKey` ve `columnId` taşır; düzenlemeleri sayfa değişmeden önce de dahil kaydetmek uygulamaya aittir.
147
+ - Geri alma geçmişi her yeni sayfada sıfırlanır.
148
+ - `formulas` verilmedikçe formüller kapalıdır; açılırsa yalnızca yüklü sayfayı görür.
149
+ - Tümünü seçme, bul ve değiştir, CSV/XLSX dışa aktarma yalnızca yüklü sayfayı kapsar.
150
+ - Satırlar yerelde eklenip silinemez. Sığmayan yapıştırma kesilir ve `afterPasteClipped` ile bildirilir.
151
+
152
+ ### Satır olayları ve kolon düzeni
153
+
154
+ ```tsx
155
+ <CenituTable
156
+ rowKey="id"
157
+ columnLayout={kayitli}
158
+ onColumnLayoutChange={(duzen) => localStorage.setItem('siparisler', JSON.stringify(duzen))}
159
+ onRowDoubleClick={({ rowKey }) => {
160
+ siparisiAc(rowKey);
161
+ return false; // hücre editörünü kapalı tutar
162
+ }}
163
+ />
164
+ ```
165
+
166
+ Kolon düzeni için kolon kimliği gerekir (`columns[i].id` ya da `data`). Geri yüklerken kaldırılmış kolonlar atlanır, yeni kolonlar kayıtlı olanların sonrasında kalır. Tarayıcıdaki gibi çift tıklama iki satır tıklaması da üretir. `setColumnLayout` kolon taşırsa geri alma geçmişini temizler.
167
+
115
168
  ### Bul, formül çubuğu, çok sütunlu sıralama
116
169
 
117
170
  ```ts
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-BHarWDHD.cjs");exports.CSV_MIME=e.CSV_MIME;exports.CellError=e.CellError;exports.CenituGrid=e.CenituGrid;exports.FormulaEngine=e.FormulaEngine;exports.FormulaSyntaxError=e.FormulaSyntaxError;exports.MAX_COLS=e.MAX_COLS;exports.MAX_ROWS=e.MAX_ROWS;exports.RangeValue=e.RangeValue;exports.SHEET_SPAN=e.SHEET_SPAN;exports.XLSX_MIME=e.XLSX_MIME;exports.ZipReader=e.ZipReader;exports.cellKey=e.cellKey;exports.columnIndex=e.columnIndex;exports.columnLabel=e.columnLabel;exports.crc32=e.crc32;exports.dateCodeFromPattern=e.dateCodeFromPattern;exports.dateToSerial=e.dateToSerial;exports.downloadBlob=e.downloadBlob;exports.enUS=e.enUS;exports.formatDateCode=e.formatDateCode;exports.formatSerialDate=e.formatSerialDate;exports.getRegisteredFunctionNames=e.getRegisteredFunctionNames;exports.inverseMove=e.inverseMove;exports.isDateFormat=e.isDateFormat;exports.isError=e.isError;exports.isFormula=e.isFormula;exports.keyToAddress=e.keyToAddress;exports.normalizeRange=e.normalizeRange;exports.numberFormatFromMeta=e.numberFormatFromMeta;exports.parseA1=e.parseA1;exports.parseDateString=e.parseDateString;exports.parseFormula=e.parseFormula;exports.pxToColWidth=e.pxToColWidth;exports.quoteSheetName=e.quoteSheetName;exports.rangeContains=e.rangeContains;exports.readXLSX=e.readXLSX;exports.registerFunction=e.registerFunction;exports.sanitizeSheetNames=e.sanitizeSheetNames;exports.serialToDate=e.serialToDate;exports.setClock=e.setClock;exports.setRandom=e.setRandom;exports.toA1=e.toA1;exports.toCSV=e.toCSV;exports.toXLSX=e.toXLSX;exports.toXLSXCompressed=e.toXLSXCompressed;exports.trTR=e.trTR;exports.unparse=e.unparse;exports.unregisterFunction=e.unregisterFunction;exports.workbookEngine=e.workbookEngine;exports.xlsxParts=e.xlsxParts;exports.zipDeflate=e.zipDeflate;exports.zipStore=e.zipStore;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-Bidvqh7P.cjs");exports.CSV_MIME=e.CSV_MIME;exports.CellError=e.CellError;exports.CenituGrid=e.CenituGrid;exports.FormulaEngine=e.FormulaEngine;exports.FormulaSyntaxError=e.FormulaSyntaxError;exports.MAX_COLS=e.MAX_COLS;exports.MAX_ROWS=e.MAX_ROWS;exports.RangeValue=e.RangeValue;exports.SHEET_SPAN=e.SHEET_SPAN;exports.XLSX_MIME=e.XLSX_MIME;exports.ZipReader=e.ZipReader;exports.cellKey=e.cellKey;exports.columnIndex=e.columnIndex;exports.columnLabel=e.columnLabel;exports.crc32=e.crc32;exports.dateCodeFromPattern=e.dateCodeFromPattern;exports.dateToSerial=e.dateToSerial;exports.downloadBlob=e.downloadBlob;exports.enUS=e.enUS;exports.formatDateCode=e.formatDateCode;exports.formatSerialDate=e.formatSerialDate;exports.getRegisteredFunctionNames=e.getRegisteredFunctionNames;exports.inverseMove=e.inverseMove;exports.isDateFormat=e.isDateFormat;exports.isError=e.isError;exports.isFormula=e.isFormula;exports.keyToAddress=e.keyToAddress;exports.normalizeRange=e.normalizeRange;exports.numberFormatFromMeta=e.numberFormatFromMeta;exports.parseA1=e.parseA1;exports.parseDateString=e.parseDateString;exports.parseFormula=e.parseFormula;exports.pxToColWidth=e.pxToColWidth;exports.quoteSheetName=e.quoteSheetName;exports.rangeContains=e.rangeContains;exports.readXLSX=e.readXLSX;exports.registerFunction=e.registerFunction;exports.sanitizeSheetNames=e.sanitizeSheetNames;exports.serialToDate=e.serialToDate;exports.setClock=e.setClock;exports.setRandom=e.setRandom;exports.toA1=e.toA1;exports.toCSV=e.toCSV;exports.toXLSX=e.toXLSX;exports.toXLSXCompressed=e.toXLSXCompressed;exports.trTR=e.trTR;exports.unparse=e.unparse;exports.unregisterFunction=e.unregisterFunction;exports.workbookEngine=e.workbookEngine;exports.xlsxParts=e.xlsxParts;exports.zipDeflate=e.zipDeflate;exports.zipStore=e.zipStore;
@@ -1,4 +1,4 @@
1
- import { a as e, b as r, C as o, F as t, c as n, M as i, d as l, R as m, S, X as d, Z as u, e as C, f as F, g, h as p, j as X, k as c, l as E, m as M, n as R, o as x, p as A, q as D, r as L, s as T, t as _, u as b, v as f, w as k, x as z, y as N, z as h, A as y, B as I, D as P, E as V, G as v, H as w, I as W, J as q, K as B, L as G, N as H, P as K, Q as O, T as U, U as Z, V as j, W as J, Y as Q, _ as Y, $ } from "./index-BpjIy-X9.js";
1
+ import { a as e, b as r, C as o, F as t, c as n, M as i, d as l, R as m, S, X as d, Z as u, e as C, f as F, g, h as p, j as X, k as c, l as E, m as M, n as R, o as x, p as A, q as D, r as L, s as T, t as _, u as b, v as f, w as k, x as z, y as N, z as h, A as y, B as I, D as P, E as V, G as v, H as w, I as W, J as q, K as B, L as G, N as H, P as K, Q as O, T as U, U as Z, V as j, W as J, Y as Q, _ as Y, $ } from "./index-BIH30fQ2.js";
2
2
  export {
3
3
  e as CSV_MIME,
4
4
  r as CellError,