@xcelsior/ui-spreadsheets 1.0.17 → 1.1.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/dist/index.d.mts +28 -20
- package/dist/index.d.ts +28 -20
- package/dist/index.js +62 -125
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +62 -125
- package/dist/index.mjs.map +1 -1
- package/dist/styles/globals.css +14 -49
- package/dist/styles/globals.css.map +1 -1
- package/package.json +1 -1
- package/src/components/Spreadsheet.stories.tsx +0 -26
- package/src/components/Spreadsheet.tsx +190 -211
- package/src/components/SpreadsheetCell.tsx +7 -7
- package/src/components/SpreadsheetSettingsModal.tsx +5 -112
- package/src/hooks/index.ts +0 -2
- package/src/hooks/useSpreadsheetHighlighting.ts +0 -3
- package/src/hooks/useSpreadsheetPinning.ts +31 -4
- package/src/types.ts +25 -11
package/dist/index.d.mts
CHANGED
|
@@ -283,8 +283,6 @@ interface SpreadsheetProps<T = any> {
|
|
|
283
283
|
showToolbar?: boolean;
|
|
284
284
|
/** Whether to show pagination */
|
|
285
285
|
showPagination?: boolean;
|
|
286
|
-
/** Whether to show row index column (#) */
|
|
287
|
-
showRowIndex?: boolean;
|
|
288
286
|
/** Whether to enable row selection */
|
|
289
287
|
enableRowSelection?: boolean;
|
|
290
288
|
/** Whether to enable cell editing */
|
|
@@ -295,18 +293,34 @@ interface SpreadsheetProps<T = any> {
|
|
|
295
293
|
enableHighlighting?: boolean;
|
|
296
294
|
/** Whether to enable undo/redo */
|
|
297
295
|
enableUndoRedo?: boolean;
|
|
298
|
-
/** Initial page size */
|
|
299
|
-
defaultPageSize?: number;
|
|
300
296
|
/** Available page size options */
|
|
301
297
|
pageSizeOptions?: number[];
|
|
302
|
-
/** Initial zoom level */
|
|
303
|
-
defaultZoom?: number;
|
|
304
|
-
/** Whether to auto-save changes */
|
|
305
|
-
autoSave?: boolean;
|
|
306
298
|
/** Callback when changes are saved (called for both auto-save and manual save) */
|
|
307
299
|
onSave?: () => void | Promise<void>;
|
|
308
|
-
/**
|
|
309
|
-
|
|
300
|
+
/** Initial settings (optional). All settings can be changed by user in the settings modal. */
|
|
301
|
+
settings?: {
|
|
302
|
+
/** Default pinned column IDs */
|
|
303
|
+
defaultPinnedColumns?: string[];
|
|
304
|
+
/** Default sort configuration */
|
|
305
|
+
defaultSort?: SpreadsheetSortConfig | null;
|
|
306
|
+
/** Default page size */
|
|
307
|
+
defaultPageSize?: number;
|
|
308
|
+
/** Default zoom level */
|
|
309
|
+
defaultZoom?: number;
|
|
310
|
+
/** Whether auto-save is enabled */
|
|
311
|
+
autoSave?: boolean;
|
|
312
|
+
/** Whether compact view is enabled */
|
|
313
|
+
compactView?: boolean;
|
|
314
|
+
};
|
|
315
|
+
/** Callback when spreadsheet settings are changed by the user */
|
|
316
|
+
onSettingsChange?: (settings: {
|
|
317
|
+
compactView?: boolean;
|
|
318
|
+
autoSave?: boolean;
|
|
319
|
+
defaultPageSize?: number;
|
|
320
|
+
defaultZoom?: number;
|
|
321
|
+
defaultPinnedColumns?: string[];
|
|
322
|
+
defaultSort?: SpreadsheetSortConfig | null;
|
|
323
|
+
}) => void;
|
|
310
324
|
/** Loading state */
|
|
311
325
|
isLoading?: boolean;
|
|
312
326
|
/** Custom className */
|
|
@@ -521,7 +535,7 @@ interface SpreadsheetToolbarProps {
|
|
|
521
535
|
/** Save status */
|
|
522
536
|
saveStatus: 'saved' | 'saving' | 'unsaved' | 'error';
|
|
523
537
|
/** Whether auto-save is enabled */
|
|
524
|
-
autoSave
|
|
538
|
+
autoSave?: boolean;
|
|
525
539
|
/** Summary data to display */
|
|
526
540
|
summary?: {
|
|
527
541
|
label: string;
|
|
@@ -606,7 +620,7 @@ interface SpreadsheetColumnGroupHeaderProps {
|
|
|
606
620
|
* />
|
|
607
621
|
* ```
|
|
608
622
|
*/
|
|
609
|
-
declare function Spreadsheet<T extends Record<string, any>>({ data, columns, columnGroups, getRowId, onCellsEdit, onSelectionChange, onSortChange, onFilterChange, onRowClick, onRowDoubleClick, onRowClone, onRowDelete, onAddCellComment, onRowHighlight, showToolbar, showPagination,
|
|
623
|
+
declare function Spreadsheet<T extends Record<string, any>>({ data, columns, columnGroups, getRowId, onCellsEdit, onSelectionChange, onSortChange, onFilterChange, onRowClick, onRowDoubleClick, onRowClone, onRowDelete, onAddCellComment, onRowHighlight, showToolbar, showPagination, enableRowSelection, enableCellEditing, enableComments, enableHighlighting, enableUndoRedo, pageSizeOptions, onSave, settings: initialSettings, onSettingsChange, isLoading, className, emptyMessage, rowHighlights: externalRowHighlights, cellComments: externalCellComments, rowActions, toolbarMenuItems, serverSide, totalItems, currentPage: controlledCurrentPage, pageSize: controlledPageSize, onPageChange, filters: controlledFilters, }: SpreadsheetProps<T>): react_jsx_runtime.JSX.Element;
|
|
610
624
|
declare namespace Spreadsheet {
|
|
611
625
|
var displayName: string;
|
|
612
626
|
}
|
|
@@ -679,15 +693,9 @@ interface SpreadsheetSettings {
|
|
|
679
693
|
/** Default zoom level */
|
|
680
694
|
defaultZoom: number;
|
|
681
695
|
/** Whether auto-save is enabled */
|
|
682
|
-
autoSave
|
|
696
|
+
autoSave?: boolean;
|
|
683
697
|
/** Whether compact view is enabled */
|
|
684
|
-
compactView
|
|
685
|
-
/** Whether to show row index column */
|
|
686
|
-
showRowIndex?: boolean;
|
|
687
|
-
/** Whether row index column is pinned */
|
|
688
|
-
pinRowIndex?: boolean;
|
|
689
|
-
/** Row index column highlight color */
|
|
690
|
-
rowIndexHighlightColor?: string;
|
|
698
|
+
compactView?: boolean;
|
|
691
699
|
}
|
|
692
700
|
interface SpreadsheetSettingsModalProps {
|
|
693
701
|
/** Whether the modal is open */
|
package/dist/index.d.ts
CHANGED
|
@@ -283,8 +283,6 @@ interface SpreadsheetProps<T = any> {
|
|
|
283
283
|
showToolbar?: boolean;
|
|
284
284
|
/** Whether to show pagination */
|
|
285
285
|
showPagination?: boolean;
|
|
286
|
-
/** Whether to show row index column (#) */
|
|
287
|
-
showRowIndex?: boolean;
|
|
288
286
|
/** Whether to enable row selection */
|
|
289
287
|
enableRowSelection?: boolean;
|
|
290
288
|
/** Whether to enable cell editing */
|
|
@@ -295,18 +293,34 @@ interface SpreadsheetProps<T = any> {
|
|
|
295
293
|
enableHighlighting?: boolean;
|
|
296
294
|
/** Whether to enable undo/redo */
|
|
297
295
|
enableUndoRedo?: boolean;
|
|
298
|
-
/** Initial page size */
|
|
299
|
-
defaultPageSize?: number;
|
|
300
296
|
/** Available page size options */
|
|
301
297
|
pageSizeOptions?: number[];
|
|
302
|
-
/** Initial zoom level */
|
|
303
|
-
defaultZoom?: number;
|
|
304
|
-
/** Whether to auto-save changes */
|
|
305
|
-
autoSave?: boolean;
|
|
306
298
|
/** Callback when changes are saved (called for both auto-save and manual save) */
|
|
307
299
|
onSave?: () => void | Promise<void>;
|
|
308
|
-
/**
|
|
309
|
-
|
|
300
|
+
/** Initial settings (optional). All settings can be changed by user in the settings modal. */
|
|
301
|
+
settings?: {
|
|
302
|
+
/** Default pinned column IDs */
|
|
303
|
+
defaultPinnedColumns?: string[];
|
|
304
|
+
/** Default sort configuration */
|
|
305
|
+
defaultSort?: SpreadsheetSortConfig | null;
|
|
306
|
+
/** Default page size */
|
|
307
|
+
defaultPageSize?: number;
|
|
308
|
+
/** Default zoom level */
|
|
309
|
+
defaultZoom?: number;
|
|
310
|
+
/** Whether auto-save is enabled */
|
|
311
|
+
autoSave?: boolean;
|
|
312
|
+
/** Whether compact view is enabled */
|
|
313
|
+
compactView?: boolean;
|
|
314
|
+
};
|
|
315
|
+
/** Callback when spreadsheet settings are changed by the user */
|
|
316
|
+
onSettingsChange?: (settings: {
|
|
317
|
+
compactView?: boolean;
|
|
318
|
+
autoSave?: boolean;
|
|
319
|
+
defaultPageSize?: number;
|
|
320
|
+
defaultZoom?: number;
|
|
321
|
+
defaultPinnedColumns?: string[];
|
|
322
|
+
defaultSort?: SpreadsheetSortConfig | null;
|
|
323
|
+
}) => void;
|
|
310
324
|
/** Loading state */
|
|
311
325
|
isLoading?: boolean;
|
|
312
326
|
/** Custom className */
|
|
@@ -521,7 +535,7 @@ interface SpreadsheetToolbarProps {
|
|
|
521
535
|
/** Save status */
|
|
522
536
|
saveStatus: 'saved' | 'saving' | 'unsaved' | 'error';
|
|
523
537
|
/** Whether auto-save is enabled */
|
|
524
|
-
autoSave
|
|
538
|
+
autoSave?: boolean;
|
|
525
539
|
/** Summary data to display */
|
|
526
540
|
summary?: {
|
|
527
541
|
label: string;
|
|
@@ -606,7 +620,7 @@ interface SpreadsheetColumnGroupHeaderProps {
|
|
|
606
620
|
* />
|
|
607
621
|
* ```
|
|
608
622
|
*/
|
|
609
|
-
declare function Spreadsheet<T extends Record<string, any>>({ data, columns, columnGroups, getRowId, onCellsEdit, onSelectionChange, onSortChange, onFilterChange, onRowClick, onRowDoubleClick, onRowClone, onRowDelete, onAddCellComment, onRowHighlight, showToolbar, showPagination,
|
|
623
|
+
declare function Spreadsheet<T extends Record<string, any>>({ data, columns, columnGroups, getRowId, onCellsEdit, onSelectionChange, onSortChange, onFilterChange, onRowClick, onRowDoubleClick, onRowClone, onRowDelete, onAddCellComment, onRowHighlight, showToolbar, showPagination, enableRowSelection, enableCellEditing, enableComments, enableHighlighting, enableUndoRedo, pageSizeOptions, onSave, settings: initialSettings, onSettingsChange, isLoading, className, emptyMessage, rowHighlights: externalRowHighlights, cellComments: externalCellComments, rowActions, toolbarMenuItems, serverSide, totalItems, currentPage: controlledCurrentPage, pageSize: controlledPageSize, onPageChange, filters: controlledFilters, }: SpreadsheetProps<T>): react_jsx_runtime.JSX.Element;
|
|
610
624
|
declare namespace Spreadsheet {
|
|
611
625
|
var displayName: string;
|
|
612
626
|
}
|
|
@@ -679,15 +693,9 @@ interface SpreadsheetSettings {
|
|
|
679
693
|
/** Default zoom level */
|
|
680
694
|
defaultZoom: number;
|
|
681
695
|
/** Whether auto-save is enabled */
|
|
682
|
-
autoSave
|
|
696
|
+
autoSave?: boolean;
|
|
683
697
|
/** Whether compact view is enabled */
|
|
684
|
-
compactView
|
|
685
|
-
/** Whether to show row index column */
|
|
686
|
-
showRowIndex?: boolean;
|
|
687
|
-
/** Whether row index column is pinned */
|
|
688
|
-
pinRowIndex?: boolean;
|
|
689
|
-
/** Row index column highlight color */
|
|
690
|
-
rowIndexHighlightColor?: string;
|
|
698
|
+
compactView?: boolean;
|
|
691
699
|
}
|
|
692
700
|
interface SpreadsheetSettingsModalProps {
|
|
693
701
|
/** Whether the modal is open */
|
package/dist/index.js
CHANGED
|
@@ -292,8 +292,8 @@ var SpreadsheetCell = ({
|
|
|
292
292
|
onKeyDown: handleKeyDown,
|
|
293
293
|
onBlur: () => onConfirm?.(localValue),
|
|
294
294
|
className: cn(
|
|
295
|
-
"w-full border
|
|
296
|
-
compactMode ? "
|
|
295
|
+
"w-full border-0 bg-blue-50 focus:outline-none focus:ring-1 focus:ring-blue-500 rounded-sm",
|
|
296
|
+
compactMode ? "text-[10px]" : "text-xs"
|
|
297
297
|
),
|
|
298
298
|
children: column.options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: option, children: option }, option))
|
|
299
299
|
}
|
|
@@ -317,8 +317,8 @@ var SpreadsheetCell = ({
|
|
|
317
317
|
autoCapitalize: "off",
|
|
318
318
|
spellCheck: false,
|
|
319
319
|
className: cn(
|
|
320
|
-
"w-full border
|
|
321
|
-
compactMode ? "
|
|
320
|
+
"w-full border-0 bg-blue-50 focus:outline-none focus:ring-1 focus:ring-blue-500 rounded-sm",
|
|
321
|
+
compactMode ? "text-[10px]" : "text-xs"
|
|
322
322
|
)
|
|
323
323
|
}
|
|
324
324
|
);
|
|
@@ -370,7 +370,7 @@ var SpreadsheetCell = ({
|
|
|
370
370
|
onKeyDown: handleCellKeyDown,
|
|
371
371
|
"data-cell-id": `${rowId}-${column.id}`,
|
|
372
372
|
className: cn(
|
|
373
|
-
"border border-gray-200 group cursor-pointer
|
|
373
|
+
"border border-gray-200 group cursor-pointer select-none",
|
|
374
374
|
compactMode ? "text-[10px]" : "text-xs",
|
|
375
375
|
cellPadding,
|
|
376
376
|
column.align === "right" && "text-right",
|
|
@@ -393,7 +393,7 @@ var SpreadsheetCell = ({
|
|
|
393
393
|
{
|
|
394
394
|
className: cn(
|
|
395
395
|
"flex-1 truncate",
|
|
396
|
-
isEditable && "cursor-text
|
|
396
|
+
isEditable && "cursor-text bg-blue-50/50 rounded"
|
|
397
397
|
),
|
|
398
398
|
title: String(value ?? ""),
|
|
399
399
|
children: renderContent()
|
|
@@ -469,6 +469,7 @@ var MemoizedSpreadsheetCell = (0, import_react3.memo)(SpreadsheetCell, (prevProp
|
|
|
469
469
|
if (prevProps.isPinned !== nextProps.isPinned) return false;
|
|
470
470
|
if (prevProps.leftOffset !== nextProps.leftOffset) return false;
|
|
471
471
|
if (prevProps.rightOffset !== nextProps.rightOffset) return false;
|
|
472
|
+
if (prevProps.compactMode !== nextProps.compactMode) return false;
|
|
472
473
|
const prevEdge = prevProps.selectionEdge;
|
|
473
474
|
const nextEdge = nextProps.selectionEdge;
|
|
474
475
|
if (prevEdge !== nextEdge) {
|
|
@@ -1273,7 +1274,8 @@ SpreadsheetHeader.displayName = "SpreadsheetHeader";
|
|
|
1273
1274
|
|
|
1274
1275
|
// src/hooks/useSpreadsheetPinning.ts
|
|
1275
1276
|
var import_react6 = require("react");
|
|
1276
|
-
var
|
|
1277
|
+
var ROW_INDEX_COLUMN_ID = "__row_index__";
|
|
1278
|
+
var ROW_INDEX_COLUMN_WIDTH = 80;
|
|
1277
1279
|
function useSpreadsheetPinning({
|
|
1278
1280
|
columns,
|
|
1279
1281
|
columnGroups,
|
|
@@ -1284,11 +1286,15 @@ function useSpreadsheetPinning({
|
|
|
1284
1286
|
const [pinnedColumns, setPinnedColumns] = (0, import_react6.useState)(() => {
|
|
1285
1287
|
const map = /* @__PURE__ */ new Map();
|
|
1286
1288
|
defaultPinnedColumns.forEach((col) => {
|
|
1287
|
-
|
|
1289
|
+
if (col !== ROW_INDEX_COLUMN_ID) {
|
|
1290
|
+
map.set(col, "left");
|
|
1291
|
+
}
|
|
1288
1292
|
});
|
|
1289
1293
|
return map;
|
|
1290
1294
|
});
|
|
1291
|
-
const [isRowIndexPinned, setIsRowIndexPinned] = (0, import_react6.useState)(
|
|
1295
|
+
const [isRowIndexPinned, setIsRowIndexPinned] = (0, import_react6.useState)(
|
|
1296
|
+
defaultPinRowIndex || defaultPinnedColumns.includes(ROW_INDEX_COLUMN_ID)
|
|
1297
|
+
);
|
|
1292
1298
|
const [collapsedGroups, setCollapsedGroups] = (0, import_react6.useState)(/* @__PURE__ */ new Set());
|
|
1293
1299
|
const handleTogglePin = (0, import_react6.useCallback)((columnId) => {
|
|
1294
1300
|
setPinnedColumns((prev) => {
|
|
@@ -1304,6 +1310,19 @@ function useSpreadsheetPinning({
|
|
|
1304
1310
|
const handleToggleRowIndexPin = (0, import_react6.useCallback)(() => {
|
|
1305
1311
|
setIsRowIndexPinned((prev) => !prev);
|
|
1306
1312
|
}, []);
|
|
1313
|
+
const setPinnedColumnsFromIds = (0, import_react6.useCallback)((columnIds) => {
|
|
1314
|
+
const map = /* @__PURE__ */ new Map();
|
|
1315
|
+
columnIds.forEach((col) => {
|
|
1316
|
+
if (col !== ROW_INDEX_COLUMN_ID) {
|
|
1317
|
+
map.set(col, "left");
|
|
1318
|
+
}
|
|
1319
|
+
});
|
|
1320
|
+
setPinnedColumns(map);
|
|
1321
|
+
setIsRowIndexPinned(columnIds.includes(ROW_INDEX_COLUMN_ID));
|
|
1322
|
+
}, []);
|
|
1323
|
+
const setRowIndexPinned = (0, import_react6.useCallback)((pinned) => {
|
|
1324
|
+
setIsRowIndexPinned(pinned);
|
|
1325
|
+
}, []);
|
|
1307
1326
|
const handleToggleGroupCollapse = (0, import_react6.useCallback)((groupId) => {
|
|
1308
1327
|
setCollapsedGroups((prev) => {
|
|
1309
1328
|
const newSet = new Set(prev);
|
|
@@ -1388,6 +1407,8 @@ function useSpreadsheetPinning({
|
|
|
1388
1407
|
handleTogglePin,
|
|
1389
1408
|
handleToggleRowIndexPin,
|
|
1390
1409
|
handleToggleGroupCollapse,
|
|
1410
|
+
setPinnedColumnsFromIds,
|
|
1411
|
+
setRowIndexPinned,
|
|
1391
1412
|
getColumnLeftOffset,
|
|
1392
1413
|
getRowIndexLeftOffset,
|
|
1393
1414
|
isColumnPinned,
|
|
@@ -1497,7 +1518,6 @@ var HIGHLIGHT_COLORS = {
|
|
|
1497
1518
|
// gray-200
|
|
1498
1519
|
]
|
|
1499
1520
|
};
|
|
1500
|
-
var ROW_INDEX_COLUMN_ID = "__row_index__";
|
|
1501
1521
|
function useSpreadsheetHighlighting({
|
|
1502
1522
|
externalRowHighlights,
|
|
1503
1523
|
onRowHighlight
|
|
@@ -1665,10 +1685,7 @@ var DEFAULT_SETTINGS = {
|
|
|
1665
1685
|
defaultPageSize: 25,
|
|
1666
1686
|
defaultZoom: 100,
|
|
1667
1687
|
autoSave: true,
|
|
1668
|
-
compactView: false
|
|
1669
|
-
showRowIndex: true,
|
|
1670
|
-
pinRowIndex: false,
|
|
1671
|
-
rowIndexHighlightColor: void 0
|
|
1688
|
+
compactView: false
|
|
1672
1689
|
};
|
|
1673
1690
|
var SpreadsheetSettingsModal = ({
|
|
1674
1691
|
isOpen,
|
|
@@ -1798,11 +1815,8 @@ var SpreadsheetSettingsModal = ({
|
|
|
1798
1815
|
"button",
|
|
1799
1816
|
{
|
|
1800
1817
|
type: "button",
|
|
1801
|
-
onClick: () =>
|
|
1802
|
-
|
|
1803
|
-
pinRowIndex: !localSettings.pinRowIndex
|
|
1804
|
-
}),
|
|
1805
|
-
className: `flex items-center gap-2 p-3 rounded-lg border transition-colors text-left ${localSettings.pinRowIndex !== false ? "bg-blue-50 border-blue-300 text-blue-700" : "bg-gray-50 border-gray-200 text-gray-700 hover:border-blue-300"}`,
|
|
1818
|
+
onClick: () => togglePinnedColumn("__row_index__"),
|
|
1819
|
+
className: `flex items-center gap-2 p-3 rounded-lg border transition-colors text-left ${localSettings.defaultPinnedColumns.includes("__row_index__") ? "bg-blue-50 border-blue-300 text-blue-700" : "bg-gray-50 border-gray-200 text-gray-700 hover:border-blue-300"}`,
|
|
1806
1820
|
children: [
|
|
1807
1821
|
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(HiViewBoards, { className: "h-4 w-4 shrink-0" }),
|
|
1808
1822
|
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "text-sm flex-1 truncate", children: "# (Row Index)" })
|
|
@@ -1827,47 +1841,6 @@ var SpreadsheetSettingsModal = ({
|
|
|
1827
1841
|
column.id
|
|
1828
1842
|
);
|
|
1829
1843
|
})
|
|
1830
|
-
] }),
|
|
1831
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "mt-6 p-4 bg-amber-50 border border-amber-200 rounded-lg", children: [
|
|
1832
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "text-sm font-semibold text-gray-900 mb-3", children: "Row Index Column Highlight" }),
|
|
1833
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "text-sm text-gray-600 mb-3", children: "Apply a highlight color to the # (row index) column to make it stand out." }),
|
|
1834
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "flex items-center gap-2 flex-wrap", children: [
|
|
1835
|
-
[
|
|
1836
|
-
"#fef3c7",
|
|
1837
|
-
"#dbeafe",
|
|
1838
|
-
"#dcfce7",
|
|
1839
|
-
"#fce7f3",
|
|
1840
|
-
"#f3e8ff",
|
|
1841
|
-
"#e0e7ff",
|
|
1842
|
-
"#fed7d7",
|
|
1843
|
-
"#c6f6d5"
|
|
1844
|
-
].map((color) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
1845
|
-
"button",
|
|
1846
|
-
{
|
|
1847
|
-
type: "button",
|
|
1848
|
-
onClick: () => setLocalSettings({
|
|
1849
|
-
...localSettings,
|
|
1850
|
-
rowIndexHighlightColor: localSettings.rowIndexHighlightColor === color ? void 0 : color
|
|
1851
|
-
}),
|
|
1852
|
-
className: `w-8 h-8 rounded-lg border-2 transition-all ${localSettings.rowIndexHighlightColor === color ? "border-blue-600 scale-110 ring-2 ring-blue-300" : "border-gray-300 hover:border-gray-400"}`,
|
|
1853
|
-
style: { backgroundColor: color },
|
|
1854
|
-
title: localSettings.rowIndexHighlightColor === color ? "Remove highlight" : "Apply highlight"
|
|
1855
|
-
},
|
|
1856
|
-
color
|
|
1857
|
-
)),
|
|
1858
|
-
localSettings.rowIndexHighlightColor && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
1859
|
-
"button",
|
|
1860
|
-
{
|
|
1861
|
-
type: "button",
|
|
1862
|
-
onClick: () => setLocalSettings({
|
|
1863
|
-
...localSettings,
|
|
1864
|
-
rowIndexHighlightColor: void 0
|
|
1865
|
-
}),
|
|
1866
|
-
className: "text-sm text-red-600 hover:text-red-700 ml-2 px-2 py-1 rounded hover:bg-red-50",
|
|
1867
|
-
children: "Clear"
|
|
1868
|
-
}
|
|
1869
|
-
)
|
|
1870
|
-
] })
|
|
1871
1844
|
] })
|
|
1872
1845
|
] }),
|
|
1873
1846
|
activeTab === "sorting" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { children: [
|
|
@@ -1913,27 +1886,6 @@ var SpreadsheetSettingsModal = ({
|
|
|
1913
1886
|
] }),
|
|
1914
1887
|
activeTab === "display" && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "space-y-5", children: [
|
|
1915
1888
|
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "text-sm text-gray-600", children: "Customize the display and behavior of the spreadsheet." }),
|
|
1916
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "p-4 bg-blue-50 border border-blue-200 rounded-lg", children: [
|
|
1917
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "text-sm font-semibold text-gray-900 mb-3", children: "Row Index Column" }),
|
|
1918
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "space-y-3", children: [
|
|
1919
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("label", { className: "flex items-center gap-3 cursor-pointer", children: [
|
|
1920
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
1921
|
-
"input",
|
|
1922
|
-
{
|
|
1923
|
-
type: "checkbox",
|
|
1924
|
-
checked: localSettings.showRowIndex !== false,
|
|
1925
|
-
onChange: (e) => setLocalSettings({
|
|
1926
|
-
...localSettings,
|
|
1927
|
-
showRowIndex: e.target.checked
|
|
1928
|
-
}),
|
|
1929
|
-
className: "w-4 h-4 cursor-pointer rounded border-gray-300 text-blue-600 focus:ring-blue-500"
|
|
1930
|
-
}
|
|
1931
|
-
),
|
|
1932
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "text-sm text-gray-700", children: "Show row index (#) column" })
|
|
1933
|
-
] }),
|
|
1934
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "text-xs text-gray-500 ml-7", children: 'Tip: Use the "Pinned Columns" tab to pin and highlight the row index column.' })
|
|
1935
|
-
] })
|
|
1936
|
-
] }),
|
|
1937
1889
|
/* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { children: [
|
|
1938
1890
|
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("label", { className: "block text-sm font-medium text-gray-900 mb-2", children: "Default Page Size" }),
|
|
1939
1891
|
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
@@ -3374,18 +3326,15 @@ function Spreadsheet({
|
|
|
3374
3326
|
onRowHighlight,
|
|
3375
3327
|
showToolbar = true,
|
|
3376
3328
|
showPagination = true,
|
|
3377
|
-
showRowIndex = true,
|
|
3378
3329
|
enableRowSelection = true,
|
|
3379
3330
|
enableCellEditing = true,
|
|
3380
3331
|
enableComments = true,
|
|
3381
3332
|
enableHighlighting = true,
|
|
3382
3333
|
enableUndoRedo = true,
|
|
3383
|
-
defaultPageSize = 25,
|
|
3384
3334
|
pageSizeOptions = [25, 50, 100, 200],
|
|
3385
|
-
defaultZoom = 100,
|
|
3386
|
-
autoSave = true,
|
|
3387
3335
|
onSave,
|
|
3388
|
-
|
|
3336
|
+
settings: initialSettings,
|
|
3337
|
+
onSettingsChange,
|
|
3389
3338
|
isLoading = false,
|
|
3390
3339
|
className,
|
|
3391
3340
|
emptyMessage = "No data available",
|
|
@@ -3399,9 +3348,16 @@ function Spreadsheet({
|
|
|
3399
3348
|
currentPage: controlledCurrentPage,
|
|
3400
3349
|
pageSize: controlledPageSize,
|
|
3401
3350
|
onPageChange,
|
|
3402
|
-
sortConfig: controlledSortConfig,
|
|
3403
3351
|
filters: controlledFilters
|
|
3404
3352
|
}) {
|
|
3353
|
+
const [spreadsheetSettings, setSpreadsheetSettings] = (0, import_react16.useState)({
|
|
3354
|
+
defaultPinnedColumns: initialSettings?.defaultPinnedColumns ?? [],
|
|
3355
|
+
defaultSort: initialSettings?.defaultSort ?? null,
|
|
3356
|
+
defaultPageSize: initialSettings?.defaultPageSize ?? 25,
|
|
3357
|
+
defaultZoom: initialSettings?.defaultZoom ?? 100,
|
|
3358
|
+
autoSave: initialSettings?.autoSave ?? true,
|
|
3359
|
+
compactView: initialSettings?.compactView ?? false
|
|
3360
|
+
});
|
|
3405
3361
|
const {
|
|
3406
3362
|
filters,
|
|
3407
3363
|
sortConfig,
|
|
@@ -3420,7 +3376,7 @@ function Spreadsheet({
|
|
|
3420
3376
|
onSortChange,
|
|
3421
3377
|
serverSide,
|
|
3422
3378
|
controlledFilters,
|
|
3423
|
-
controlledSortConfig
|
|
3379
|
+
controlledSortConfig: spreadsheetSettings?.defaultSort
|
|
3424
3380
|
});
|
|
3425
3381
|
const {
|
|
3426
3382
|
getCellHighlight,
|
|
@@ -3445,15 +3401,14 @@ function Spreadsheet({
|
|
|
3445
3401
|
collapsedGroups,
|
|
3446
3402
|
visibleColumns,
|
|
3447
3403
|
handleTogglePin,
|
|
3448
|
-
handleToggleRowIndexPin,
|
|
3449
3404
|
handleToggleGroupCollapse,
|
|
3405
|
+
setPinnedColumnsFromIds,
|
|
3450
3406
|
getColumnLeftOffset,
|
|
3451
3407
|
isColumnPinned,
|
|
3452
3408
|
getColumnPinSide
|
|
3453
3409
|
} = useSpreadsheetPinning({
|
|
3454
3410
|
columns,
|
|
3455
|
-
columnGroups
|
|
3456
|
-
showRowIndex
|
|
3411
|
+
columnGroups
|
|
3457
3412
|
});
|
|
3458
3413
|
const {
|
|
3459
3414
|
getCellComments,
|
|
@@ -3470,18 +3425,6 @@ function Spreadsheet({
|
|
|
3470
3425
|
onAddCellComment
|
|
3471
3426
|
});
|
|
3472
3427
|
const [showSettingsModal, setShowSettingsModal] = (0, import_react16.useState)(false);
|
|
3473
|
-
const [spreadsheetSettings, setSpreadsheetSettings] = (0, import_react16.useState)({
|
|
3474
|
-
defaultPinnedColumns: [],
|
|
3475
|
-
defaultSort: null,
|
|
3476
|
-
defaultPageSize,
|
|
3477
|
-
defaultZoom,
|
|
3478
|
-
autoSave,
|
|
3479
|
-
compactView: compactMode,
|
|
3480
|
-
showRowIndex,
|
|
3481
|
-
pinRowIndex: false,
|
|
3482
|
-
rowIndexHighlightColor: void 0
|
|
3483
|
-
});
|
|
3484
|
-
const effectiveAutoSave = spreadsheetSettings.autoSave ?? autoSave;
|
|
3485
3428
|
const {
|
|
3486
3429
|
canUndo,
|
|
3487
3430
|
canRedo,
|
|
@@ -3496,15 +3439,15 @@ function Spreadsheet({
|
|
|
3496
3439
|
markAsChanged
|
|
3497
3440
|
} = useSpreadsheetUndoRedo({
|
|
3498
3441
|
enabled: enableUndoRedo,
|
|
3499
|
-
autoSave:
|
|
3442
|
+
autoSave: spreadsheetSettings.autoSave,
|
|
3500
3443
|
onSave
|
|
3501
3444
|
});
|
|
3502
3445
|
const [selectedRows, setSelectedRows] = (0, import_react16.useState)(/* @__PURE__ */ new Set());
|
|
3503
3446
|
const [lastSelectedRow, setLastSelectedRow] = (0, import_react16.useState)(null);
|
|
3504
3447
|
const [hoveredRow, setHoveredRow] = (0, import_react16.useState)(null);
|
|
3505
3448
|
const [internalCurrentPage, setInternalCurrentPage] = (0, import_react16.useState)(1);
|
|
3506
|
-
const [internalPageSize, setInternalPageSize] = (0, import_react16.useState)(defaultPageSize);
|
|
3507
|
-
const [zoom, setZoom] = (0, import_react16.useState)(defaultZoom);
|
|
3449
|
+
const [internalPageSize, setInternalPageSize] = (0, import_react16.useState)(spreadsheetSettings.defaultPageSize);
|
|
3450
|
+
const [zoom, setZoom] = (0, import_react16.useState)(spreadsheetSettings.defaultZoom);
|
|
3508
3451
|
const currentPage = controlledCurrentPage ?? internalCurrentPage;
|
|
3509
3452
|
const pageSize = controlledPageSize ?? internalPageSize;
|
|
3510
3453
|
const handlePageChange = (0, import_react16.useCallback)(
|
|
@@ -3577,7 +3520,6 @@ function Spreadsheet({
|
|
|
3577
3520
|
}, [filteredData, currentPage, pageSize, serverSide]);
|
|
3578
3521
|
const {
|
|
3579
3522
|
focusedCell,
|
|
3580
|
-
setFocusedCell,
|
|
3581
3523
|
editingCell,
|
|
3582
3524
|
setEditingCell,
|
|
3583
3525
|
handleCellMouseDown,
|
|
@@ -3692,8 +3634,7 @@ function Spreadsheet({
|
|
|
3692
3634
|
isEditing: editingCell !== null,
|
|
3693
3635
|
enabled: true
|
|
3694
3636
|
});
|
|
3695
|
-
const
|
|
3696
|
-
const effectiveCompactMode = spreadsheetSettings.compactView ?? compactMode;
|
|
3637
|
+
const effectiveCompactMode = spreadsheetSettings.compactView ?? false;
|
|
3697
3638
|
const rowIndexHighlightColor = getColumnHighlight(ROW_INDEX_COLUMN_ID);
|
|
3698
3639
|
const tableRef = (0, import_react16.useRef)(null);
|
|
3699
3640
|
const effectiveTotalItems = serverSide ? totalItems ?? data.length : filteredData.length;
|
|
@@ -3821,7 +3762,7 @@ function Spreadsheet({
|
|
|
3821
3762
|
selectedRowCount: selectedRows.size,
|
|
3822
3763
|
hasUnsavedChanges,
|
|
3823
3764
|
saveStatus,
|
|
3824
|
-
autoSave:
|
|
3765
|
+
autoSave: spreadsheetSettings.autoSave,
|
|
3825
3766
|
hasActiveFilters,
|
|
3826
3767
|
onClearFilters: clearAllFilters,
|
|
3827
3768
|
onZoomIn: () => setZoom((z) => Math.min(z + 10, 200)),
|
|
@@ -3851,14 +3792,14 @@ function Spreadsheet({
|
|
|
3851
3792
|
children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("table", { className: "w-full border-separate border-spacing-0 text-xs select-none", children: [
|
|
3852
3793
|
/* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("thead", { children: [
|
|
3853
3794
|
columnGroups && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("tr", { children: [
|
|
3854
|
-
|
|
3795
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
3855
3796
|
RowIndexColumnHeader,
|
|
3856
3797
|
{
|
|
3857
3798
|
enableHighlighting,
|
|
3858
3799
|
highlightColor: rowIndexHighlightColor,
|
|
3859
3800
|
isPinned: isRowIndexPinned,
|
|
3860
3801
|
onHighlightClick: handleRowIndexHighlightClick,
|
|
3861
|
-
onPinClick:
|
|
3802
|
+
onPinClick: () => handleTogglePin(ROW_INDEX_COLUMN_ID),
|
|
3862
3803
|
hasColumnGroups: true,
|
|
3863
3804
|
compactMode: effectiveCompactMode
|
|
3864
3805
|
}
|
|
@@ -3895,14 +3836,14 @@ function Spreadsheet({
|
|
|
3895
3836
|
})
|
|
3896
3837
|
] }),
|
|
3897
3838
|
/* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("tr", { children: [
|
|
3898
|
-
|
|
3839
|
+
!columnGroups && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
3899
3840
|
RowIndexColumnHeader,
|
|
3900
3841
|
{
|
|
3901
3842
|
enableHighlighting,
|
|
3902
3843
|
highlightColor: rowIndexHighlightColor,
|
|
3903
3844
|
isPinned: isRowIndexPinned,
|
|
3904
3845
|
onHighlightClick: handleRowIndexHighlightClick,
|
|
3905
|
-
onPinClick:
|
|
3846
|
+
onPinClick: () => handleTogglePin(ROW_INDEX_COLUMN_ID),
|
|
3906
3847
|
hasColumnGroups: false,
|
|
3907
3848
|
compactMode: effectiveCompactMode
|
|
3908
3849
|
}
|
|
@@ -3944,7 +3885,7 @@ function Spreadsheet({
|
|
|
3944
3885
|
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)("tbody", { children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("tr", { children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
3945
3886
|
"td",
|
|
3946
3887
|
{
|
|
3947
|
-
colSpan: visibleColumns.length +
|
|
3888
|
+
colSpan: visibleColumns.length + 1,
|
|
3948
3889
|
className: "text-center py-8 text-gray-500",
|
|
3949
3890
|
children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center justify-center gap-2", children: [
|
|
3950
3891
|
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "w-4 h-4 border-2 border-blue-600 border-t-transparent rounded-full animate-spin" }),
|
|
@@ -3954,7 +3895,7 @@ function Spreadsheet({
|
|
|
3954
3895
|
) }) : paginatedData.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("tr", { children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
3955
3896
|
"td",
|
|
3956
3897
|
{
|
|
3957
|
-
colSpan: visibleColumns.length +
|
|
3898
|
+
colSpan: visibleColumns.length + 1,
|
|
3958
3899
|
className: "text-center py-8 text-gray-500",
|
|
3959
3900
|
children: emptyMessage
|
|
3960
3901
|
}
|
|
@@ -3973,9 +3914,8 @@ function Spreadsheet({
|
|
|
3973
3914
|
onRowClick?.(row, rowIndex);
|
|
3974
3915
|
},
|
|
3975
3916
|
onDoubleClick: () => onRowDoubleClick?.(row, rowIndex),
|
|
3976
|
-
className: "transition-colors",
|
|
3977
3917
|
children: [
|
|
3978
|
-
|
|
3918
|
+
/* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
|
|
3979
3919
|
"td",
|
|
3980
3920
|
{
|
|
3981
3921
|
onClick: (e) => handleRowSelect(rowId, e),
|
|
@@ -4031,9 +3971,7 @@ function Spreadsheet({
|
|
|
4031
3971
|
type: "button",
|
|
4032
3972
|
onClick: (e) => {
|
|
4033
3973
|
e.stopPropagation();
|
|
4034
|
-
setHighlightPickerRow(
|
|
4035
|
-
rowId
|
|
4036
|
-
);
|
|
3974
|
+
setHighlightPickerRow(rowId);
|
|
4037
3975
|
},
|
|
4038
3976
|
className: "opacity-0 group-hover:opacity-100 transition-opacity p-0.5 bg-gray-100 hover:bg-gray-200 rounded",
|
|
4039
3977
|
title: "Highlight row",
|
|
@@ -4103,10 +4041,7 @@ function Spreadsheet({
|
|
|
4103
4041
|
type: "button",
|
|
4104
4042
|
onClick: (e) => {
|
|
4105
4043
|
e.stopPropagation();
|
|
4106
|
-
action.onClick(
|
|
4107
|
-
row,
|
|
4108
|
-
rowId
|
|
4109
|
-
);
|
|
4044
|
+
action.onClick(row, rowId);
|
|
4110
4045
|
},
|
|
4111
4046
|
className: cn(
|
|
4112
4047
|
"opacity-0 group-hover:opacity-100 transition-opacity p-0.5 hover:bg-gray-200 rounded",
|
|
@@ -4289,6 +4224,8 @@ function Spreadsheet({
|
|
|
4289
4224
|
if (newSettings.defaultSort?.columnId !== sortConfig?.columnId || newSettings.defaultSort?.direction !== sortConfig?.direction) {
|
|
4290
4225
|
setSortConfig(newSettings.defaultSort);
|
|
4291
4226
|
}
|
|
4227
|
+
setPinnedColumnsFromIds(newSettings.defaultPinnedColumns);
|
|
4228
|
+
onSettingsChange?.(newSettings);
|
|
4292
4229
|
},
|
|
4293
4230
|
columns: columns || [],
|
|
4294
4231
|
title: "Spreadsheet Settings",
|