@@ -33,6 +33,9 @@ export class AssessmentsSidebarProvider
33
33
}
34
34
35
35
getChildren ( element ?: BaseTreeItem ) : Thenable < BaseTreeItem [ ] > {
36
+ // Synthetic root item that launches the Source Academy panel.
37
+ const launchItem = new PlaygroundItem ( ) ;
38
+
36
39
// @ts -ignore
37
40
const assessmentOverviews : VscAssessmentOverview [ ] =
38
41
this . context . globalState . get ( "assessmentOverviews" ) ;
@@ -44,14 +47,18 @@ export class AssessmentsSidebarProvider
44
47
const assessmentTypes = [
45
48
...new Set ( assessmentOverviews . map ( ( ao ) => ao . type ) ) ,
46
49
] ;
47
- return Promise . resolve (
48
- assessmentTypes . map ( ( at ) => new AssessmentFolder ( at ) ) ,
49
- ) ;
50
+ const folders = assessmentTypes . map ( ( at ) => new AssessmentFolder ( at ) ) ;
51
+
52
+ return Promise . resolve ( [ launchItem , ... folders ] ) ;
50
53
}
51
54
52
55
if ( element && element . type === "AssessmentFolder" ) {
53
56
const elem = element as AssessmentFolder ;
54
57
58
+ if ( ! assessmentOverviews ) {
59
+ return Promise . resolve ( [ ] ) ;
60
+ }
61
+
55
62
return Promise . resolve (
56
63
assessmentOverviews
57
64
. filter ( ( ao ) => ao . type == elem . assessmentType )
@@ -84,6 +91,21 @@ class BaseTreeItem extends vscode.TreeItem {
84
91
} ;
85
92
}
86
93
94
+ /**
95
+ * Synthetic tree item that always appears at the top-level of the view.
96
+ */
97
+ class PlaygroundItem extends BaseTreeItem {
98
+ constructor ( ) {
99
+ super ( "Playground" , vscode . TreeItemCollapsibleState . None ) ;
100
+ this . type = "LaunchItem" ;
101
+ this . command = {
102
+ title : "Playground" ,
103
+ command : "source-academy.navigate" ,
104
+ arguments : [ "/playground" ] ,
105
+ } ;
106
+ }
107
+ }
108
+
87
109
class AssessmentFolder extends BaseTreeItem {
88
110
constructor ( public readonly assessmentType : string ) {
89
111
super ( assessmentType , vscode . TreeItemCollapsibleState . Collapsed ) ;
0 commit comments