Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
6eaed50e
V
vscode
项目概览
xxadev
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
6eaed50e
编写于
10月 06, 2017
作者:
R
Rob Lourens
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Support sending feedback on settings search results
上级
626ef93c
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
91 addition
and
26 deletion
+91
-26
src/vs/workbench/parts/preferences/browser/preferencesEditor.ts
.../workbench/parts/preferences/browser/preferencesEditor.ts
+1
-1
src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts
...rkbench/parts/preferences/browser/preferencesRenderers.ts
+52
-8
src/vs/workbench/parts/preferences/browser/preferencesSearch.ts
.../workbench/parts/preferences/browser/preferencesSearch.ts
+24
-13
src/vs/workbench/parts/preferences/common/preferences.ts
src/vs/workbench/parts/preferences/common/preferences.ts
+9
-1
src/vs/workbench/parts/preferences/common/preferencesModels.ts
...s/workbench/parts/preferences/common/preferencesModels.ts
+5
-3
未找到文件。
src/vs/workbench/parts/preferences/browser/preferencesEditor.ts
浏览文件 @
6eaed50e
...
...
@@ -449,7 +449,7 @@ class PreferencesRenderers extends Disposable {
const
editablePreferencesFilteredGroups
=
editablePreferencesFilterResult
?
editablePreferencesFilterResult
.
filteredGroups
:
this
.
_getAllPreferences
(
this
.
_editablePreferencesRenderer
);
const
consolidatedSettings
=
this
.
_consolidateSettings
(
editablePreferencesFilteredGroups
,
defaultPreferencesFilteredGroups
);
if
(
defaultPreferencesFilterResult
&&
defaultPreferencesFilterResult
.
scores
)
{
if
(
defaultPreferencesFilterResult
&&
defaultPreferencesFilterResult
.
remoteResult
)
{
// Disable navigation for remote settings search
this
.
_settingsNavigator
=
null
;
}
else
{
...
...
src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts
浏览文件 @
6eaed50e
...
...
@@ -308,7 +308,7 @@ export class DefaultSettingsRenderer extends Disposable implements IPreferencesR
public
filterPreferences
(
filterResult
:
IFilterResult
):
void
{
this
.
filterResult
=
filterResult
;
if
(
filterResult
)
{
if
(
filterResult
.
scores
)
{
if
(
filterResult
.
remoteResult
)
{
this
.
filteredMatchesRenderer
.
render
(
null
);
this
.
settingsGroupTitleRenderer
.
render
(
null
);
}
else
{
...
...
@@ -582,7 +582,7 @@ export class MostRelevantMatchesRenderer extends Disposable implements HiddenAre
public
render
(
result
:
IFilterResult
):
void
{
this
.
hiddenAreas
=
[];
if
(
result
&&
result
.
matches
.
length
&&
result
.
scores
)
{
if
(
result
&&
result
.
matches
.
length
&&
result
.
remoteResult
)
{
const
settingsTextEndLine
=
this
.
renderResults
(
result
);
this
.
hiddenAreas
=
[{
...
...
@@ -606,7 +606,7 @@ export class MostRelevantMatchesRenderer extends Disposable implements HiddenAre
this
.
hiddenAreas
=
[];
this
.
editor
.
updateOptions
({
readOnly
:
false
});
const
relevantRanges
=
this
.
getOrderedSettingRanges
(
result
.
filteredGroups
,
result
.
allGroups
,
result
.
scores
,
this
.
editor
.
getModel
());
const
relevantRanges
=
this
.
getOrderedSettingRanges
(
result
.
filteredGroups
,
result
.
allGroups
,
result
.
remoteResult
.
scores
,
this
.
editor
.
getModel
());
let
totalLines
=
0
;
const
settingsValue
=
relevantRanges
.
map
(
visibleRange
=>
{
const
settingLines
=
(
visibleRange
.
endLineNumber
-
visibleRange
.
startLineNumber
)
+
1
;
...
...
@@ -702,17 +702,22 @@ export class MostRelevantMatchesRenderer extends Disposable implements HiddenAre
}
export
class
FeedbackWidgetRenderer
extends
Disposable
{
private
static
COMMENT_TEXT
=
'
// Reorder and modify the below results to match your expectations. Replace this comment with any text feedback.
'
;
private
_feedbackWidget
:
FloatingClickWidget
;
private
_currentResult
:
IFilterResult
;
constructor
(
private
editor
:
ICodeEditor
,
@
IInstantiationService
private
instantiationService
:
IInstantiationService
,
@
IWorkbenchEditorService
private
editorService
:
IWorkbenchEditorService
@
IWorkbenchEditorService
private
editorService
:
IWorkbenchEditorService
,
@
ITelemetryService
private
telemetryService
:
ITelemetryService
)
{
super
();
}
public
render
(
result
:
IFilterResult
):
void
{
if
(
result
&&
result
.
scores
)
{
this
.
_currentResult
=
result
;
if
(
result
&&
result
.
remoteResult
)
{
this
.
showWidget
();
}
else
if
(
this
.
_feedbackWidget
)
{
this
.
disposeWidget
();
...
...
@@ -728,15 +733,54 @@ export class FeedbackWidgetRenderer extends Disposable {
}
private
getFeedback
():
void
{
this
.
editorService
.
openEditor
({
contents
:
'
test
'
},
true
).
then
(
feedbackEditor
=>
{
const
result
=
this
.
_currentResult
;
const
actualResults
=
Object
.
keys
(
result
.
remoteResult
.
scores
)
.
sort
((
a
,
b
)
=>
result
.
remoteResult
.
scores
[
b
]
-
result
.
remoteResult
.
scores
[
a
]);
const
actualResultText
=
actualResults
.
join
(
'
\n
'
);
const
contents
=
FeedbackWidgetRenderer
.
COMMENT_TEXT
+
'
\n
'
+
actualResultText
;
this
.
editorService
.
openEditor
({
contents
},
/*sideBySide=*/
true
).
then
(
feedbackEditor
=>
{
const
sendFeedbackWidget
=
this
.
_register
(
this
.
instantiationService
.
createInstance
(
FloatingClickWidget
,
feedbackEditor
.
getControl
(),
'
Send feedback
'
,
null
));
this
.
_register
(
sendFeedbackWidget
.
onClick
(()
=>
this
.
sendFeedback
()));
sendFeedbackWidget
.
render
();
this
.
_register
(
sendFeedbackWidget
.
onClick
(()
=>
{
this
.
sendFeedback
(
feedbackEditor
.
getControl
()
as
ICodeEditor
,
result
,
actualResults
);
sendFeedbackWidget
.
dispose
();
}));
});
}
private
sendFeedback
():
void
{
private
sendFeedback
(
feedbackEditor
:
ICodeEditor
,
result
:
IFilterResult
,
actualResults
:
string
[]):
void
{
const
model
=
feedbackEditor
.
getModel
();
const
expectedResults
=
model
.
getLinesContent
().
slice
();
const
commentLines
=
[];
while
(
strings
.
startsWith
(
expectedResults
[
0
],
'
//
'
))
{
commentLines
.
push
(
expectedResults
.
shift
());
}
const
commentText
=
commentLines
.
join
(
'
\n
'
);
/* __GDPR__
"settingsSearchResultFeedback" : {
"query" : { "classification": "CustomContent", "purpose": "FeatureInsight" },
"userComment" : { "classification": "CustomerContent", "purpose": "FeatureInsight" },
"actualResults" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" },
"expectedResults" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" },
"url" : { "classification": "CustomerContent", "purpose": "FeatureInsight" },
"duration" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" },
"timestamp" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }
}
*/
this
.
telemetryService
.
publicLog
(
'
settingsSearchResultFeedback
'
,
{
query
:
result
.
query
,
userComment
:
commentText
===
FeedbackWidgetRenderer
.
COMMENT_TEXT
?
undefined
:
commentText
,
actualResults
,
expectedResults
,
url
:
result
.
remoteResult
.
url
,
duration
:
result
.
remoteResult
.
duration
,
timestamp
:
result
.
remoteResult
.
timestamp
});
console
.
log
(
'
Feedback sent successfully
'
);
}
private
disposeWidget
():
void
{
...
...
src/vs/workbench/parts/preferences/browser/preferencesSearch.ts
浏览文件 @
6eaed50e
...
...
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import
{
TPromise
}
from
'
vs/base/common/winjs.base
'
;
import
{
ISettingsEditorModel
,
IFilterResult
,
ISetting
,
ISettingsGroup
,
IWorkbenchSettingsConfiguration
}
from
'
vs/workbench/parts/preferences/common/preferences
'
;
import
{
ISettingsEditorModel
,
IFilterResult
,
ISetting
,
ISettingsGroup
,
IWorkbenchSettingsConfiguration
,
IRemoteFilterResult
}
from
'
vs/workbench/parts/preferences/common/preferences
'
;
import
{
IRange
,
Range
}
from
'
vs/editor/common/core/range
'
;
import
{
distinct
}
from
'
vs/base/common/arrays
'
;
import
*
as
strings
from
'
vs/base/common/strings
'
;
...
...
@@ -75,17 +75,17 @@ class LocalSearchProvider {
class
RemoteSearchProvider
{
private
_filter
:
string
;
private
_remoteSearchP
:
TPromise
<
{
[
key
:
string
]:
number
}
>
;
private
_remoteSearchP
:
TPromise
<
IRemoteFilterResult
>
;
constructor
(
filter
:
string
)
{
this
.
_filter
=
filter
;
this
.
_remoteSearchP
=
filter
?
getSettingsFromBing
(
filter
)
:
TPromise
.
wrap
(
{}
);
this
.
_remoteSearchP
=
filter
?
getSettingsFromBing
(
filter
)
:
TPromise
.
wrap
(
null
);
}
filterPreferences
(
preferencesModel
:
ISettingsEditorModel
):
TPromise
<
IFilterResult
>
{
return
this
.
_remoteSearchP
.
then
(
settingsSe
t
=>
{
return
this
.
_remoteSearchP
.
then
(
remoteResul
t
=>
{
const
settingFilter
=
(
setting
:
ISetting
)
=>
{
if
(
!!
settingsSet
[
setting
.
key
])
{
if
(
!!
remoteResult
.
scores
[
setting
.
key
])
{
const
settingMatches
=
new
SettingMatches
(
this
.
_filter
,
setting
,
(
filter
,
setting
)
=>
preferencesModel
.
findValueMatches
(
filter
,
setting
)).
matches
;
if
(
settingMatches
.
length
)
{
return
settingMatches
;
...
...
@@ -97,14 +97,18 @@ class RemoteSearchProvider {
}
};
const
result
=
preferencesModel
.
filterSettings
(
this
.
_filter
,
group
=>
null
,
settingFilter
);
result
.
scores
=
settingsSet
;
return
result
;
if
(
remoteResult
)
{
const
result
=
preferencesModel
.
filterSettings
(
this
.
_filter
,
group
=>
null
,
settingFilter
);
result
.
remoteResult
=
remoteResult
;
return
result
;
}
else
{
return
null
;
}
});
}
}
function
getSettingsFromBing
(
filter
:
string
):
TPromise
<
{
[
key
:
string
]:
number
}
>
{
function
getSettingsFromBing
(
filter
:
string
):
TPromise
<
IRemoteFilterResult
>
{
const
url
=
prepareUrl
(
filter
);
console
.
log
(
'
fetching:
'
+
url
);
const
start
=
Date
.
now
();
...
...
@@ -117,22 +121,29 @@ function getSettingsFromBing(filter: string): TPromise<{ [key: string]: number }
})
.
then
(
r
=>
r
.
json
())
.
then
(
result
=>
{
console
.
log
(
'
time:
'
+
(
Date
.
now
()
-
start
)
/
1000
);
const
timestamp
=
Date
.
now
();
const
duration
=
timestamp
-
start
;
console
.
log
(
'
time:
'
+
duration
/
1000
);
const
suggestions
=
(
result
.
value
||
[])
.
map
(
r
=>
({
name
:
r
.
Setting
,
score
:
r
[
'
@search.score
'
]
}));
const
s
uggSet
=
Object
.
create
(
null
);
const
s
cores
=
Object
.
create
(
null
);
suggestions
.
forEach
(
s
=>
{
const
name
=
s
.
name
.
replace
(
/^"/
,
''
)
.
replace
(
/"$/
,
''
);
s
uggSet
[
name
]
=
s
.
score
;
s
cores
[
name
]
=
s
.
score
;
});
return
suggSet
;
return
<
IRemoteFilterResult
>
{
url
,
scores
,
duration
,
timestamp
};
});
return
TPromise
.
as
(
p
as
any
);
...
...
src/vs/workbench/parts/preferences/common/preferences.ts
浏览文件 @
6eaed50e
...
...
@@ -50,10 +50,18 @@ export interface ISetting {
}
export
interface
IFilterResult
{
query
:
string
;
filteredGroups
:
ISettingsGroup
[];
allGroups
:
ISettingsGroup
[];
matches
:
IRange
[];
scores
?:
{
[
key
:
string
]:
number
};
remoteResult
?:
IRemoteFilterResult
;
}
export
interface
IRemoteFilterResult
{
url
:
string
;
timestamp
:
number
;
duration
:
number
;
scores
:
{
[
key
:
string
]:
number
};
}
export
interface
IPreferencesEditorModel
<
T
>
{
...
...
src/vs/workbench/parts/preferences/common/preferencesModels.ts
浏览文件 @
6eaed50e
...
...
@@ -37,7 +37,8 @@ export abstract class AbstractSettingsModel extends EditorModel {
return
{
filteredGroups
:
allGroups
,
allGroups
,
matches
:
[]
matches
:
[],
query
:
filter
};
}
...
...
@@ -46,7 +47,8 @@ export abstract class AbstractSettingsModel extends EditorModel {
return
{
filteredGroups
:
[
group
],
allGroups
,
matches
:
[]
matches
:
[],
query
:
filter
};
}
...
...
@@ -85,7 +87,7 @@ export abstract class AbstractSettingsModel extends EditorModel {
});
}
}
return
{
filteredGroups
,
matches
,
allGroups
};
return
{
filteredGroups
,
matches
,
allGroups
,
query
:
filter
};
}
private
filterByGroupTerm
(
filter
:
string
):
ISettingsGroup
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录