@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.
Files changed (56) hide show
  1. package/lib/browser/component.js.map +1 -1
  2. package/lib/browser/doc-model/editor-document-model.d.ts.map +1 -1
  3. package/lib/browser/doc-model/editor-document-model.js +1 -0
  4. package/lib/browser/doc-model/editor-document-model.js.map +1 -1
  5. package/lib/browser/doc-model/types.d.ts +1 -0
  6. package/lib/browser/doc-model/types.d.ts.map +1 -1
  7. package/lib/browser/doc-model/types.js.map +1 -1
  8. package/lib/browser/editor-collection.service.d.ts +2 -0
  9. package/lib/browser/editor-collection.service.d.ts.map +1 -1
  10. package/lib/browser/editor-collection.service.js +4 -0
  11. package/lib/browser/editor-collection.service.js.map +1 -1
  12. package/lib/browser/fs-resource/fs-editor-doc.d.ts.map +1 -1
  13. package/lib/browser/fs-resource/fs-editor-doc.js +1 -0
  14. package/lib/browser/fs-resource/fs-editor-doc.js.map +1 -1
  15. package/lib/browser/fs-resource/fs-resource.d.ts.map +1 -1
  16. package/lib/browser/fs-resource/fs-resource.js +0 -1
  17. package/lib/browser/fs-resource/fs-resource.js.map +1 -1
  18. package/lib/browser/merge-conflict/merge-conflict.model.d.ts +7 -0
  19. package/lib/browser/merge-conflict/merge-conflict.model.d.ts.map +1 -0
  20. package/lib/browser/merge-conflict/merge-conflict.model.js +51 -0
  21. package/lib/browser/merge-conflict/merge-conflict.model.js.map +1 -0
  22. package/lib/browser/merge-conflict/merge-conflict.service.d.ts +14 -0
  23. package/lib/browser/merge-conflict/merge-conflict.service.d.ts.map +1 -0
  24. package/lib/browser/merge-conflict/merge-conflict.service.js +66 -0
  25. package/lib/browser/merge-conflict/merge-conflict.service.js.map +1 -0
  26. package/lib/browser/merge-conflict/types.d.ts +0 -17
  27. package/lib/browser/merge-conflict/types.d.ts.map +1 -1
  28. package/lib/browser/merge-conflict/types.js +1 -6
  29. package/lib/browser/merge-conflict/types.js.map +1 -1
  30. package/lib/browser/merge-editor/MergeEditorFloatComponents.d.ts.map +1 -1
  31. package/lib/browser/merge-editor/MergeEditorFloatComponents.js +7 -40
  32. package/lib/browser/merge-editor/MergeEditorFloatComponents.js.map +1 -1
  33. package/lib/browser/tab.view.d.ts.map +1 -1
  34. package/lib/browser/tab.view.js +1 -1
  35. package/lib/browser/tab.view.js.map +1 -1
  36. package/lib/browser/types.d.ts +2 -2
  37. package/lib/browser/types.d.ts.map +1 -1
  38. package/lib/browser/types.js.map +1 -1
  39. package/lib/common/editor.d.ts +1 -0
  40. package/lib/common/editor.d.ts.map +1 -1
  41. package/lib/common/editor.js.map +1 -1
  42. package/package.json +14 -14
  43. package/src/browser/component.ts +1 -1
  44. package/src/browser/doc-model/editor-document-model.ts +1 -0
  45. package/src/browser/doc-model/types.ts +1 -2
  46. package/src/browser/editor-collection.service.ts +6 -0
  47. package/src/browser/fs-resource/fs-editor-doc.ts +4 -0
  48. package/src/browser/fs-resource/fs-resource.ts +0 -1
  49. package/src/browser/merge-conflict/merge-conflict.model.ts +63 -0
  50. package/src/browser/merge-conflict/merge-conflict.service.ts +65 -0
  51. package/src/browser/merge-conflict/types.ts +0 -21
  52. package/src/browser/merge-editor/MergeEditorFloatComponents.tsx +10 -45
  53. package/src/browser/preference/schema.ts +1 -1
  54. package/src/browser/tab.view.tsx +1 -0
  55. package/src/browser/types.ts +3 -6
  56. 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, useEffect, useState } from 'react';
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 { useEditorDocumentModelRef } from '../hooks/useEditor';
17
- import { DocumentMergeConflict, MergeConflictParser } from '../merge-conflict';
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 editorModel = useEditorDocumentModelRef(uri);
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 [isVisiable, setIsVisiable] = useState(false);
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
- commandService.tryExecuteCommand(MergeConflictCommands.Previous).then(() => {
61
- // TODO: 编辑器向上滚动一行
62
- });
28
+ mergeConflictService.navigatePrevious();
63
29
  }, []);
64
30
 
65
31
  const handleNext = useCallback(() => {
66
- commandService.tryExecuteCommand(MergeConflictCommands.Next).then(() => {
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': {
@@ -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,
@@ -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
- // eslint-disable-next-line @typescript-eslint/unified-signatures
123
- handlesScheme: (scheme: string) => number,
118
+ handlesScheme:
119
+ | string // 等同于 handlesScheme => 10
120
+ | ((scheme: string) => number), // handlesScheme 返回权重, 小于 0 表示不处理
124
121
  resolver: IEditorComponentResolver<T>,
125
122
  ): IDisposable;
126
123
 
@@ -257,6 +257,8 @@ export interface IDiffEditor extends IDisposable {
257
257
  focus(): void;
258
258
 
259
259
  getLineChanges(): ILineChange[] | null;
260
+
261
+ onRefOpen: Event<IEditorDocumentModelRef>;
260
262
  }
261
263
 
262
264
  @Injectable()