Files
BinarySandia04 76bb9fbb30
All checks were successful
Build and Deploy Nuxt / build (push) Successful in 36s
A lot of progress
2026-04-28 00:20:15 +02:00

64 lines
1.7 KiB
Vue

<script setup>
import { onMounted, ref, watch } from 'vue';
import { AddContextMenu, HideContextMenu } from '@/services/ContextMenu';
const props = defineProps(['options', 'onselect', 'selected', 'keyFunc']);
const options = props.options;
const selectCallback = props.onselect;
const initialSelect = props.selected;
const dropdown = ref(null);
const selected = ref(null);
onMounted(() => {
if(props.keyFunc == undefined) props.keyFunc = (option) => option;
selected.value = props.keyFunc(initialSelect);
let context = [];
watch(() => props.selected, () => {
selected.value = props.keyFunc(props.selected);
});
options.forEach(obj => {
const name = props.keyFunc(obj);
context.push({
icon: selected.value == name ? 'icons/iconoir/regular/check.svg' : false,
name,
action: () => {
HideContextMenu();
selected.value = name;
if(selectCallback) selectCallback(obj);
}
});
});
AddContextMenu(dropdown.value, context, {dropdown: true});
});
</script>
<template>
<div class="dropdown" ref="dropdown">
<span>{{ selected }}</span>
<img class="icon" src="/icons/iconoir/regular/nav-arrow-down.svg" draggable="false" ref="closeButton">
</div>
</template>
<style scoped lang="scss">
.dropdown {
flex-grow: 1;
display: flex;
background-color: var(--color-background-softer);
border: none;
padding: 4px 8px 4px 8px;
margin: 0 6px 0px 6px;
border-radius: 6px;
color: var(--color-text);
transition: 300ms background-color;
border: solid 1px var(--color-border);
.icon {
margin-left: auto;
justify-content: right;
}
}
</style>