@@ -33,6 +33,9 @@ export class AssessmentsSidebarProvider
3333 }
3434
3535 getChildren ( element ?: BaseTreeItem ) : Thenable < BaseTreeItem [ ] > {
36+ // Synthetic root item that launches the Source Academy panel.
37+ const launchItem = new PlaygroundItem ( ) ;
38+
3639 // @ts -ignore
3740 const assessmentOverviews : VscAssessmentOverview [ ] =
3841 this . context . globalState . get ( "assessmentOverviews" ) ;
@@ -44,14 +47,18 @@ export class AssessmentsSidebarProvider
4447 const assessmentTypes = [
4548 ...new Set ( assessmentOverviews . map ( ( ao ) => ao . type ) ) ,
4649 ] ;
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 ] ) ;
5053 }
5154
5255 if ( element && element . type === "AssessmentFolder" ) {
5356 const elem = element as AssessmentFolder ;
5457
58+ if ( ! assessmentOverviews ) {
59+ return Promise . resolve ( [ ] ) ;
60+ }
61+
5562 return Promise . resolve (
5663 assessmentOverviews
5764 . filter ( ( ao ) => ao . type == elem . assessmentType )
@@ -84,6 +91,21 @@ class BaseTreeItem extends vscode.TreeItem {
8491 } ;
8592}
8693
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+
87109class AssessmentFolder extends BaseTreeItem {
88110 constructor ( public readonly assessmentType : string ) {
89111 super ( assessmentType , vscode . TreeItemCollapsibleState . Collapsed ) ;
0 commit comments