Index: dashboard/dashboard/elements/test-picker.html |
diff --git a/dashboard/dashboard/elements/test-picker.html b/dashboard/dashboard/elements/test-picker.html |
index 770e073a41ac9a369c9659ca24f0feec0c604d5e..3bc2be648afe08fc3904610a71d54a01603f47a1 100644 |
--- a/dashboard/dashboard/elements/test-picker.html |
+++ b/dashboard/dashboard/elements/test-picker.html |
@@ -253,8 +253,6 @@ found in the LICENSE file. |
} else if (boxIndex == 0) { |
this.updateTestSuiteDescription(); |
this.updateBotMenu(); |
- } else if (boxIndex == 1) { |
- this.sendSubtestRequest(); |
} else { |
// Update all the next dropdown menus for subtests. |
this.updateSubtestMenus(boxIndex + 1); |
@@ -289,9 +287,9 @@ found in the LICENSE file. |
menu.set('items', botItems); |
menu.set('disabled', botItems.length === 0); |
this.subtestDict = null; |
- // If there's a selection, send a subtest request. |
+ // If there's a selection, update the subtest menus. |
if (menu.selectedItem) { |
- this.sendSubtestRequest(); |
+ this.updateSubtestMenus(2); |
} else { |
// Clear all subtest menus. |
this.splice('selectionModels', 2); |
@@ -300,86 +298,46 @@ found in the LICENSE file. |
}, |
/** |
- * Sends a request for subtestDict base on selected test suite and bot. |
+ * Updates all subtest menus starting at 'startIndex'. |
*/ |
- sendSubtestRequest: function() { |
- if (this.subtestXhr) { |
- this.subtestXhr.abort(); |
- this.subtestXhr = null; |
- } |
- var bot = this.getCheckedBot(); |
- // If no bot is selected, just leave the current subtests. |
- if (bot === null) { |
- return; |
- } |
- var suite = this.getCheckedSuite(); |
- if (!suite) { |
- return; |
- } |
+ updateSubtestMenus: async function(startIndex) { |
shatch
2017/03/22 17:10:13
Just for record-keeping since we spoke offline, si
|
+ // If there's no selection model at this level yet, we must make one. |
+ if (startIndex >= this.selectionModels.length) { |
+ this.loading = true; |
- this.loading = true; |
+ const children = await this.getChildren( |
+ this.getCurrentPreselectedPath()); |
+ this.loading = false; |
- var params = { |
- type: 'sub_tests', |
- suite: suite, |
- bots: bot, |
- xsrf_token: this.xsrfToken |
- }; |
- this.subtestXhr = simple_xhr.send( |
- '/list_tests', |
- params, |
- function(response) { |
- this.loading = false; |
- this.subtestDict = response; |
- // Start at first subtest menu. |
- this.updateSubtestMenus(2); |
- }.bind(this), |
- function(error) { |
- // TODO: Display error. |
- this.loading = false; |
- }.bind(this) |
- ); |
- }, |
+ this.push('selectionModels', { |
+ placeholder: this.SUBTEST_LABEL, |
+ datalist: children, |
+ disabled: false, |
+ }); |
- /** |
- * Updates all subtest menus starting at 'startIndex'. |
- */ |
- updateSubtestMenus: function(startIndex) { |
- var subtestDict = this.getSubtestAtIndex(startIndex); |
+ Polymer.dom.flush(); |
+ } |
- // Update existing subtest menu. |
for (var i = startIndex; i < this.selectionModels.length; i++) { |
- // Remove the rest of the menu if no subtestDict. |
- if (!subtestDict || Object.keys(subtestDict).length == 0) { |
+ const children = await this.getChildren( |
+ this.getCurrentPreselectedPath()); |
sullivan
2017/03/21 13:24:23
This is pretty confusing. It seems like either:
*
shatch
2017/03/21 17:48:02
Yeah this could use some clarification, had to pas
|
+ // Remove the rest of the menu if no children. |
+ if (children.length === 0) { |
this.splice('selectionModels', i); |
this.updateAddButtonState(); |
return; |
} |
- var subtestItems = this.getSubtestItems(subtestDict); |
- var menu = this.getSelectionMenu(i); |
- menu.set('items', subtestItems); |
+ const menu = this.getSelectionMenu(i); |
+ menu.set('items', children); |
// If there are selected item, update next menu. |
if (menu.selectedItem) { |
- subtestDict = subtestDict[menu.selectedName]['sub_tests']; |
+ continue; |
} else { |
- subtestDict = null; |
+ break; |
} |
} |
- // Check if we still need to add a subtest menu. |
- if (subtestDict && Object.keys(subtestDict).length > 0) { |
- var subtestItems = this.getSubtestItems(subtestDict); |
- this.push('selectionModels', { |
- placeholder: this.SUBTEST_LABEL, |
- datalist: subtestItems, |
- disabled: false, |
- }); |
- Polymer.dom.flush(); |
- var menu = this.getSelectionMenu(this.selectionModels.length - 1); |
- menu.set('items', subtestItems); |
- } |
- |
this.updateAddButtonState(); |
}, |
@@ -387,30 +345,16 @@ found in the LICENSE file. |
this.enableAddSeries = this.getCurrentSelection() instanceof Array; |
}, |
- getSubtestAtIndex: function(index) { |
- var subtestDict = this.subtestDict; |
- for (var i = 2; i < index; i++) { |
- var test = this.getSelectionMenu(i).selectedName; |
- if (test in subtestDict) { |
- subtestDict = subtestDict[test]['sub_tests']; |
- } else { |
- return null; |
- } |
- } |
- return subtestDict; |
- }, |
+ getChildren: function(path) { |
+ const testPathDict = {}; |
+ testPathDict[path] = 'all'; |
+ const params = { |
+ type: 'test_path_dict', |
+ return_selected: '1', |
+ test_path_dict: JSON.stringify(testPathDict) |
+ }; |
- getSubtestItems: function(subtestDict) { |
- var subtestItems = []; |
- var subtestNames = Object.keys(subtestDict).sort(); |
- for (var i = 0; i < subtestNames.length; i++) { |
- var name = subtestNames[i]; |
- subtestItems.push({ |
- name: name, |
- tag: (subtestDict[name]['deprecated'] ? this.DEPRECATED_TAG : '') |
- }); |
- } |
- return subtestItems; |
+ return simple_xhr.asPromise('/list_tests', params); |
}, |
getCheckedBot: function() { |
@@ -458,6 +402,16 @@ found in the LICENSE file. |
* is a valid selection. |
*/ |
getCurrentSelection: function() { |
+ const path = this.getCurrentPreselectedPath(true); |
+ if (this.currentSelectedPath_ === path) { |
+ return this.currentSelectedTests_; |
+ } |
+ this.currentSelectedPath_ = path; |
+ this.sendListTestsRequest(path); |
+ return null; |
+ }, |
+ |
+ getCurrentPreselectedPath: function(onlyValid) { |
var level = 0; |
var parts = []; |
while (true) { |
@@ -465,7 +419,7 @@ found in the LICENSE file. |
if (!menu || !menu.selectedItem) { |
// A selection is only valid if it specifies at least one subtest |
// component, which is the third level. |
- if (level <= 2) return null; |
+ if (onlyValid && level <= 2) return null; |
break; |
} else { |
// We want to collect all the subtest components so we can form |
@@ -480,12 +434,7 @@ found in the LICENSE file. |
parts.unshift(suite); |
parts.unshift(bot); |
- var path = parts.join('/'); |
- |
- if (this.currentSelectedPath_ === path) |
- return this.currentSelectedTests_; |
- this.sendListTestsRequest(path); |
- return null; |
+ return parts.join('/'); |
}, |
getCurrentSelectedPath: function() { |