pixel-react 1.1.8 → 1.1.9
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
}
|