pixel-react 1.1.8 → 1.1.9
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/components/AddButton/AddButton.d.ts +5 -0
- package/lib/components/AddButton/AddButton.stories.d.ts +6 -0
- package/lib/components/AddButton/index.d.ts +1 -0
- package/lib/components/AddButton/types.d.ts +4 -0
- package/lib/components/ExcelFile/ChangeExcelStyles.d.ts +14 -0
- package/lib/components/ExcelFile/ColorBarSelector/ColorBarSelector.d.ts +8 -0
- package/lib/components/ExcelFile/ContextMenu/ContextMenu.d.ts +4 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/ActiveCell.d.ts +7 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/Cell.d.ts +4 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/ColumnIndicator.d.ts +5 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/Copied.d.ts +3 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/CornerIndicator.d.ts +5 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/DataEditor.d.ts +5 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/DataViewer.d.ts +8 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/FloatingRect.d.ts +10 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/HeaderRow.d.ts +3 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/Row.d.ts +3 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/RowIndicator.d.ts +5 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/Selected.d.ts +3 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/Spreadsheet.d.ts +81 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/Table.d.ts +3 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/actions.d.ts +130 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/areModelsEqual.d.ts +1 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/context.d.ts +8 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/engine.d.ts +22 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/formula.d.ts +17 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/index.d.ts +2 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/point-graph.d.ts +21 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/point-hash.d.ts +3 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/point-set.d.ts +24 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/index.d.ts +13 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/matrix.d.ts +67 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/point-range.d.ts +22 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/point.d.ts +11 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/reducer.d.ts +27 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/selection.d.ts +95 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/types.d.ts +215 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/use-dispatch.d.ts +3 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/use-selector.d.ts +3 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/util.d.ts +45 -0
- package/lib/components/ExcelFile/ExcelFile/ExcelFile.d.ts +3 -0
- package/lib/components/ExcelFile/ExcelFile.stories.d.ts +6 -0
- package/lib/components/ExcelFile/ExcelSheetBar/ExcelSheetBar.d.ts +15 -0
- package/lib/components/ExcelFile/ExcelToolBar/ExcelToolBar.d.ts +3 -0
- package/lib/components/ExcelFile/ImportExcelStyles.d.ts +24 -0
- package/lib/components/ExcelFile/Types.d.ts +176 -0
- package/lib/components/ExcelFile/index.d.ts +1 -0
- package/lib/components/IconRadioGroup/IconRadioGroup.d.ts +5 -0
- package/lib/components/IconRadioGroup/IconRadioGroup.stories.d.ts +7 -0
- package/lib/components/IconRadioGroup/index.d.ts +1 -0
- package/lib/components/IconRadioGroup/type.d.ts +41 -0
- package/lib/index.d.ts +45 -1
- package/lib/index.esm.js +682 -244
- package/lib/index.esm.js.map +1 -1
- package/lib/index.js +682 -243
- package/lib/index.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/utils/find/findAndInsert.d.ts +7 -0
- package/lib/utils/find/findAndInsert.stories.d.ts +7 -0
- package/package.json +4 -2
- package/src/assets/Themes/BaseTheme.scss +1 -0
- package/src/assets/Themes/DarkTheme.scss +1 -0
- package/src/assets/icons/all_borders.svg +3 -0
- package/src/assets/icons/bold.svg +3 -0
- package/src/assets/icons/border_bottom.svg +3 -0
- package/src/assets/icons/border_left.svg +3 -0
- package/src/assets/icons/border_right.svg +3 -0
- package/src/assets/icons/border_top.svg +3 -0
- package/src/assets/icons/clone_icon.svg +3 -0
- package/src/assets/icons/double_underline.svg +5 -0
- package/src/assets/icons/fill_color.svg +7 -0
- package/src/assets/icons/formate_painter.svg +5 -0
- package/src/assets/icons/full_access_icon.svg +4 -0
- package/src/assets/icons/history_icon.svg +19 -0
- package/src/assets/icons/italic.svg +3 -0
- package/src/assets/icons/jira.svg +3 -0
- package/src/assets/icons/linked_defects.svg +11 -0
- package/src/assets/icons/move_icon.svg +5 -0
- package/src/assets/icons/no_access_icon.svg +4 -0
- package/src/assets/icons/no_border.svg +3 -0
- package/src/assets/icons/strike_through.svg +3 -0
- package/src/assets/icons/text_align_center.svg +3 -0
- package/src/assets/icons/text_align_left.svg +3 -0
- package/src/assets/icons/text_align_right.svg +3 -0
- package/src/assets/icons/text_color.svg +3 -0
- package/src/assets/icons/underline.svg +4 -0
- package/src/assets/icons/view_access_icon.svg +4 -0
- package/src/components/AppHeader/AppHeader.scss +14 -9
- package/src/components/AppHeader/AppHeader.stories.tsx +1 -0
- package/src/components/AppHeader/AppHeader.tsx +7 -5
- package/src/components/ExcelFile/ChangeExcelStyles.tsx +78 -0
- package/src/components/ExcelFile/ColorBarselector/ColorBarSelector.scss +13 -0
- package/src/components/ExcelFile/ColorBarselector/ColorBarSelector.tsx +43 -0
- package/src/components/ExcelFile/ContextMenu/ContextMenu.scss +102 -0
- package/src/components/ExcelFile/ContextMenu/ContextMenu.tsx +104 -0
- package/src/components/ExcelFile/ExcelFile/Excel/ActiveCell.tsx +131 -0
- package/src/components/ExcelFile/ExcelFile/Excel/Cell.tsx +201 -0
- package/src/components/ExcelFile/ExcelFile/Excel/ColumnIndicator.tsx +123 -0
- package/src/components/ExcelFile/ExcelFile/Excel/Copied.tsx +25 -0
- package/src/components/ExcelFile/ExcelFile/Excel/CornerIndicator.tsx +49 -0
- package/src/components/ExcelFile/ExcelFile/Excel/DataEditor.tsx +37 -0
- package/src/components/ExcelFile/ExcelFile/Excel/DataViewer.tsx +46 -0
- package/src/components/ExcelFile/ExcelFile/Excel/FloatingRect.tsx +31 -0
- package/src/components/ExcelFile/ExcelFile/Excel/HeaderRow.tsx +5 -0
- package/src/components/ExcelFile/ExcelFile/Excel/Row.tsx +5 -0
- package/src/components/ExcelFile/ExcelFile/Excel/RowIndicator.tsx +102 -0
- package/src/components/ExcelFile/ExcelFile/Excel/Selected.tsx +32 -0
- package/src/components/ExcelFile/ExcelFile/Excel/Spreadsheet.css +144 -0
- package/src/components/ExcelFile/ExcelFile/Excel/Spreadsheet.tsx +494 -0
- package/src/components/ExcelFile/ExcelFile/Excel/Table.tsx +19 -0
- package/src/components/ExcelFile/ExcelFile/Excel/actions.ts +302 -0
- package/src/components/ExcelFile/ExcelFile/Excel/areModelsEqual.ts +18 -0
- package/src/components/ExcelFile/ExcelFile/Excel/context.ts +12 -0
- package/src/components/ExcelFile/ExcelFile/Excel/engine/engine.ts +200 -0
- package/src/components/ExcelFile/ExcelFile/Excel/engine/formula.ts +137 -0
- package/src/components/ExcelFile/ExcelFile/Excel/engine/index.ts +2 -0
- package/src/components/ExcelFile/ExcelFile/Excel/engine/point-graph.ts +154 -0
- package/src/components/ExcelFile/ExcelFile/Excel/engine/point-hash.ts +10 -0
- package/src/components/ExcelFile/ExcelFile/Excel/engine/point-set.ts +69 -0
- package/src/components/ExcelFile/ExcelFile/Excel/index.ts +48 -0
- package/src/components/ExcelFile/ExcelFile/Excel/matrix.ts +388 -0
- package/src/components/ExcelFile/ExcelFile/Excel/point-range.ts +82 -0
- package/src/components/ExcelFile/ExcelFile/Excel/point.ts +15 -0
- package/src/components/ExcelFile/ExcelFile/Excel/reducer.ts +682 -0
- package/src/components/ExcelFile/ExcelFile/Excel/selection.ts +257 -0
- package/src/components/ExcelFile/ExcelFile/Excel/types.ts +269 -0
- package/src/components/ExcelFile/ExcelFile/Excel/typings/fast-formula-parser.d.ts +58 -0
- package/src/components/ExcelFile/ExcelFile/Excel/use-dispatch.ts +8 -0
- package/src/components/ExcelFile/ExcelFile/Excel/use-selector.ts +9 -0
- package/src/components/ExcelFile/ExcelFile/Excel/util.ts +173 -0
- package/src/components/ExcelFile/ExcelFile/ExcelFile.scss +27 -0
- package/src/components/ExcelFile/ExcelFile/ExcelFile.tsx +520 -0
- package/src/components/ExcelFile/ExcelFile.stories.tsx +132 -0
- package/src/components/ExcelFile/ExcelSheetBar/ExcelSheetBar.scss +16 -0
- package/src/components/ExcelFile/ExcelSheetBar/ExcelSheetBar.tsx +79 -0
- package/src/components/ExcelFile/ExcelToolBar/ExcelToolBar.scss +22 -0
- package/src/components/ExcelFile/ExcelToolBar/ExcelToolBar.tsx +271 -0
- package/src/components/ExcelFile/ImportExcelStyles.tsx +86 -0
- package/src/components/ExcelFile/Types.ts +241 -0
- package/src/components/ExcelFile/index.ts +1 -0
- package/src/components/Icon/Icons.scss +2 -3
- package/src/components/Icon/iconList.ts +50 -1
- package/src/components/IconRadioGroup/IconRadioGroup.scss +60 -0
- package/src/components/IconRadioGroup/IconRadioGroup.stories.tsx +108 -0
- package/src/components/IconRadioGroup/IconRadioGroup.tsx +72 -0
- package/src/components/IconRadioGroup/index.ts +1 -0
- package/src/components/IconRadioGroup/type.ts +50 -0
- package/src/index.ts +2 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import classNames from "classnames";
|
|
3
|
+
import * as Types from "./types";
|
|
4
|
+
import * as Point from "./point";
|
|
5
|
+
import * as Actions from "./actions";
|
|
6
|
+
import useDispatch from "./use-dispatch";
|
|
7
|
+
import useSelector from "./use-selector";
|
|
8
|
+
|
|
9
|
+
const ColumnIndicator: Types.ColumnIndicatorComponent = ({
|
|
10
|
+
column,
|
|
11
|
+
label,
|
|
12
|
+
selected,
|
|
13
|
+
onSelect,
|
|
14
|
+
}) => {
|
|
15
|
+
const dispatch = useDispatch();
|
|
16
|
+
const [width, setWidth] = React.useState(100);
|
|
17
|
+
|
|
18
|
+
// Function to handle the start of the resize (mouse down)
|
|
19
|
+
const onMouseDown = (e: React.MouseEvent) => {
|
|
20
|
+
const startX = e.clientX;
|
|
21
|
+
|
|
22
|
+
// Function to handle mouse movement (resize)
|
|
23
|
+
const onMouseMove = (moveEvent: MouseEvent) => {
|
|
24
|
+
const newWidth = width + (moveEvent.clientX - startX);
|
|
25
|
+
setWidth(newWidth);
|
|
26
|
+
|
|
27
|
+
// const selectedAllRow = document.querySelector(".Spreadsheet__floating-rect--selected");
|
|
28
|
+
// const selectedSingleRow = document.querySelector(".Spreadsheet__active-cell");
|
|
29
|
+
|
|
30
|
+
// // If the element exists, update its height
|
|
31
|
+
// if (selectedAllRow instanceof HTMLElement&&selectedSingleRow instanceof HTMLElement) {
|
|
32
|
+
// selectedAllRow.style.width = `${newWidth}px`; // Set the width
|
|
33
|
+
// selectedSingleRow.style.width = `${newWidth}px`; // Set the width
|
|
34
|
+
// }
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
// Function to stop the resizing (mouse up)
|
|
38
|
+
const onMouseUp = () => {
|
|
39
|
+
document.removeEventListener("mousemove", onMouseMove);
|
|
40
|
+
document.removeEventListener("mouseup", onMouseUp);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// Add event listeners for mouse move and mouse up
|
|
44
|
+
document.addEventListener("mousemove", onMouseMove);
|
|
45
|
+
document.addEventListener("mouseup", onMouseUp);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const activate = React.useCallback(
|
|
49
|
+
(point: Point.Point) => dispatch(Actions.activate(point)),
|
|
50
|
+
[dispatch]
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
// Handle column header click
|
|
54
|
+
const handleClick = React.useCallback(
|
|
55
|
+
(event: React.MouseEvent) => {
|
|
56
|
+
onSelect(column, event.shiftKey);
|
|
57
|
+
},
|
|
58
|
+
[onSelect, column]
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
return (
|
|
63
|
+
<th
|
|
64
|
+
style={{ minWidth: `${width}px`, position: "relative" }} // Use dynamic width
|
|
65
|
+
className={classNames("Spreadsheet__header", {
|
|
66
|
+
"Spreadsheet__header--selected": selected,
|
|
67
|
+
})}
|
|
68
|
+
onClick={handleClick}
|
|
69
|
+
tabIndex={0}
|
|
70
|
+
>
|
|
71
|
+
{label !== undefined ? label : columnIndexToLabel(column)}
|
|
72
|
+
<div
|
|
73
|
+
onMouseDown={onMouseDown}
|
|
74
|
+
onClick={()=>{activate}}
|
|
75
|
+
style={{
|
|
76
|
+
zIndex: "inherit",
|
|
77
|
+
width: "2px",
|
|
78
|
+
position: "absolute",
|
|
79
|
+
right: 0,
|
|
80
|
+
top: 0,
|
|
81
|
+
height: "100%",
|
|
82
|
+
cursor: "ew-resize",
|
|
83
|
+
}}
|
|
84
|
+
/>
|
|
85
|
+
</th>
|
|
86
|
+
);
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export default ColumnIndicator;
|
|
90
|
+
|
|
91
|
+
export const enhance = (
|
|
92
|
+
ColumnIndicatorComponent: Types.ColumnIndicatorComponent
|
|
93
|
+
): React.FC<Omit<Types.ColumnIndicatorProps, "selected" | "onSelect">> => {
|
|
94
|
+
return function ColumnIndicatorWrapper(props) {
|
|
95
|
+
const dispatch = useDispatch();
|
|
96
|
+
const selectEntireColumn = React.useCallback(
|
|
97
|
+
(column: number, extend: boolean) =>
|
|
98
|
+
dispatch(Actions.selectEntireColumn(column, extend)),
|
|
99
|
+
[dispatch]
|
|
100
|
+
);
|
|
101
|
+
const selected = useSelector((state) =>
|
|
102
|
+
state.selected.hasEntireColumn(props.column)
|
|
103
|
+
);
|
|
104
|
+
return (
|
|
105
|
+
<ColumnIndicatorComponent
|
|
106
|
+
{...props}
|
|
107
|
+
selected={selected}
|
|
108
|
+
onSelect={selectEntireColumn}
|
|
109
|
+
/>
|
|
110
|
+
);
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// Utility function to convert column index to label (e.g., 0 -> A, 1 -> B, etc.)
|
|
115
|
+
function columnIndexToLabel(column: number): string {
|
|
116
|
+
let label = "";
|
|
117
|
+
let index = column;
|
|
118
|
+
while (index >= 0) {
|
|
119
|
+
label = String.fromCharCode(65 + (index % 26)) + label;
|
|
120
|
+
index = Math.floor(index / 26) - 1;
|
|
121
|
+
}
|
|
122
|
+
return label;
|
|
123
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import FloatingRect from "./FloatingRect";
|
|
3
|
+
import { getRangeDimensions } from "./util";
|
|
4
|
+
import useSelector from "./use-selector";
|
|
5
|
+
|
|
6
|
+
const Copied: React.FC = () => {
|
|
7
|
+
const range = useSelector((state) => state.copied);
|
|
8
|
+
const dimensions = useSelector(
|
|
9
|
+
(state) =>
|
|
10
|
+
range &&
|
|
11
|
+
getRangeDimensions(state.rowDimensions, state.columnDimensions, range)
|
|
12
|
+
);
|
|
13
|
+
const hidden = range === null;
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<FloatingRect
|
|
17
|
+
variant="copied"
|
|
18
|
+
dimensions={dimensions}
|
|
19
|
+
hidden={hidden}
|
|
20
|
+
dragging={false}
|
|
21
|
+
/>
|
|
22
|
+
);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export default Copied;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import classNames from "classnames";
|
|
3
|
+
import * as Actions from "./actions";
|
|
4
|
+
import { EntireWorksheetSelection } from "./selection";
|
|
5
|
+
import * as Types from "./types";
|
|
6
|
+
import useDispatch from "./use-dispatch";
|
|
7
|
+
import useSelector from "./use-selector";
|
|
8
|
+
|
|
9
|
+
const CornerIndicator: Types.CornerIndicatorComponent = ({
|
|
10
|
+
selected,
|
|
11
|
+
onSelect,
|
|
12
|
+
}) => {
|
|
13
|
+
const handleClick = React.useCallback(() => {
|
|
14
|
+
onSelect();
|
|
15
|
+
}, [onSelect]);
|
|
16
|
+
return (
|
|
17
|
+
<th
|
|
18
|
+
className={classNames("Spreadsheet__header", {
|
|
19
|
+
"Spreadsheet__header--selected": selected,
|
|
20
|
+
})}
|
|
21
|
+
onClick={handleClick}
|
|
22
|
+
tabIndex={0}
|
|
23
|
+
/>
|
|
24
|
+
);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default CornerIndicator;
|
|
28
|
+
|
|
29
|
+
export const enhance = (
|
|
30
|
+
CornerIndicatorComponent: Types.CornerIndicatorComponent
|
|
31
|
+
): React.FC<Omit<Types.CornerIndicatorProps, "selected" | "onSelect">> => {
|
|
32
|
+
return function CornerIndicatorWrapper(props) {
|
|
33
|
+
const dispatch = useDispatch();
|
|
34
|
+
const selectEntireWorksheet = React.useCallback(
|
|
35
|
+
() => dispatch(Actions.selectEntireWorksheet()),
|
|
36
|
+
[dispatch]
|
|
37
|
+
);
|
|
38
|
+
const selected = useSelector(
|
|
39
|
+
(state) => state.selected instanceof EntireWorksheetSelection
|
|
40
|
+
);
|
|
41
|
+
return (
|
|
42
|
+
<CornerIndicatorComponent
|
|
43
|
+
{...props}
|
|
44
|
+
selected={selected}
|
|
45
|
+
onSelect={selectEntireWorksheet}
|
|
46
|
+
/>
|
|
47
|
+
);
|
|
48
|
+
};
|
|
49
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as Types from "./types";
|
|
3
|
+
import { moveCursorToEnd } from "./util";
|
|
4
|
+
|
|
5
|
+
/** The default Spreadsheet DataEditor component */
|
|
6
|
+
const DataEditor: React.FC<Types.DataEditorProps> = ({ onChange, cell }) => {
|
|
7
|
+
const inputRef = React.useRef<HTMLInputElement>(null);
|
|
8
|
+
|
|
9
|
+
const handleChange = React.useCallback(
|
|
10
|
+
(event: React.ChangeEvent<HTMLInputElement>) => {
|
|
11
|
+
onChange({ ...cell, value: event.target.value,style:cell?.style});
|
|
12
|
+
},
|
|
13
|
+
[onChange, cell]
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
React.useEffect(() => {
|
|
17
|
+
if (inputRef.current) {
|
|
18
|
+
moveCursorToEnd(inputRef.current);
|
|
19
|
+
}
|
|
20
|
+
}, [inputRef]);
|
|
21
|
+
|
|
22
|
+
const value = cell?.value ?? "";
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<div className="Spreadsheet__data-editor">
|
|
26
|
+
<input
|
|
27
|
+
ref={inputRef}
|
|
28
|
+
type="text"
|
|
29
|
+
onChange={handleChange}
|
|
30
|
+
value={value}
|
|
31
|
+
autoFocus
|
|
32
|
+
/>
|
|
33
|
+
</div>
|
|
34
|
+
);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export default DataEditor;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import classNames from "classnames";
|
|
3
|
+
import * as Types from "./types";
|
|
4
|
+
import { hasLineBreaker } from "./util";
|
|
5
|
+
|
|
6
|
+
export const TRUE_TEXT = "TRUE";
|
|
7
|
+
export const FALSE_TEXT = "FALSE";
|
|
8
|
+
|
|
9
|
+
/** The default Spreadsheet DataViewer component */
|
|
10
|
+
const DataViewer = <Cell extends Types.CellBase<Value>, Value>({
|
|
11
|
+
cell,
|
|
12
|
+
evaluatedCell,
|
|
13
|
+
}: Types.DataViewerProps<Cell>): React.ReactElement => {
|
|
14
|
+
const value = getValue(cell, evaluatedCell);
|
|
15
|
+
|
|
16
|
+
return typeof value === "boolean" ? (
|
|
17
|
+
<span className="Spreadsheet__data-viewer Spreadsheet__data-viewer--boolean">
|
|
18
|
+
{convertBooleanToText(value)}
|
|
19
|
+
</span>
|
|
20
|
+
) : (
|
|
21
|
+
<span
|
|
22
|
+
className={classNames("Spreadsheet__data-viewer", {
|
|
23
|
+
"Spreadsheet__data-viewer--preserve-breaks": hasLineBreaker(value),
|
|
24
|
+
})}
|
|
25
|
+
>
|
|
26
|
+
{value}
|
|
27
|
+
</span>
|
|
28
|
+
);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export default DataViewer;
|
|
32
|
+
|
|
33
|
+
function getValue(
|
|
34
|
+
cell: Types.CellBase | undefined,
|
|
35
|
+
evaluatedCell: Types.CellBase | undefined
|
|
36
|
+
) {
|
|
37
|
+
const baseValue = evaluatedCell?.value ?? cell?.value;
|
|
38
|
+
if (baseValue && typeof baseValue === "object") {
|
|
39
|
+
return baseValue.toString();
|
|
40
|
+
}
|
|
41
|
+
return baseValue;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function convertBooleanToText(value: boolean): string {
|
|
45
|
+
return value ? TRUE_TEXT : FALSE_TEXT;
|
|
46
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import classnames from "classnames";
|
|
3
|
+
import * as Types from "./types";
|
|
4
|
+
|
|
5
|
+
export type Props = {
|
|
6
|
+
variant?: string;
|
|
7
|
+
dimensions?: Types.Dimensions | null | undefined;
|
|
8
|
+
hidden?: boolean;
|
|
9
|
+
dragging?: boolean;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const FloatingRect: React.FC<Props> = ({
|
|
13
|
+
dimensions,
|
|
14
|
+
dragging,
|
|
15
|
+
hidden,
|
|
16
|
+
variant,
|
|
17
|
+
}) => {
|
|
18
|
+
const { width, height, top, left } = dimensions || {};
|
|
19
|
+
return (
|
|
20
|
+
<div
|
|
21
|
+
className={classnames("Spreadsheet__floating-rect", {
|
|
22
|
+
[`Spreadsheet__floating-rect--${variant}`]: variant,
|
|
23
|
+
"Spreadsheet__floating-rect--dragging": dragging,
|
|
24
|
+
"Spreadsheet__floating-rect--hidden": hidden,
|
|
25
|
+
})}
|
|
26
|
+
style={{ width, height, top, left }}
|
|
27
|
+
/>
|
|
28
|
+
);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export default FloatingRect;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import classNames from "classnames";
|
|
3
|
+
import * as Actions from "./actions";
|
|
4
|
+
import * as Types from "./types";
|
|
5
|
+
import useDispatch from "./use-dispatch";
|
|
6
|
+
import useSelector from "./use-selector";
|
|
7
|
+
|
|
8
|
+
const RowIndicator: Types.RowIndicatorComponent = ({
|
|
9
|
+
row,
|
|
10
|
+
label,
|
|
11
|
+
selected,
|
|
12
|
+
onSelect,
|
|
13
|
+
}) => {
|
|
14
|
+
const [height, setHeight] = React.useState(0);
|
|
15
|
+
|
|
16
|
+
// Function to handle the start of the resize (mouse down)
|
|
17
|
+
const onMouseDown = (e: React.MouseEvent) => {
|
|
18
|
+
const startY = e.clientY;
|
|
19
|
+
|
|
20
|
+
// Function to handle mouse movement (resize)
|
|
21
|
+
const onMouseMove = (moveEvent: MouseEvent) => {
|
|
22
|
+
const newHeight = height + (moveEvent.clientY - startY);
|
|
23
|
+
setHeight(newHeight);
|
|
24
|
+
// Fetch the floating rectangle element from the DOM
|
|
25
|
+
// const selectedAllRow = document.querySelector(".Spreadsheet__floating-rect--selected");
|
|
26
|
+
// const selectedSingleRow = document.querySelector(".Spreadsheet__active-cell");
|
|
27
|
+
|
|
28
|
+
// // If the element exists, update its height
|
|
29
|
+
// if (selectedAllRow instanceof HTMLElement&&selectedSingleRow instanceof HTMLElement) {
|
|
30
|
+
// selectedAllRow.style.height = `${newHeight}px`; // Set the height
|
|
31
|
+
// selectedSingleRow.style.height = `${newHeight}px`; // Set the height
|
|
32
|
+
// }
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
// Function to stop the resizing (mouse up)
|
|
36
|
+
const onMouseUp = () => {
|
|
37
|
+
document.removeEventListener("mousemove", onMouseMove);
|
|
38
|
+
document.removeEventListener("mouseup", onMouseUp);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// Add event listeners for mouse move and mouse up
|
|
42
|
+
document.addEventListener("mousemove", onMouseMove);
|
|
43
|
+
document.addEventListener("mouseup", onMouseUp);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const handleClick = React.useCallback(
|
|
47
|
+
(event: React.MouseEvent) => {
|
|
48
|
+
onSelect(row, event.shiftKey);
|
|
49
|
+
},
|
|
50
|
+
[onSelect, row]
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
return (
|
|
54
|
+
<th
|
|
55
|
+
style={{ height: `${height}px`,minWidth:'60px', position: "relative" }}
|
|
56
|
+
className={classNames("Spreadsheet__header", {
|
|
57
|
+
"Spreadsheet__header--selected": selected,
|
|
58
|
+
})}
|
|
59
|
+
onClick={handleClick}
|
|
60
|
+
tabIndex={0}
|
|
61
|
+
>
|
|
62
|
+
{label !== undefined ? label : row + 1}
|
|
63
|
+
<div
|
|
64
|
+
onMouseDown={onMouseDown}
|
|
65
|
+
style={{
|
|
66
|
+
zIndex: "inherit",
|
|
67
|
+
height: "2px",
|
|
68
|
+
position: "absolute",
|
|
69
|
+
right: 0,
|
|
70
|
+
bottom: 0,
|
|
71
|
+
width: "100%",
|
|
72
|
+
cursor: "ns-resize",
|
|
73
|
+
}}
|
|
74
|
+
/>
|
|
75
|
+
</th>
|
|
76
|
+
);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export default RowIndicator;
|
|
80
|
+
|
|
81
|
+
export const enhance = (
|
|
82
|
+
RowIndicatorComponent: Types.RowIndicatorComponent
|
|
83
|
+
): React.FC<Omit<Types.RowIndicatorProps, "selected" | "onSelect">> => {
|
|
84
|
+
return function RowIndicatorWrapper(props) {
|
|
85
|
+
const dispatch = useDispatch();
|
|
86
|
+
const selected = useSelector((state) =>
|
|
87
|
+
state.selected.hasEntireRow(props.row)
|
|
88
|
+
);
|
|
89
|
+
const selectEntireRow = React.useCallback(
|
|
90
|
+
(row: number, extend: boolean) =>
|
|
91
|
+
dispatch(Actions.selectEntireRow(row, extend)),
|
|
92
|
+
[dispatch]
|
|
93
|
+
);
|
|
94
|
+
return (
|
|
95
|
+
<RowIndicatorComponent
|
|
96
|
+
{...props}
|
|
97
|
+
selected={selected}
|
|
98
|
+
onSelect={selectEntireRow}
|
|
99
|
+
/>
|
|
100
|
+
);
|
|
101
|
+
};
|
|
102
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { getSelectedDimensions } from "./util";
|
|
3
|
+
import FloatingRect from "./FloatingRect";
|
|
4
|
+
import useSelector from "./use-selector";
|
|
5
|
+
|
|
6
|
+
const Selected: React.FC = () => {
|
|
7
|
+
const selected = useSelector((state) => state.selected);
|
|
8
|
+
const dimensions = useSelector(
|
|
9
|
+
(state) =>
|
|
10
|
+
selected &&
|
|
11
|
+
getSelectedDimensions(
|
|
12
|
+
state.rowDimensions,
|
|
13
|
+
state.columnDimensions,
|
|
14
|
+
state.model.data,
|
|
15
|
+
state.selected
|
|
16
|
+
)
|
|
17
|
+
);
|
|
18
|
+
const dragging = useSelector((state) => state.dragging);
|
|
19
|
+
const hidden = useSelector(
|
|
20
|
+
(state) => state.selected.size(state.model.data) < 2
|
|
21
|
+
);
|
|
22
|
+
return (
|
|
23
|
+
<FloatingRect
|
|
24
|
+
variant="selected"
|
|
25
|
+
dimensions={dimensions}
|
|
26
|
+
dragging={dragging}
|
|
27
|
+
hidden={hidden}
|
|
28
|
+
/>
|
|
29
|
+
);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export default Selected;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
.Spreadsheet {
|
|
2
|
+
--background-color: white;
|
|
3
|
+
--text-color: black;
|
|
4
|
+
--readonly-text-color: rgba(0, 0, 0, 0.4);
|
|
5
|
+
--outline-color: #4285f4;
|
|
6
|
+
--outline-background-color: rgba(160, 195, 255, 0.2);
|
|
7
|
+
--border-color: hsl(2deg, 0%, 91%);
|
|
8
|
+
--header-background-color: rgba(0, 0, 0, 0.04);
|
|
9
|
+
--elevation: 0 2px 5px rgba(0, 0, 0, 0.4);
|
|
10
|
+
|
|
11
|
+
position: relative;
|
|
12
|
+
overflow: visible;
|
|
13
|
+
background: var(--background-color);
|
|
14
|
+
color: var(--text-color);
|
|
15
|
+
display: inline-block;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.Spreadsheet--dark-mode {
|
|
19
|
+
--background-color: black;
|
|
20
|
+
--text-color: white;
|
|
21
|
+
--readonly-text-color: rgba(255, 255, 255, 0.4);
|
|
22
|
+
--header-background-color: rgba(255, 255, 255, 0.04);
|
|
23
|
+
--border-color: hsl(2deg, 0%, 19%);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.Spreadsheet__active-cell {
|
|
27
|
+
position: absolute;
|
|
28
|
+
border: 2px solid var(--outline-color);
|
|
29
|
+
box-sizing: border-box;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.Spreadsheet__active-cell--edit {
|
|
33
|
+
background: var(--background-color);
|
|
34
|
+
box-shadow: var(--elevation);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.Spreadsheet__table {
|
|
38
|
+
border-collapse: collapse;
|
|
39
|
+
table-layout: fixed;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.Spreadsheet__cell,
|
|
43
|
+
.Spreadsheet__active-cell {
|
|
44
|
+
cursor: cell;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.Spreadsheet__cell {
|
|
48
|
+
outline: none;
|
|
49
|
+
position: relative;
|
|
50
|
+
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* .Spreadsheet__active-cell .Selection_dot{
|
|
54
|
+
background-color:red;
|
|
55
|
+
height:7px;
|
|
56
|
+
width:7px;
|
|
57
|
+
border-radius:50%;
|
|
58
|
+
position:absolute;
|
|
59
|
+
right:-3px;
|
|
60
|
+
z-index: 10;
|
|
61
|
+
bottom:-3px;
|
|
62
|
+
cursor: crosshair;
|
|
63
|
+
} */
|
|
64
|
+
|
|
65
|
+
/* .Spreadsheet__cell--readonly {
|
|
66
|
+
color: var(--readonly-text-color);
|
|
67
|
+
} */
|
|
68
|
+
|
|
69
|
+
.Spreadsheet__cell,
|
|
70
|
+
.Spreadsheet__header {
|
|
71
|
+
border: 0.1px solid var(--border-color);
|
|
72
|
+
overflow: hidden;
|
|
73
|
+
word-break: keep-all;
|
|
74
|
+
white-space: nowrap;
|
|
75
|
+
text-align: left;
|
|
76
|
+
box-sizing: border-box;
|
|
77
|
+
user-select: none;
|
|
78
|
+
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.Spreadsheet__header {
|
|
82
|
+
background: var(--header-background-color);
|
|
83
|
+
color: var(--readonly-text-color);
|
|
84
|
+
text-align: center;
|
|
85
|
+
font: inherit;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.Spreadsheet__header--selected {
|
|
89
|
+
background: #5f6268;
|
|
90
|
+
color: #fff;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.Spreadsheet__header,
|
|
94
|
+
.Spreadsheet__data-viewer,
|
|
95
|
+
.Spreadsheet__data-editor input {
|
|
96
|
+
padding: 4px;
|
|
97
|
+
box-sizing: border-box;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.Spreadsheet__data-viewer--preserve-breaks {
|
|
101
|
+
white-space: pre-wrap;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.Spreadsheet__data-editor,
|
|
105
|
+
.Spreadsheet__data-editor input {
|
|
106
|
+
width: 100%;
|
|
107
|
+
height: 100%;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.Spreadsheet__data-editor input {
|
|
111
|
+
font: inherit;
|
|
112
|
+
color: inherit;
|
|
113
|
+
background: none;
|
|
114
|
+
border: none;
|
|
115
|
+
outline: none;
|
|
116
|
+
margin: 0;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.Spreadsheet__data-viewer--boolean {
|
|
120
|
+
text-align: center;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.Spreadsheet__floating-rect {
|
|
124
|
+
position: absolute;
|
|
125
|
+
pointer-events: none;
|
|
126
|
+
box-sizing: border-box;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.Spreadsheet__floating-rect--hidden {
|
|
130
|
+
display: none;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.Spreadsheet__floating-rect--selected {
|
|
134
|
+
background: var(--outline-background-color);
|
|
135
|
+
border: 2px var(--outline-color) solid;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.Spreadsheet__floating-rect--dragging {
|
|
139
|
+
border: none;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.Spreadsheet__floating-rect--copied {
|
|
143
|
+
border: 2px var(--outline-color) dashed;
|
|
144
|
+
}
|