2025-12-18 17:04:01 +01:00
|
|
|
<script setup>
|
|
|
|
|
|
2026-01-14 12:10:10 +01:00
|
|
|
import { computed, useTemplateRef,ref } from 'vue';
|
2025-12-19 10:25:37 +01:00
|
|
|
import { Menu, Button, ButtonGroup } from '@cloudron/pankow';
|
2025-12-18 17:04:01 +01:00
|
|
|
|
|
|
|
|
const props = defineProps({
|
|
|
|
|
actions: {
|
|
|
|
|
type: Array,
|
|
|
|
|
default: () => [],
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const quickActions = computed(() => {
|
2026-01-14 15:19:27 +01:00
|
|
|
const visibleActions = props.actions.filter(a => !(typeof a.visible !== 'undefined' && !a.visible) && !a.separator);
|
|
|
|
|
if (visibleActions.length <= 2) return visibleActions;
|
|
|
|
|
|
|
|
|
|
return visibleActions.filter(a => a.quickAction);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const visibleActionCount = computed(() => {
|
|
|
|
|
return props.actions.filter(a => !(typeof a.visible !== 'undefined' && !a.visible) && !a.separator).length;
|
2025-12-18 17:04:01 +01:00
|
|
|
});
|
|
|
|
|
|
2026-01-14 12:10:10 +01:00
|
|
|
const isMenuOpen = ref(false);
|
|
|
|
|
|
2025-12-18 17:04:01 +01:00
|
|
|
const menuElement = useTemplateRef('menuElement');
|
|
|
|
|
function onMenu(event) {
|
2026-01-14 12:10:10 +01:00
|
|
|
isMenuOpen.value = true;
|
2025-12-18 17:04:01 +01:00
|
|
|
menuElement.value.open(event, event.currentTarget);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<template>
|
2026-01-14 12:10:10 +01:00
|
|
|
<div class="action-bar" :class="{ 'is-menu-open': isMenuOpen }">
|
|
|
|
|
<Menu ref="menuElement" :model="actions" @close="isMenuOpen = false" />
|
2025-12-19 10:25:37 +01:00
|
|
|
<ButtonGroup class="quick-action-group">
|
2026-01-14 12:29:31 +01:00
|
|
|
<Button tool v-for="quickAction in quickActions" :key="quickAction" :icon="quickAction.icon" @click="quickAction.action()" :href="quickAction.href || null" :target="quickAction.target || null" v-tooltip.top="quickAction.label"/>
|
2026-01-14 15:19:27 +01:00
|
|
|
<Button tool @click.capture="onMenu($event)" icon="fa-solid fa-ellipsis" v-if="visibleActionCount > 0 && visibleActionCount !== quickActions.length"/>
|
2025-12-19 10:25:37 +01:00
|
|
|
</ButtonGroup>
|
2026-01-14 15:19:27 +01:00
|
|
|
<Button tool :plain="isMenuOpen ? null : true" secondary @click.capture="onMenu($event)" icon="fa-solid fa-ellipsis" v-if="visibleActionCount > 0 && visibleActionCount !== quickActions.length" class="menu-action" />
|
2025-12-18 17:04:01 +01:00
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|
|
|
|
|
|
.action-bar {
|
|
|
|
|
display: flex;
|
|
|
|
|
gap: 5px;
|
|
|
|
|
justify-content: end;
|
2025-12-19 11:00:44 +01:00
|
|
|
min-height: 31px;
|
2025-12-19 20:51:48 +01:00
|
|
|
align-items: center;
|
2026-01-14 15:19:27 +01:00
|
|
|
min-width: 55px;
|
2025-12-18 17:04:01 +01:00
|
|
|
}
|
|
|
|
|
|
2025-12-19 10:25:37 +01:00
|
|
|
.menu-action {
|
|
|
|
|
display: block;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.quick-action-group {
|
2025-12-18 17:04:01 +01:00
|
|
|
display: block;
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-14 12:29:31 +01:00
|
|
|
.action-bar .quick-action-group .pankow-button {
|
2026-01-14 14:48:41 +01:00
|
|
|
background-color: white;
|
2026-01-14 12:29:31 +01:00
|
|
|
color: var(--pankow-color-text);
|
2026-01-14 15:19:27 +01:00
|
|
|
border: 1px solid transparent;
|
2026-01-14 12:29:31 +01:00
|
|
|
}
|
|
|
|
|
|
2026-01-14 14:48:41 +01:00
|
|
|
.action-bar .quick-action-group .pankow-button:hover {
|
|
|
|
|
color: var(--pankow-color-primary);
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-14 12:29:31 +01:00
|
|
|
@media (prefers-color-scheme: dark) {
|
|
|
|
|
.action-bar .quick-action-group .pankow-button {
|
|
|
|
|
background: var(--pankow-color-background);
|
|
|
|
|
color: var(--pankow-color-text);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-20 08:39:19 +01:00
|
|
|
@media (hover: hover) {
|
|
|
|
|
tr:hover .menu-action {
|
|
|
|
|
display: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.quick-action-group {
|
|
|
|
|
display: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tr:hover .quick-action-group {
|
|
|
|
|
display: block;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-12-19 10:25:37 +01:00
|
|
|
|
2025-12-18 17:04:01 +01:00
|
|
|
</style>
|