Skip to content

Commit 656bb08

Browse files
committed
fix context menus on branches on top of commit
1 parent c529816 commit 656bb08

File tree

1 file changed

+17
-19
lines changed

1 file changed

+17
-19
lines changed

web/src/directives/context-menu.coffee

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
1-
import Vue, { nextTick } from 'vue'
1+
import Vue from 'vue'
22

33
``###* @typedef {{label:string,icon?:string,action:()=>any}} ContextMenuEntry ###
44
``###* @typedef {{
55
oncontextmenu: (this: HTMLElement, ev: MouseEvent) => any
6-
onglobalclick: (ev: MouseEvent) => any
7-
onglobalkeyup: (ev: KeyboardEvent) => any
6+
destroy: () => any
87
entries_provider: (ev: MouseEvent) => ContextMenuEntry[]
98
}} ContextMenuData
109
###
1110

1211
``###* @type {Map<HTMLElement,ContextMenuData>} ###
1312
context_menu_data_by_el = new Map
1413

14+
remove_all_context_menus = =>
15+
context_menu_data_by_el.forEach (menu) =>
16+
menu.destroy()
17+
document.addEventListener 'contextmenu', remove_all_context_menus, false
18+
document.addEventListener 'click', remove_all_context_menus, false
19+
document.addEventListener 'keyup', remove_all_context_menus, false
20+
1521
set_context_menu = (###* @type HTMLElement ### el, ###* @type {(ev: MouseEvent)=>ContextMenuEntry[]} ### entries_provider) =>
1622
existing_context_menu_data = context_menu_data_by_el.get el
1723
if existing_context_menu_data
@@ -24,7 +30,7 @@ set_context_menu = (###* @type HTMLElement ### el, ###* @type {(ev: MouseEvent)=
2430
# The element(s) created by this is quite similar to the template of <git-action-button>
2531
build_context_menu = (###* @type MouseEvent ### event) =>
2632
entries = entries_provider(event)
27-
return if not entries
33+
return if not entries or wrapper_el
2834
wrapper_el = document.createElement('ul')
2935
wrapper_el.setAttribute('aria-label', 'Context menu')
3036
wrapper_el.classList.add 'context-menu-wrapper'
@@ -44,35 +50,27 @@ set_context_menu = (###* @type HTMLElement ### el, ###* @type {(ev: MouseEvent)=
4450
entry_el.onclick = entry.action
4551
wrapper_el?.appendChild(entry_el)
4652
document.body.appendChild(wrapper_el)
47-
destroy_context_menu = =>
48-
return if not wrapper_el
49-
document.body.removeChild(wrapper_el)
50-
wrapper_el = null
5153

5254
``###* @type ContextMenuData ###
5355
context_menu_data =
5456
oncontextmenu: (e) =>
5557
e.preventDefault()
56-
setTimeout (=>build_context_menu(e)), 0
57-
onglobalclick: destroy_context_menu
58-
onglobalkeyup: destroy_context_menu
58+
e.stopPropagation()
59+
remove_all_context_menus()
60+
build_context_menu(e)
61+
destroy: =>
62+
return if not wrapper_el
63+
document.body.removeChild(wrapper_el)
64+
wrapper_el = null
5965
entries_provider: entries_provider
60-
6166
el.addEventListener 'contextmenu', context_menu_data.oncontextmenu, false
62-
document.addEventListener 'contextmenu', context_menu_data.onglobalclick, false
63-
document.addEventListener 'click', context_menu_data.onglobalclick, false
64-
document.addEventListener 'keyup', context_menu_data.onglobalkeyup, false
65-
6667
context_menu_data_by_el.set el, context_menu_data
6768

6869
disable_context_menu = (###* @type {HTMLElement} ### el) =>
6970
context_menu_data = context_menu_data_by_el.get el
7071
if not context_menu_data
7172
return
7273
el.removeEventListener 'contextmenu', context_menu_data.oncontextmenu
73-
document.removeEventListener 'contextmenu', context_menu_data.onglobalclick
74-
document.removeEventListener 'click', context_menu_data.onglobalclick
75-
document.removeEventListener 'keyup', context_menu_data.onglobalkeyup
7674
context_menu_data_by_el.delete el
7775

7876
``###* @type {Vue.Directive} ###

0 commit comments

Comments
 (0)