@@ -32,6 +32,8 @@ import { ModelWithPersistence } from '../../persistence/model'
3232import { PersistenceKey } from '../../persistence/constants'
3333import { sum } from '../../util/math'
3434
35+ export type StarredExperiments = Record < string , boolean | undefined >
36+
3537type SelectedExperimentWithColor = Experiment & {
3638 displayColor : Color
3739 selected : true
@@ -56,6 +58,7 @@ export class ExperimentsModel extends ModelWithPersistence {
5658 private checkpointsByTip : Map < string , Experiment [ ] > = new Map ( )
5759 private availableColors : Color [ ]
5860 private coloredStatus : ColoredStatus
61+ private starredExperiments : StarredExperiments
5962
6063 private filters : Map < string , FilterDefinition > = new Map ( )
6164 private useFiltersForSelection = false
@@ -81,6 +84,10 @@ export class ExperimentsModel extends ModelWithPersistence {
8184 PersistenceKey . EXPERIMENTS_STATUS ,
8285 { }
8386 )
87+ this . starredExperiments = this . revive < StarredExperiments > (
88+ PersistenceKey . EXPERIMENTS_STARS ,
89+ { }
90+ )
8491
8592 const assignedColors = new Set (
8693 Object . values ( this . coloredStatus ) . filter ( Boolean )
@@ -108,6 +115,13 @@ export class ExperimentsModel extends ModelWithPersistence {
108115 this . setColoredStatus ( )
109116 }
110117
118+ public toggleStars ( ids : string [ ] ) {
119+ for ( const id of ids ) {
120+ this . starredExperiments [ id ] = ! this . starredExperiments [ id ]
121+ this . persistStars ( )
122+ }
123+ }
124+
111125 public toggleStatus ( id : string ) {
112126 if (
113127 this . flattenExperiments ( ) . find ( ( { id : queuedId } ) => queuedId === id )
@@ -273,19 +287,19 @@ export class ExperimentsModel extends ModelWithPersistence {
273287 } ) [ ] {
274288 return [
275289 {
276- ...this . addSelected ( this . workspace ) ,
290+ ...this . addDetails ( this . workspace ) ,
277291 hasChildren : false ,
278292 type : ExperimentType . WORKSPACE
279293 } ,
280294 ...this . branches . map ( branch => {
281295 return {
282- ...this . addSelected ( branch ) ,
296+ ...this . addDetails ( branch ) ,
283297 hasChildren : false ,
284298 type : ExperimentType . BRANCH
285299 }
286300 } ) ,
287301 ...this . flattenExperiments ( ) . map ( experiment => ( {
288- ...this . addSelected ( experiment ) ,
302+ ...this . addDetails ( experiment ) ,
289303 hasChildren : definedAndNonEmpty (
290304 this . checkpointsByTip . get ( experiment . id )
291305 ) ,
@@ -300,7 +314,7 @@ export class ExperimentsModel extends ModelWithPersistence {
300314 return this . getExperiments ( ) . map ( experiment => {
301315 const checkpoints = this . checkpointsByTip
302316 . get ( experiment . id )
303- ?. map ( checkpoint => this . addSelected ( checkpoint ) )
317+ ?. map ( checkpoint => this . addDetails ( checkpoint ) )
304318 if ( ! definedAndNonEmpty ( checkpoints ) ) {
305319 return experiment
306320 }
@@ -328,24 +342,24 @@ export class ExperimentsModel extends ModelWithPersistence {
328342 id : string
329343 ) : ( Experiment & { type : ExperimentType } ) [ ] | undefined {
330344 return this . checkpointsByTip . get ( id ) ?. map ( checkpoint => ( {
331- ...this . addSelected ( checkpoint ) ,
345+ ...this . addDetails ( checkpoint ) ,
332346 type : ExperimentType . CHECKPOINT
333347 } ) )
334348 }
335349
336350 public getRowData ( ) {
337351 return [
338- this . addSelected ( this . workspace ) ,
352+ this . addDetails ( this . workspace ) ,
339353 ...this . branches . map ( branch => {
340354 const experiments = this . getExperimentsByBranch ( branch )
341- const branchWithSelected = this . addSelected ( branch )
355+ const branchWithSelectedAndStarred = this . addDetails ( branch )
342356
343357 if ( ! definedAndNonEmpty ( experiments ) ) {
344- return branchWithSelected
358+ return branchWithSelectedAndStarred
345359 }
346360
347361 return {
348- ...branchWithSelected ,
362+ ...branchWithSelectedAndStarred ,
349363 subRows : this . getSubRows ( experiments )
350364 }
351365 } )
@@ -356,6 +370,10 @@ export class ExperimentsModel extends ModelWithPersistence {
356370 return ! ! this . coloredStatus [ id ]
357371 }
358372
373+ public isStarred ( id : string ) {
374+ return ! ! this . starredExperiments [ id ]
375+ }
376+
359377 public getExperimentCount ( ) {
360378 return sum ( [
361379 this . flattenCheckpoints ( ) . length ,
@@ -387,12 +405,12 @@ export class ExperimentsModel extends ModelWithPersistence {
387405 filters
388406 )
389407 if ( ! checkpoints ) {
390- return this . addSelected ( experiment )
408+ return this . addDetails ( experiment )
391409 }
392410 return {
393- ...this . addSelected ( experiment ) ,
411+ ...this . addDetails ( experiment ) ,
394412 subRows : checkpoints . map ( checkpoint => ( {
395- ...this . addSelected ( checkpoint )
413+ ...this . addDetails ( checkpoint )
396414 } ) )
397415 }
398416 } )
@@ -505,10 +523,30 @@ export class ExperimentsModel extends ModelWithPersistence {
505523 return this . persist ( PersistenceKey . EXPERIMENTS_FILTER_BY , [ ...this . filters ] )
506524 }
507525
526+ private persistStars ( ) {
527+ return this . persist (
528+ PersistenceKey . EXPERIMENTS_STARS ,
529+ this . starredExperiments
530+ )
531+ }
532+
508533 private persistStatus ( ) {
509534 return this . persist ( PersistenceKey . EXPERIMENTS_STATUS , this . coloredStatus )
510535 }
511536
537+ private addStarred ( experiment : Experiment ) {
538+ const { id } = experiment
539+
540+ if ( ! this . isStarred ( id ) ) {
541+ return experiment
542+ }
543+
544+ return {
545+ ...experiment ,
546+ starred : true
547+ }
548+ }
549+
512550 private addSelected ( experiment : Experiment ) {
513551 const { id } = experiment
514552 if ( ! hasKey ( this . coloredStatus , id ) ) {
@@ -524,6 +562,10 @@ export class ExperimentsModel extends ModelWithPersistence {
524562 }
525563 }
526564
565+ private addDetails ( experiment : Experiment ) {
566+ return this . addStarred ( this . addSelected ( experiment ) )
567+ }
568+
527569 private getDisplayColor ( id : string ) {
528570 const color = this . coloredStatus [ id ]
529571 if ( ! color ) {
0 commit comments