@univerjs/sheets-find-replace 0.2.5 → 0.2.6
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/cjs/index.js +1 -1
- package/lib/es/index.js +433 -415
- package/lib/types/plugin.d.ts +1 -1
- package/lib/umd/index.js +1 -1
- package/package.json +16 -16
package/lib/es/index.js
CHANGED
|
@@ -1,130 +1,141 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: !0, configurable: !0, writable: !0, value }) : obj[key] = value;
|
|
3
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: !0 });
|
|
4
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key != "symbol" ? key + "" : key, value);
|
|
5
|
+
import { CommandType, IUndoRedoService, ICommandService, Rectangle, OnLifecycle, LifecycleStages, Inject, Injector, ThemeService, Disposable, EDITOR_ACTIVATED, IContextService, IUniverInstanceService, UniverInstanceType, fromCallback, ColorKit, rotate, groupBy, ObjectMatrix, Tools, replaceInDocumentBody, DependentOn, Plugin } from "@univerjs/core";
|
|
6
|
+
import { FindReplaceController, IFindReplaceService, FindModel, FindBy, FindScope, FindDirection, UniverFindReplacePlugin } from "@univerjs/find-replace";
|
|
7
|
+
import { SetRangeValuesCommand, SheetsSelectionsService, SetWorksheetActiveOperation, SetSelectionsOperation, SetWorksheetActivateCommand, UniverSheetsPlugin } from "@univerjs/sheets";
|
|
8
|
+
import { Shape, Rect, IRenderManagerService, RENDER_RAW_FORMULA_KEY } from "@univerjs/engine-render";
|
|
9
|
+
import { SheetSkeletonManagerService, getCoordByCell, getSheetObject, ScrollToCellCommand } from "@univerjs/sheets-ui";
|
|
10
|
+
import { filter, Subject, throttleTime, merge, skip, debounceTime } from "rxjs";
|
|
11
|
+
const _SheetFindReplaceHighlightShape = class _SheetFindReplaceHighlightShape extends Shape {
|
|
12
|
+
constructor(key, props) {
|
|
13
|
+
super(key, props);
|
|
14
|
+
__publicField(this, "_activated", !1);
|
|
15
|
+
__publicField(this, "_inHiddenRange", !1);
|
|
16
|
+
__publicField(this, "_color");
|
|
17
|
+
props && this.setShapeProps(props);
|
|
18
|
+
}
|
|
19
|
+
setShapeProps(props) {
|
|
20
|
+
this._activated = !!props.activated, typeof props.inHiddenRange < "u" && (this._inHiddenRange = props.inHiddenRange), typeof props.color < "u" && (this._color = props.color), this.transformByState({
|
|
21
|
+
width: props.width,
|
|
22
|
+
height: props.height
|
|
22
23
|
});
|
|
23
24
|
}
|
|
24
|
-
_draw(
|
|
25
|
-
const
|
|
26
|
-
|
|
25
|
+
_draw(ctx) {
|
|
26
|
+
const activated = this._activated, color = `rgba(${this._color.r}, ${this._color.g}, ${this._color.b}, 0.35)`, borderColor = `rgb(${this._color.r}, ${this._color.g}, ${this._color.b})`;
|
|
27
|
+
Rect.drawWith(ctx, {
|
|
27
28
|
width: this.width,
|
|
28
29
|
height: this.height,
|
|
29
|
-
fill:
|
|
30
|
-
stroke:
|
|
31
|
-
strokeWidth:
|
|
30
|
+
fill: color,
|
|
31
|
+
stroke: activated ? borderColor : void 0,
|
|
32
|
+
strokeWidth: activated ? 2 : 0,
|
|
32
33
|
evented: !1
|
|
33
34
|
});
|
|
34
35
|
}
|
|
35
|
-
}
|
|
36
|
-
|
|
36
|
+
};
|
|
37
|
+
__name(_SheetFindReplaceHighlightShape, "SheetFindReplaceHighlightShape");
|
|
38
|
+
let SheetFindReplaceHighlightShape = _SheetFindReplaceHighlightShape;
|
|
39
|
+
const SheetReplaceCommand = {
|
|
37
40
|
id: "sheet.command.replace",
|
|
38
|
-
type:
|
|
39
|
-
handler: async (
|
|
40
|
-
const
|
|
41
|
-
unitId
|
|
42
|
-
subUnitId:
|
|
43
|
-
value:
|
|
41
|
+
type: CommandType.COMMAND,
|
|
42
|
+
handler: /* @__PURE__ */ __name(async (accessor, params) => {
|
|
43
|
+
const undoRedoService = accessor.get(IUndoRedoService), commandService = accessor.get(ICommandService), { unitId, replacements } = params, disposeBatchingHandler = undoRedoService.__tempBatchingUndoRedo(unitId), results = await Promise.all(replacements.map((replacement) => commandService.executeCommand(SetRangeValuesCommand.id, {
|
|
44
|
+
unitId,
|
|
45
|
+
subUnitId: replacement.subUnitId,
|
|
46
|
+
value: replacement.value
|
|
44
47
|
})));
|
|
45
|
-
return
|
|
46
|
-
}
|
|
48
|
+
return disposeBatchingHandler.dispose(), getReplaceAllResult(results, replacements);
|
|
49
|
+
}, "handler")
|
|
47
50
|
};
|
|
48
|
-
function
|
|
49
|
-
let
|
|
50
|
-
return
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
}), { success
|
|
51
|
+
function getReplaceAllResult(results, replacements) {
|
|
52
|
+
let success = 0, failure = 0;
|
|
53
|
+
return results.forEach((r, index) => {
|
|
54
|
+
const count = replacements[index].count;
|
|
55
|
+
r ? success += count : failure += count;
|
|
56
|
+
}), { success, failure };
|
|
54
57
|
}
|
|
55
|
-
|
|
56
|
-
|
|
58
|
+
__name(getReplaceAllResult, "getReplaceAllResult");
|
|
59
|
+
function isSamePosition(range1, range2) {
|
|
60
|
+
return range1.startRow === range2.startRow && range1.startColumn === range2.startColumn;
|
|
57
61
|
}
|
|
58
|
-
|
|
59
|
-
|
|
62
|
+
__name(isSamePosition, "isSamePosition");
|
|
63
|
+
function isBehindPositionWithRowPriority(range1, range2) {
|
|
64
|
+
return range1.startRow < range2.startRow || range1.startRow === range2.startRow && range1.startColumn <= range2.startColumn;
|
|
60
65
|
}
|
|
61
|
-
|
|
62
|
-
|
|
66
|
+
__name(isBehindPositionWithRowPriority, "isBehindPositionWithRowPriority");
|
|
67
|
+
function isBehindPositionWithColumnPriority(range1, range2) {
|
|
68
|
+
return range1.startColumn < range2.startColumn || range1.startColumn === range2.startColumn && range1.startRow <= range2.startRow;
|
|
63
69
|
}
|
|
64
|
-
|
|
65
|
-
|
|
70
|
+
__name(isBehindPositionWithColumnPriority, "isBehindPositionWithColumnPriority");
|
|
71
|
+
function isBeforePositionWithRowPriority(range1, range2) {
|
|
72
|
+
return range1.startRow > range2.startRow || range1.startRow === range2.startRow && range1.startColumn >= range2.startColumn;
|
|
66
73
|
}
|
|
67
|
-
|
|
68
|
-
|
|
74
|
+
__name(isBeforePositionWithRowPriority, "isBeforePositionWithRowPriority");
|
|
75
|
+
function isBeforePositionWithColumnPriority(range1, range2) {
|
|
76
|
+
return range1.startColumn > range2.startColumn || range1.startColumn === range2.startColumn && range1.startRow >= range2.startRow;
|
|
69
77
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
78
|
+
__name(isBeforePositionWithColumnPriority, "isBeforePositionWithColumnPriority");
|
|
79
|
+
function isSelectionSingleCell(selection, worksheet) {
|
|
80
|
+
const { range } = selection, { startRow, startColumn } = range, hasMergedCell = worksheet.getMergedCell(startRow, startColumn);
|
|
81
|
+
return hasMergedCell ? Rectangle.equals(range, hasMergedCell) : range.endRow === range.startRow && range.endColumn === range.startColumn;
|
|
73
82
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
83
|
+
__name(isSelectionSingleCell, "isSelectionSingleCell");
|
|
84
|
+
var __defProp$1 = Object.defineProperty, __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor, __decorateClass$1 = /* @__PURE__ */ __name((decorators, target, key, kind) => {
|
|
85
|
+
for (var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$1(target, key) : target, i = decorators.length - 1, decorator; i >= 0; i--)
|
|
86
|
+
(decorator = decorators[i]) && (result = (kind ? decorator(target, key, result) : decorator(result)) || result);
|
|
87
|
+
return kind && result && __defProp$1(target, key, result), result;
|
|
88
|
+
}, "__decorateClass$1"), __decorateParam$1 = /* @__PURE__ */ __name((index, decorator) => (target, key) => decorator(target, key, index), "__decorateParam$1"), _a;
|
|
89
|
+
let SheetsFindReplaceController = (_a = class extends Disposable {
|
|
90
|
+
constructor(_injector, _findReplaceController, _contextService, _findReplaceService, _commandService) {
|
|
81
91
|
super();
|
|
82
|
-
|
|
83
|
-
this._injector =
|
|
92
|
+
__publicField(this, "_provider");
|
|
93
|
+
this._injector = _injector, this._findReplaceController = _findReplaceController, this._contextService = _contextService, this._findReplaceService = _findReplaceService, this._commandService = _commandService, this._init(), this._initCommands();
|
|
84
94
|
}
|
|
85
95
|
dispose() {
|
|
86
96
|
super.dispose(), this._findReplaceController.closePanel(), this._provider.dispose();
|
|
87
97
|
}
|
|
88
98
|
_init() {
|
|
89
|
-
const
|
|
90
|
-
this._provider =
|
|
91
|
-
this._contextService.subscribeContextValue$(
|
|
99
|
+
const provider = this._injector.createInstance(SheetsFindReplaceProvider);
|
|
100
|
+
this._provider = provider, this.disposeWithMe(this._findReplaceService.registerFindReplaceProvider(provider)), this.disposeWithMe(
|
|
101
|
+
this._contextService.subscribeContextValue$(EDITOR_ACTIVATED).pipe(filter((v) => !!v)).subscribe(() => this._findReplaceController.closePanel())
|
|
92
102
|
);
|
|
93
103
|
}
|
|
94
104
|
_initCommands() {
|
|
95
|
-
[
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
],
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
105
|
+
[SheetReplaceCommand].forEach((command) => this.disposeWithMe(this._commandService.registerCommand(command)));
|
|
106
|
+
}
|
|
107
|
+
}, __name(_a, "SheetsFindReplaceController"), _a);
|
|
108
|
+
SheetsFindReplaceController = __decorateClass$1([
|
|
109
|
+
OnLifecycle(LifecycleStages.Steady, SheetsFindReplaceController),
|
|
110
|
+
__decorateParam$1(0, Inject(Injector)),
|
|
111
|
+
__decorateParam$1(1, Inject(FindReplaceController)),
|
|
112
|
+
__decorateParam$1(2, IContextService),
|
|
113
|
+
__decorateParam$1(3, IFindReplaceService),
|
|
114
|
+
__decorateParam$1(4, ICommandService)
|
|
115
|
+
], SheetsFindReplaceController);
|
|
116
|
+
const SHEETS_FIND_REPLACE_PROVIDER_NAME = "sheets-find-replace-provider", FIND_REPLACE_Z_INDEX = 1e4;
|
|
117
|
+
var _a2;
|
|
118
|
+
let SheetFindModel = (_a2 = class extends FindModel {
|
|
119
|
+
constructor(_workbook, _sheetSkeletonManagerService, _univerInstanceService, _renderManagerService, _commandService, _contextService, _themeService, _selectionManagerService) {
|
|
109
120
|
super();
|
|
110
121
|
// We can directly inject the `FindReplaceService` here, and call its methods instead of using the observables.
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
122
|
+
__publicField(this, "_matchesUpdate$", new Subject());
|
|
123
|
+
__publicField(this, "matchesUpdate$", this._matchesUpdate$.asObservable());
|
|
124
|
+
__publicField(this, "_activelyChangingMatch$", new Subject());
|
|
125
|
+
__publicField(this, "activelyChangingMatch$", this._activelyChangingMatch$.asObservable());
|
|
115
126
|
/** Hold matches by the worksheet they are in. Make it easier to track the next (or previous) match when searching in the whole workbook. */
|
|
116
|
-
|
|
127
|
+
__publicField(this, "_matchesByWorksheet", /* @__PURE__ */ new Map());
|
|
117
128
|
/** Hold all matches in the currently searching scope. */
|
|
118
|
-
|
|
129
|
+
__publicField(this, "_matches", []);
|
|
119
130
|
/** Position of the current focused ISheetCellMatch, starting from 1. */
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
131
|
+
__publicField(this, "_matchesPosition", 0);
|
|
132
|
+
__publicField(this, "_activeHighlightIndex", -1);
|
|
133
|
+
__publicField(this, "_highlightShapes", []);
|
|
134
|
+
__publicField(this, "_currentHighlightShape", null);
|
|
124
135
|
/** This properties holds the query params during this searching session. */
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
this._workbook =
|
|
136
|
+
__publicField(this, "_query", null);
|
|
137
|
+
__publicField(this, "_workbookSelections");
|
|
138
|
+
this._workbook = _workbook, this._sheetSkeletonManagerService = _sheetSkeletonManagerService, this._univerInstanceService = _univerInstanceService, this._renderManagerService = _renderManagerService, this._commandService = _commandService, this._contextService = _contextService, this._themeService = _themeService, this._workbookSelections = _selectionManagerService.getWorkbookSelections(this.unitId);
|
|
128
139
|
}
|
|
129
140
|
get _matchesCount() {
|
|
130
141
|
return this._matches.length;
|
|
@@ -147,466 +158,473 @@ let W = class extends ye {
|
|
|
147
158
|
getMatches() {
|
|
148
159
|
return this._matches;
|
|
149
160
|
}
|
|
150
|
-
start(
|
|
151
|
-
switch (this._query =
|
|
152
|
-
case
|
|
153
|
-
this.findInWorkbook(
|
|
161
|
+
start(query) {
|
|
162
|
+
switch (this._query = query, query.findBy === FindBy.FORMULA ? this._toggleDisplayRawFormula(!0) : this._toggleDisplayRawFormula(!1), query.findScope) {
|
|
163
|
+
case FindScope.UNIT:
|
|
164
|
+
this.findInWorkbook(query);
|
|
154
165
|
break;
|
|
155
|
-
case
|
|
166
|
+
case FindScope.SUBUNIT:
|
|
156
167
|
default:
|
|
157
|
-
this.findInActiveWorksheet(
|
|
168
|
+
this.findInActiveWorksheet(query);
|
|
158
169
|
break;
|
|
159
170
|
}
|
|
160
171
|
}
|
|
161
|
-
_toggleDisplayRawFormula(
|
|
162
|
-
this._contextService.setContextValue(
|
|
172
|
+
_toggleDisplayRawFormula(force) {
|
|
173
|
+
this._contextService.setContextValue(RENDER_RAW_FORMULA_KEY, force);
|
|
163
174
|
}
|
|
164
175
|
/**
|
|
165
176
|
* Find all matches in the current workbook no matter which worksheet is activated.
|
|
166
177
|
* @param query the query object
|
|
167
178
|
* @returns the query complete event
|
|
168
179
|
*/
|
|
169
|
-
findInWorkbook(
|
|
170
|
-
const
|
|
171
|
-
let
|
|
172
|
-
const
|
|
173
|
-
const
|
|
174
|
-
const
|
|
175
|
-
return
|
|
180
|
+
findInWorkbook(query) {
|
|
181
|
+
const unitId = this._workbook.getUnitId();
|
|
182
|
+
let complete, firstSearch = !0;
|
|
183
|
+
const findInWorkbook = /* @__PURE__ */ __name(() => {
|
|
184
|
+
const allCompletes = this._workbook.getSheets().filter((worksheet) => !worksheet.isSheetHidden()).map((worksheet) => {
|
|
185
|
+
const complete2 = this._findInWorksheet(worksheet, query, unitId), sheetId = worksheet.getSheetId(), { results } = complete2;
|
|
186
|
+
return results.length ? this._matchesByWorksheet.set(sheetId, complete2.results) : this._matchesByWorksheet.delete(sheetId), complete2;
|
|
176
187
|
});
|
|
177
|
-
this._matches =
|
|
178
|
-
};
|
|
188
|
+
this._matches = allCompletes.map((c) => c.results).flat(), this._updateFindHighlight(), firstSearch ? (complete = { results: this._matches }, firstSearch = !1) : this._matchesUpdate$.next(this._matches);
|
|
189
|
+
}, "findInWorkbook");
|
|
179
190
|
return this.disposeWithMe(this._sheetSkeletonManagerService.currentSkeleton$.subscribe(() => {
|
|
180
191
|
this._updateFindHighlight(), this._updateCurrentHighlightShape(this._activeHighlightIndex);
|
|
181
192
|
})), this.disposeWithMe(
|
|
182
|
-
|
|
183
|
-
|
|
193
|
+
fromCallback(this._commandService.onCommandExecuted.bind(this._commandService.onCommandExecuted)).pipe(
|
|
194
|
+
filter(([command, options]) => command.id === SetWorksheetActiveOperation.id && !(options != null && options.fromFindReplace))
|
|
184
195
|
).subscribe(() => {
|
|
185
|
-
const
|
|
186
|
-
if (!
|
|
196
|
+
const activeSheet = this._workbook.getActiveSheet();
|
|
197
|
+
if (!activeSheet)
|
|
187
198
|
return;
|
|
188
|
-
const
|
|
189
|
-
this._matchesByWorksheet.has(
|
|
199
|
+
const activeSheetId = activeSheet.getSheetId();
|
|
200
|
+
this._matchesByWorksheet.has(activeSheetId) && this._findNextMatchOnActiveSheetChange(activeSheet);
|
|
190
201
|
})
|
|
191
202
|
), this.disposeWithMe(
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
([
|
|
203
|
+
fromCallback(this._commandService.onCommandExecuted.bind(this._commandService)).pipe(
|
|
204
|
+
filter(
|
|
205
|
+
([command]) => command.type === CommandType.MUTATION && command.params.unitId === this._workbook.getUnitId()
|
|
195
206
|
),
|
|
196
|
-
|
|
197
|
-
).subscribe(() =>
|
|
198
|
-
),
|
|
207
|
+
throttleTime(600, void 0, { leading: !1, trailing: !0 })
|
|
208
|
+
).subscribe(() => findInWorkbook())
|
|
209
|
+
), findInWorkbook(), complete;
|
|
199
210
|
}
|
|
200
211
|
/**
|
|
201
212
|
* This method is used in `findInWorkbook`. When the active sheet changes, this method helps to find the next match
|
|
202
213
|
* in the new worksheet.
|
|
203
214
|
*/
|
|
204
|
-
_findNextMatchOnActiveSheetChange(
|
|
205
|
-
let
|
|
206
|
-
const
|
|
207
|
-
|
|
215
|
+
_findNextMatchOnActiveSheetChange(activeSheet) {
|
|
216
|
+
let match, index, globalIndex = 0;
|
|
217
|
+
const matchesByWorksheet = this._matchesByWorksheet.get(activeSheet.getSheetId()), selections = this._workbookSelections.getCurrentSelections();
|
|
218
|
+
selections != null && selections.length ? ([match, globalIndex] = this._findNextMatchByRange(matchesByWorksheet, selections[0].range), index = matchesByWorksheet.findIndex((m) => m === match)) : (match = matchesByWorksheet[0], index = 0, globalIndex = this._matches.findIndex((m) => m === match)), this._matchesPosition = globalIndex + 1, this._activelyChangingMatch$.next(match), this._activeHighlightIndex = index, this._updateFindHighlight(), this._updateCurrentHighlightShape(index);
|
|
208
219
|
}
|
|
209
220
|
/**
|
|
210
221
|
* Find all matches (only) in the currently activated worksheet.
|
|
211
222
|
* @param query the query object
|
|
212
223
|
* @returns the query complete event
|
|
213
224
|
*/
|
|
214
|
-
findInActiveWorksheet(
|
|
215
|
-
const
|
|
216
|
-
var
|
|
217
|
-
const
|
|
218
|
-
if (!
|
|
219
|
-
const
|
|
220
|
-
return (
|
|
221
|
-
};
|
|
222
|
-
let
|
|
223
|
-
const
|
|
224
|
-
const
|
|
225
|
-
if (!
|
|
226
|
-
const
|
|
227
|
-
|
|
228
|
-
const
|
|
229
|
-
return this._matches =
|
|
230
|
-
};
|
|
225
|
+
findInActiveWorksheet(query) {
|
|
226
|
+
const unitId = this._workbook.getUnitId(), checkShouldFindInSelections = /* @__PURE__ */ __name(() => {
|
|
227
|
+
var _a5;
|
|
228
|
+
const currentWorksheet = this._workbook.getActiveSheet();
|
|
229
|
+
if (!currentWorksheet) return !1;
|
|
230
|
+
const currentSelections = this._workbookSelections.getCurrentSelections();
|
|
231
|
+
return (_a5 = currentSelections == null ? void 0 : currentSelections.some((selection) => !isSelectionSingleCell(selection, currentWorksheet))) != null ? _a5 : !1;
|
|
232
|
+
}, "checkShouldFindInSelections");
|
|
233
|
+
let complete, firstSearch = !0, findBySelections = !1;
|
|
234
|
+
const performFindInWorksheet = /* @__PURE__ */ __name(() => {
|
|
235
|
+
const currentWorksheet = this._workbook.getActiveSheet();
|
|
236
|
+
if (!currentWorksheet) return { results: [] };
|
|
237
|
+
const lastMatch = this.currentMatch;
|
|
238
|
+
findBySelections = checkShouldFindInSelections();
|
|
239
|
+
const currentSelections = this._workbookSelections.getCurrentSelections(), newComplete = findBySelections ? this._findInSelections(currentWorksheet, currentSelections, query, unitId) : this._findInWorksheet(currentWorksheet, query, unitId);
|
|
240
|
+
return this._matches = newComplete.results, this._matchesPosition = this._tryRestoreLastMatchesPosition(lastMatch, this._matches), firstSearch ? (complete = newComplete, firstSearch = !1) : this._matchesUpdate$.next(this._matches), this._updateFindHighlight(), newComplete;
|
|
241
|
+
}, "performFindInWorksheet");
|
|
231
242
|
return this.disposeWithMe(this._sheetSkeletonManagerService.currentSkeleton$.subscribe(() => this._updateFindHighlight())), this.disposeWithMe(
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
if (
|
|
243
|
+
merge(
|
|
244
|
+
fromCallback(this._commandService.onCommandExecuted.bind(this._commandService)).pipe(
|
|
245
|
+
filter(([command]) => {
|
|
246
|
+
if (command.type === CommandType.MUTATION && command.params.unitId === this._workbook.getUnitId())
|
|
236
247
|
return !0;
|
|
237
|
-
if (
|
|
238
|
-
const
|
|
239
|
-
return
|
|
248
|
+
if (command.id === SetSelectionsOperation.id && command.params.unitId === unitId) {
|
|
249
|
+
const shouldFindBySelections = checkShouldFindInSelections();
|
|
250
|
+
return shouldFindBySelections === !1 && findBySelections === !1 ? !1 : (findBySelections = shouldFindBySelections, !0);
|
|
240
251
|
}
|
|
241
252
|
return !1;
|
|
242
253
|
})
|
|
243
254
|
),
|
|
244
255
|
// activeSheet$ is a BehaviorSubject, so we need to skip the first
|
|
245
|
-
this._workbook.activeSheet$.pipe(
|
|
246
|
-
).pipe(
|
|
247
|
-
),
|
|
248
|
-
}
|
|
249
|
-
_findInRange(
|
|
250
|
-
const
|
|
251
|
-
for (const
|
|
252
|
-
const { row
|
|
253
|
-
if (
|
|
256
|
+
this._workbook.activeSheet$.pipe(skip(1))
|
|
257
|
+
).pipe(debounceTime(200)).subscribe(() => performFindInWorksheet())
|
|
258
|
+
), performFindInWorksheet(), complete;
|
|
259
|
+
}
|
|
260
|
+
_findInRange(worksheet, query, range, unitId, dedupeFn) {
|
|
261
|
+
const results = [], subUnitId = worksheet.getSheetId(), iter = (query.findDirection === FindDirection.COLUMN ? worksheet.iterateByColumn : worksheet.iterateByRow).bind(worksheet)(range);
|
|
262
|
+
for (const value of iter) {
|
|
263
|
+
const { row, col, colSpan, rowSpan, value: cellData } = value;
|
|
264
|
+
if (dedupeFn != null && dedupeFn(row, col) || !cellData || worksheet.getRowFiltered(row))
|
|
254
265
|
continue;
|
|
255
|
-
const { hit
|
|
256
|
-
if (
|
|
257
|
-
const
|
|
258
|
-
provider:
|
|
259
|
-
unitId
|
|
260
|
-
replaceable
|
|
261
|
-
isFormula
|
|
266
|
+
const { hit, replaceable, isFormula } = hitCell(worksheet, row, col, query, cellData);
|
|
267
|
+
if (hit) {
|
|
268
|
+
const result = {
|
|
269
|
+
provider: SHEETS_FIND_REPLACE_PROVIDER_NAME,
|
|
270
|
+
unitId,
|
|
271
|
+
replaceable,
|
|
272
|
+
isFormula,
|
|
262
273
|
range: {
|
|
263
|
-
subUnitId
|
|
274
|
+
subUnitId,
|
|
264
275
|
range: {
|
|
265
|
-
startRow:
|
|
266
|
-
startColumn:
|
|
267
|
-
endColumn:
|
|
268
|
-
endRow:
|
|
276
|
+
startRow: row,
|
|
277
|
+
startColumn: col,
|
|
278
|
+
endColumn: col + (colSpan != null ? colSpan : 1) - 1,
|
|
279
|
+
endRow: row + (rowSpan != null ? rowSpan : 1) - 1
|
|
269
280
|
}
|
|
270
281
|
}
|
|
271
282
|
};
|
|
272
|
-
|
|
283
|
+
results.push(result);
|
|
273
284
|
}
|
|
274
285
|
}
|
|
275
|
-
return { results
|
|
276
|
-
}
|
|
277
|
-
_findInSelections(
|
|
278
|
-
const { findDirection
|
|
279
|
-
return { results:
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
(
|
|
285
|
-
const
|
|
286
|
-
return
|
|
286
|
+
return { results };
|
|
287
|
+
}
|
|
288
|
+
_findInSelections(worksheet, selections, query, unitId) {
|
|
289
|
+
const { findDirection } = query, sortFn = findDirection === FindDirection.ROW ? isBehindPositionWithRowPriority : isBehindPositionWithColumnPriority, dedupeSet = /* @__PURE__ */ new Set();
|
|
290
|
+
return { results: selections.map((selection) => this._findInRange(
|
|
291
|
+
worksheet,
|
|
292
|
+
query,
|
|
293
|
+
selection.range,
|
|
294
|
+
unitId,
|
|
295
|
+
(row, col) => {
|
|
296
|
+
const key = `${row}-${col}`;
|
|
297
|
+
return dedupeSet.has(key) ? !0 : (dedupeSet.add(key), !1);
|
|
287
298
|
}
|
|
288
|
-
).results).flat().sort((
|
|
299
|
+
).results).flat().sort((a, b) => sortFn(a.range.range, b.range.range) ? -1 : 1) };
|
|
289
300
|
}
|
|
290
301
|
/** Find matches in a given worksheet. */
|
|
291
|
-
_findInWorksheet(
|
|
292
|
-
const
|
|
293
|
-
return this._findInRange(
|
|
302
|
+
_findInWorksheet(worksheet, query, unitId) {
|
|
303
|
+
const rowCount = worksheet.getRowCount(), colCount = worksheet.getColumnCount(), range = { startRow: 0, startColumn: 0, endRow: rowCount - 1, endColumn: colCount - 1 };
|
|
304
|
+
return this._findInRange(worksheet, query, range, unitId);
|
|
294
305
|
}
|
|
295
306
|
_disposeHighlights() {
|
|
296
|
-
var
|
|
297
|
-
this._highlightShapes.forEach((
|
|
298
|
-
|
|
299
|
-
}), this._highlightShapes = [], (
|
|
307
|
+
var _a5;
|
|
308
|
+
this._highlightShapes.forEach((shape) => {
|
|
309
|
+
shape.getScene().makeDirty(), shape.dispose();
|
|
310
|
+
}), this._highlightShapes = [], (_a5 = this._currentHighlightShape) == null || _a5.dispose(), this._currentHighlightShape = null;
|
|
300
311
|
}
|
|
301
312
|
_updateFindHighlight() {
|
|
302
|
-
var
|
|
313
|
+
var _a5;
|
|
303
314
|
this._disposeHighlights();
|
|
304
|
-
const
|
|
305
|
-
if (!
|
|
315
|
+
const skeleton = (_a5 = this._sheetSkeletonManagerService.getCurrent()) == null ? void 0 : _a5.skeleton;
|
|
316
|
+
if (!skeleton)
|
|
306
317
|
return;
|
|
307
|
-
const
|
|
308
|
-
if (
|
|
318
|
+
const unitId = this._workbook.getUnitId(), currentRender = this._renderManagerService.getRenderById(unitId);
|
|
319
|
+
if (currentRender == null)
|
|
309
320
|
return;
|
|
310
|
-
const { scene
|
|
311
|
-
if (!
|
|
321
|
+
const { scene } = currentRender, matches = this._matches, searchBackgroundColor = this._themeService.getCurrentTheme().gold400, color = new ColorKit(searchBackgroundColor).toRgb(), worksheet = this._workbook.getActiveSheet();
|
|
322
|
+
if (!worksheet)
|
|
312
323
|
return;
|
|
313
|
-
const
|
|
314
|
-
const { startColumn
|
|
315
|
-
left:
|
|
316
|
-
top:
|
|
317
|
-
color
|
|
318
|
-
width
|
|
319
|
-
height
|
|
324
|
+
const activeSheetId = worksheet.getSheetId(), highlightShapes = matches.filter((match) => match.range.subUnitId === activeSheetId).map((find, index) => {
|
|
325
|
+
const { startColumn, startRow, endColumn, endRow } = find.range.range, startPosition = getCoordByCell(startRow, startColumn, scene, skeleton), endPosition = getCoordByCell(endRow, endColumn, scene, skeleton), { startX, startY } = startPosition, { endX, endY } = endPosition, rowHidden = !worksheet.getRowRawVisible(startRow), columnHidden = !worksheet.getColVisible(startColumn), inHiddenRange = rowHidden || columnHidden, width = columnHidden ? 2 : endX - startX, height = rowHidden ? 2 : endY - startY, props = {
|
|
326
|
+
left: startX,
|
|
327
|
+
top: startY,
|
|
328
|
+
color,
|
|
329
|
+
width,
|
|
330
|
+
height,
|
|
320
331
|
evented: !1,
|
|
321
|
-
inHiddenRange
|
|
322
|
-
zIndex:
|
|
332
|
+
inHiddenRange,
|
|
333
|
+
zIndex: FIND_REPLACE_Z_INDEX
|
|
323
334
|
};
|
|
324
|
-
return new
|
|
335
|
+
return new SheetFindReplaceHighlightShape(`find-highlight-${index}`, props);
|
|
325
336
|
});
|
|
326
|
-
|
|
337
|
+
scene.addObjects(highlightShapes), this._highlightShapes = highlightShapes, scene.makeDirty();
|
|
327
338
|
}
|
|
328
|
-
_updateCurrentHighlightShape(
|
|
329
|
-
var
|
|
330
|
-
if ((
|
|
331
|
-
const
|
|
332
|
-
if (!
|
|
339
|
+
_updateCurrentHighlightShape(matchIndex) {
|
|
340
|
+
var _a5;
|
|
341
|
+
if ((_a5 = this._currentHighlightShape) == null || _a5.setShapeProps({ activated: !1 }), this._currentHighlightShape = null, matchIndex !== void 0) {
|
|
342
|
+
const shape = this._highlightShapes[matchIndex];
|
|
343
|
+
if (!shape)
|
|
333
344
|
return;
|
|
334
|
-
this._currentHighlightShape =
|
|
345
|
+
this._currentHighlightShape = shape, shape.setShapeProps({ activated: !0 });
|
|
335
346
|
}
|
|
336
347
|
}
|
|
337
348
|
_getSheetObject() {
|
|
338
|
-
return
|
|
339
|
-
}
|
|
340
|
-
_focusMatch(
|
|
341
|
-
var
|
|
342
|
-
const
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
{ unitId: this._workbook.getUnitId(), subUnitId
|
|
349
|
+
return getSheetObject(this._univerInstanceService, this._renderManagerService);
|
|
350
|
+
}
|
|
351
|
+
_focusMatch(match) {
|
|
352
|
+
var _a5;
|
|
353
|
+
const subUnitId = match.range.subUnitId;
|
|
354
|
+
subUnitId !== ((_a5 = this._workbook.getActiveSheet()) == null ? void 0 : _a5.getSheetId()) && this._commandService.executeCommand(
|
|
355
|
+
SetWorksheetActivateCommand.id,
|
|
356
|
+
{ unitId: this._workbook.getUnitId(), subUnitId },
|
|
346
357
|
{ fromFindReplace: !0 }
|
|
347
358
|
), this._commandService.executeCommand(
|
|
348
|
-
|
|
349
|
-
{ range:
|
|
359
|
+
ScrollToCellCommand.id,
|
|
360
|
+
{ range: match.range.range },
|
|
350
361
|
{ fromFindReplace: !0 }
|
|
351
362
|
);
|
|
352
363
|
}
|
|
353
|
-
_tryRestoreLastMatchesPosition(
|
|
354
|
-
if (!
|
|
355
|
-
const { subUnitId:
|
|
356
|
-
if (
|
|
364
|
+
_tryRestoreLastMatchesPosition(lastMatch, newMatches) {
|
|
365
|
+
if (!lastMatch) return 0;
|
|
366
|
+
const { subUnitId: lastSubUnitId } = lastMatch.range, { startColumn: lastStartColumn, startRow: lastStartRow } = lastMatch.range.range, index = newMatches.findIndex((match) => {
|
|
367
|
+
if (lastSubUnitId !== match.range.subUnitId)
|
|
357
368
|
return !1;
|
|
358
|
-
const { startColumn
|
|
359
|
-
return
|
|
369
|
+
const { startColumn, startRow } = match.range.range;
|
|
370
|
+
return startColumn === lastStartColumn && startRow === lastStartRow;
|
|
360
371
|
});
|
|
361
|
-
return
|
|
372
|
+
return index > -1 ? index + 1 : 0;
|
|
362
373
|
}
|
|
363
|
-
moveToNextMatch(
|
|
364
|
-
var
|
|
374
|
+
moveToNextMatch(params) {
|
|
375
|
+
var _a5, _b, _c, _d, _e;
|
|
365
376
|
if (!this._matches.length)
|
|
366
377
|
return null;
|
|
367
|
-
const
|
|
368
|
-
if (
|
|
369
|
-
const [
|
|
370
|
-
return this._matchesPosition =
|
|
378
|
+
const loop = (_a5 = params == null ? void 0 : params.loop) != null ? _a5 : !1, stayIfOnMatch = (_b = params == null ? void 0 : params.stayIfOnMatch) != null ? _b : !1, noFocus = (_c = params == null ? void 0 : params.noFocus) != null ? _c : !1, ignoreSelection = (_d = params == null ? void 0 : params.ignoreSelection) != null ? _d : !1, matchToMove = this._findNextMatch(loop, stayIfOnMatch, ignoreSelection);
|
|
379
|
+
if (matchToMove) {
|
|
380
|
+
const [match, index] = matchToMove;
|
|
381
|
+
return this._matchesPosition = index + 1, this._query.findScope === FindScope.UNIT ? this._activeHighlightIndex = this._matchesByWorksheet.get(match.range.subUnitId).findIndex((m) => m === match) : this._activeHighlightIndex = index, noFocus || this._focusMatch(match), ((_e = this._workbook.getActiveSheet()) == null ? void 0 : _e.getSheetId()) === match.range.subUnitId && this._updateCurrentHighlightShape(this._activeHighlightIndex), match;
|
|
371
382
|
}
|
|
372
383
|
return this._matchesPosition = 0, this._updateCurrentHighlightShape(), null;
|
|
373
384
|
}
|
|
374
|
-
moveToPreviousMatch(
|
|
375
|
-
var
|
|
385
|
+
moveToPreviousMatch(params) {
|
|
386
|
+
var _a5, _b, _c, _d, _e;
|
|
376
387
|
if (!this._matches.length)
|
|
377
388
|
return null;
|
|
378
|
-
const
|
|
379
|
-
if (
|
|
380
|
-
const [
|
|
381
|
-
return this._matchesPosition =
|
|
389
|
+
const loop = (_a5 = params == null ? void 0 : params.loop) != null ? _a5 : !1, stayIfOnMatch = (_b = params == null ? void 0 : params.stayIfOnMatch) != null ? _b : !1, noFocus = (_c = params == null ? void 0 : params.noFocus) != null ? _c : !1, ignoreSelection = (_d = params == null ? void 0 : params.ignoreSelection) != null ? _d : !1, matchToMove = this._findPreviousMatch(loop, stayIfOnMatch, ignoreSelection);
|
|
390
|
+
if (matchToMove) {
|
|
391
|
+
const [match, index] = matchToMove;
|
|
392
|
+
return this._matchesPosition = index + 1, this._query.findScope === FindScope.UNIT ? this._activeHighlightIndex = this._matchesByWorksheet.get(match.range.subUnitId).findIndex((m) => m === match) : this._activeHighlightIndex = index, noFocus || this._focusMatch(match), ((_e = this._workbook.getActiveSheet()) == null ? void 0 : _e.getSheetId()) === match.range.subUnitId && this._updateCurrentHighlightShape(this._activeHighlightIndex), match;
|
|
382
393
|
}
|
|
383
394
|
return this._matchesPosition = 0, this._updateCurrentHighlightShape(), null;
|
|
384
395
|
}
|
|
385
|
-
_findPreviousMatch(
|
|
386
|
-
var
|
|
396
|
+
_findPreviousMatch(loop = !1, stayIfOnMatch = !1, ignoreSelection = !1) {
|
|
397
|
+
var _a5;
|
|
387
398
|
if (this.currentMatch) {
|
|
388
|
-
const
|
|
389
|
-
if (
|
|
390
|
-
return [this.currentMatch,
|
|
391
|
-
const
|
|
392
|
-
if (!
|
|
399
|
+
const currentMatchIndex = this._matches.findIndex((match) => match === this.currentMatch);
|
|
400
|
+
if (stayIfOnMatch)
|
|
401
|
+
return [this.currentMatch, currentMatchIndex];
|
|
402
|
+
const nextMatchIndex = currentMatchIndex - 1;
|
|
403
|
+
if (!loop && nextMatchIndex < 0)
|
|
393
404
|
return null;
|
|
394
|
-
const
|
|
395
|
-
return [this._matches[
|
|
405
|
+
const length = this._matches.length, modded = (nextMatchIndex + length) % length;
|
|
406
|
+
return [this._matches[modded], modded];
|
|
396
407
|
}
|
|
397
|
-
const
|
|
398
|
-
if (
|
|
399
|
-
const
|
|
400
|
-
return [this._matches[
|
|
408
|
+
const lastSelection = this._workbookSelections.getCurrentLastSelection();
|
|
409
|
+
if (ignoreSelection || !lastSelection) {
|
|
410
|
+
const lastIndex = this._matches.length - 1;
|
|
411
|
+
return [this._matches[lastIndex], lastIndex];
|
|
401
412
|
}
|
|
402
|
-
if (this._query.findScope !==
|
|
403
|
-
return this._findPreviousMatchByRange(this._matches,
|
|
404
|
-
const
|
|
405
|
-
if (!
|
|
413
|
+
if (this._query.findScope !== FindScope.UNIT)
|
|
414
|
+
return this._findPreviousMatchByRange(this._matches, lastSelection.range);
|
|
415
|
+
const currentSheetId = (_a5 = this._workbook.getActiveSheet()) == null ? void 0 : _a5.getSheetId();
|
|
416
|
+
if (!currentSheetId)
|
|
406
417
|
return null;
|
|
407
|
-
const
|
|
408
|
-
return
|
|
418
|
+
const worksheetThatHasMatch = this._findPreviousWorksheetThatHasAMatch(currentSheetId, loop);
|
|
419
|
+
return worksheetThatHasMatch ? this._findPreviousMatchByRange(this._matchesByWorksheet.get(worksheetThatHasMatch), lastSelection.range) : null;
|
|
409
420
|
}
|
|
410
|
-
_findNextMatch(
|
|
411
|
-
var
|
|
421
|
+
_findNextMatch(loop = !1, stayIfOnMatch = !1, ignoreSelection = !1) {
|
|
422
|
+
var _a5;
|
|
412
423
|
if (this.currentMatch) {
|
|
413
|
-
const
|
|
414
|
-
if (
|
|
415
|
-
return [this.currentMatch,
|
|
416
|
-
const
|
|
417
|
-
if (!
|
|
424
|
+
const currentMatchIndex = this._matches.findIndex((match) => match === this.currentMatch);
|
|
425
|
+
if (stayIfOnMatch)
|
|
426
|
+
return [this.currentMatch, currentMatchIndex];
|
|
427
|
+
const nextMatchIndex = currentMatchIndex + 1, length = this._matches.length;
|
|
428
|
+
if (!loop && nextMatchIndex >= length)
|
|
418
429
|
return null;
|
|
419
|
-
const
|
|
420
|
-
return [this._matches[
|
|
430
|
+
const modded = nextMatchIndex % length;
|
|
431
|
+
return [this._matches[modded], modded];
|
|
421
432
|
}
|
|
422
|
-
const
|
|
423
|
-
if (
|
|
433
|
+
const last = this._workbookSelections.getCurrentLastSelection();
|
|
434
|
+
if (ignoreSelection || !last)
|
|
424
435
|
return [this._matches[0], 0];
|
|
425
|
-
if (this._query.findScope !==
|
|
426
|
-
return this._findNextMatchByRange(this._matches,
|
|
427
|
-
const
|
|
428
|
-
if (!
|
|
436
|
+
if (this._query.findScope !== FindScope.UNIT)
|
|
437
|
+
return this._findNextMatchByRange(this._matches, last.range, stayIfOnMatch);
|
|
438
|
+
const currentSheetId = (_a5 = this._workbook.getActiveSheet()) == null ? void 0 : _a5.getSheetId();
|
|
439
|
+
if (!currentSheetId)
|
|
429
440
|
return null;
|
|
430
|
-
const
|
|
431
|
-
return
|
|
432
|
-
}
|
|
433
|
-
_findPreviousWorksheetThatHasAMatch(
|
|
434
|
-
const
|
|
435
|
-
return
|
|
436
|
-
}
|
|
437
|
-
_findNextWorksheetThatHasAMatch(
|
|
438
|
-
const
|
|
439
|
-
return
|
|
440
|
-
}
|
|
441
|
-
_findNextMatchByRange(
|
|
442
|
-
const
|
|
443
|
-
let
|
|
444
|
-
const
|
|
445
|
-
if (!(
|
|
441
|
+
const worksheetThatHasMatch = this._findNextWorksheetThatHasAMatch(currentSheetId, loop);
|
|
442
|
+
return worksheetThatHasMatch ? this._findNextMatchByRange(this._matchesByWorksheet.get(worksheetThatHasMatch), last.range) : null;
|
|
443
|
+
}
|
|
444
|
+
_findPreviousWorksheetThatHasAMatch(currentWorksheet, loop = !1) {
|
|
445
|
+
const rawWorksheetsInOrder = this._workbook.getSheetOrders(), currentSheetIndex = rawWorksheetsInOrder.findIndex((sheet) => sheet === currentWorksheet), first = (loop ? rotate(rawWorksheetsInOrder, currentSheetIndex + 1) : rawWorksheetsInOrder.slice(0, currentSheetIndex + 1)).findLast((worksheet) => this._matchesByWorksheet.has(worksheet));
|
|
446
|
+
return first != null ? first : null;
|
|
447
|
+
}
|
|
448
|
+
_findNextWorksheetThatHasAMatch(currentWorksheet, loop = !1) {
|
|
449
|
+
const rawWorksheetsInOrder = this._workbook.getSheetOrders(), currentSheetIndex = rawWorksheetsInOrder.findIndex((sheet) => sheet === currentWorksheet), first = (loop ? rotate(rawWorksheetsInOrder, currentSheetIndex) : rawWorksheetsInOrder.slice(currentSheetIndex)).find((worksheet) => this._matchesByWorksheet.has(worksheet));
|
|
450
|
+
return first != null ? first : null;
|
|
451
|
+
}
|
|
452
|
+
_findNextMatchByRange(matches, range, stayIfOnMatch = !1) {
|
|
453
|
+
const findByRow = this._query.findDirection === FindDirection.ROW;
|
|
454
|
+
let index = matches.findIndex((match2) => {
|
|
455
|
+
const matchRange = match2.range.range;
|
|
456
|
+
if (!(findByRow ? isBehindPositionWithRowPriority(range, matchRange) : isBehindPositionWithColumnPriority(range, matchRange)))
|
|
446
457
|
return !1;
|
|
447
|
-
const
|
|
448
|
-
return
|
|
458
|
+
const isSame = isSamePosition(range, matchRange);
|
|
459
|
+
return stayIfOnMatch ? isSame : !isSame;
|
|
449
460
|
});
|
|
450
|
-
|
|
451
|
-
const
|
|
452
|
-
return [
|
|
453
|
-
}
|
|
454
|
-
_findPreviousMatchByRange(
|
|
455
|
-
const
|
|
456
|
-
let
|
|
457
|
-
const
|
|
458
|
-
if (!(
|
|
461
|
+
index === -1 && (index = matches.length - 1);
|
|
462
|
+
const match = matches[index];
|
|
463
|
+
return [match, this._matches.findIndex((m) => m === match)];
|
|
464
|
+
}
|
|
465
|
+
_findPreviousMatchByRange(matches, range, stayIfOnMatch = !1) {
|
|
466
|
+
const findByRow = this._query.findDirection === FindDirection.ROW;
|
|
467
|
+
let index = this._matches.findLastIndex((match2) => {
|
|
468
|
+
const matchRange = match2.range.range;
|
|
469
|
+
if (!(findByRow ? isBeforePositionWithRowPriority(range, matchRange) : isBeforePositionWithColumnPriority(range, matchRange)))
|
|
459
470
|
return !1;
|
|
460
|
-
const
|
|
461
|
-
return
|
|
471
|
+
const isSame = isSamePosition(range, matchRange);
|
|
472
|
+
return stayIfOnMatch ? isSame : !isSame;
|
|
462
473
|
});
|
|
463
|
-
|
|
464
|
-
const
|
|
465
|
-
return [
|
|
474
|
+
index === -1 && (index = 0);
|
|
475
|
+
const match = matches[index];
|
|
476
|
+
return [match, this._matches.findIndex((m) => m === match)];
|
|
466
477
|
}
|
|
467
|
-
async replace(
|
|
478
|
+
async replace(replaceString) {
|
|
468
479
|
if (this._matchesCount === 0 || !this.currentMatch || !this._query || !this.currentMatch.replaceable)
|
|
469
480
|
return !1;
|
|
470
|
-
const
|
|
481
|
+
const range = this.currentMatch.range, targetWorksheet = this._workbook.getSheetBySheetId(this.currentMatch.range.subUnitId), newContent = this._getReplacedCellData(
|
|
471
482
|
this.currentMatch,
|
|
472
|
-
|
|
473
|
-
this._query.findBy ===
|
|
483
|
+
targetWorksheet,
|
|
484
|
+
this._query.findBy === FindBy.FORMULA,
|
|
474
485
|
this._query.findString,
|
|
475
|
-
|
|
486
|
+
replaceString,
|
|
476
487
|
this._query.caseSensitive ? "g" : "ig"
|
|
477
|
-
),
|
|
488
|
+
), params = {
|
|
478
489
|
unitId: this.currentMatch.unitId,
|
|
479
|
-
subUnitId:
|
|
490
|
+
subUnitId: range.subUnitId,
|
|
480
491
|
value: {
|
|
481
|
-
[
|
|
482
|
-
[
|
|
492
|
+
[range.range.startRow]: {
|
|
493
|
+
[range.range.startColumn]: newContent
|
|
483
494
|
}
|
|
484
495
|
}
|
|
485
496
|
};
|
|
486
|
-
return this._commandService.executeCommand(
|
|
497
|
+
return this._commandService.executeCommand(SetRangeValuesCommand.id, params);
|
|
487
498
|
}
|
|
488
|
-
async replaceAll(
|
|
499
|
+
async replaceAll(replaceString) {
|
|
489
500
|
if (this._matchesCount === 0 || !this._query)
|
|
490
501
|
return { success: 0, failure: 0 };
|
|
491
|
-
const
|
|
492
|
-
return
|
|
493
|
-
const
|
|
494
|
-
|
|
495
|
-
const { startColumn
|
|
496
|
-
|
|
497
|
-
}),
|
|
498
|
-
count:
|
|
499
|
-
subUnitId
|
|
500
|
-
value:
|
|
502
|
+
const unitId = this._workbook.getUnitId(), { findString, caseSensitive, findBy } = this._query, shouldReplaceFormula = findBy === FindBy.FORMULA, replaceFlag = caseSensitive ? "g" : "ig", replacements = [];
|
|
503
|
+
return groupBy(this._matches.filter((m) => m.replaceable), (match) => match.range.subUnitId).forEach((matches, subUnitId) => {
|
|
504
|
+
const matrix = new ObjectMatrix(), worksheet = this._workbook.getSheetBySheetId(subUnitId);
|
|
505
|
+
matches.forEach((match) => {
|
|
506
|
+
const { startColumn, startRow } = match.range.range, newCellData = this._getReplacedCellData(match, worksheet, shouldReplaceFormula, findString, replaceString, replaceFlag);
|
|
507
|
+
newCellData && matrix.setValue(startRow, startColumn, newCellData);
|
|
508
|
+
}), replacements.push({
|
|
509
|
+
count: matches.length,
|
|
510
|
+
subUnitId,
|
|
511
|
+
value: matrix.getMatrix()
|
|
501
512
|
});
|
|
502
|
-
}),
|
|
503
|
-
unitId
|
|
504
|
-
replacements
|
|
513
|
+
}), replacements ? this._commandService.executeCommand(SheetReplaceCommand.id, {
|
|
514
|
+
unitId,
|
|
515
|
+
replacements
|
|
505
516
|
}) : { success: 0, failure: 0 };
|
|
506
517
|
}
|
|
507
|
-
_getReplacedCellData(
|
|
508
|
-
var
|
|
509
|
-
const
|
|
510
|
-
if (
|
|
511
|
-
return
|
|
512
|
-
if (!!((
|
|
513
|
-
const
|
|
514
|
-
return
|
|
518
|
+
_getReplacedCellData(match, worksheet, shouldReplaceFormula, findString, replaceString, replaceFlag) {
|
|
519
|
+
var _a5;
|
|
520
|
+
const range = match.range.range, { startRow, startColumn } = range, currentContent = worksheet.getCellRaw(startRow, startColumn);
|
|
521
|
+
if (match.isFormula)
|
|
522
|
+
return shouldReplaceFormula ? { f: currentContent.f.replace(new RegExp(escapeRegExp(findString), replaceFlag), replaceString), v: null } : null;
|
|
523
|
+
if (!!((_a5 = currentContent.p) != null && _a5.body)) {
|
|
524
|
+
const clonedRichText = Tools.deepClone(currentContent.p);
|
|
525
|
+
return replaceInDocumentBody(clonedRichText.body, findString, replaceString), { p: clonedRichText };
|
|
515
526
|
}
|
|
516
|
-
return { v:
|
|
517
|
-
}
|
|
518
|
-
};
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
],
|
|
527
|
-
function
|
|
528
|
-
return
|
|
527
|
+
return { v: currentContent.v.toString().replace(new RegExp(escapeRegExp(findString), replaceFlag), replaceString) };
|
|
528
|
+
}
|
|
529
|
+
}, __name(_a2, "SheetFindModel"), _a2);
|
|
530
|
+
SheetFindModel = __decorateClass$1([
|
|
531
|
+
__decorateParam$1(2, IUniverInstanceService),
|
|
532
|
+
__decorateParam$1(3, IRenderManagerService),
|
|
533
|
+
__decorateParam$1(4, ICommandService),
|
|
534
|
+
__decorateParam$1(5, IContextService),
|
|
535
|
+
__decorateParam$1(6, Inject(ThemeService)),
|
|
536
|
+
__decorateParam$1(7, Inject(SheetsSelectionsService))
|
|
537
|
+
], SheetFindModel);
|
|
538
|
+
function escapeRegExp(text) {
|
|
539
|
+
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
|
|
529
540
|
}
|
|
530
|
-
|
|
531
|
-
|
|
541
|
+
__name(escapeRegExp, "escapeRegExp");
|
|
542
|
+
var _a3;
|
|
543
|
+
let SheetsFindReplaceProvider = (_a3 = class extends Disposable {
|
|
544
|
+
constructor(_univerInstanceService, _renderManagerService, _injector) {
|
|
532
545
|
super();
|
|
533
546
|
/**
|
|
534
547
|
* Hold all find results in this kind of univer business instances (Workbooks).
|
|
535
548
|
*/
|
|
536
|
-
|
|
537
|
-
this._univerInstanceService =
|
|
549
|
+
__publicField(this, "_findModelsByUnitId", /* @__PURE__ */ new Map());
|
|
550
|
+
this._univerInstanceService = _univerInstanceService, this._renderManagerService = _renderManagerService, this._injector = _injector;
|
|
538
551
|
}
|
|
539
|
-
async find(
|
|
552
|
+
async find(query) {
|
|
540
553
|
this._terminate();
|
|
541
|
-
const
|
|
542
|
-
return
|
|
543
|
-
const
|
|
544
|
-
return this._findModelsByUnitId.set(
|
|
554
|
+
const allWorkbooks = this._univerInstanceService.getAllUnitsForType(UniverInstanceType.UNIVER_SHEET), parsedQuery = this._preprocessQuery(query);
|
|
555
|
+
return allWorkbooks.map((workbook) => {
|
|
556
|
+
const skeletonManagerService = this._renderManagerService.getRenderById(workbook.getUnitId()).with(SheetSkeletonManagerService), sheetFind = this._injector.createInstance(SheetFindModel, workbook, skeletonManagerService);
|
|
557
|
+
return this._findModelsByUnitId.set(workbook.getUnitId(), sheetFind), sheetFind.start(parsedQuery), sheetFind;
|
|
545
558
|
});
|
|
546
559
|
}
|
|
547
560
|
terminate() {
|
|
548
561
|
this._terminate();
|
|
549
562
|
}
|
|
550
563
|
_terminate() {
|
|
551
|
-
this._findModelsByUnitId.forEach((
|
|
564
|
+
this._findModelsByUnitId.forEach((model) => model.dispose()), this._findModelsByUnitId.clear();
|
|
552
565
|
}
|
|
553
566
|
/**
|
|
554
567
|
* Parsed the query object before do actual searching in favor of performance.
|
|
555
568
|
* @param query the raw query object
|
|
556
569
|
* @returns the parsed query object
|
|
557
570
|
*/
|
|
558
|
-
_preprocessQuery(
|
|
559
|
-
let
|
|
560
|
-
return
|
|
561
|
-
...
|
|
562
|
-
findString
|
|
571
|
+
_preprocessQuery(query) {
|
|
572
|
+
let findString = query.caseSensitive ? query.findString : query.findString.toLowerCase();
|
|
573
|
+
return findString = findString.trim(), {
|
|
574
|
+
...query,
|
|
575
|
+
findString
|
|
563
576
|
};
|
|
564
577
|
}
|
|
565
|
-
};
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
],
|
|
571
|
-
const
|
|
572
|
-
function
|
|
573
|
-
const { findBy
|
|
574
|
-
return
|
|
578
|
+
}, __name(_a3, "SheetsFindReplaceProvider"), _a3);
|
|
579
|
+
SheetsFindReplaceProvider = __decorateClass$1([
|
|
580
|
+
__decorateParam$1(0, IUniverInstanceService),
|
|
581
|
+
__decorateParam$1(1, IRenderManagerService),
|
|
582
|
+
__decorateParam$1(2, Inject(Injector))
|
|
583
|
+
], SheetsFindReplaceProvider);
|
|
584
|
+
const VALUE_PASSING_OBJECT = { hit: !1, replaceable: !1, isFormula: !1, rawData: null };
|
|
585
|
+
function hitCell(worksheet, row, col, query, cellData) {
|
|
586
|
+
const { findBy } = query, findByFormula = findBy === FindBy.FORMULA, rawData = worksheet.getCellRaw(row, col);
|
|
587
|
+
return VALUE_PASSING_OBJECT.rawData = rawData, !(rawData != null && rawData.f) ? (VALUE_PASSING_OBJECT.isFormula = !1, matchCellData(cellData, query) ? rawData ? (VALUE_PASSING_OBJECT.hit = !0, VALUE_PASSING_OBJECT.replaceable = !0) : (VALUE_PASSING_OBJECT.hit = !0, VALUE_PASSING_OBJECT.replaceable = !1) : (VALUE_PASSING_OBJECT.hit = !1, VALUE_PASSING_OBJECT.replaceable = !1), VALUE_PASSING_OBJECT) : (VALUE_PASSING_OBJECT.isFormula = !0, findByFormula ? matchCellData({ v: rawData.f }, query) ? (VALUE_PASSING_OBJECT.hit = !0, VALUE_PASSING_OBJECT.replaceable = !0, VALUE_PASSING_OBJECT) : (VALUE_PASSING_OBJECT.hit = !1, VALUE_PASSING_OBJECT.replaceable = !1, VALUE_PASSING_OBJECT) : (VALUE_PASSING_OBJECT.replaceable = !1, matchCellData(cellData, query) ? VALUE_PASSING_OBJECT.hit = !0 : VALUE_PASSING_OBJECT.hit = !1, VALUE_PASSING_OBJECT));
|
|
575
588
|
}
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
589
|
+
__name(hitCell, "hitCell");
|
|
590
|
+
function matchCellData(cellData, query) {
|
|
591
|
+
let value = extractPureValue(cellData);
|
|
592
|
+
return value ? query.matchesTheWholeCell ? (value = trimLeadingTrailingWhitespace(value), query.caseSensitive ? value === query.findString : value.toLowerCase() === query.findString) : query.caseSensitive ? value.indexOf(query.findString) > -1 : value.toLowerCase().indexOf(query.findString) > -1 : !1;
|
|
579
593
|
}
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
594
|
+
__name(matchCellData, "matchCellData");
|
|
595
|
+
function extractPureValue(cell) {
|
|
596
|
+
var _a5, _b, _c;
|
|
597
|
+
const rawValue = (_c = (_b = (_a5 = cell == null ? void 0 : cell.p) == null ? void 0 : _a5.body) == null ? void 0 : _b.dataStream) != null ? _c : cell == null ? void 0 : cell.v;
|
|
598
|
+
return typeof rawValue == "number" ? `${rawValue}` : typeof rawValue == "boolean" ? rawValue ? "1" : "0" : rawValue;
|
|
584
599
|
}
|
|
585
|
-
|
|
586
|
-
|
|
600
|
+
__name(extractPureValue, "extractPureValue");
|
|
601
|
+
function trimLeadingTrailingWhitespace(value) {
|
|
602
|
+
return value.replace(/^ +/g, "").replace(/ +$/g, "");
|
|
587
603
|
}
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
604
|
+
__name(trimLeadingTrailingWhitespace, "trimLeadingTrailingWhitespace");
|
|
605
|
+
var __defProp2 = Object.defineProperty, __getOwnPropDesc = Object.getOwnPropertyDescriptor, __defNormalProp2 = /* @__PURE__ */ __name((obj, key, value) => key in obj ? __defProp2(obj, key, { enumerable: !0, configurable: !0, writable: !0, value }) : obj[key] = value, "__defNormalProp"), __decorateClass = /* @__PURE__ */ __name((decorators, target, key, kind) => {
|
|
606
|
+
for (var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target, i = decorators.length - 1, decorator; i >= 0; i--)
|
|
607
|
+
(decorator = decorators[i]) && (result = (kind ? decorator(target, key, result) : decorator(result)) || result);
|
|
608
|
+
return kind && result && __defProp2(target, key, result), result;
|
|
609
|
+
}, "__decorateClass"), __decorateParam = /* @__PURE__ */ __name((index, decorator) => (target, key) => decorator(target, key, index), "__decorateParam"), __publicField2 = /* @__PURE__ */ __name((obj, key, value) => __defNormalProp2(obj, typeof key != "symbol" ? key + "" : key, value), "__publicField");
|
|
610
|
+
const NAME = "SHEET_FIND_REPLACE_PLUGIN";
|
|
611
|
+
var _a4;
|
|
612
|
+
let UniverSheetsFindReplacePlugin = (_a4 = class extends Plugin {
|
|
613
|
+
constructor(_config, _injector) {
|
|
614
|
+
super(), this._injector = _injector;
|
|
615
|
+
}
|
|
616
|
+
onStarting() {
|
|
617
|
+
[[SheetsFindReplaceController]].forEach((d) => this._injector.add(d));
|
|
618
|
+
}
|
|
619
|
+
}, __name(_a4, "UniverSheetsFindReplacePlugin"), _a4);
|
|
620
|
+
__publicField2(UniverSheetsFindReplacePlugin, "pluginName", NAME);
|
|
621
|
+
__publicField2(UniverSheetsFindReplacePlugin, "type", UniverInstanceType.UNIVER_SHEET);
|
|
622
|
+
UniverSheetsFindReplacePlugin = __decorateClass([
|
|
623
|
+
DependentOn(UniverSheetsPlugin, UniverSheetsPlugin, UniverFindReplacePlugin),
|
|
624
|
+
__decorateParam(1, Inject(Injector))
|
|
625
|
+
], UniverSheetsFindReplacePlugin);
|
|
608
626
|
export {
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
627
|
+
SheetReplaceCommand,
|
|
628
|
+
SheetsFindReplaceController,
|
|
629
|
+
UniverSheetsFindReplacePlugin
|
|
612
630
|
};
|