This commit is contained in:
tamaina 2023-08-02 01:12:28 +00:00
parent 485f89d262
commit 718021f15c
2 changed files with 16 additions and 5 deletions

View File

@ -39,11 +39,11 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkSwitchButton :class="$style.switchButton" :checked="item.ref" :disabled="item.disabled" @toggle="switchItem(item)" />
<span :class="$style.switchText">{{ item.text }}</span>
</button>
<button v-else-if="item.type === 'parent'" class="_button" role="menuitem" :tabindex="i" :class="[$style.item, $style.parent, { [$style.childShowing]: childShowingItem === item }]" @mouseenter.stop="showChildren(item, $event)">
<div v-else-if="item.type === 'parent'" role="menuitem" :tabindex="i" :class="[$style.item, $style.parent, { [$style.childShowing]: childShowingItem === item }]" @mousedown.stop="showChildren(item, $event)">
<i v-if="item.icon" class="ti-fw" :class="[$style.icon, item.icon]"></i>
<span>{{ item.text }}</span>
<span :class="$style.caret"><i class="ti ti-chevron-right ti-fw"></i></span>
</button>
</div>
<button v-else :tabindex="i" class="_button" role="menuitem" :class="[$style.item, { [$style.danger]: item.danger, [$style.active]: item.active }]" :disabled="item.active" @click="clicked(item.action, $event)" @mouseenter.passive="onItemMouseEnter(item)" @mouseleave.passive="onItemMouseLeave(item)">
<i v-if="item.icon" class="ti-fw" :class="[$style.icon, item.icon]"></i>
<MkAvatar v-if="item.avatar" :user="item.avatar" :class="$style.avatar"/>
@ -136,6 +136,7 @@ function childActioned() {
}
function onGlobalMousedown(event: MouseEvent) {
console.log('globalmousedown')
if (childTarget && (event.target === childTarget || childTarget.contains(event.target))) return;
if (child && child.checkHit(event)) return;
closeChild();
@ -152,6 +153,8 @@ function onItemMouseLeave(item) {
}
async function showChildren(item: MenuParent, ev: MouseEvent) {
console.log(ev);
if (props.asDrawer && childrenCache.has(item)) return;
const children: Ref<(MenuItem | MenuPending)[]> = ref([]);
if (!item.noCache && childrenCache.has(item)) {
children.value = childrenCache.get(item)!;
@ -171,6 +174,7 @@ async function showChildren(item: MenuParent, ev: MouseEvent) {
if (props.asDrawer) {
os.popupMenu(children as Ref<MenuItem[]>, ev.currentTarget ?? ev.target).finally(() => {
childrenCache.delete(item);
console.log('child drawer close');
emit('close');
});
@ -182,6 +186,10 @@ async function showChildren(item: MenuParent, ev: MouseEvent) {
}
}
function onmousedown(ev: MouseEvent) {
ev.stopImmediatePropagation();
}
function clicked(fn: MenuAction, ev: MouseEvent) {
fn(ev);
close(true);

View File

@ -33,7 +33,7 @@ SPDX-License-Identifier: AGPL-3.0-only
:duration="transitionDuration" appear @afterLeave="afterLeave" @enter="emit('opening')" @afterEnter="onOpened"
>
<div v-show="manualShowing != null ? manualShowing : showing" v-hotkey.global="keymap" :class="[$style.root, { [$style.drawer]: type === 'drawer', [$style.dialog]: type === 'dialog', [$style.popup]: type === 'popup' }]" :style="{ zIndex, pointerEvents: (manualShowing != null ? manualShowing : showing) ? 'auto' : 'none', '--transformOrigin': transformOrigin }">
<div data-cy-bg :data-cy-transparent="isEnableBgTransparent" class="_modalBg" :class="[$style.bg, { [$style.bgTransparent]: isEnableBgTransparent }]" :style="{ zIndex }" @click="onBgClick" @mousedown="onBgClick" @contextmenu.prevent.stop="() => {}"></div>
<div data-cy-bg :data-cy-transparent="isEnableBgTransparent" class="_modalBg" :class="[$style.bg, { [$style.bgTransparent]: isEnableBgTransparent }]" :style="{ zIndex }" @click="onBgClick" @mousedown.self="onBgClick" @contextmenu.prevent.stop="() => {}"></div>
<div ref="content" :class="[$style.content, { [$style.fixed]: fixed }]" :style="{ zIndex }" @click.self="onBgClick">
<slot :max-height="maxHeight" :type="type"></slot>
</div>
@ -161,7 +161,7 @@ function afterLeave() {
}
function onBgClick(e) {
console.log(e);
console.log(e, contentClicking);
if (contentClicking) return;
emit('click');
}
@ -296,14 +296,17 @@ const onOpened = () => {
//
const el = content!.children[0];
el.addEventListener('mousedown', ev => {
ev.stopPropagation();
console.log('mousedown');
contentClicking = true;
window.addEventListener('mouseup', ev => {
console.log('mouseup');
// click mouseup
window.setTimeout(() => {
contentClicking = false;
}, 100);
}, { passive: true, once: true });
}, { passive: true });
}, { passive: true, capture: true });
};
const alignObserver = new ResizeObserver((entries, observer) => {