react-restyle-components 0.4.64 → 0.4.65
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/lib/src/core-components/src/components/Modal/BasicModal/modal.component.d.ts +1 -1
- package/lib/src/core-components/src/components/Modal/BasicModal/modal.component.js +62 -23
- package/lib/src/core-components/src/components/Modal/BasicModal/types.d.ts +10 -0
- package/lib/src/core-components/src/components/Table/Table.js +39 -9
- package/lib/src/core-components/src/components/Table/columnResize.js +23 -15
- package/lib/src/core-components/src/tc.global.css +6 -0
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
export type { ModalSize, ModalPosition, ModalClassNames, ModalStyles, ModalProps } from './types';
|
|
3
3
|
import type { ModalProps } from './types';
|
|
4
|
-
export declare const Modal: ({ visible, title, className, contentClassName, headerClassName, style, contentStyle, onClose, isAutoClose, autoCloseDelay, isAutoCloseOutside, size, position, showCloseButton, closeButton, overlayOpacity, overlayColor, zIndex, closeOnOverlayClick, closeOnEscape, showHeader, headerBgColor, headerTextColor, borderRadius, maxWidth, contentPadding, headerPadding, animationDuration, classNames, styles, children, }: ModalProps) => React.JSX.Element | null;
|
|
4
|
+
export declare const Modal: ({ visible, title, className, contentClassName, headerClassName, style, contentStyle, onClose, isAutoClose, autoCloseDelay, isAutoCloseOutside, size, position, showCloseButton, closeButton, isExpand, expandButton, onExpand, overlayOpacity, overlayColor, zIndex, closeOnOverlayClick, closeOnEscape, showHeader, headerBgColor, headerTextColor, borderRadius, maxWidth, contentPadding, headerPadding, animationDuration, classNames, styles, children, }: ModalProps) => React.JSX.Element | null;
|
|
@@ -2,11 +2,12 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
import { useEffect, useState } from 'react';
|
|
3
3
|
import s from '../../../tc.module.css';
|
|
4
4
|
import { cn } from '../../../utils';
|
|
5
|
-
export const Modal = ({ visible, title = '', className = '', contentClassName = '', headerClassName = '', style = {}, contentStyle = {}, onClose, isAutoClose = false, autoCloseDelay = 1000, isAutoCloseOutside, size = 'md', position = 'center', showCloseButton = true, closeButton, overlayOpacity = 0.5, overlayColor, zIndex = 11000, closeOnOverlayClick, closeOnEscape = true, showHeader = true, headerBgColor, headerTextColor, borderRadius = '0.5rem', maxWidth, contentPadding = '1rem', headerPadding = '1rem', animationDuration = 300, classNames = {}, styles = {}, children, }) => {
|
|
5
|
+
export const Modal = ({ visible, title = '', className = '', contentClassName = '', headerClassName = '', style = {}, contentStyle = {}, onClose, isAutoClose = false, autoCloseDelay = 1000, isAutoCloseOutside, size = 'md', position = 'center', showCloseButton = true, closeButton, isExpand = false, expandButton, onExpand, overlayOpacity = 0.5, overlayColor, zIndex = 11000, closeOnOverlayClick, closeOnEscape = true, showHeader = true, headerBgColor, headerTextColor, borderRadius = '0.5rem', maxWidth, contentPadding = '1rem', headerPadding = '1rem', animationDuration = 300, classNames = {}, styles = {}, children, }) => {
|
|
6
6
|
// isAutoCloseOutside takes priority, then closeOnOverlayClick, default true
|
|
7
7
|
const shouldCloseOnOutsideClick = isAutoCloseOutside ?? closeOnOverlayClick ?? true;
|
|
8
8
|
const [showModal, setShowModal] = useState(visible);
|
|
9
9
|
const [isAnimating, setIsAnimating] = useState(false);
|
|
10
|
+
const [isExpanded, setIsExpanded] = useState(false);
|
|
10
11
|
useEffect(() => {
|
|
11
12
|
if (visible) {
|
|
12
13
|
setShowModal(true);
|
|
@@ -75,28 +76,46 @@ export const Modal = ({ visible, title = '', className = '', contentClassName =
|
|
|
75
76
|
...style,
|
|
76
77
|
transition: `opacity ${animationDuration}ms ease-in-out`,
|
|
77
78
|
opacity: isAnimating ? 1 : 0,
|
|
78
|
-
zIndex: containerZIndex,
|
|
79
|
+
zIndex: isExpanded ? 2147483647 : containerZIndex,
|
|
80
|
+
overflow: isExpanded ? 'hidden' : undefined,
|
|
79
81
|
...styles.container,
|
|
80
|
-
}, onClick: handleOverlayClick, children: _jsx("div", { className: cn(s['relative'], s['w-full'], s['my-5'], s['mx-auto'], classNames.wrapper), style:
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
82
|
+
}, onClick: handleOverlayClick, children: _jsx("div", { className: cn(s['relative'], s['w-full'], !isExpanded && s['my-5'], !isExpanded && s['mx-auto'], classNames.wrapper), style: isExpanded
|
|
83
|
+
? {
|
|
84
|
+
maxWidth: '100vw',
|
|
85
|
+
width: '100vw',
|
|
86
|
+
height: '100vh',
|
|
87
|
+
margin: 0,
|
|
88
|
+
position: 'fixed',
|
|
89
|
+
top: 0,
|
|
90
|
+
left: 0,
|
|
91
|
+
right: 0,
|
|
92
|
+
bottom: 0,
|
|
93
|
+
zIndex: 2147483647,
|
|
94
|
+
transform: 'none',
|
|
95
|
+
opacity: isAnimating ? 1 : 0,
|
|
96
|
+
transition: `opacity ${animationDuration}ms ease-out`,
|
|
97
|
+
...styles.wrapper,
|
|
98
|
+
}
|
|
99
|
+
: {
|
|
100
|
+
maxWidth: modalMaxWidth,
|
|
101
|
+
marginLeft: size === 'full' ? '1rem' : undefined,
|
|
102
|
+
marginRight: size === 'full' ? '1rem' : undefined,
|
|
103
|
+
transform: isAnimating
|
|
104
|
+
? position === 'center'
|
|
105
|
+
? 'scale(1)'
|
|
89
106
|
: 'translateY(0)'
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
borderRadius,
|
|
107
|
+
: position === 'center'
|
|
108
|
+
? 'scale(0.95)'
|
|
109
|
+
: position === 'top'
|
|
110
|
+
? 'translateY(-20px)'
|
|
111
|
+
: 'translateY(20px)',
|
|
112
|
+
transition: `transform ${animationDuration}ms ease-out, opacity ${animationDuration}ms ease-out`,
|
|
113
|
+
opacity: isAnimating ? 1 : 0,
|
|
114
|
+
...styles.wrapper,
|
|
115
|
+
}, onClick: (e) => e.stopPropagation(), children: _jsxs("div", { className: cn(s['border-0'], s['shadow-xl'], s['relative'], s['flex'], s['flex-col'], s['bg-white'], s['outline-none'], s['focus:outline-none'], contentClassName, classNames.content), style: {
|
|
116
|
+
borderRadius: isExpanded ? 0 : borderRadius,
|
|
117
|
+
height: isExpanded ? '100%' : undefined,
|
|
118
|
+
overflow: isExpanded ? 'hidden' : undefined,
|
|
100
119
|
...contentStyle,
|
|
101
120
|
...styles.content,
|
|
102
121
|
}, children: [showHeader && (_jsxs("div", { className: cn(s['flex'], s['items-center'], s['justify-between'], s['border-b'], s['border-solid'], s['border-gray-200'], headerClassName, classNames.header), style: {
|
|
@@ -106,7 +125,25 @@ export const Modal = ({ visible, title = '', className = '', contentClassName =
|
|
|
106
125
|
borderTopRightRadius: borderRadius,
|
|
107
126
|
borderBottom: title || showCloseButton ? undefined : 'none',
|
|
108
127
|
...styles.header,
|
|
109
|
-
}, children: [title && (_jsx("h3", { className: cn(s['text-xl'], s['font-semibold'], s['m-0'], s['flex-1'], classNames.title), style: { color: headerTextColor, ...styles.title }, children: title })),
|
|
128
|
+
}, children: [title && (_jsx("h3", { className: cn(s['text-xl'], s['font-semibold'], s['m-0'], s['flex-1'], classNames.title), style: { color: headerTextColor, ...styles.title }, children: title })), isExpand && (_jsx("button", { type: "button", className: cn(s['p-1'], s['ml-4'], s['border-0'], s['bg-transparent'], s['cursor-pointer'], s['outline-none'], s['focus:outline-none'], s['transition-colors'], s['hover:bg-gray-100'], s['rounded'], classNames.expandButton), onClick: () => {
|
|
129
|
+
const next = !isExpanded;
|
|
130
|
+
setIsExpanded(next);
|
|
131
|
+
onExpand && onExpand(next);
|
|
132
|
+
}, "aria-label": isExpanded ? 'Collapse modal' : 'Expand modal', style: {
|
|
133
|
+
marginLeft: title ? '1rem' : 0,
|
|
134
|
+
...styles.expandButton,
|
|
135
|
+
}, children: expandButton || (_jsx("span", { style: {
|
|
136
|
+
color: headerTextColor || '#1f2937',
|
|
137
|
+
height: '1.5rem',
|
|
138
|
+
width: '1.5rem',
|
|
139
|
+
display: 'flex',
|
|
140
|
+
alignItems: 'center',
|
|
141
|
+
justifyContent: 'center',
|
|
142
|
+
}, children: isExpanded ? (
|
|
143
|
+
// Collapse icon
|
|
144
|
+
_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("polyline", { points: "4 14 10 14 10 20" }), _jsx("polyline", { points: "20 10 14 10 14 4" }), _jsx("line", { x1: "10", y1: "14", x2: "3", y2: "21" }), _jsx("line", { x1: "21", y1: "3", x2: "14", y2: "10" })] })) : (
|
|
145
|
+
// Expand icon
|
|
146
|
+
_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("polyline", { points: "15 3 21 3 21 9" }), _jsx("polyline", { points: "9 21 3 21 3 15" }), _jsx("line", { x1: "21", y1: "3", x2: "14", y2: "10" }), _jsx("line", { x1: "3", y1: "21", x2: "10", y2: "14" })] })) })) })), showCloseButton && (_jsx("button", { type: "button", className: cn(s['p-1'], s['ml-4'], s['border-0'], s['bg-transparent'], s['cursor-pointer'], s['outline-none'], s['focus:outline-none'], s['transition-colors'], s['hover:bg-gray-100'], s['rounded'], classNames.closeButton), onClick: handleClose, "aria-label": "Close modal", style: {
|
|
110
147
|
marginLeft: title ? '1rem' : 0,
|
|
111
148
|
marginRight: title ? 0 : 'auto',
|
|
112
149
|
...styles.closeButton,
|
|
@@ -118,8 +155,10 @@ export const Modal = ({ visible, title = '', className = '', contentClassName =
|
|
|
118
155
|
alignItems: 'center',
|
|
119
156
|
justifyContent: 'center',
|
|
120
157
|
lineHeight: 1,
|
|
121
|
-
}, children: "\u00D7" })) }))] })), _jsx("div", { className: cn(s['flex'], s['flex-col'], s['w-full'], s['h-auto'], s['overflow-y-auto'], classNames.body), style: {
|
|
158
|
+
}, children: "\u00D7" })) }))] })), _jsx("div", { className: cn(s['flex'], s['flex-col'], s['w-full'], !isExpanded && s['h-auto'], s['overflow-y-auto'], classNames.body), style: {
|
|
122
159
|
padding: contentPadding,
|
|
160
|
+
flex: isExpanded ? '1 1 0' : undefined,
|
|
161
|
+
minHeight: isExpanded ? 0 : undefined,
|
|
123
162
|
...styles.body,
|
|
124
163
|
}, children: children })] }) }) })] }));
|
|
125
164
|
};
|
|
@@ -14,6 +14,8 @@ export interface ModalClassNames {
|
|
|
14
14
|
header?: string;
|
|
15
15
|
/** Custom className for the title */
|
|
16
16
|
title?: string;
|
|
17
|
+
/** Custom className for the expand button */
|
|
18
|
+
expandButton?: string;
|
|
17
19
|
/** Custom className for the close button */
|
|
18
20
|
closeButton?: string;
|
|
19
21
|
/** Custom className for the body/children container */
|
|
@@ -32,6 +34,8 @@ export interface ModalStyles {
|
|
|
32
34
|
header?: CSSProperties;
|
|
33
35
|
/** Custom style for the title */
|
|
34
36
|
title?: CSSProperties;
|
|
37
|
+
/** Custom style for the expand button */
|
|
38
|
+
expandButton?: CSSProperties;
|
|
35
39
|
/** Custom style for the close button */
|
|
36
40
|
closeButton?: CSSProperties;
|
|
37
41
|
/** Custom style for the body/children container */
|
|
@@ -68,6 +72,12 @@ export interface ModalProps {
|
|
|
68
72
|
showCloseButton?: boolean;
|
|
69
73
|
/** Custom close button element */
|
|
70
74
|
closeButton?: React.ReactNode;
|
|
75
|
+
/** Enable expand/collapse fullscreen button (shown before close button) */
|
|
76
|
+
isExpand?: boolean;
|
|
77
|
+
/** Custom expand button element */
|
|
78
|
+
expandButton?: React.ReactNode;
|
|
79
|
+
/** Callback fired when expand/collapse button is clicked; receives the new expanded state */
|
|
80
|
+
onExpand?: (isExpanded: boolean) => void;
|
|
71
81
|
/** Overlay background opacity (0-1) */
|
|
72
82
|
overlayOpacity?: number;
|
|
73
83
|
/** Overlay background color */
|
|
@@ -184,8 +184,35 @@ export const Table = forwardRef(function TableComponent(props, ref) {
|
|
|
184
184
|
const [toggleDragOverColumn, setToggleDragOverColumn] = useState(null);
|
|
185
185
|
// Internal state for reordered columns (used in popup and for rendering)
|
|
186
186
|
const [reorderedColumns, setReorderedColumns] = useState(columns);
|
|
187
|
-
//
|
|
188
|
-
//
|
|
187
|
+
// A stable string fingerprint built from every serialisable column property.
|
|
188
|
+
// Using a primitive (string) as the useEffect dependency means the effect only
|
|
189
|
+
// re-runs when the column *content* meaningfully changes — not merely because
|
|
190
|
+
// the caller re-created the columns array inline on every render.
|
|
191
|
+
// When the fingerprint does change we re-run the effect and update reorderedColumns
|
|
192
|
+
// with the full column objects (picking up formatters, filters, and all functions).
|
|
193
|
+
const columnsFingerprint = useMemo(() => columns
|
|
194
|
+
.map((c) => [
|
|
195
|
+
c.dataField,
|
|
196
|
+
c.text ?? '',
|
|
197
|
+
c.headerText ?? '',
|
|
198
|
+
c.hidden ? '1' : '0',
|
|
199
|
+
c.sort ? '1' : '0',
|
|
200
|
+
String(c.width ?? ''),
|
|
201
|
+
String(c.minWidth ?? ''),
|
|
202
|
+
String(c.maxWidth ?? ''),
|
|
203
|
+
c.align ?? '',
|
|
204
|
+
c.headerAlign ?? '',
|
|
205
|
+
// editable can be boolean or function; stringify the boolean branch only
|
|
206
|
+
typeof c.editable === 'boolean' ? (c.editable ? '1' : '0') : 'fn',
|
|
207
|
+
c.pinned ?? '',
|
|
208
|
+
c.csvExport !== false ? '1' : '0',
|
|
209
|
+
c.editorType ?? '',
|
|
210
|
+
].join('|'))
|
|
211
|
+
.join('~'), [columns]);
|
|
212
|
+
// Sync reorderedColumns when columns prop changes.
|
|
213
|
+
// Depends on columnsFingerprint (a string primitive) rather than the columns
|
|
214
|
+
// array reference so that inline column arrays that get re-created on every
|
|
215
|
+
// render do not trigger an infinite setState → re-render → setState loop.
|
|
189
216
|
useEffect(() => {
|
|
190
217
|
const currentDataFields = reorderedColumns
|
|
191
218
|
.map((c) => c.dataField)
|
|
@@ -196,14 +223,12 @@ export const Table = forwardRef(function TableComponent(props, ref) {
|
|
|
196
223
|
.sort()
|
|
197
224
|
.join(',');
|
|
198
225
|
if (currentDataFields !== newDataFields) {
|
|
199
|
-
// Columns structure changed
|
|
226
|
+
// Columns structure changed — merge while preserving user-defined order
|
|
200
227
|
const newColumnMap = new Map(columns.map((c) => [c.dataField, c]));
|
|
201
228
|
const existingDataFields = new Set(reorderedColumns.map((c) => c.dataField));
|
|
202
|
-
// Keep existing order for columns that still exist, update their data
|
|
203
229
|
const preserved = reorderedColumns
|
|
204
230
|
.filter((c) => newColumnMap.has(c.dataField))
|
|
205
231
|
.map((c) => newColumnMap.get(c.dataField));
|
|
206
|
-
// Add new columns at the end
|
|
207
232
|
const added = columns.filter((c) => !existingDataFields.has(c.dataField));
|
|
208
233
|
setReorderedColumns([...preserved, ...added]);
|
|
209
234
|
// Clean up filter component cache for removed columns
|
|
@@ -215,11 +240,16 @@ export const Table = forwardRef(function TableComponent(props, ref) {
|
|
|
215
240
|
}
|
|
216
241
|
}
|
|
217
242
|
else {
|
|
218
|
-
// Same
|
|
243
|
+
// Same column structure — update all column data (including formatter,
|
|
244
|
+
// filter, csvFormatter, etc.) so that reorderable-table rendering always
|
|
245
|
+
// uses the latest column definitions.
|
|
246
|
+
// This branch is only reached when columnsFingerprint actually changed,
|
|
247
|
+
// so there is no risk of an infinite loop here.
|
|
219
248
|
const columnMap = new Map(columns.map((c) => [c.dataField, c]));
|
|
220
|
-
setReorderedColumns(reorderedColumns.map((c) => columnMap.get(c.dataField)
|
|
249
|
+
setReorderedColumns(reorderedColumns.map((c) => columnMap.get(c.dataField) ?? c));
|
|
221
250
|
}
|
|
222
|
-
|
|
251
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
252
|
+
}, [columnsFingerprint]);
|
|
223
253
|
// Close column toggle panel on outside click
|
|
224
254
|
useEffect(() => {
|
|
225
255
|
if (!columnToggleOpen)
|
|
@@ -1064,7 +1094,7 @@ export const Table = forwardRef(function TableComponent(props, ref) {
|
|
|
1064
1094
|
? JSON.stringify(value)
|
|
1065
1095
|
: String(value)
|
|
1066
1096
|
: '';
|
|
1067
|
-
return (
|
|
1097
|
+
return (_jsx(_Fragment, { children: editorRendererCacheRef.current.get(cacheKey) }));
|
|
1068
1098
|
}
|
|
1069
1099
|
// Default editor
|
|
1070
1100
|
return (_jsx(CellEditor, { type: column.editorType === 'number' ? 'number' : 'text', value: editValue ?? '', onChange: (e) => setEditValue(e.target.value), onBlur: () => handleCellEditComplete(row, rowIndex, column), onKeyDown: (e) => {
|
|
@@ -175,26 +175,31 @@ export const ResizeLine = styled.div `
|
|
|
175
175
|
// ============================================================================
|
|
176
176
|
// Hook: useColumnResize
|
|
177
177
|
// ============================================================================
|
|
178
|
-
|
|
179
|
-
|
|
178
|
+
// Module-level stable defaults so that destructuring in the hook never creates
|
|
179
|
+
// new object references on every render (which would re-trigger useEffect deps).
|
|
180
|
+
const EMPTY_RESIZE_CONFIG = {};
|
|
181
|
+
const EMPTY_WIDTHS = {};
|
|
182
|
+
export function useColumnResize({ columns, config = EMPTY_RESIZE_CONFIG, enabled = true, tableId, }) {
|
|
183
|
+
const { minWidth = 50, maxWidth = 800, autoFit = true, onResize, onResizeStart, onResizeEnd, defaultWidths, handleColor, handleHoverColor, handleWidth = 4, } = config;
|
|
184
|
+
// Stable reference — when the caller doesn't provide defaultWidths, always
|
|
185
|
+
// use the same empty object so that useEffect dependencies remain unchanged.
|
|
186
|
+
const stableDefaultWidths = defaultWidths || EMPTY_WIDTHS;
|
|
180
187
|
// Initialize column widths - Column-level width takes FIRST priority
|
|
181
188
|
const initialWidths = useMemo(() => {
|
|
182
189
|
const widths = {};
|
|
183
190
|
columns.forEach((col) => {
|
|
184
|
-
// Priority 1: Column-level width (user-defined in column)
|
|
185
191
|
if (typeof col.width === 'number') {
|
|
186
192
|
widths[col.dataField] = col.width;
|
|
187
193
|
}
|
|
188
194
|
else if (typeof col.width === 'string' && col.width.endsWith('px')) {
|
|
189
195
|
widths[col.dataField] = parseInt(col.width, 10);
|
|
190
196
|
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
widths[col.dataField] = defaultWidths[col.dataField];
|
|
197
|
+
else if (stableDefaultWidths[col.dataField]) {
|
|
198
|
+
widths[col.dataField] = stableDefaultWidths[col.dataField];
|
|
194
199
|
}
|
|
195
200
|
});
|
|
196
201
|
return widths;
|
|
197
|
-
}, [columns,
|
|
202
|
+
}, [columns, stableDefaultWidths]);
|
|
198
203
|
const [columnWidths, setColumnWidths] = useState(initialWidths);
|
|
199
204
|
const [isResizing, setIsResizing] = useState(false);
|
|
200
205
|
const [resizingColumn, setResizingColumn] = useState(null);
|
|
@@ -203,29 +208,32 @@ export function useColumnResize({ columns, config = {}, enabled = true, tableId,
|
|
|
203
208
|
const startWidthRef = useRef(0);
|
|
204
209
|
const currentColumnRef = useRef(null);
|
|
205
210
|
const headerRefMap = useRef(new Map());
|
|
206
|
-
// Update widths when columns change - Column-level width takes FIRST priority
|
|
211
|
+
// Update widths when columns change - Column-level width takes FIRST priority.
|
|
212
|
+
// Returns `prev` (same reference) when nothing was added so React skips the
|
|
213
|
+
// re-render and avoids an infinite setState → render → setState loop.
|
|
207
214
|
useEffect(() => {
|
|
208
215
|
setColumnWidths((prev) => {
|
|
216
|
+
let changed = false;
|
|
209
217
|
const newWidths = { ...prev };
|
|
210
218
|
columns.forEach((col) => {
|
|
211
|
-
// Only add if not already set (user hasn't resized it)
|
|
212
219
|
if (!(col.dataField in newWidths)) {
|
|
213
|
-
// Priority 1: Column-level width
|
|
214
220
|
if (typeof col.width === 'number') {
|
|
215
221
|
newWidths[col.dataField] = col.width;
|
|
222
|
+
changed = true;
|
|
216
223
|
}
|
|
217
224
|
else if (typeof col.width === 'string' && col.width.endsWith('px')) {
|
|
218
225
|
newWidths[col.dataField] = parseInt(col.width, 10);
|
|
226
|
+
changed = true;
|
|
219
227
|
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
228
|
+
else if (stableDefaultWidths[col.dataField]) {
|
|
229
|
+
newWidths[col.dataField] = stableDefaultWidths[col.dataField];
|
|
230
|
+
changed = true;
|
|
223
231
|
}
|
|
224
232
|
}
|
|
225
233
|
});
|
|
226
|
-
return newWidths;
|
|
234
|
+
return changed ? newWidths : prev;
|
|
227
235
|
});
|
|
228
|
-
}, [columns,
|
|
236
|
+
}, [columns, stableDefaultWidths]);
|
|
229
237
|
// Handle mouse move during resize
|
|
230
238
|
const handleMouseMove = useCallback((e) => {
|
|
231
239
|
if (!currentColumnRef.current)
|
|
@@ -69,4 +69,10 @@
|
|
|
69
69
|
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
|
|
70
70
|
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
|
|
71
71
|
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
|
|
72
|
+
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
|
|
73
|
+
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
|
|
74
|
+
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
|
|
75
|
+
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
|
|
76
|
+
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
|
|
77
|
+
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/
|
|
72
78
|
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/.\!filter,.backdrop-blur-sm,.blur,.ring,.ring-2,.shadow,.shadow-inner,body{font-family:Arima Regular;font-size:14px}.dark\:bg-black:is(.dark *),.dark\:border-gray-600:is(.dark *){--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/fieldset,legend{padding:0}.container{width:100%}@media (min-width:0px){.container{max-width:0}}@media (min-width:20rem){.container{max-width:20rem}}@media (min-width:23.4375rem){.container{max-width:23.4375rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:90rem){.container{max-width:90rem}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.form-input,.form-input::-webkit-datetime-edit,.form-input::-webkit-datetime-edit-day-field,.form-input::-webkit-datetime-edit-hour-field,.form-input::-webkit-datetime-edit-meridiem-field,.form-input::-webkit-datetime-edit-millisecond-field,.form-input::-webkit-datetime-edit-minute-field,.form-input::-webkit-datetime-edit-month-field,.form-input::-webkit-datetime-edit-second-field,.form-input::placeholder,.form-input:focus,.form-multiselect,.form-multiselect:focus,.form-select,.form-select:focus,table{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}table:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}table tr:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}select:is(.dark *){--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.\!visible{visibility:visible!important}.top-1\/2{top:50%}.-translate-x-1\/2,.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(1px*var(--tw-divide-y-reverse));border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(243 244 246/var(--tw-divide-opacity,1))}.divide-teal-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(240 253 250/var(--tw-divide-opacity,1))}.bg-purple-900\/50{background-color:#581c8780}.p-0\.5{padding:.125rem}.py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.\!filter,.blur,.ring,.ring-2,.shadow,.shadow-inner,.backdrop-blur-sm,body{font-family:Arima Regular;font-size:14px}.hover\:bg-white\/20:hover{background-color:#fff3}.dark\:border-gray-600:is(.dark *),.dark\:bg-black:is(.dark *){--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.dark\:bg-boxdark:is(.dark *){--tw-bg-opacity:1;background-color:rgb(36 48 63/var(--tw-bg-opacity,1))}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.dark\:text-black:is(.dark *){--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.dark\:text-gray-100:is(.dark *){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.dark\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:placeholder-gray-400:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.dark\:ring-offset-gray-800:is(.dark *){--tw-ring-offset-color:#1f2937}.dark\:hover\:bg-blue-900:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-600:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-700:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:focus\:ring-blue-600:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(37 99 235/var(--tw-ring-opacity,1))}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-feature-settings:normal;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}@font-face{font-family:ArimaRegular;src:url(library/assets/fonts/arima/arima-regular.ttf)}.container{width:100%}@media (min-width:0px){.container{max-width:0}}@media (min-width:20rem){.container{max-width:20rem}}@media (min-width:23.4375rem){.container{max-width:23.4375rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:90rem){.container{max-width:90rem}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.form-input,.form-multiselect,.form-select,.form-input:focus,.form-multiselect:focus,.form-select:focus,.form-input::placeholder,.form-input::-webkit-datetime-edit,.form-input::-webkit-datetime-edit-day-field,.form-input::-webkit-datetime-edit-hour-field,.form-input::-webkit-datetime-edit-meridiem-field,.form-input::-webkit-datetime-edit-millisecond-field,.form-input::-webkit-datetime-edit-minute-field,.form-input::-webkit-datetime-edit-month-field,.form-input::-webkit-datetime-edit-second-field,table{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}table:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}table tr:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}select:is(.dark *){--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.\!visible{visibility:visible!important}.top-1\/2{top:50%}.flex-grow,.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}@keyframes pulse{50%{opacity:.5}}@keyframes spin{to{transform:rotate(1turn)}}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(1px*var(--tw-divide-y-reverse));border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(243 244 246/var(--tw-divide-opacity,1))}.divide-teal-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(240 253 250/var(--tw-divide-opacity,1))}.bg-purple-900\/50{background-color:#581c8780}.p-0\.5{padding:.125rem}.py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.shadow,.shadow-inner,.shadow-md,.ring,.ring-2,.blur,.\!filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.backdrop-blur-sm,body{font-family:Arima Regular;font-size:14px}.menu ul{list-style:none;margin:0;padding:0}.menu li{border-bottom:1px solid #ddd;padding:10px}.menu li:last-child{border-bottom:none}.hover\:bg-white\/20:hover{background-color:#fff3}.focus\:ring-0:focus,.dark\:border-gray-600:is(.dark *){--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.dark\:bg-black:is(.dark *){--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.dark\:bg-boxdark:is(.dark *){--tw-bg-opacity:1;background-color:rgb(36 48 63/var(--tw-bg-opacity,1))}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.dark\:text-black:is(.dark *){--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.dark\:text-gray-100:is(.dark *){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.dark\:text-gray-200:is(.dark *){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:placeholder-gray-400:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.dark\:ring-offset-gray-800:is(.dark *){--tw-ring-offset-color:#1f2937}.dark\:hover\:bg-blue-900:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(30 58 138/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-600:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-700:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:focus\:ring-blue-600:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(37 99 235/var(--tw-ring-opacity,1))}@media (min-width:0px) and (max-width:767px){}
|