fix: update menu to match requirements

This commit is contained in:
Omar Hussein 2025-02-27 00:41:33 -05:00
parent 3f21a64b4f
commit e65df8b244
4 changed files with 97 additions and 107 deletions

View File

@ -4,7 +4,7 @@
ref="contextMenu" ref="contextMenu"
v-show="show" v-show="show"
:style="{ :style="{
top: `${top}px`, top: `${props.pos.y}px`,
left: `${left}px`, left: `${left}px`,
}" }"
> >
@ -19,13 +19,6 @@ const emit = defineEmits(["hide"]);
const props = defineProps<{ show: boolean; pos: { x: number; y: number } }>(); const props = defineProps<{ show: boolean; pos: { x: number; y: number } }>();
const contextMenu = ref<HTMLElement | null>(null); const contextMenu = ref<HTMLElement | null>(null);
const top = computed(() => {
return Math.min(
props.pos.y,
window.innerHeight - (contextMenu.value?.clientHeight ?? 0)
);
});
const left = computed(() => { const left = computed(() => {
return Math.min( return Math.min(
props.pos.x, props.pos.x,

View File

@ -222,21 +222,12 @@ const itemClick = (event: Event | KeyboardEvent) => {
}; };
const contextMenu = (event: MouseEvent) => { const contextMenu = (event: MouseEvent) => {
const to = setTimeout(() => {
touches.value = 0;
}, 300);
touches.value++;
if (touches.value > 1) return;
event.preventDefault(); event.preventDefault();
if ( if (
fileStore.selected.length < 2 || fileStore.selected.length === 0 ||
event.ctrlKey || event.ctrlKey ||
fileStore.selected.indexOf(props.index) === -1 fileStore.selected.indexOf(props.index) === -1
) { ) {
touches.value--;
clearTimeout(to);
click(event); click(event);
} }
}; };

View File

@ -1,10 +1,11 @@
.context-menu { .context-menu {
position: fixed; position: absolute;
background: var(--surfacePrimary); background: var(--surfacePrimary);
min-width: 180px; min-width: 180px;
max-width: 220px;
border: 1px solid var(--borderSecondary); border: 1px solid var(--borderSecondary);
box-shadow: 0 2px 4px var(--borderPrimary); box-shadow: 0 2px 4px var(--borderPrimary);
z-index: 1000; z-index: 999;
} }
.context-menu .action { .context-menu .action {

View File

@ -205,11 +205,13 @@
</div> </div>
</div> </div>
<span @contextmenu="showContextMenu">
<h2 v-if="fileStore.req?.numDirs ?? false"> <h2 v-if="fileStore.req?.numDirs ?? false">
{{ t("files.folders") }} {{ t("files.folders") }}
</h2> </h2>
<div v-if="fileStore.req?.numDirs ?? false"> <div
v-if="fileStore.req?.numDirs ?? false"
@contextmenu="showContextMenu"
>
<item <item
v-for="item in dirs" v-for="item in dirs"
:key="base64(item.name)" :key="base64(item.name)"
@ -228,7 +230,10 @@
<h2 v-if="fileStore.req?.numFiles ?? false"> <h2 v-if="fileStore.req?.numFiles ?? false">
{{ t("files.files") }} {{ t("files.files") }}
</h2> </h2>
<div v-if="fileStore.req?.numFiles ?? false"> <div
v-if="fileStore.req?.numFiles ?? false"
@contextmenu="showContextMenu"
>
<item <item
v-for="item in files" v-for="item in files"
:key="base64(item.name)" :key="base64(item.name)"
@ -251,46 +256,45 @@
<action <action
v-if="headerButtons.share" v-if="headerButtons.share"
icon="share" icon="share"
:label="$t('buttons.share')" :label="t('buttons.share')"
show="share" show="share"
/> />
<action <action
v-if="headerButtons.rename" v-if="headerButtons.rename"
icon="mode_edit" icon="mode_edit"
:label="$t('buttons.rename')" :label="t('buttons.rename')"
show="rename" show="rename"
/> />
<action <action
v-if="headerButtons.copy" v-if="headerButtons.copy"
id="copy-button" id="copy-button"
icon="content_copy" icon="content_copy"
:label="$t('buttons.copyFile')" :label="t('buttons.copyFile')"
show="copy" show="copy"
/> />
<action <action
v-if="headerButtons.move" v-if="headerButtons.move"
id="move-button" id="move-button"
icon="forward" icon="forward"
:label="$t('buttons.moveFile')" :label="t('buttons.moveFile')"
show="move" show="move"
/> />
<action <action
v-if="headerButtons.delete" v-if="headerButtons.delete"
id="delete-button" id="delete-button"
icon="delete" icon="delete"
:label="$t('buttons.delete')" :label="t('buttons.delete')"
show="delete" show="delete"
/> />
<action <action
v-if="headerButtons.download" v-if="headerButtons.download"
icon="file_download" icon="file_download"
:label="$t('buttons.download')" :label="t('buttons.download')"
@action="download" @action="download"
:counter="fileStore.selectedCount" :counter="fileStore.selectedCount"
/> />
<action icon="info" :label="$t('buttons.info')" show="info" /> <action icon="info" :label="t('buttons.info')" show="info" />
</context-menu> </context-menu>
</span>
<input <input
style="display: none" style="display: none"
@ -1007,10 +1011,11 @@ const fillWindow = (fit = false) => {
}; };
const showContextMenu = (event: MouseEvent) => { const showContextMenu = (event: MouseEvent) => {
event.preventDefault();
isContextMenuVisible.value = true; isContextMenuVisible.value = true;
contextMenuPos.value = { contextMenuPos.value = {
x: event.clientX, x: event.clientX + 8,
y: event.clientY, y: event.clientY + Math.floor(window.scrollY),
}; };
}; };