pixel-react 1.2.1 → 1.2.2
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/AppHeader/types.d.ts +11 -2
- package/lib/components/Avatar/Avatar.d.ts +5 -0
- package/lib/components/Avatar/Avatar.stories.d.ts +10 -0
- package/lib/components/Avatar/index.d.ts +1 -0
- package/lib/components/Avatar/types.d.ts +26 -0
- package/lib/components/ExcelFile/ExcelFile/Excel/ActiveCell.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/ColumnIndicator.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/Copied.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/CornerIndicator.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/DataEditor.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/DataViewer.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/FloatingRect.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/HeaderRow.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/Row.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/RowIndicator.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/Selected.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/Spreadsheet.d.ts +6 -7
- package/lib/components/ExcelFile/ExcelFile/Excel/Table.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/actions.d.ts +49 -5
- package/lib/components/ExcelFile/ExcelFile/Excel/context.d.ts +3 -3
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/engine.d.ts +5 -5
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/formula.d.ts +6 -6
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/index.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/point-graph.d.ts +2 -2
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/point-hash.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/engine/point-set.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/index.d.ts +11 -11
- package/lib/components/ExcelFile/ExcelFile/Excel/matrix.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/point-range.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/reducer.d.ts +5 -5
- package/lib/components/ExcelFile/ExcelFile/Excel/selection.d.ts +3 -3
- package/lib/components/ExcelFile/ExcelFile/Excel/types.d.ts +11 -48
- package/lib/components/ExcelFile/ExcelFile/Excel/use-dispatch.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/use-selector.d.ts +1 -1
- package/lib/components/ExcelFile/ExcelFile/Excel/util.d.ts +11 -12
- package/lib/components/ExcelFile/ExcelFile/ExcelFile.d.ts +16 -0
- package/lib/components/ExcelFile/ExcelSheetBar/ExcelSheetBar.d.ts +0 -3
- package/lib/components/ExcelFile/ExcelToolBar/ExcelToolBar.d.ts +12 -0
- package/lib/components/ExcelFile/Types.d.ts +2 -49
- package/lib/components/Form/Form.d.ts +1 -15
- package/lib/components/Form/Form.stories.d.ts +6 -5
- package/lib/components/Form/Forms.d.ts +8 -0
- package/lib/components/Form/index.d.ts +1 -1
- package/lib/components/MenuOption/types.d.ts +7 -7
- package/lib/components/ModulesChip/ModuleChip.d.ts +4 -0
- package/lib/components/ModulesChip/ModuleChip.stories.d.ts +6 -0
- package/lib/components/ModulesChip/index.d.ts +1 -0
- package/lib/components/ModulesChip/types.d.ts +14 -0
- package/lib/components/MultiSelect/MultiSelectTypes.d.ts +1 -0
- package/lib/components/Toastify/Toastify.d.ts +8 -0
- package/lib/components/Toastify/Toastify.stories.d.ts +6 -0
- package/lib/components/Toastify/index.d.ts +1 -0
- package/lib/components/Toastify/types.d.ts +7 -0
- package/lib/components/Tooltip/types.d.ts +6 -0
- package/lib/components/Typography/types.d.ts +1 -0
- package/lib/index.d.ts +75 -22
- package/lib/index.esm.js +26686 -870
- package/lib/index.esm.js.map +1 -1
- package/lib/index.js +26684 -864
- package/lib/index.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/StyleGuide/ColorPalette/colorPaletteList.ts +10 -0
- package/src/assets/Themes/BaseTheme.scss +2 -0
- package/src/assets/Themes/DarkTheme.scss +2 -0
- package/src/assets/icons/client_profile.svg +4 -0
- package/src/assets/icons/fireflink_finder_logo.svg +7 -0
- package/src/assets/icons/fireflink_platform.svg +4 -0
- package/src/assets/icons/license_expired.svg +20 -0
- package/src/components/AppHeader/AppHeader.stories.tsx +24 -3
- package/src/components/AppHeader/AppHeader.tsx +29 -11
- package/src/components/AppHeader/types.ts +11 -3
- package/src/components/Avatar/Avatar.scss +24 -0
- package/src/components/Avatar/Avatar.stories.tsx +56 -0
- package/src/components/Avatar/Avatar.tsx +25 -0
- package/src/components/Avatar/index.ts +1 -0
- package/src/components/Avatar/types.ts +27 -0
- package/src/components/ExcelFile/ColorBarselector/ColorBarSelector.scss +0 -2
- package/src/components/ExcelFile/ContextMenu/ContextMenu.scss +1 -4
- package/src/components/ExcelFile/ContextMenu/ContextMenu.tsx +0 -1
- package/src/components/ExcelFile/ExcelFile/Excel/ActiveCell.tsx +13 -13
- package/src/components/ExcelFile/ExcelFile/Excel/Cell.tsx +13 -12
- package/src/components/ExcelFile/ExcelFile/Excel/ColumnIndicator.tsx +40 -32
- package/src/components/ExcelFile/ExcelFile/Excel/Copied.tsx +4 -4
- package/src/components/ExcelFile/ExcelFile/Excel/CornerIndicator.tsx +10 -10
- package/src/components/ExcelFile/ExcelFile/Excel/DataEditor.tsx +5 -5
- package/src/components/ExcelFile/ExcelFile/Excel/DataViewer.tsx +10 -10
- package/src/components/ExcelFile/ExcelFile/Excel/FloatingRect.tsx +6 -6
- package/src/components/ExcelFile/ExcelFile/Excel/HeaderRow.tsx +1 -1
- package/src/components/ExcelFile/ExcelFile/Excel/Row.tsx +1 -1
- package/src/components/ExcelFile/ExcelFile/Excel/RowIndicator.tsx +34 -27
- package/src/components/ExcelFile/ExcelFile/Excel/Selected.tsx +5 -5
- package/src/components/ExcelFile/ExcelFile/Excel/{Spreadsheet.css → Spreadsheet.scss} +21 -37
- package/src/components/ExcelFile/ExcelFile/Excel/Spreadsheet.tsx +87 -78
- package/src/components/ExcelFile/ExcelFile/Excel/Table.tsx +2 -2
- package/src/components/ExcelFile/ExcelFile/Excel/actions.ts +121 -31
- package/src/components/ExcelFile/ExcelFile/Excel/areModelsEqual.ts +1 -1
- package/src/components/ExcelFile/ExcelFile/Excel/context.ts +4 -4
- package/src/components/ExcelFile/ExcelFile/Excel/engine/engine.ts +7 -7
- package/src/components/ExcelFile/ExcelFile/Excel/engine/formula.ts +11 -11
- package/src/components/ExcelFile/ExcelFile/Excel/engine/index.ts +2 -2
- package/src/components/ExcelFile/ExcelFile/Excel/engine/point-graph.ts +3 -3
- package/src/components/ExcelFile/ExcelFile/Excel/engine/point-hash.ts +2 -2
- package/src/components/ExcelFile/ExcelFile/Excel/engine/point-set.ts +2 -2
- package/src/components/ExcelFile/ExcelFile/Excel/index.ts +12 -11
- package/src/components/ExcelFile/ExcelFile/Excel/matrix.ts +18 -24
- package/src/components/ExcelFile/ExcelFile/Excel/point-range.ts +1 -1
- package/src/components/ExcelFile/ExcelFile/Excel/reducer.ts +311 -41
- package/src/components/ExcelFile/ExcelFile/Excel/selection.ts +5 -5
- package/src/components/ExcelFile/ExcelFile/Excel/types.ts +14 -66
- package/src/components/ExcelFile/ExcelFile/Excel/typings/fast-formula-parser.d.ts +8 -8
- package/src/components/ExcelFile/ExcelFile/Excel/use-dispatch.ts +2 -2
- package/src/components/ExcelFile/ExcelFile/Excel/use-selector.ts +3 -3
- package/src/components/ExcelFile/ExcelFile/Excel/util.ts +21 -22
- package/src/components/ExcelFile/ExcelFile/ExcelFile.scss +0 -3
- package/src/components/ExcelFile/ExcelFile/ExcelFile.tsx +45 -403
- package/src/components/ExcelFile/ExcelFile.stories.tsx +10 -29
- package/src/components/ExcelFile/ExcelSheetBar/ExcelSheetBar.tsx +1 -12
- package/src/components/ExcelFile/ExcelToolBar/ExcelToolBar.scss +0 -3
- package/src/components/ExcelFile/ExcelToolBar/ExcelToolBar.tsx +147 -127
- package/src/components/ExcelFile/Types.ts +3 -70
- package/src/components/ExcelFile/index.ts +1 -1
- package/src/components/Form/Form.d.ts +3 -0
- package/src/components/Form/Form.scss +31 -4
- package/src/components/Form/Form.stories.tsx +172 -138
- package/src/components/Form/Form.ts +2 -0
- package/src/components/Form/Forms.tsx +25 -0
- package/src/components/Form/index.ts +1 -1
- package/src/components/Icon/iconList.ts +8 -0
- package/src/components/IconButton/IconButton.scss +1 -1
- package/src/components/MenuOption/types.ts +7 -6
- package/src/components/ModulesChip/ModuleChip.scss +20 -0
- package/src/components/ModulesChip/ModuleChip.stories.tsx +41 -0
- package/src/components/ModulesChip/ModuleChip.tsx +31 -0
- package/src/components/ModulesChip/index.ts +1 -0
- package/src/components/ModulesChip/types.ts +14 -0
- package/src/components/MultiSelect/Dropdown.tsx +6 -1
- package/src/components/MultiSelect/MultiSelect.scss +17 -10
- package/src/components/MultiSelect/MultiSelect.stories.tsx +16 -4
- package/src/components/MultiSelect/MultiSelect.tsx +11 -4
- package/src/components/MultiSelect/MultiSelectTypes.ts +4 -3
- package/src/components/Select/Select.scss +4 -0
- package/src/components/Select/Select.tsx +2 -2
- package/src/components/Toastify/Toastify.stories.tsx +52 -0
- package/src/components/Toastify/Toastify.tsx +66 -0
- package/src/components/Toastify/index.ts +1 -0
- package/src/components/Toastify/types.ts +8 -0
- package/src/components/Tooltip/Tooltip.tsx +2 -1
- package/src/components/Tooltip/types.ts +6 -0
- package/src/components/Typography/Typography.scss +12 -4
- package/src/components/Typography/Typography.stories.tsx +2 -0
- package/src/components/Typography/Typography.tsx +2 -0
- package/src/components/Typography/types.ts +1 -0
- package/src/index.ts +10 -2
- package/src/components/ExcelFile/ChangeExcelStyles.tsx +0 -78
- package/src/components/ExcelFile/ImportExcelStyles.tsx +0 -86
- package/src/components/Form/Form.tsx +0 -57
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as Point from
|
|
1
|
+
import * as Point from './point';
|
|
2
2
|
|
|
3
3
|
/** A two-dimensional array of given type T in rows and columns */
|
|
4
4
|
export type Matrix<T> = Array<Array<T | undefined>>;
|
|
@@ -65,7 +65,7 @@ export function set<T>(
|
|
|
65
65
|
if (nextFirstRow.length <= point.column) {
|
|
66
66
|
nextFirstRow.length = point.column + 1; // Extend the first row if needed
|
|
67
67
|
}
|
|
68
|
-
|
|
68
|
+
|
|
69
69
|
// Set the modified first row back into the matrix
|
|
70
70
|
nextMatrix[0] = nextFirstRow;
|
|
71
71
|
|
|
@@ -82,10 +82,8 @@ export function set<T>(
|
|
|
82
82
|
return nextMatrix;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
|
|
86
85
|
/** Like Matrix.set() but mutates the matrix */
|
|
87
86
|
|
|
88
|
-
|
|
89
87
|
export function mutableSet<T>(
|
|
90
88
|
point: Point.Point,
|
|
91
89
|
value: T,
|
|
@@ -114,8 +112,6 @@ export function mutableSet<T>(
|
|
|
114
112
|
row[point.column] = value;
|
|
115
113
|
}
|
|
116
114
|
|
|
117
|
-
|
|
118
|
-
|
|
119
115
|
/** Removes the coordinate of matrix */
|
|
120
116
|
// export function unset<T>(point: Point.Point, matrix: Matrix<T>): Matrix<T> {
|
|
121
117
|
// if (!has(point, matrix)) {
|
|
@@ -155,7 +151,6 @@ export function unset<T>(point: Point.Point, matrix: Matrix<T>): Matrix<T> {
|
|
|
155
151
|
return nextMatrix;
|
|
156
152
|
}
|
|
157
153
|
|
|
158
|
-
|
|
159
154
|
/** Creates an array of values by running each element in collection thru iteratee. */
|
|
160
155
|
export function map<T, T2>(
|
|
161
156
|
func: (value: T | undefined, point: Point.Point) => T2,
|
|
@@ -187,34 +182,33 @@ export function* entries<T>(
|
|
|
187
182
|
|
|
188
183
|
export function join(
|
|
189
184
|
matrix: Matrix<unknown>,
|
|
190
|
-
horizontalSeparator =
|
|
191
|
-
verticalSeparator =
|
|
185
|
+
horizontalSeparator = '\t',
|
|
186
|
+
verticalSeparator = '\n'
|
|
192
187
|
): string {
|
|
193
|
-
let joined =
|
|
188
|
+
let joined = '';
|
|
194
189
|
const { rows, columns } = getSize(matrix);
|
|
195
|
-
|
|
190
|
+
|
|
196
191
|
for (let row = 0; row < rows; row++) {
|
|
197
192
|
if (row) {
|
|
198
193
|
joined += verticalSeparator;
|
|
199
194
|
}
|
|
200
|
-
|
|
195
|
+
|
|
201
196
|
for (let column = 0; column < columns; column++) {
|
|
202
197
|
if (column) {
|
|
203
198
|
joined += horizontalSeparator;
|
|
204
199
|
}
|
|
205
|
-
|
|
200
|
+
|
|
206
201
|
// Ensure matrix[row] exists and matrix[row][column] is not undefined
|
|
207
202
|
const cellValue = matrix[row]?.[column];
|
|
208
|
-
|
|
203
|
+
|
|
209
204
|
// If cellValue is undefined, you can use a fallback value like an empty string
|
|
210
|
-
joined += cellValue !== undefined ? String(cellValue) :
|
|
205
|
+
joined += cellValue !== undefined ? String(cellValue) : '';
|
|
211
206
|
}
|
|
212
207
|
}
|
|
213
|
-
|
|
208
|
+
|
|
214
209
|
return joined;
|
|
215
210
|
}
|
|
216
211
|
|
|
217
|
-
|
|
218
212
|
/**
|
|
219
213
|
* Parses a CSV separated by a horizontalSeparator and verticalSeparator into a
|
|
220
214
|
* Matrix using a transform function
|
|
@@ -222,19 +216,19 @@ export function join(
|
|
|
222
216
|
export function split<T>(
|
|
223
217
|
csv: string,
|
|
224
218
|
transform: (value: string) => T,
|
|
225
|
-
horizontalSeparator =
|
|
219
|
+
horizontalSeparator = '\t',
|
|
226
220
|
verticalSeparator: string | RegExp = /\r\n|\n|\r/
|
|
227
221
|
): Matrix<T> {
|
|
228
222
|
// Temporarily replace line breaks inside quotes
|
|
229
223
|
const replaced = csv.replace(/"([^"]*?)"/g, (_, p1) => {
|
|
230
|
-
return p1.replace(/\n/g,
|
|
224
|
+
return p1.replace(/\n/g, '\\n');
|
|
231
225
|
});
|
|
232
226
|
return replaced.split(verticalSeparator).map((row) =>
|
|
233
227
|
row
|
|
234
228
|
.split(horizontalSeparator)
|
|
235
229
|
.map((line) => {
|
|
236
230
|
// Restore original line breaks in each line
|
|
237
|
-
return line.replace(/\\n/g,
|
|
231
|
+
return line.replace(/\\n/g, '\n');
|
|
238
232
|
})
|
|
239
233
|
.map(transform)
|
|
240
234
|
);
|
|
@@ -246,7 +240,7 @@ export function has(point: Point.Point, matrix: Matrix<unknown>): boolean {
|
|
|
246
240
|
if (!firstRow) {
|
|
247
241
|
return false; // If first row is undefined, return false
|
|
248
242
|
}
|
|
249
|
-
|
|
243
|
+
|
|
250
244
|
// Perform validation checks
|
|
251
245
|
return (
|
|
252
246
|
point.row >= 0 &&
|
|
@@ -258,7 +252,6 @@ export function has(point: Point.Point, matrix: Matrix<unknown>): boolean {
|
|
|
258
252
|
);
|
|
259
253
|
}
|
|
260
254
|
|
|
261
|
-
|
|
262
255
|
/** Counts of the rows and column in a matrix */
|
|
263
256
|
export type Size = {
|
|
264
257
|
/** Count of the rows in the matrix */
|
|
@@ -372,7 +365,9 @@ export function toArray<T1, T2>(
|
|
|
372
365
|
for (let column = 0; column < currentRow.length; column++) {
|
|
373
366
|
const value = currentRow[column];
|
|
374
367
|
// If transform is provided, apply it; otherwise, use the value as is
|
|
375
|
-
array.push(
|
|
368
|
+
array.push(
|
|
369
|
+
transform ? transform(value, { row, column }) : (value as T2)
|
|
370
|
+
);
|
|
376
371
|
}
|
|
377
372
|
}
|
|
378
373
|
}
|
|
@@ -380,7 +375,6 @@ export function toArray<T1, T2>(
|
|
|
380
375
|
return array;
|
|
381
376
|
}
|
|
382
377
|
|
|
383
|
-
|
|
384
378
|
/** Returns the maximum point in the matrix */
|
|
385
379
|
export function maxPoint(matrix: Matrix<unknown>): Point.Point {
|
|
386
380
|
const size = getSize(matrix);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { PointRange } from
|
|
2
|
-
import * as Matrix from
|
|
3
|
-
import * as Types from
|
|
4
|
-
import * as Point from
|
|
1
|
+
import { PointRange } from './point-range';
|
|
2
|
+
import * as Matrix from './matrix';
|
|
3
|
+
import * as Types from './types';
|
|
4
|
+
import * as Point from './point';
|
|
5
5
|
import {
|
|
6
6
|
Selection,
|
|
7
7
|
EmptySelection,
|
|
@@ -9,14 +9,14 @@ import {
|
|
|
9
9
|
EntireColumnsSelection,
|
|
10
10
|
EntireRowsSelection,
|
|
11
11
|
EntireWorksheetSelection,
|
|
12
|
-
} from
|
|
13
|
-
import { isActive } from
|
|
14
|
-
import * as Actions from
|
|
15
|
-
import { Model, updateCellValue, createFormulaParser } from
|
|
12
|
+
} from './selection';
|
|
13
|
+
import { isActive } from './util';
|
|
14
|
+
import * as Actions from './actions';
|
|
15
|
+
import { Model, updateCellValue, createFormulaParser } from './engine';
|
|
16
16
|
|
|
17
17
|
export const INITIAL_STATE: Types.StoreState = {
|
|
18
18
|
active: null,
|
|
19
|
-
mode:
|
|
19
|
+
mode: 'view',
|
|
20
20
|
rowDimensions: {},
|
|
21
21
|
columnDimensions: {},
|
|
22
22
|
lastChanged: null,
|
|
@@ -34,6 +34,83 @@ export default function reducer(
|
|
|
34
34
|
action: Actions.Action
|
|
35
35
|
): Types.StoreState {
|
|
36
36
|
switch (action.type) {
|
|
37
|
+
case Actions.BOLD: {
|
|
38
|
+
const selectedRange = state.selected.toRange(state.model.data);
|
|
39
|
+
const updatedData = applyBoldToCells(
|
|
40
|
+
state.model.data,
|
|
41
|
+
selectedRange as PointRange
|
|
42
|
+
);
|
|
43
|
+
return {
|
|
44
|
+
...state,
|
|
45
|
+
model: new Model(state.model.createFormulaParser, updatedData),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
case Actions.ITALIC: {
|
|
50
|
+
const selectedRange = state.selected.toRange(state.model.data);
|
|
51
|
+
const updatedData = applyItalicToCells(
|
|
52
|
+
state.model.data,
|
|
53
|
+
selectedRange as PointRange
|
|
54
|
+
);
|
|
55
|
+
return {
|
|
56
|
+
...state,
|
|
57
|
+
model: new Model(state.model.createFormulaParser, updatedData),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
case Actions.UNDERLINE: {
|
|
62
|
+
const selectedRange = state.selected.toRange(state.model.data);
|
|
63
|
+
const updatedData = applyUnderlineToCells(
|
|
64
|
+
state.model.data,
|
|
65
|
+
selectedRange as PointRange
|
|
66
|
+
);
|
|
67
|
+
return {
|
|
68
|
+
...state,
|
|
69
|
+
model: new Model(state.model.createFormulaParser, updatedData),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
case Actions.COLOR: {
|
|
73
|
+
const { value } = action.payload;
|
|
74
|
+
const selectedRange = state.selected.toRange(state.model.data);
|
|
75
|
+
const updatedData = applyColorToCells(
|
|
76
|
+
state.model.data,
|
|
77
|
+
selectedRange as PointRange,
|
|
78
|
+
value
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
...state,
|
|
83
|
+
model: new Model(state.model.createFormulaParser, updatedData),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
case Actions.BACKGROUND_COLOR: {
|
|
88
|
+
const { value } = action.payload;
|
|
89
|
+
const selectedRange = state.selected.toRange(state.model.data);
|
|
90
|
+
const updatedData = applyBackgroundColorToCells(
|
|
91
|
+
state.model.data,
|
|
92
|
+
selectedRange as PointRange,
|
|
93
|
+
value
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
...state,
|
|
98
|
+
model: new Model(state.model.createFormulaParser, updatedData),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
case Actions.FORMATE_PAINTER: {
|
|
103
|
+
const selectedRange = state.selected.toRange(state.model.data);
|
|
104
|
+
const updatedData = applyUnderlineToCells(
|
|
105
|
+
state.model.data,
|
|
106
|
+
selectedRange as PointRange
|
|
107
|
+
);
|
|
108
|
+
return {
|
|
109
|
+
...state,
|
|
110
|
+
model: new Model(state.model.createFormulaParser, updatedData),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
37
114
|
case Actions.SET_DATA: {
|
|
38
115
|
const { data } = action.payload;
|
|
39
116
|
const nextActive =
|
|
@@ -64,7 +141,7 @@ export default function reducer(
|
|
|
64
141
|
? new EntireRowsSelection(active.row, row)
|
|
65
142
|
: new EntireRowsSelection(row, row),
|
|
66
143
|
active: extend && active ? active : { ...Point.ORIGIN, row },
|
|
67
|
-
mode:
|
|
144
|
+
mode: 'view',
|
|
68
145
|
};
|
|
69
146
|
}
|
|
70
147
|
case Actions.SELECT_ENTIRE_COLUMN: {
|
|
@@ -78,7 +155,7 @@ export default function reducer(
|
|
|
78
155
|
? new EntireColumnsSelection(active.column, column)
|
|
79
156
|
: new EntireColumnsSelection(column, column),
|
|
80
157
|
active: extend && active ? active : { ...Point.ORIGIN, column },
|
|
81
|
-
mode:
|
|
158
|
+
mode: 'view',
|
|
82
159
|
};
|
|
83
160
|
}
|
|
84
161
|
case Actions.SELECT_ENTIRE_WORKSHEET: {
|
|
@@ -86,7 +163,7 @@ export default function reducer(
|
|
|
86
163
|
...state,
|
|
87
164
|
selected: new EntireWorksheetSelection(),
|
|
88
165
|
active: Point.ORIGIN,
|
|
89
|
-
mode:
|
|
166
|
+
mode: 'view',
|
|
90
167
|
};
|
|
91
168
|
}
|
|
92
169
|
case Actions.SET_SELECTION: {
|
|
@@ -100,7 +177,7 @@ export default function reducer(
|
|
|
100
177
|
...state,
|
|
101
178
|
selected: selection,
|
|
102
179
|
active: active || null,
|
|
103
|
-
mode:
|
|
180
|
+
mode: 'view',
|
|
104
181
|
};
|
|
105
182
|
}
|
|
106
183
|
case Actions.SELECT: {
|
|
@@ -109,7 +186,7 @@ export default function reducer(
|
|
|
109
186
|
return {
|
|
110
187
|
...state,
|
|
111
188
|
selected: new RangeSelection(new PointRange(point, state.active)),
|
|
112
|
-
mode:
|
|
189
|
+
mode: 'view',
|
|
113
190
|
};
|
|
114
191
|
}
|
|
115
192
|
return state;
|
|
@@ -120,7 +197,7 @@ export default function reducer(
|
|
|
120
197
|
...state,
|
|
121
198
|
selected: new RangeSelection(new PointRange(point, point)),
|
|
122
199
|
active: point,
|
|
123
|
-
mode: isActive(state.active, point) ?
|
|
200
|
+
mode: isActive(state.active, point) ? 'edit' : 'view',
|
|
124
201
|
};
|
|
125
202
|
}
|
|
126
203
|
case Actions.SET_CELL_DATA: {
|
|
@@ -174,7 +251,7 @@ export default function reducer(
|
|
|
174
251
|
case Actions.PASTE: {
|
|
175
252
|
const { data: text } = action.payload;
|
|
176
253
|
const { active } = state;
|
|
177
|
-
|
|
254
|
+
|
|
178
255
|
if (!active) {
|
|
179
256
|
return state;
|
|
180
257
|
}
|
|
@@ -189,7 +266,7 @@ export default function reducer(
|
|
|
189
266
|
state.cut && state.copied
|
|
190
267
|
? Matrix.unset(state.copied.start, state.model.data)
|
|
191
268
|
: state.model.data;
|
|
192
|
-
const commit: Types.StoreState[
|
|
269
|
+
const commit: Types.StoreState['lastCommit'] = [];
|
|
193
270
|
for (const point of selectedRange || []) {
|
|
194
271
|
const currentCell = Matrix.get(point, state.model.data);
|
|
195
272
|
commit.push({
|
|
@@ -205,7 +282,7 @@ export default function reducer(
|
|
|
205
282
|
copied: null,
|
|
206
283
|
cut: false,
|
|
207
284
|
hasPasted: true,
|
|
208
|
-
mode:
|
|
285
|
+
mode: 'view',
|
|
209
286
|
lastCommit: commit,
|
|
210
287
|
};
|
|
211
288
|
}
|
|
@@ -217,8 +294,8 @@ export default function reducer(
|
|
|
217
294
|
const paddedData = Matrix.pad(state.model.data, requiredSize);
|
|
218
295
|
|
|
219
296
|
let acc: {
|
|
220
|
-
data: Types.StoreState[
|
|
221
|
-
commit: Types.StoreState[
|
|
297
|
+
data: Types.StoreState['model']['data'];
|
|
298
|
+
commit: Types.StoreState['lastCommit'];
|
|
222
299
|
} = { data: paddedData, commit: [] };
|
|
223
300
|
for (const [point, cell] of Matrix.entries(copied)) {
|
|
224
301
|
let commit = acc.commit || [];
|
|
@@ -275,7 +352,7 @@ export default function reducer(
|
|
|
275
352
|
copied: null,
|
|
276
353
|
cut: false,
|
|
277
354
|
hasPasted: true,
|
|
278
|
-
mode:
|
|
355
|
+
mode: 'view',
|
|
279
356
|
lastCommit: acc.commit,
|
|
280
357
|
};
|
|
281
358
|
}
|
|
@@ -301,7 +378,7 @@ export default function reducer(
|
|
|
301
378
|
if (isActiveReadOnly(state) || event.metaKey) {
|
|
302
379
|
return state;
|
|
303
380
|
}
|
|
304
|
-
if (state.mode ===
|
|
381
|
+
if (state.mode === 'view' && state.active) {
|
|
305
382
|
const selectedRange = state.selected.toRange(state.model.data);
|
|
306
383
|
if (selectedRange?.size() === 1) {
|
|
307
384
|
return edit(clear(state));
|
|
@@ -334,7 +411,7 @@ export default function reducer(
|
|
|
334
411
|
}
|
|
335
412
|
|
|
336
413
|
default:
|
|
337
|
-
throw new Error(
|
|
414
|
+
throw new Error('Unknown action');
|
|
338
415
|
}
|
|
339
416
|
}
|
|
340
417
|
|
|
@@ -350,11 +427,204 @@ export default function reducer(
|
|
|
350
427
|
|
|
351
428
|
// // Shared reducers
|
|
352
429
|
|
|
430
|
+
function applyBoldToCells(
|
|
431
|
+
currentData: Matrix.Matrix<Types.CellBase<any>>,
|
|
432
|
+
selectedRange: PointRange
|
|
433
|
+
): Matrix.Matrix<Types.CellBase<any>> {
|
|
434
|
+
const { start, end } = selectedRange;
|
|
435
|
+
|
|
436
|
+
let updatedData = currentData;
|
|
437
|
+
|
|
438
|
+
for (let row = start.row; row <= end.row; row++) {
|
|
439
|
+
for (let col = start.column; col <= end.column; col++) {
|
|
440
|
+
const currentCell = Matrix.get({ row, column: col }, updatedData);
|
|
441
|
+
|
|
442
|
+
if (!currentCell) {
|
|
443
|
+
continue;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
const updatedCell = {
|
|
447
|
+
...currentCell,
|
|
448
|
+
style: {
|
|
449
|
+
...currentCell.style,
|
|
450
|
+
fontWeight: 'bold',
|
|
451
|
+
},
|
|
452
|
+
};
|
|
453
|
+
|
|
454
|
+
updatedData = Matrix.set({ row, column: col }, updatedCell, updatedData);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
return updatedData;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
function applyItalicToCells(
|
|
462
|
+
currentData: Matrix.Matrix<Types.CellBase<any>>,
|
|
463
|
+
selectedRange: PointRange
|
|
464
|
+
): Matrix.Matrix<Types.CellBase<any>> {
|
|
465
|
+
const { start, end } = selectedRange;
|
|
466
|
+
|
|
467
|
+
let updatedData = currentData;
|
|
468
|
+
|
|
469
|
+
for (let row = start.row; row <= end.row; row++) {
|
|
470
|
+
for (let col = start.column; col <= end.column; col++) {
|
|
471
|
+
const currentCell = Matrix.get({ row, column: col }, updatedData);
|
|
472
|
+
|
|
473
|
+
if (!currentCell) {
|
|
474
|
+
continue;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
const updatedCell = {
|
|
478
|
+
...currentCell,
|
|
479
|
+
style: {
|
|
480
|
+
...currentCell.style,
|
|
481
|
+
fontStyle: 'italic',
|
|
482
|
+
},
|
|
483
|
+
};
|
|
484
|
+
|
|
485
|
+
updatedData = Matrix.set({ row, column: col }, updatedCell, updatedData);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
return updatedData;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
function applyUnderlineToCells(
|
|
493
|
+
currentData: Matrix.Matrix<Types.CellBase<any>>,
|
|
494
|
+
selectedRange: PointRange
|
|
495
|
+
): Matrix.Matrix<Types.CellBase<any>> {
|
|
496
|
+
const { start, end } = selectedRange;
|
|
497
|
+
|
|
498
|
+
let updatedData = currentData;
|
|
499
|
+
|
|
500
|
+
for (let row = start.row; row <= end.row; row++) {
|
|
501
|
+
for (let col = start.column; col <= end.column; col++) {
|
|
502
|
+
const currentCell = Matrix.get({ row, column: col }, updatedData);
|
|
503
|
+
|
|
504
|
+
if (!currentCell) {
|
|
505
|
+
continue;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
const updatedCell = {
|
|
509
|
+
...currentCell,
|
|
510
|
+
style: {
|
|
511
|
+
...currentCell.style,
|
|
512
|
+
textDecoration: 'underline',
|
|
513
|
+
},
|
|
514
|
+
};
|
|
515
|
+
|
|
516
|
+
updatedData = Matrix.set({ row, column: col }, updatedCell, updatedData);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
return updatedData;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
function isValidHexColor(color: string): boolean {
|
|
524
|
+
if (color.length !== 6) {
|
|
525
|
+
return false;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
const hexChars = '0123456789ABCDEFabcdef';
|
|
529
|
+
for (let i = 1; i < color.length; i++) {
|
|
530
|
+
console.log(typeof color[i]);
|
|
531
|
+
|
|
532
|
+
if (!hexChars.includes(color[i] as string)) {
|
|
533
|
+
return false;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
return true;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
function applyColorToCells(
|
|
541
|
+
currentData: Matrix.Matrix<Types.CellBase<any>>,
|
|
542
|
+
selectedRange: PointRange | null,
|
|
543
|
+
color: string
|
|
544
|
+
): Matrix.Matrix<Types.CellBase<any>> {
|
|
545
|
+
if (!selectedRange) {
|
|
546
|
+
return currentData;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
const { start, end } = selectedRange;
|
|
550
|
+
|
|
551
|
+
let updatedData = currentData;
|
|
552
|
+
|
|
553
|
+
const isHex = isValidHexColor(color);
|
|
554
|
+
|
|
555
|
+
const applyColor = isHex ? `#${color}` : color;
|
|
556
|
+
|
|
557
|
+
for (let row = start.row; row <= end.row; row++) {
|
|
558
|
+
for (let col = start.column; col <= end.column; col++) {
|
|
559
|
+
const currentCell = Matrix.get({ row, column: col }, updatedData);
|
|
560
|
+
|
|
561
|
+
if (!currentCell) {
|
|
562
|
+
continue;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
const updatedCell = {
|
|
566
|
+
...currentCell,
|
|
567
|
+
style: {
|
|
568
|
+
...currentCell.style,
|
|
569
|
+
color: applyColor,
|
|
570
|
+
},
|
|
571
|
+
};
|
|
572
|
+
|
|
573
|
+
updatedData = Matrix.set({ row, column: col }, updatedCell, updatedData);
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
return updatedData;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
function applyBackgroundColorToCells(
|
|
581
|
+
currentData: Matrix.Matrix<Types.CellBase<any>>,
|
|
582
|
+
selectedRange: PointRange | null,
|
|
583
|
+
backgroundColor: string
|
|
584
|
+
): Matrix.Matrix<Types.CellBase<any>> {
|
|
585
|
+
if (selectedRange) {
|
|
586
|
+
const { start, end } = selectedRange;
|
|
587
|
+
|
|
588
|
+
let updatedData = currentData;
|
|
589
|
+
|
|
590
|
+
const isHex = isValidHexColor(backgroundColor);
|
|
591
|
+
|
|
592
|
+
const applyColor = isHex ? `#${backgroundColor}` : backgroundColor;
|
|
593
|
+
|
|
594
|
+
for (let row = start.row; row <= end.row; row++) {
|
|
595
|
+
for (let col = start.column; col <= end.column; col++) {
|
|
596
|
+
const currentCell = Matrix.get({ row, column: col }, updatedData);
|
|
597
|
+
|
|
598
|
+
if (!currentCell) {
|
|
599
|
+
continue;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
const updatedCell = {
|
|
603
|
+
...currentCell,
|
|
604
|
+
style: {
|
|
605
|
+
...currentCell.style,
|
|
606
|
+
backgroundColor: applyColor,
|
|
607
|
+
},
|
|
608
|
+
};
|
|
609
|
+
|
|
610
|
+
updatedData = Matrix.set(
|
|
611
|
+
{ row, column: col },
|
|
612
|
+
updatedCell,
|
|
613
|
+
updatedData
|
|
614
|
+
);
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
return updatedData;
|
|
619
|
+
}
|
|
620
|
+
return currentData;
|
|
621
|
+
}
|
|
622
|
+
|
|
353
623
|
function edit(state: Types.StoreState): Types.StoreState {
|
|
354
624
|
if (isActiveReadOnly(state)) {
|
|
355
625
|
return state;
|
|
356
626
|
}
|
|
357
|
-
return { ...state, mode:
|
|
627
|
+
return { ...state, mode: 'edit' };
|
|
358
628
|
}
|
|
359
629
|
|
|
360
630
|
function clear(state: Types.StoreState): Types.StoreState {
|
|
@@ -398,7 +668,7 @@ function blur(state: Types.StoreState): Types.StoreState {
|
|
|
398
668
|
}
|
|
399
669
|
|
|
400
670
|
function view(state: Types.StoreState): Types.StoreState {
|
|
401
|
-
return { ...state, mode:
|
|
671
|
+
return { ...state, mode: 'view' };
|
|
402
672
|
}
|
|
403
673
|
|
|
404
674
|
function commit(changes: Types.CommitChanges): Partial<Types.StoreState> {
|
|
@@ -421,13 +691,13 @@ export const go =
|
|
|
421
691
|
column: (state.active.column + columnDelta) % size.columns,
|
|
422
692
|
};
|
|
423
693
|
if (!Matrix.has(nextActive, state.model.data)) {
|
|
424
|
-
return { ...state, mode:
|
|
694
|
+
return { ...state, mode: 'view' };
|
|
425
695
|
}
|
|
426
696
|
return {
|
|
427
697
|
...state,
|
|
428
698
|
active: nextActive,
|
|
429
699
|
selected: new RangeSelection(new PointRange(nextActive, nextActive)),
|
|
430
|
-
mode:
|
|
700
|
+
mode: 'view',
|
|
431
701
|
};
|
|
432
702
|
};
|
|
433
703
|
|
|
@@ -439,7 +709,7 @@ export type KeyDownHandler = (
|
|
|
439
709
|
) => Types.StoreState | void;
|
|
440
710
|
|
|
441
711
|
type KeyDownHandlers = {
|
|
442
|
-
[K in string]: KeyDownHandler|undefined;
|
|
712
|
+
[K in string]: KeyDownHandler | undefined;
|
|
443
713
|
};
|
|
444
714
|
|
|
445
715
|
const keyDownHandlers: KeyDownHandlers = {
|
|
@@ -465,10 +735,10 @@ const editShiftKeyDownHandlers: KeyDownHandlers = {
|
|
|
465
735
|
};
|
|
466
736
|
|
|
467
737
|
export enum Direction {
|
|
468
|
-
Left =
|
|
469
|
-
Right =
|
|
470
|
-
Top =
|
|
471
|
-
Bottom =
|
|
738
|
+
Left = 'Left',
|
|
739
|
+
Right = 'Right',
|
|
740
|
+
Top = 'Top',
|
|
741
|
+
Bottom = 'Bottom',
|
|
472
742
|
}
|
|
473
743
|
|
|
474
744
|
const shiftKeyDownHandlers: KeyDownHandlers = {
|
|
@@ -521,7 +791,7 @@ export function getKeyDownHandler(
|
|
|
521
791
|
const { key } = event;
|
|
522
792
|
let handlers;
|
|
523
793
|
// Order matters
|
|
524
|
-
if (state.mode ===
|
|
794
|
+
if (state.mode === 'edit') {
|
|
525
795
|
if (event.shiftKey) {
|
|
526
796
|
handlers = editShiftKeyDownHandlers;
|
|
527
797
|
} else {
|
|
@@ -598,18 +868,18 @@ export function modifyRangeSelectionEdge(
|
|
|
598
868
|
edge: Direction
|
|
599
869
|
): RangeSelection {
|
|
600
870
|
const field =
|
|
601
|
-
edge === Direction.Left || edge === Direction.Right ?
|
|
871
|
+
edge === Direction.Left || edge === Direction.Right ? 'column' : 'row';
|
|
602
872
|
|
|
603
873
|
const key =
|
|
604
|
-
edge === Direction.Left || edge === Direction.Top ?
|
|
605
|
-
const delta = key ===
|
|
874
|
+
edge === Direction.Left || edge === Direction.Top ? 'start' : 'end';
|
|
875
|
+
const delta = key === 'start' ? -1 : 1;
|
|
606
876
|
|
|
607
877
|
const edgeOffsets = rangeSelection.range.has({
|
|
608
878
|
...active,
|
|
609
879
|
[field]: active[field] + delta * -1,
|
|
610
880
|
});
|
|
611
881
|
|
|
612
|
-
const keyToModify = edgeOffsets ? (key ===
|
|
882
|
+
const keyToModify = edgeOffsets ? (key === 'start' ? 'end' : 'start') : key;
|
|
613
883
|
|
|
614
884
|
const nextRange = new PointRange(
|
|
615
885
|
rangeSelection.range.start,
|
|
@@ -633,8 +903,8 @@ export function modifyEntireRowsSelection(
|
|
|
633
903
|
return selection;
|
|
634
904
|
}
|
|
635
905
|
const delta = edge === Direction.Top ? -1 : 1;
|
|
636
|
-
const property = edge === Direction.Top ?
|
|
637
|
-
const oppositeProperty = property ===
|
|
906
|
+
const property = edge === Direction.Top ? 'start' : 'end';
|
|
907
|
+
const oppositeProperty = property === 'start' ? 'end' : 'start';
|
|
638
908
|
const newSelectionData = { ...selection };
|
|
639
909
|
if (
|
|
640
910
|
edge === Direction.Top
|
|
@@ -662,8 +932,8 @@ export function modifyEntireColumnsSelection(
|
|
|
662
932
|
return selection;
|
|
663
933
|
}
|
|
664
934
|
const delta = edge === Direction.Left ? -1 : 1;
|
|
665
|
-
const property = edge === Direction.Left ?
|
|
666
|
-
const oppositeProperty = property ===
|
|
935
|
+
const property = edge === Direction.Left ? 'start' : 'end';
|
|
936
|
+
const oppositeProperty = property === 'start' ? 'end' : 'start';
|
|
667
937
|
const newSelectionData = { ...selection };
|
|
668
938
|
if (
|
|
669
939
|
edge === Direction.Left
|