@opensumi/ide-editor 3.1.4-next-1719541057.0 → 3.1.5-next-1719913150.0
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/browser/component.js.map +1 -1
- package/lib/browser/doc-model/editor-document-model.d.ts.map +1 -1
- package/lib/browser/doc-model/editor-document-model.js +1 -0
- package/lib/browser/doc-model/editor-document-model.js.map +1 -1
- package/lib/browser/doc-model/types.d.ts +1 -0
- package/lib/browser/doc-model/types.d.ts.map +1 -1
- package/lib/browser/doc-model/types.js.map +1 -1
- package/lib/browser/editor-collection.service.d.ts +2 -0
- package/lib/browser/editor-collection.service.d.ts.map +1 -1
- package/lib/browser/editor-collection.service.js +4 -0
- package/lib/browser/editor-collection.service.js.map +1 -1
- package/lib/browser/fs-resource/fs-editor-doc.d.ts.map +1 -1
- package/lib/browser/fs-resource/fs-editor-doc.js +1 -0
- package/lib/browser/fs-resource/fs-editor-doc.js.map +1 -1
- package/lib/browser/fs-resource/fs-resource.d.ts.map +1 -1
- package/lib/browser/fs-resource/fs-resource.js +0 -1
- package/lib/browser/fs-resource/fs-resource.js.map +1 -1
- package/lib/browser/merge-conflict/merge-conflict.model.d.ts +7 -0
- package/lib/browser/merge-conflict/merge-conflict.model.d.ts.map +1 -0
- package/lib/browser/merge-conflict/merge-conflict.model.js +51 -0
- package/lib/browser/merge-conflict/merge-conflict.model.js.map +1 -0
- package/lib/browser/merge-conflict/merge-conflict.service.d.ts +14 -0
- package/lib/browser/merge-conflict/merge-conflict.service.d.ts.map +1 -0
- package/lib/browser/merge-conflict/merge-conflict.service.js +66 -0
- package/lib/browser/merge-conflict/merge-conflict.service.js.map +1 -0
- package/lib/browser/merge-conflict/types.d.ts +0 -17
- package/lib/browser/merge-conflict/types.d.ts.map +1 -1
- package/lib/browser/merge-conflict/types.js +1 -6
- package/lib/browser/merge-conflict/types.js.map +1 -1
- package/lib/browser/merge-editor/MergeEditorFloatComponents.d.ts.map +1 -1
- package/lib/browser/merge-editor/MergeEditorFloatComponents.js +7 -40
- package/lib/browser/merge-editor/MergeEditorFloatComponents.js.map +1 -1
- package/lib/browser/tab.view.d.ts.map +1 -1
- package/lib/browser/tab.view.js +1 -1
- package/lib/browser/tab.view.js.map +1 -1
- package/lib/browser/types.d.ts +2 -2
- package/lib/browser/types.d.ts.map +1 -1
- package/lib/browser/types.js.map +1 -1
- package/lib/common/editor.d.ts +1 -0
- package/lib/common/editor.d.ts.map +1 -1
- package/lib/common/editor.js.map +1 -1
- package/package.json +14 -14
- package/src/browser/component.ts +1 -1
- package/src/browser/doc-model/editor-document-model.ts +1 -0
- package/src/browser/doc-model/types.ts +1 -2
- package/src/browser/editor-collection.service.ts +6 -0
- package/src/browser/fs-resource/fs-editor-doc.ts +4 -0
- package/src/browser/fs-resource/fs-resource.ts +0 -1
- package/src/browser/merge-conflict/merge-conflict.model.ts +63 -0
- package/src/browser/merge-conflict/merge-conflict.service.ts +65 -0
- package/src/browser/merge-conflict/types.ts +0 -21
- package/src/browser/merge-editor/MergeEditorFloatComponents.tsx +10 -45
- package/src/browser/preference/schema.ts +1 -1
- package/src/browser/tab.view.tsx +1 -0
- package/src/browser/types.ts +3 -6
- package/src/common/editor.ts +2 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import debounce from 'lodash/debounce';
|
|
2
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
3
|
+
|
|
4
|
+
import { formatLocalize, useInjectable } from '@opensumi/ide-core-browser';
|
|
5
|
+
import { DisposableStore, URI } from '@opensumi/ide-utils';
|
|
6
|
+
|
|
7
|
+
import { useEditorDocumentModelRef } from '../hooks/useEditor';
|
|
8
|
+
|
|
9
|
+
import { MergeConflictService } from './merge-conflict.service';
|
|
10
|
+
|
|
11
|
+
export function useMergeConflictModel(uri: URI) {
|
|
12
|
+
const editorModel = useEditorDocumentModelRef(uri);
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* 如果是原来就有冲突的文件,当冲突没了之后,仍然显示冲突
|
|
16
|
+
*/
|
|
17
|
+
const [isInitialVisiable, setIsInitialVisiable] = useState(false);
|
|
18
|
+
const [conflictsCount, setConflictsCount] = useState(0);
|
|
19
|
+
|
|
20
|
+
const mergeConflictService = useInjectable<MergeConflictService>(MergeConflictService);
|
|
21
|
+
|
|
22
|
+
const summary = useMemo(
|
|
23
|
+
() => formatLocalize('merge-conflicts.merge.conflict.remain', conflictsCount),
|
|
24
|
+
[conflictsCount],
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
const disposables = new DisposableStore();
|
|
29
|
+
|
|
30
|
+
if (editorModel) {
|
|
31
|
+
const { instance } = editorModel;
|
|
32
|
+
const run = () => {
|
|
33
|
+
const n = mergeConflictService.scanDocument(instance.getMonacoModel());
|
|
34
|
+
setConflictsCount(n);
|
|
35
|
+
if (n > 0) {
|
|
36
|
+
setIsInitialVisiable(true);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const debounceRun = debounce(run, 150);
|
|
41
|
+
|
|
42
|
+
disposables.add(
|
|
43
|
+
instance.getMonacoModel().onDidChangeContent(() => {
|
|
44
|
+
debounceRun();
|
|
45
|
+
}),
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
run();
|
|
49
|
+
return () => {
|
|
50
|
+
disposables.dispose();
|
|
51
|
+
mergeConflictService.clear();
|
|
52
|
+
setIsInitialVisiable(false);
|
|
53
|
+
setConflictsCount(0);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}, [editorModel]);
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
isVisiable: isInitialVisiable,
|
|
60
|
+
summary,
|
|
61
|
+
canNavigate: conflictsCount > 0,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Autowired, Injectable } from '@opensumi/di';
|
|
2
|
+
import * as monaco from '@opensumi/ide-monaco';
|
|
3
|
+
import { NavigationDirection, findRangeForNavigation } from '@opensumi/ide-monaco/lib/browser/contrib/merge-editor';
|
|
4
|
+
import { IMessageService } from '@opensumi/ide-overlay';
|
|
5
|
+
|
|
6
|
+
import { IEditor, WorkbenchEditorService } from '../types';
|
|
7
|
+
|
|
8
|
+
import { DocumentMergeConflict, MergeConflictParser } from './conflict-parser';
|
|
9
|
+
|
|
10
|
+
@Injectable()
|
|
11
|
+
export class MergeConflictService {
|
|
12
|
+
@Autowired(MergeConflictParser)
|
|
13
|
+
parser: MergeConflictParser;
|
|
14
|
+
|
|
15
|
+
@Autowired(WorkbenchEditorService)
|
|
16
|
+
private readonly editorService: WorkbenchEditorService;
|
|
17
|
+
|
|
18
|
+
@Autowired(IMessageService)
|
|
19
|
+
private readonly messageService: IMessageService;
|
|
20
|
+
|
|
21
|
+
conflicts = [] as DocumentMergeConflict[];
|
|
22
|
+
|
|
23
|
+
scanDocument(model: monaco.editor.ITextModel) {
|
|
24
|
+
this.conflicts = this.parser.scanDocument(model);
|
|
25
|
+
return this.conflicts.length;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
clear(): void {
|
|
29
|
+
this.conflicts = [];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
private async navigate(editor: IEditor, direction: NavigationDirection): Promise<void> {
|
|
33
|
+
this.conflicts = this.parser.scanDocument(editor.monacoEditor.getModel()!);
|
|
34
|
+
const ranges = this.conflicts.map((conflict) => conflict.range);
|
|
35
|
+
|
|
36
|
+
const navigationResult = findRangeForNavigation(direction, ranges, editor.monacoEditor.getPosition()!);
|
|
37
|
+
|
|
38
|
+
if (!navigationResult) {
|
|
39
|
+
this.messageService.warning('No merge conflicts found in this file');
|
|
40
|
+
return;
|
|
41
|
+
} else if (!navigationResult.canNavigate) {
|
|
42
|
+
this.messageService.warning('No other merge conflicts within this file');
|
|
43
|
+
return;
|
|
44
|
+
} else if (!navigationResult.range) {
|
|
45
|
+
// impossible path
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
editor.monacoEditor.setPosition(navigationResult.range.getStartPosition());
|
|
50
|
+
|
|
51
|
+
// when navigating, we want to show the codelens on the first line of the conflict
|
|
52
|
+
const range = navigationResult.range.delta(-1);
|
|
53
|
+
|
|
54
|
+
editor.monacoEditor.revealRangeNearTopIfOutsideViewport(range);
|
|
55
|
+
editor.monacoEditor.focus();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
navigateNext(): Promise<void> {
|
|
59
|
+
return this.navigate(this.editorService.currentEditor!, NavigationDirection.Forwards);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
navigatePrevious(): Promise<void> {
|
|
63
|
+
return this.navigate(this.editorService.currentEditor!, NavigationDirection.Backwards);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -41,27 +41,6 @@ export interface ICacheDocumentMergeConflict extends IDocumentMergeConflictDescr
|
|
|
41
41
|
aiContent?: string;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
export interface IDocumentMergeConflictTracker {
|
|
45
|
-
getConflicts(document: monaco.editor.ITextModel): PromiseLike<IDocumentMergeConflict[]>;
|
|
46
|
-
isPending(document: monaco.editor.ITextModel): boolean;
|
|
47
|
-
forget(document: monaco.editor.ITextModel): void;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export interface IDocumentMergeConflictTrackerService {
|
|
51
|
-
createTracker(origin: string): IDocumentMergeConflictTracker;
|
|
52
|
-
forget(document: monaco.editor.ITextModel): void;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export interface IDocumentMergeConflictNavigationResults {
|
|
56
|
-
canNavigate: boolean;
|
|
57
|
-
conflict?: IDocumentMergeConflict;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export enum NavigationDirection {
|
|
61
|
-
Forwards,
|
|
62
|
-
Backwards,
|
|
63
|
-
}
|
|
64
|
-
|
|
65
44
|
export namespace AI_COMMAND {
|
|
66
45
|
const MERGE_CONFLICT = 'merge-conflict';
|
|
67
46
|
export const ACCEPT = `${MERGE_CONFLICT}.ai.accept`;
|
|
@@ -1,72 +1,37 @@
|
|
|
1
|
-
import React, { useCallback,
|
|
1
|
+
import React, { useCallback, useState } from 'react';
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
CommandRegistry,
|
|
5
5
|
CommandService,
|
|
6
|
-
DisposableStore,
|
|
7
6
|
MERGE_CONFLICT_COMMANDS,
|
|
8
7
|
SCM_COMMANDS,
|
|
9
8
|
URI,
|
|
10
9
|
useInjectable,
|
|
11
10
|
} from '@opensumi/ide-core-browser';
|
|
12
|
-
import { formatLocalize } from '@opensumi/ide-core-common';
|
|
13
|
-
import { MergeConflictCommands } from '@opensumi/ide-core-common/lib/commands/git';
|
|
14
11
|
import { MergeActions } from '@opensumi/ide-monaco/lib/browser/contrib/merge-editor/components/merge-actions';
|
|
15
12
|
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
13
|
+
import { useMergeConflictModel } from '../merge-conflict/merge-conflict.model';
|
|
14
|
+
import { MergeConflictService } from '../merge-conflict/merge-conflict.service';
|
|
18
15
|
import { ReactEditorComponent } from '../types';
|
|
19
16
|
|
|
20
17
|
export const MergeEditorFloatComponents: ReactEditorComponent<{ uri: URI }> = ({ resource }) => {
|
|
21
18
|
const { uri } = resource;
|
|
22
|
-
const
|
|
23
|
-
const mergeConflictParser: MergeConflictParser = useInjectable(MergeConflictParser);
|
|
19
|
+
const mergeConflictService = useInjectable<MergeConflictService>(MergeConflictService);
|
|
24
20
|
const commandService = useInjectable<CommandService>(CommandService);
|
|
25
21
|
const commandRegistry = useInjectable<CommandRegistry>(CommandRegistry);
|
|
26
22
|
|
|
27
|
-
const
|
|
28
|
-
const [conflicts, setConflicts] = useState<DocumentMergeConflict[]>([]);
|
|
29
|
-
|
|
30
|
-
useEffect(() => {
|
|
31
|
-
const disposables = new DisposableStore();
|
|
32
|
-
|
|
33
|
-
if (editorModel) {
|
|
34
|
-
const { instance } = editorModel;
|
|
35
|
-
const run = () => {
|
|
36
|
-
const conflicts = mergeConflictParser.scanDocument(instance.getMonacoModel());
|
|
37
|
-
if (conflicts.length > 0) {
|
|
38
|
-
setIsVisiable(true);
|
|
39
|
-
setConflicts(conflicts);
|
|
40
|
-
} else {
|
|
41
|
-
setIsVisiable(false);
|
|
42
|
-
setConflicts([]);
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
disposables.add(
|
|
47
|
-
editorModel.instance.getMonacoModel().onDidChangeContent(() => {
|
|
48
|
-
run();
|
|
49
|
-
}),
|
|
50
|
-
);
|
|
51
|
-
run();
|
|
52
|
-
return () => {
|
|
53
|
-
disposables.dispose();
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
}, [editorModel]);
|
|
23
|
+
const { canNavigate, isVisiable, summary } = useMergeConflictModel(uri);
|
|
57
24
|
|
|
58
25
|
const [isAIResolving, setIsAIResolving] = useState(false);
|
|
26
|
+
|
|
59
27
|
const handlePrev = useCallback(() => {
|
|
60
|
-
|
|
61
|
-
// TODO: 编辑器向上滚动一行
|
|
62
|
-
});
|
|
28
|
+
mergeConflictService.navigatePrevious();
|
|
63
29
|
}, []);
|
|
64
30
|
|
|
65
31
|
const handleNext = useCallback(() => {
|
|
66
|
-
|
|
67
|
-
// TODO: 编辑器向上滚动一行
|
|
68
|
-
});
|
|
32
|
+
mergeConflictService.navigateNext();
|
|
69
33
|
}, []);
|
|
34
|
+
|
|
70
35
|
const handleAIResolve = useCallback(async () => {
|
|
71
36
|
setIsAIResolving(true);
|
|
72
37
|
if (isAIResolving) {
|
|
@@ -81,12 +46,12 @@ export const MergeEditorFloatComponents: ReactEditorComponent<{ uri: URI }> = ({
|
|
|
81
46
|
return null;
|
|
82
47
|
}
|
|
83
48
|
|
|
84
|
-
const summary = formatLocalize('merge-conflicts.merge.conflict.remain', conflicts.length);
|
|
85
49
|
return (
|
|
86
50
|
<MergeActions
|
|
87
51
|
uri={uri}
|
|
88
52
|
editorType='text'
|
|
89
53
|
summary={summary}
|
|
54
|
+
canNavigate={canNavigate}
|
|
90
55
|
handleNext={handleNext}
|
|
91
56
|
handlePrev={handlePrev}
|
|
92
57
|
isAIResolving={isAIResolving}
|
|
@@ -1631,7 +1631,7 @@ const customEditorSchema: PreferenceSchemaProperties = {
|
|
|
1631
1631
|
},
|
|
1632
1632
|
'editor.largeFile': {
|
|
1633
1633
|
type: 'number',
|
|
1634
|
-
default: 4 * 1024 * 1024 * 1024,
|
|
1634
|
+
default: 4 * 1024 * 1024 * 1024, // 4096 MB
|
|
1635
1635
|
description: '%editor.configuration.largeFileSize%',
|
|
1636
1636
|
},
|
|
1637
1637
|
'editor.quickSuggestionsDelay': {
|
package/src/browser/tab.view.tsx
CHANGED
|
@@ -391,6 +391,7 @@ export const Tabs = ({ group }: ITabsProps) => {
|
|
|
391
391
|
const curTabIndex = group.resources.findIndex((resource) => group.currentResource === resource);
|
|
392
392
|
return (
|
|
393
393
|
<div
|
|
394
|
+
draggable={false}
|
|
394
395
|
className={cls({
|
|
395
396
|
[styles_kt_editor_tabs_content]: true,
|
|
396
397
|
[styles_kt_editor_tabs_current_last]: curTabIndex === group.resources.length - 1,
|
package/src/browser/types.ts
CHANGED
|
@@ -114,13 +114,10 @@ export class RegisterEditorComponentEvent extends BasicEvent<string> {}
|
|
|
114
114
|
export abstract class EditorComponentRegistry {
|
|
115
115
|
abstract registerEditorComponent<T>(component: IEditorComponent<T>, initialProps?: any): IDisposable;
|
|
116
116
|
|
|
117
|
-
// 等同于 handlesScheme => 10
|
|
118
|
-
abstract registerEditorComponentResolver<T>(scheme: string, resolver: IEditorComponentResolver<T>): IDisposable;
|
|
119
|
-
|
|
120
|
-
// handlesScheme 返回权重, 小于 0 表示不处理
|
|
121
117
|
abstract registerEditorComponentResolver<T>(
|
|
122
|
-
|
|
123
|
-
|
|
118
|
+
handlesScheme:
|
|
119
|
+
| string // 等同于 handlesScheme => 10
|
|
120
|
+
| ((scheme: string) => number), // handlesScheme 返回权重, 小于 0 表示不处理
|
|
124
121
|
resolver: IEditorComponentResolver<T>,
|
|
125
122
|
): IDisposable;
|
|
126
123
|
|