@opensumi/ide-preferences 2.21.13 → 2.22.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 (80) hide show
  1. package/lib/browser/abstract-resource-preference-provider.d.ts +1 -0
  2. package/lib/browser/abstract-resource-preference-provider.d.ts.map +1 -1
  3. package/lib/browser/abstract-resource-preference-provider.js +22 -3
  4. package/lib/browser/abstract-resource-preference-provider.js.map +1 -1
  5. package/lib/browser/folder-file-preference-provider.d.ts +24 -0
  6. package/lib/browser/folder-file-preference-provider.d.ts.map +1 -0
  7. package/lib/browser/{folder-preference-provider.js → folder-file-preference-provider.js} +12 -14
  8. package/lib/browser/folder-file-preference-provider.js.map +1 -0
  9. package/lib/browser/folders-preferences-provider.d.ts +8 -8
  10. package/lib/browser/folders-preferences-provider.d.ts.map +1 -1
  11. package/lib/browser/folders-preferences-provider.js +7 -7
  12. package/lib/browser/folders-preferences-provider.js.map +1 -1
  13. package/lib/browser/index.d.ts.map +1 -1
  14. package/lib/browser/index.js +8 -8
  15. package/lib/browser/index.js.map +1 -1
  16. package/lib/browser/preference-contribution.d.ts.map +1 -1
  17. package/lib/browser/preference-contribution.js +3 -3
  18. package/lib/browser/preference-contribution.js.map +1 -1
  19. package/lib/browser/preference-settings.service.d.ts +22 -10
  20. package/lib/browser/preference-settings.service.d.ts.map +1 -1
  21. package/lib/browser/preference-settings.service.js +284 -101
  22. package/lib/browser/preference-settings.service.js.map +1 -1
  23. package/lib/browser/preference-widgets.js.map +1 -1
  24. package/lib/browser/preferenceItem.view.d.ts +4 -3
  25. package/lib/browser/preferenceItem.view.d.ts.map +1 -1
  26. package/lib/browser/preferenceItem.view.js +125 -62
  27. package/lib/browser/preferenceItem.view.js.map +1 -1
  28. package/lib/browser/preferences.module.less +100 -60
  29. package/lib/browser/preferences.view.d.ts +3 -17
  30. package/lib/browser/preferences.view.d.ts.map +1 -1
  31. package/lib/browser/preferences.view.js +194 -112
  32. package/lib/browser/preferences.view.js.map +1 -1
  33. package/lib/browser/user-preference-provider.js.map +1 -1
  34. package/lib/browser/userstorage/user-storage.contribution.js.map +1 -1
  35. package/lib/browser/userstorage/user-storage.service.js +7 -7
  36. package/lib/browser/userstorage/user-storage.service.js.map +1 -1
  37. package/lib/browser/workspace-file-preference-provider.d.ts +1 -1
  38. package/lib/browser/workspace-file-preference-provider.d.ts.map +1 -1
  39. package/lib/browser/workspace-file-preference-provider.js.map +1 -1
  40. package/lib/browser/workspace-preference-provider.js.map +1 -1
  41. package/lib/common/preference-id.d.ts +3 -0
  42. package/lib/common/preference-id.d.ts.map +1 -1
  43. package/lib/common/preference-id.js +4 -1
  44. package/lib/common/preference-id.js.map +1 -1
  45. package/lib/common/preference.d.ts +1 -0
  46. package/lib/common/preference.d.ts.map +1 -1
  47. package/lib/common/preference.js +26 -4
  48. package/lib/common/preference.js.map +1 -1
  49. package/lib/common/types.d.ts +18 -3
  50. package/lib/common/types.d.ts.map +1 -1
  51. package/lib/common/user-storage.d.ts +1 -1
  52. package/lib/common/user-storage.d.ts.map +1 -1
  53. package/package.json +12 -11
  54. package/src/browser/abstract-resource-preference-provider.ts +357 -0
  55. package/src/browser/folder-file-preference-provider.ts +56 -0
  56. package/src/browser/folders-preferences-provider.ts +262 -0
  57. package/src/browser/index.ts +125 -0
  58. package/src/browser/preference-contribution.ts +432 -0
  59. package/src/browser/preference-settings.service.ts +810 -0
  60. package/src/browser/preference-widgets.ts +368 -0
  61. package/src/browser/preferenceItem.view.tsx +787 -0
  62. package/src/browser/preferences.module.less +345 -0
  63. package/src/browser/preferences.view.tsx +388 -0
  64. package/src/browser/user-preference-provider.ts +18 -0
  65. package/src/browser/userstorage/index.ts +2 -0
  66. package/src/browser/userstorage/user-storage.contribution.ts +19 -0
  67. package/src/browser/userstorage/user-storage.service.ts +192 -0
  68. package/src/browser/workspace-file-preference-provider.ts +50 -0
  69. package/src/browser/workspace-preference-provider.ts +129 -0
  70. package/src/common/commands.ts +5 -0
  71. package/src/common/index.ts +4 -0
  72. package/src/common/preference-id.ts +11 -0
  73. package/src/common/preference.ts +51 -0
  74. package/src/common/types.ts +63 -0
  75. package/src/common/user-storage.ts +6 -0
  76. package/src/index.ts +1 -0
  77. package/lib/browser/folder-preference-provider.d.ts +0 -26
  78. package/lib/browser/folder-preference-provider.d.ts.map +0 -1
  79. package/lib/browser/folder-preference-provider.js.map +0 -1
  80. package/lib/browser/index.less +0 -36
@@ -1,4 +1,4 @@
1
- @import '~@opensumi/ide-core-browser/lib/style/variable.less';
1
+ @base-font-size: 14px;
2
2
 
3
3
  .preferences {
4
4
  height: 100%;
@@ -45,60 +45,35 @@
45
45
 
46
46
  .preferences_body {
47
47
  height: calc(100% - 40px);
48
- position: relative;
49
- padding-left: 155px;
48
+ margin-top: 8px;
50
49
  .preferences_indexes {
51
- position: absolute;
52
- width: 155px;
53
- padding-top: 16px;
54
- height: 100%;
55
- left: 0;
56
- .index_item_wrapper {
57
- margin-bottom: 2px;
58
- }
59
- .index_item {
60
- height: 26px;
50
+ .group_item {
61
51
  font-size: @base-font-size;
62
- line-height: 26px;
63
- padding-left: 9px;
64
52
  cursor: pointer;
65
53
  white-space: nowrap;
66
54
  user-select: none;
67
-
68
- > span {
69
- margin-right: 5px;
70
- display: inline-block;
71
- font-size: 1em;
72
- }
73
- &:hover {
74
- color: var(--list-hoverForeground);
75
- background-color: var(--list-hoverBackground);
76
- }
77
- &.activated {
78
- color: var(--list-activeSelectionForeground);
79
- background: var(--list-activeSelectionBackground);
80
- }
81
- }
82
- .preference_section_link {
83
- > div {
84
- padding: 5px 5px 5px 20px;
85
- padding-left: 25px;
86
- color: var(--titleBar-inactiveForeground);
87
- overflow: hidden;
88
- white-space: nowrap;
89
- text-overflow: ellipsis;
90
- cursor: pointer;
91
- &:hover {
92
- color: var(--list-hoverForeground);
93
- background-color: var(--list-hoverBackground);
55
+ margin-bottom: 2px;
56
+ :global {
57
+ .kt-icon {
58
+ max-height: 20px !important;
94
59
  }
95
60
  }
96
61
  }
62
+
63
+ .index_item {
64
+ color: var(--titleBar-inactiveForeground);
65
+ overflow: hidden;
66
+ white-space: nowrap;
67
+ text-overflow: ellipsis;
68
+ cursor: pointer;
69
+ }
97
70
  }
71
+
98
72
  .preferences_items {
99
73
  height: 100%;
74
+ width: 100%;
75
+ flex: 1;
100
76
  user-select: text;
101
- padding: 16px 0 0 10px;
102
77
  }
103
78
  .preference_section {
104
79
  :global(.kt-checkbox-icon) {
@@ -108,20 +83,40 @@
108
83
  :global(.kt-checkbox) {
109
84
  font-size: @base-font-size;
110
85
  }
86
+ .group_title {
87
+ font-size: 24px;
88
+ font-weight: 400;
89
+ padding: 10px 18px;
90
+ &:hover {
91
+ color: var(--kt-tree-hoverForeground);
92
+ background: var(--kt-tree-hoverBackground);
93
+ }
94
+ }
111
95
  .section_title {
112
- font-size: 14px;
113
- font-weight: bold;
114
- padding: 10px 15px;
96
+ font-size: 20px;
97
+ font-weight: 500;
98
+ padding: 10px 18px;
115
99
  &:hover {
116
100
  color: var(--kt-tree-hoverForeground);
117
101
  background: var(--kt-tree-hoverBackground);
118
102
  }
119
103
  }
120
104
  .preference_item {
121
- padding: 15px 0px 15px 15px;
122
- border-left: 3px solid transparent;
105
+ padding: 18px;
106
+ border-left: 4px solid transparent;
107
+ display: flex;
108
+ flex-direction: column;
109
+ align-items: flex-start;
110
+ justify-content: space-around;
123
111
  &.modified {
124
- border-left: 3px solid var(--settings-modifiedItemIndicator);
112
+ position: relative;
113
+ }
114
+ &.modified:before {
115
+ content: '';
116
+ position: absolute;
117
+ left: 7px;
118
+ height: 75%;
119
+ border-left: 2px solid var(--settings-modifiedItemIndicator);
125
120
  }
126
121
  &:hover {
127
122
  color: var(--kt-tree-hoverForeground);
@@ -134,28 +129,35 @@
134
129
  &.focused {
135
130
  outline: 1px solid var(--list-focusOutline);
136
131
  outline-offset: -1px;
137
- color: var(--kt-tree-activeSelectionForeground) !important;
138
- background: var(--kt-tree-activeSelectionBackground);
139
132
  }
140
133
  }
141
134
  .key {
142
- margin-bottom: 5px;
135
+ flex: 1;
136
+ padding: 0 10px 10px 0;
137
+ font-weight: 600;
143
138
  font-size: @base-font-size;
144
139
  }
145
140
  .check {
146
141
  display: flex;
147
142
  align-items: center;
148
- > div:first-child {
149
- margin-right: 2px;
150
- display: flex;
151
- align-items: center;
143
+ :global {
144
+ .kt-checkbox {
145
+ margin-right: 2px;
146
+ display: flex;
147
+ align-self: flex-start;
148
+ }
149
+ }
150
+ & .desc {
151
+ padding: 0;
152
152
  }
153
153
  }
154
154
  .desc {
155
+ flex: 1;
156
+ padding: 0 10px 10px 0;
155
157
  font-size: @base-font-size;
156
158
  opacity: 0.75;
157
159
  color: var(--descriptionForeground);
158
- margin-bottom: 5px;
160
+ margin-bottom: 0px;
159
161
  ul {
160
162
  list-style: none;
161
163
  }
@@ -169,6 +171,9 @@
169
171
  width: 1em;
170
172
  margin-left: -1em;
171
173
  }
174
+ p {
175
+ margin-bottom: auto;
176
+ }
172
177
  }
173
178
  .control_wrap {
174
179
  input[type='number']::-webkit-outer-spin-button,
@@ -185,7 +190,6 @@
185
190
  padding: 0 8px !important;
186
191
  }
187
192
  .array_items_wrapper {
188
- width: 550px;
189
193
  padding-left: 0;
190
194
  position: relative;
191
195
  .array_edit_wrapper {
@@ -239,11 +243,13 @@
239
243
  cursor: pointer;
240
244
  }
241
245
  .text_control {
246
+ min-width: 300px;
242
247
  max-width: 500px;
243
248
  width: 100%;
244
249
  }
245
250
  .select_control {
246
- max-width: 300px;
251
+ min-width: 300px;
252
+ max-width: 500px;
247
253
  width: 100%;
248
254
 
249
255
  .select_option {
@@ -264,7 +270,8 @@
264
270
  }
265
271
  }
266
272
  .number_control {
267
- max-width: 300px;
273
+ min-width: 300px;
274
+ max-width: 500px;
268
275
  width: 100%;
269
276
  }
270
277
  }
@@ -293,6 +300,11 @@
293
300
  .preference_overwritten {
294
301
  font-size: 12px;
295
302
  opacity: 0.75;
303
+ text-decoration: underline;
304
+ text-decoration-color: black;
305
+ text-underline-position: under;
306
+ cursor: pointer;
307
+ opacity: 0.75;
296
308
  }
297
309
  .preference_reset {
298
310
  font-size: @base-font-size;
@@ -303,3 +315,31 @@
303
315
  }
304
316
  }
305
317
  }
318
+
319
+ .devider {
320
+ box-sizing: border-box;
321
+ font-size: 14px;
322
+ font-variant: tabular-nums;
323
+ list-style: none;
324
+ font-feature-settings: 'tnum';
325
+ position: relative;
326
+ margin: 0 3px;
327
+ display: inline-block;
328
+ vertical-align: middle;
329
+ &:after {
330
+ content: '';
331
+ display: block;
332
+ position: absolute;
333
+ top: 0px;
334
+ left: 0px;
335
+ width: 100%;
336
+ height: 100%;
337
+ border-top: 0;
338
+ border-left: 1px solid var(--editorGroup-border);
339
+ pointer-events: none;
340
+ transform: translateX(1.5px);
341
+ }
342
+ &:hover:after {
343
+ border-color: transparent;
344
+ }
345
+ }
@@ -1,29 +1,15 @@
1
1
  /// <reference types="react" />
2
- import { PreferenceScope, ISettingGroup, ISettingSection } from '@opensumi/ide-core-browser';
2
+ import { IVirtualListRange } from '@opensumi/ide-components/lib/virtual-list/types';
3
3
  import { ReactEditorComponent } from '@opensumi/ide-editor/lib/browser';
4
4
  import { ISectionItemData } from '../common';
5
- import './index.less';
6
5
  export declare const PreferenceView: ReactEditorComponent<null>;
7
- export declare const PreferenceSections: ({ preferenceSections, navigateTo, }: {
8
- preferenceSections: ISettingSection[];
9
- navigateTo: (section: ISettingSection) => void;
10
- }) => JSX.Element;
11
- export declare const PreferencesIndexes: ({ groups, scope, searchText, navigateTo, }: {
12
- groups: ISettingGroup[];
13
- scope: PreferenceScope;
14
- searchText: string;
15
- navigateTo: (section: ISettingSection) => void;
16
- }) => JSX.Element;
17
6
  export declare const PreferenceItem: ({ data, index }: {
18
7
  data: ISectionItemData;
19
8
  index: number;
20
9
  }) => JSX.Element | undefined;
21
- export declare const PreferenceBody: ({ items, onReady }: {
10
+ export declare const PreferenceBody: ({ items, onReady, onRangeChanged, }: {
22
11
  items: ISectionItemData[];
23
12
  onReady: (handler: any) => void;
24
- }) => JSX.Element;
25
- export declare const PreferenceSection: ({ section, scope }: {
26
- section: ISettingSection;
27
- scope: PreferenceScope;
13
+ onRangeChanged: (props: IVirtualListRange) => any;
28
14
  }) => JSX.Element;
29
15
  //# sourceMappingURL=preferences.view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"preferences.view.d.ts","sourceRoot":"","sources":["../../src/browser/preferences.view.tsx"],"names":[],"mappings":";AAMA,OAAO,EAIL,eAAe,EAGf,aAAa,EAEb,eAAe,EAIhB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,OAAO,EAAE,gBAAgB,EAAgB,MAAM,WAAW,CAAC;AAM3D,OAAO,cAAc,CAAC;AAYtB,eAAO,MAAM,cAAc,EAAE,oBAAoB,CAAC,IAAI,CAmJpD,CAAC;AAEH,eAAO,MAAM,kBAAkB;wBAIT,eAAe,EAAE;0BACf,eAAe,KAAK,IAAI;iBAW/C,CAAC;AAEF,eAAO,MAAM,kBAAkB;YAMrB,aAAa,EAAE;WAChB,eAAe;gBACV,MAAM;0BACI,eAAe,KAAK,IAAI;iBAuC/C,CAAC;AAEF,eAAO,MAAM,cAAc;UAA6B,gBAAgB;WAAS,MAAM;6BA2BtF,CAAC;AAEF,eAAO,MAAM,cAAc;WAAiC,gBAAgB,EAAE;uBAAqB,GAAG,KAAK,IAAI;iBAS9G,CAAC;AAEF,eAAO,MAAM,iBAAiB;aAAmC,eAAe;WAAS,eAAe;iBAavG,CAAC"}
1
+ {"version":3,"file":"preferences.view.d.ts","sourceRoot":"","sources":["../../src/browser/preferences.view.tsx"],"names":[],"mappings":";AAcA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iDAAiD,CAAC;AAepF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,OAAO,EAAoB,gBAAgB,EAAgB,MAAM,WAAW,CAAC;AAc7E,eAAO,MAAM,cAAc,EAAE,oBAAoB,CAAC,IAAI,CAuSpD,CAAC;AAEH,eAAO,MAAM,cAAc;UAA6B,gBAAgB;WAAS,MAAM;6BA2BtF,CAAC;AAEF,eAAO,MAAM,cAAc;WAKlB,gBAAgB,EAAE;uBACN,GAAG,KAAK,IAAI;4BACP,iBAAiB,KAAK,GAAG;iBASlD,CAAC"}
@@ -1,66 +1,29 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PreferenceSection = exports.PreferenceBody = exports.PreferenceItem = exports.PreferencesIndexes = exports.PreferenceSections = exports.PreferenceView = void 0;
3
+ exports.PreferenceBody = exports.PreferenceItem = exports.PreferenceView = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const classnames_1 = tslib_1.__importDefault(require("classnames"));
6
5
  const debounce_1 = tslib_1.__importDefault(require("lodash/debounce"));
7
6
  const mobx_react_lite_1 = require("mobx-react-lite");
8
- const react_1 = tslib_1.__importDefault(require("react"));
7
+ const react_1 = tslib_1.__importStar(require("react"));
8
+ const react_virtualized_auto_sizer_1 = tslib_1.__importDefault(require("react-virtualized-auto-sizer"));
9
9
  const ide_components_1 = require("@opensumi/ide-components");
10
+ const virtual_list_1 = require("@opensumi/ide-components/lib/virtual-list");
10
11
  const ide_core_browser_1 = require("@opensumi/ide-core-browser");
11
- const scroll_1 = require("@opensumi/ide-core-browser/lib/components/scroll");
12
+ const split_panel_1 = require("@opensumi/ide-core-browser/lib/components/layout/split-panel");
13
+ const useThrottleFn_1 = tslib_1.__importDefault(require("@opensumi/ide-core-browser/lib/react-hooks/useThrottleFn"));
12
14
  const common_1 = require("../common");
13
15
  const preferenceItem_view_1 = require("./preferenceItem.view");
14
16
  const preferences_module_less_1 = tslib_1.__importDefault(require("./preferences.module.less"));
15
- require("./index.less");
16
- const WorkspaceScope = {
17
- id: ide_core_browser_1.PreferenceScope.Workspace,
18
- label: 'preference.tab.workspace',
19
- };
20
- const UserScope = {
21
- id: ide_core_browser_1.PreferenceScope.User,
22
- label: 'preference.tab.user',
23
- };
17
+ const TREE_NAME = 'preferenceViewIndexTree';
24
18
  exports.PreferenceView = (0, mobx_react_lite_1.observer)(() => {
25
19
  const preferenceService = (0, ide_core_browser_1.useInjectable)(ide_core_browser_1.IPreferenceSettingsService);
26
- const preferences = (0, ide_core_browser_1.useInjectable)(ide_core_browser_1.PreferenceService);
27
20
  const labelService = (0, ide_core_browser_1.useInjectable)(ide_core_browser_1.LabelService);
28
21
  const getResourceIcon = react_1.default.useCallback((uri, options) => labelService.getIcon(ide_core_browser_1.URI.parse(uri), options), []);
29
- const userBeforeWorkspace = react_1.default.useMemo(() => preferences.get('settings.userBeforeWorkspace'), []);
30
- const tabList = userBeforeWorkspace ? [UserScope, WorkspaceScope] : [WorkspaceScope, UserScope];
31
- const [tabIndex, setTabIndex] = react_1.default.useState(0);
32
- const { currentSearch: _currentSearchText, currentGroup } = preferenceService;
33
- const currentScope = react_1.default.useMemo(() => (tabList[tabIndex] || tabList[0]).id, [tabList, tabIndex]);
34
- const [currentSearchText, setCurrentSearchText] = react_1.default.useState(_currentSearchText);
35
- const [groups, setGroups] = react_1.default.useState([]);
36
22
  const inputRef = react_1.default.useRef(null);
23
+ const [focusItem, setFocusItem] = (0, react_1.useState)(undefined);
37
24
  const debouncedSearch = (0, debounce_1.default)((value) => {
38
- setCurrentSearchText(value);
39
- }, 100, { maxWait: 1000 });
40
- const doGetGroups = async () => {
41
- const groups = preferenceService.getSettingGroups(currentScope, currentSearchText);
42
- if (groups.length > 0 && groups.findIndex((g) => g.id === currentGroup) === -1) {
43
- preferenceService.setCurrentGroup(groups[0].id);
44
- }
45
- setGroups(groups);
46
- };
47
- react_1.default.useEffect(() => {
48
- doGetGroups();
49
- const toDispose = preferenceService.onDidSettingsChange((0, debounce_1.default)(() => {
50
- doGetGroups();
51
- }, 300, {
52
- maxWait: 1000,
53
- }));
54
- return () => {
55
- toDispose === null || toDispose === void 0 ? void 0 : toDispose.dispose();
56
- };
57
- }, []);
58
- react_1.default.useEffect(() => {
59
- doGetGroups();
60
- }, [currentScope, currentSearchText]);
61
- react_1.default.useEffect(() => {
62
- setCurrentSearchText(_currentSearchText);
63
- }, [_currentSearchText]);
25
+ preferenceService.search(value);
26
+ }, 100, { maxWait: 300 });
64
27
  react_1.default.useEffect(() => {
65
28
  const focusDispose = preferenceService.onFocus(() => {
66
29
  if (inputRef && inputRef.current) {
@@ -71,93 +34,212 @@ exports.PreferenceView = (0, mobx_react_lite_1.observer)(() => {
71
34
  focusDispose.dispose();
72
35
  };
73
36
  }, []);
74
- const headers = (react_1.default.createElement(ide_components_1.Tabs, { className: preferences_module_less_1.default.tabs, value: tabIndex, onChange: (index) => setTabIndex(index), tabs: tabList.map((n) => (0, ide_core_browser_1.localize)(n.label)) }));
75
- const items = react_1.default.useMemo(() => {
76
- const sections = preferenceService.getSections(currentGroup, currentScope, currentSearchText);
77
- let items = [];
78
- for (const section of sections) {
37
+ react_1.default.useEffect(() => {
38
+ var _a;
39
+ if (focusItem && ((_a = preferenceService.treeHandler) === null || _a === void 0 ? void 0 : _a.focusItem)) {
40
+ preferenceService.treeHandler.focusItem(focusItem);
41
+ }
42
+ }, [preferenceService.tabIndex, preferenceService.treeHandler, focusItem]);
43
+ const treeData = react_1.default.useMemo(() => {
44
+ if (!preferenceService.groups) {
45
+ return [];
46
+ }
47
+ const parseTreeData = (id, section, i) => {
48
+ let innerTreeData;
79
49
  if (section.title) {
80
- items.push({ title: section.title, scope: currentScope });
50
+ innerTreeData = {
51
+ label: section.title,
52
+ section: section.title,
53
+ groupId: id,
54
+ order: i,
55
+ };
81
56
  }
82
- if (section.component) {
83
- items.push({ component: section.title, scope: currentScope });
57
+ const subTreeData = [];
58
+ if (section.subSections) {
59
+ section.subSections.forEach((v, _i) => {
60
+ const _treeData = parseTreeData(id, v, _i);
61
+ _treeData && subTreeData.push(_treeData);
62
+ });
84
63
  }
85
- else {
86
- items = items.concat(section.preferences.map((pre) => ({ preference: pre, scope: currentScope })));
64
+ if (innerTreeData && subTreeData && subTreeData.length > 0) {
65
+ innerTreeData.children = subTreeData;
66
+ innerTreeData.expandable = true;
67
+ }
68
+ return innerTreeData;
69
+ };
70
+ const basicTreeData = [];
71
+ for (let index = 0; index < preferenceService.groups.length; index++) {
72
+ const { id, title, iconClass } = preferenceService.groups[index];
73
+ const data = {
74
+ label: (0, common_1.toNormalCase)(title),
75
+ iconClassName: iconClass,
76
+ groupId: id,
77
+ order: index,
78
+ };
79
+ const children = [];
80
+ const sections = preferenceService.getResolvedSections(id, preferenceService.currentScope, preferenceService.currentSearch);
81
+ sections.forEach((sec, i) => {
82
+ const _treeData = parseTreeData(id, sec, i);
83
+ if (_treeData) {
84
+ children.push(_treeData);
85
+ }
86
+ });
87
+ // 要传这个,让 BasicTree 认为这是文件夹以保持排列顺序
88
+ data.children = children;
89
+ if (children.length > 0) {
90
+ data.expandable = true;
87
91
  }
92
+ basicTreeData.push(data);
88
93
  }
89
- return items;
90
- }, [currentGroup, currentScope, currentSearchText]);
91
- const navigateTo = react_1.default.useCallback((section) => {
94
+ return basicTreeData;
95
+ }, [preferenceService.groups, preferenceService.getResolvedSections]);
96
+ const items = react_1.default.useMemo(() => {
97
+ // 如果是搜索模式,是只展示用户左侧选择的组的内容
98
+ const result = [];
99
+ preferenceService.groups.forEach((v) => {
100
+ result.push(...collectGroup(v));
101
+ });
102
+ return result;
103
+ function collectGroup(group) {
104
+ const groupItems = [];
105
+ const sections = preferenceService.getResolvedSections(group.id, preferenceService.currentScope, preferenceService.currentSearch);
106
+ const collectItem = (section, prefix = '') => {
107
+ let currentItemPath = prefix;
108
+ if (section.title) {
109
+ currentItemPath = prefix + '/' + section.title;
110
+ }
111
+ const innerItems = [];
112
+ if (section.component) {
113
+ innerItems.push({
114
+ component: section.component,
115
+ scope: preferenceService.currentScope,
116
+ });
117
+ }
118
+ else if (section.preferences) {
119
+ innerItems.push(...section.preferences.map((pre) => ({
120
+ id: "preference:" /* ESectionItemKind.Preference */ + pre.id,
121
+ preference: pre,
122
+ scope: preferenceService.currentScope,
123
+ _path: currentItemPath,
124
+ })));
125
+ }
126
+ else if (section.subSections) {
127
+ section.subSections.forEach((v) => {
128
+ const _items = collectItem(v, currentItemPath);
129
+ innerItems.push(..._items);
130
+ });
131
+ }
132
+ // 如果该 section 有选项,填入一个 title
133
+ if (innerItems.length > 0 && section.title) {
134
+ innerItems.unshift({
135
+ id: "section:" /* ESectionItemKind.Section */ + section.title,
136
+ title: section.title,
137
+ scope: preferenceService.currentScope,
138
+ _path: currentItemPath,
139
+ });
140
+ }
141
+ return innerItems;
142
+ };
143
+ for (const section of sections) {
144
+ const _items = collectItem(section, group.title);
145
+ groupItems.push(..._items);
146
+ }
147
+ // 如果该 group 有选项,填入一个 title
148
+ if (groupItems.length > 0 && group.title) {
149
+ groupItems.unshift({
150
+ title: group.title,
151
+ id: "group:" /* ESectionItemKind.Group */ + group.id,
152
+ scope: preferenceService.currentScope,
153
+ _path: group.title,
154
+ });
155
+ }
156
+ return groupItems;
157
+ }
158
+ }, [preferenceService.groups, preferenceService.currentScope, preferenceService.currentSearch]);
159
+ const navigateTo = (id) => {
92
160
  var _a;
93
- const index = items.findIndex((item) => item.title === section.title);
94
- if (index >= 0) {
95
- (_a = preferenceService.listHandler) === null || _a === void 0 ? void 0 : _a.scrollToIndex(index);
161
+ if (id) {
162
+ const index = items.findIndex((item) => item.id === id);
163
+ if (index >= 0) {
164
+ (_a = preferenceService.listHandler) === null || _a === void 0 ? void 0 : _a.scrollToIndex({
165
+ index,
166
+ behavior: 'auto',
167
+ align: 'start',
168
+ });
169
+ }
170
+ }
171
+ };
172
+ const onRangeChanged = (0, useThrottleFn_1.default)((range) => {
173
+ // 我们通过第一个 item 来变更左侧文件树的选择状态
174
+ // 当我们点击左侧的 section 的时候,我们的设计是让每一个 section 的 title 滚到顶部
175
+ // 此时仍然会触发该事件,但有时可能因为计算取整等原因,它上报的 startIndex 是 title 的上一个 index。
176
+ // 我们在这里 +1 就是防止因为计算错误而取到上一个章节的 _path 的情况。
177
+ const item = items[range.startIndex + 1];
178
+ if (item && item._path) {
179
+ setFocusItem(item._path);
96
180
  }
97
- }, [items]);
181
+ }, 16 * 3, {
182
+ leading: true,
183
+ trailing: true,
184
+ });
185
+ react_1.default.useEffect(() => {
186
+ if (preferenceService.currentSelectId) {
187
+ navigateTo(preferenceService.currentSelectId);
188
+ }
189
+ }, [items, preferenceService.currentSelectId]);
98
190
  return (react_1.default.createElement(ide_components_1.ComponentContextProvider, { value: { getIcon: ide_core_browser_1.getIcon, localize: ide_core_browser_1.localize, getResourceIcon } },
99
191
  react_1.default.createElement("div", { className: preferences_module_less_1.default.preferences },
100
192
  react_1.default.createElement("div", { className: preferences_module_less_1.default.preferences_header },
101
- headers,
193
+ react_1.default.createElement(ide_components_1.Tabs, { className: preferences_module_less_1.default.tabs, value: preferenceService.tabIndex, onChange: (index) => {
194
+ preferenceService.tabIndex = index;
195
+ }, tabs: preferenceService.tabList.map((n) => (0, ide_core_browser_1.localize)(n.label)) }),
102
196
  react_1.default.createElement("div", { className: preferences_module_less_1.default.search_pref },
103
- react_1.default.createElement(ide_components_1.Input, { autoFocus: true, value: currentSearchText, placeholder: (0, ide_core_browser_1.localize)('preference.searchPlaceholder'), onValueChange: debouncedSearch, ref: inputRef }))),
104
- groups.length > 0 ? (react_1.default.createElement("div", { className: preferences_module_less_1.default.preferences_body },
105
- react_1.default.createElement(exports.PreferencesIndexes, { groups: groups, scope: currentScope, searchText: currentSearchText, navigateTo: navigateTo }),
106
- react_1.default.createElement("div", { className: preferences_module_less_1.default.preferences_items },
107
- react_1.default.createElement(exports.PreferenceBody, { items: items, onReady: preferenceService.handleListHandler })))) : (react_1.default.createElement("div", { className: preferences_module_less_1.default.preference_noResults }, currentSearchText
108
- ? (0, ide_core_browser_1.formatLocalize)('preference.noResults', currentSearchText)
197
+ react_1.default.createElement(ide_components_1.Input, { autoFocus: true, value: preferenceService.currentSearch, placeholder: (0, ide_core_browser_1.localize)('preference.searchPlaceholder'), onValueChange: debouncedSearch, ref: inputRef, hasClear: true }))),
198
+ preferenceService.groups.length > 0 ? (react_1.default.createElement(split_panel_1.SplitPanel, { id: 'preference-panel', resizeHandleClassName: preferences_module_less_1.default.devider, className: preferences_module_less_1.default.preferences_body, direction: 'left-to-right' },
199
+ react_1.default.createElement(react_virtualized_auto_sizer_1.default, { className: preferences_module_less_1.default.preferences_indexes, "data-sp-defaultSize": 180, "data-sp-minSize": 150 }, ({ width, height }) => (react_1.default.createElement(ide_components_1.BasicRecycleTree, { treeName: TREE_NAME, sortComparator: (a, b) => {
200
+ if (typeof a.order !== 'undefined' && typeof b.order !== 'undefined') {
201
+ return a.order > b.order ? 1 : a.order < b.order ? -1 : 0;
202
+ }
203
+ return undefined;
204
+ }, height: height, width: width, itemHeight: 26, getItemClassName: (item) => {
205
+ if ((item === null || item === void 0 ? void 0 : item.depth) === 1) {
206
+ return preferences_module_less_1.default.group_item;
207
+ }
208
+ return preferences_module_less_1.default.index_item;
209
+ }, baseIndent: 8, treeData: treeData, onClick: (_e, node) => {
210
+ const treeData = node && node._raw;
211
+ if (treeData) {
212
+ if (treeData.section) {
213
+ preferenceService.scrollToSection(treeData.section);
214
+ }
215
+ else if (treeData.groupId) {
216
+ preferenceService.scrollToGroup(treeData.groupId);
217
+ }
218
+ }
219
+ }, onReady: (handler) => {
220
+ preferenceService.handleTreeHandler(handler);
221
+ } }))),
222
+ react_1.default.createElement("div", { className: preferences_module_less_1.default.preferences_items, "data-sp-flex": 1 },
223
+ react_1.default.createElement(exports.PreferenceBody, { items: items, onReady: preferenceService.handleListHandler, onRangeChanged: onRangeChanged.run })))) : (react_1.default.createElement("div", { className: preferences_module_less_1.default.preference_noResults }, preferenceService.currentSearch
224
+ ? (0, ide_core_browser_1.formatLocalize)('preference.noResults', preferenceService.currentSearch)
109
225
  : (0, ide_core_browser_1.formatLocalize)('preference.empty'))))));
110
226
  });
111
- const PreferenceSections = ({ preferenceSections, navigateTo, }) => (react_1.default.createElement("div", { className: preferences_module_less_1.default.preference_section_link }, preferenceSections
112
- .filter((s) => s.title)
113
- .map((section, idx) => (react_1.default.createElement("div", { key: `${section.title}-${idx}`, onClick: () => navigateTo(section) }, section.title)))));
114
- exports.PreferenceSections = PreferenceSections;
115
- const PreferencesIndexes = ({ groups, scope, searchText, navigateTo, }) => {
116
- const preferenceService = (0, ide_core_browser_1.useInjectable)(ide_core_browser_1.IPreferenceSettingsService);
117
- return (react_1.default.createElement("div", { className: preferences_module_less_1.default.preferences_indexes },
118
- react_1.default.createElement(scroll_1.Scroll, null, groups &&
119
- groups.map(({ id, title, iconClass }) => {
120
- const sections = preferenceService.getSections(id, scope, searchText);
121
- return (react_1.default.createElement("div", { key: `${id} - ${title}`, className: preferences_module_less_1.default.index_item_wrapper },
122
- react_1.default.createElement("div", { key: `${id} - ${title}`, className: (0, classnames_1.default)({
123
- [preferences_module_less_1.default.index_item]: true,
124
- [preferences_module_less_1.default.activated]: preferenceService.currentGroup === id,
125
- }), onClick: () => {
126
- preferenceService.setCurrentGroup(id);
127
- } },
128
- react_1.default.createElement("span", { className: iconClass }),
129
- (0, common_1.toNormalCase)((0, ide_core_browser_1.replaceLocalizePlaceholder)(title) || '')),
130
- preferenceService.currentGroup === id ? (react_1.default.createElement("div", null,
131
- react_1.default.createElement(exports.PreferenceSections, { preferenceSections: sections, navigateTo: navigateTo }))) : (react_1.default.createElement("div", null))));
132
- }))));
133
- };
134
- exports.PreferencesIndexes = PreferencesIndexes;
135
227
  const PreferenceItem = ({ data, index }) => {
228
+ var _a;
136
229
  if (data.title) {
137
- return (react_1.default.createElement("div", { className: preferences_module_less_1.default.section_title, id: `preferenceSection-${data.title}` }, data.title));
230
+ if ((_a = data.id) === null || _a === void 0 ? void 0 : _a.startsWith("group:" /* ESectionItemKind.Group */)) {
231
+ return (react_1.default.createElement("div", { className: preferences_module_less_1.default.group_title, id: data.id }, data.title));
232
+ }
233
+ return (react_1.default.createElement("div", { className: preferences_module_less_1.default.section_title, id: data.id }, data.title));
138
234
  }
139
235
  else if (data.component) {
140
236
  return react_1.default.createElement(data.component, { scope: data.scope });
141
237
  }
142
- else if (typeof data.preference === 'string') {
143
- return (react_1.default.createElement(preferenceItem_view_1.NextPreferenceItem, { key: `${index} - ${data.preference} - ${data.scope}`, preferenceName: data.preference, scope: data.scope }));
144
- }
145
238
  else if (data.preference) {
146
- return (react_1.default.createElement(preferenceItem_view_1.NextPreferenceItem, { key: `${index} - ${data.preference.id} - ${data.scope}`, preferenceName: data.preference.id, localizedName: data.preference.localized ? (0, ide_core_browser_1.localize)(data.preference.localized) : '', scope: data.scope }));
239
+ return (react_1.default.createElement(preferenceItem_view_1.NextPreferenceItem, { key: `${index} - ${data.preference.id} - ${data.scope}`, preference: data.preference, preferenceId: data.preference.id, localizedName: data.preference.label, scope: data.scope }));
147
240
  }
148
241
  };
149
242
  exports.PreferenceItem = PreferenceItem;
150
- const PreferenceBody = ({ items, onReady }) => (react_1.default.createElement(ide_components_1.RecycleList, { onReady: onReady, data: items, template: exports.PreferenceItem, className: preferences_module_less_1.default.preference_section,
151
- // 防止底部选择框无法查看的临时处理方式
152
- paddingBottomSize: 100 }));
243
+ const PreferenceBody = ({ items, onReady, onRangeChanged, }) => (react_1.default.createElement(virtual_list_1.VirtualList, { data: items, template: exports.PreferenceItem, className: preferences_module_less_1.default.preference_section, refSetter: onReady, onRangeChanged: onRangeChanged }));
153
244
  exports.PreferenceBody = PreferenceBody;
154
- const PreferenceSection = ({ section, scope }) => (react_1.default.createElement("div", { className: preferences_module_less_1.default.preference_section, id: 'preferenceSection-' + section.title },
155
- section.title ? react_1.default.createElement("div", { className: preferences_module_less_1.default.section_title }, section.title) : null,
156
- section.component ? (react_1.default.createElement(section.component, { scope: scope })) : (section.preferences.map((preference, idx) => {
157
- if (typeof preference === 'string') {
158
- }
159
- else {
160
- }
161
- }) || react_1.default.createElement("div", null))));
162
- exports.PreferenceSection = PreferenceSection;
163
245
  //# sourceMappingURL=preferences.view.js.map