@@ -4,6 +4,7 @@ import { when } from 'lit/directives/when.js';
4
4
import type { Commands } from '../../../../../constants.commands' ;
5
5
import type { GitTrackingState } from '../../../../../git/models/branch' ;
6
6
import type { GetOverviewBranch , OpenInGraphParams } from '../../../../home/protocol' ;
7
+ import type { ActionItemProps } from '../../../shared/components/actions/action-list' ;
7
8
import { srOnlyStyles } from '../../../shared/components/styles/lit/a11y.css' ;
8
9
import { linkStyles } from '../../shared/components/vscode.css' ;
9
10
import '../../../shared/components/code-icon' ;
@@ -15,6 +16,7 @@ import '../../../shared/components/commit/commit-stats';
15
16
import '../../../shared/components/formatted-date' ;
16
17
import '../../../shared/components/pills/tracking' ;
17
18
import '../../../shared/components/rich/pr-icon' ;
19
+ import '../../../shared/components/actions/action-list' ;
18
20
import '../../../shared/components/actions/action-item' ;
19
21
import '../../../shared/components/actions/action-nav' ;
20
22
@@ -101,7 +103,35 @@ export class GlBranchSection extends LitElement {
101
103
this . branches . length > 0 ,
102
104
( ) =>
103
105
this . branches . map (
104
- branch => html `< gl-branch-card .repo =${ this . repo } .branch =${ branch } > </ gl-branch-card > ` ,
106
+ branch =>
107
+ html `< gl-branch-card
108
+ @open-actions-menu =${ e => {
109
+ const evt = new CustomEvent < { branch : GetOverviewBranch } > (
110
+ 'branch-context-opened' ,
111
+ {
112
+ detail : {
113
+ branch : branch ,
114
+ } ,
115
+ } ,
116
+ ) ;
117
+ this . dispatchEvent ( evt ) ;
118
+ console . log ( 'openVContext' , { e : e } , branch ) ;
119
+ } }
120
+ @close-actions-menu =${ e => {
121
+ const evt = new CustomEvent < { branch : GetOverviewBranch } > (
122
+ 'branch-context-closed' ,
123
+ {
124
+ detail : {
125
+ branch : branch ,
126
+ } ,
127
+ } ,
128
+ ) ;
129
+ this . dispatchEvent ( evt ) ;
130
+ console . log ( 'closeVContext' , { e : e } , branch ) ;
131
+ } }
132
+ .repo=${ this . repo }
133
+ .branch=${ branch }
134
+ > </ gl-branch-card > ` ,
105
135
) ,
106
136
( ) => html `< p > No ${ this . label } branches</ p > ` ,
107
137
) }
@@ -345,72 +375,112 @@ export class GlBranchCard extends LitElement {
345
375
}
346
376
347
377
private renderActions ( ) {
348
- const actions = [ ] ;
378
+ const actions : ActionItemProps [ ] = [ ] ;
349
379
if ( this . branch . pr ) {
350
380
actions . push (
351
- html `< action-item
352
- label ="Open Pull Request Changes "
353
- icon ="request-changes "
354
- href =${ this . createCommandLink ( 'gitlens.home.openPullRequestChanges' ) }
355
- > </ action-item > ` ,
356
- ) ;
357
- actions . push (
358
- html `< action-item
359
- label ="Open Pull Request on Remote "
360
- icon ="globe "
361
- href =${ this . createCommandLink ( 'gitlens.home.openPullRequestOnRemote' ) }
362
- > </ action-item > ` ,
381
+ {
382
+ label : 'Open Pull Request Changes' ,
383
+ icon : 'request-changes' ,
384
+ href : this . createCommandLink ( 'gitlens.home.openPullRequestChanges' ) ,
385
+ } ,
386
+ {
387
+ label : 'Open Pull Request on Remote' ,
388
+ icon : 'globe' ,
389
+ href : this . createCommandLink ( 'gitlens.home.openPullRequestOnRemote' ) ,
390
+ } ,
363
391
) ;
364
392
} else if ( this . branch . upstream ?. missing === false ) {
365
- actions . push (
366
- html `< action-item
367
- label ="Create Pull Request... "
368
- icon ="git-pull-request-create "
369
- href =${ this . createCommandLink ( 'gitlens.home.createPullRequest' ) }
370
- > </ action-item > ` ,
371
- ) ;
393
+ actions . push ( {
394
+ label : 'Create Pull Request...' ,
395
+ icon : 'git-pull-request-create' ,
396
+ href : this . createCommandLink ( 'gitlens.home.createPullRequest' ) ,
397
+ modifiers : [
398
+ {
399
+ key : 'alt' ,
400
+ label : 'c' ,
401
+ icon : 'globe' ,
402
+ href : '' ,
403
+ } ,
404
+ {
405
+ key : 'ctrl' ,
406
+ label : 'c' ,
407
+ icon : 'request-changes' ,
408
+ href : '' ,
409
+ } ,
410
+ ] ,
411
+ } ) ;
372
412
}
373
413
if ( this . branch . worktree ) {
374
- actions . push (
375
- html `< action-item
376
- label ="Open Worktree "
377
- icon ="browser "
378
- href =${ this . createCommandLink ( 'gitlens.home.openWorktree' ) }
379
- > </ action-item > ` ,
380
- ) ;
414
+ actions . push ( {
415
+ label : 'Open Worktree' ,
416
+ icon : 'browser' ,
417
+ href : this . createCommandLink ( 'gitlens.home.openWorktree' ) ,
418
+ } ) ;
381
419
} else {
382
- actions . push (
383
- html `< action-item
384
- label ="Switch to Branch... "
385
- icon ="gl-switch "
386
- href =${ this . createCommandLink ( 'gitlens.home.switchToBranch' ) }
387
- > </ action-item > ` ,
388
- ) ;
420
+ actions . push ( {
421
+ label : 'Switch to Branch...' ,
422
+ icon : 'gl-switch' ,
423
+ href : this . createCommandLink ( 'gitlens.home.switchToBranch' ) ,
424
+ } ) ;
389
425
}
390
426
391
427
// branch actions
392
428
actions . push (
393
- html `< action-item
394
- label ="Fetch "
395
- icon ="gl-repo-fetch "
396
- href =${ this . createCommandLink ( 'gitlens.home.fetch' ) }
397
- > </ action-item > ` ,
398
- ) ;
399
- actions . push (
400
- html `< action-item
401
- label ="Open in Commit Graph "
402
- icon ="gl-graph "
403
- href =${ createCommandLink ( 'gitlens.home.openInGraph' , {
429
+ {
430
+ label : 'Fetch' ,
431
+ icon : 'gl-repo-fetch' ,
432
+ href : this . createCommandLink ( 'gitlens.home.fetch' ) ,
433
+ } ,
434
+ {
435
+ label : 'Open in Commit Graph' ,
436
+ icon : 'gl-graph' ,
437
+ href : createCommandLink ( 'gitlens.home.openInGraph' , {
404
438
...this . branchRefs ,
405
439
type : 'branch' ,
406
- } satisfies OpenInGraphParams ) }
407
- > </ action-item > ` ,
440
+ } satisfies OpenInGraphParams ) ,
441
+ } ,
408
442
) ;
409
443
410
444
if ( ! actions . length ) {
411
445
return nothing ;
412
446
}
413
- return html `< action-nav class ="branch-item__actions "> ${ actions } </ action-nav > ` ;
447
+ return html `< action-list
448
+ limit =${ 2 }
449
+ class ="branch-item__actions"
450
+ @open-actions-menu=${ ( e : CustomEvent ) => {
451
+ e . preventDefault ( ) ;
452
+
453
+ const ev = new CustomEvent ( 'open-actions-menu' ) ;
454
+ this . dispatchEvent ( ev ) ;
455
+ if ( ev . defaultPrevented ) return ;
456
+
457
+ const element = e . target as HTMLElement ;
458
+ const ev1 = new PointerEvent ( 'contextmenu' , {
459
+ bubbles : true ,
460
+ cancelable : true ,
461
+ composed : true ,
462
+ view : window ,
463
+ button : 2 ,
464
+ buttons : 2 ,
465
+ clientX : element . getBoundingClientRect ( ) . right ,
466
+ clientY : element . getBoundingClientRect ( ) . bottom ,
467
+ } ) ;
468
+ element . dispatchEvent ( ev1 ) ;
469
+
470
+ const _handleClick = ( ) => {
471
+ const ev = new CustomEvent ( 'close-actions-menu' ) ;
472
+ this . dispatchEvent ( ev ) ;
473
+ window . removeEventListener ( 'keyup' , handleClick ) ;
474
+ window . removeEventListener ( 'mousedown' , handleClick ) ;
475
+ window . removeEventListener ( 'focus' , handleClick ) ;
476
+ } ;
477
+ const handleClick = _handleClick . bind ( this ) ;
478
+ window . addEventListener ( 'keyup' , handleClick ) ;
479
+ window . addEventListener ( 'mousedown' , handleClick ) ;
480
+ window . addEventListener ( 'focus' , handleClick ) ;
481
+ } }
482
+ .items=${ actions }
483
+ > </ action-list > ` ;
414
484
}
415
485
416
486
private createCommandLink ( command : string ) {
0 commit comments