add edit time entry dropdown option to timeentryrow

This commit is contained in:
Gregor Vostrak
2025-08-27 13:09:24 +02:00
parent 7281ed5611
commit ea8e5f6002
3 changed files with 54 additions and 3 deletions

View File

@@ -92,7 +92,7 @@ function onSelectChange(checked: boolean) {
class="border-b border-default-background-separator bg-row-background min-w-0 transition"
data-testid="time_entry_row">
<MainContainer class="min-w-0">
<div class="sm:flex py-1.5 items-center min-w-0 justify-between group">
<div class="sm:flex py-2 items-center min-w-0 justify-between group">
<div class="flex space-x-3 items-center min-w-0">
<Checkbox
:checked="
@@ -172,6 +172,7 @@ function onSelectChange(checked: boolean) {
class="opacity-20 flex group-hover:opacity-100 focus-visible:opacity-100"
@changed="onStartStopClick(timeEntry)"></TimeTrackerStartStop>
<TimeEntryMoreOptionsDropdown
:show-edit="false"
@delete="
deleteTimeEntries(timeEntry?.timeEntries ?? [])
"></TimeEntryMoreOptionsDropdown>

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import { TrashIcon } from '@heroicons/vue/20/solid';
import { TrashIcon, PencilIcon } from '@heroicons/vue/20/solid';
import {
DropdownMenu,
DropdownMenuContent,
@@ -7,7 +7,17 @@ import {
DropdownMenuTrigger,
} from '@/Components/ui/dropdown-menu';
const props = withDefaults(
defineProps<{
showEdit?: boolean;
}>(),
{
showEdit: true,
}
);
const emit = defineEmits<{
edit: [];
delete: [];
}>();
</script>
@@ -33,6 +43,14 @@ const emit = defineEmits<{
</button>
</DropdownMenuTrigger>
<DropdownMenuContent class="min-w-[150px]" align="end">
<DropdownMenuItem
v-if="props.showEdit"
data-testid="time_entry_edit"
class="flex items-center space-x-3 cursor-pointer"
@click="emit('edit')">
<PencilIcon class="w-5" />
<span>Edit</span>
</DropdownMenuItem>
<DropdownMenuItem
data-testid="time_entry_delete"
class="flex items-center space-x-3 cursor-pointer text-destructive focus:text-destructive"

View File

@@ -16,8 +16,9 @@ import TimeEntryDescriptionInput from '@/packages/ui/src/TimeEntry/TimeEntryDesc
import TimeEntryRowTagDropdown from '@/packages/ui/src/TimeEntry/TimeEntryRowTagDropdown.vue';
import TimeEntryRowDurationInput from '@/packages/ui/src/TimeEntry/TimeEntryRowDurationInput.vue';
import TimeEntryMoreOptionsDropdown from '@/packages/ui/src/TimeEntry/TimeEntryMoreOptionsDropdown.vue';
import { TimeEntryEditModal } from '@/packages/ui/src';
import BillableToggleButton from '@/packages/ui/src/Input/BillableToggleButton.vue';
import { computed } from 'vue';
import { computed, ref } from 'vue';
import TimeTrackerProjectTaskDropdown from '@/packages/ui/src/TimeTracker/TimeTrackerProjectTaskDropdown.vue';
import { Checkbox } from '@/packages/ui/src';
import { twMerge } from 'tailwind-merge';
@@ -46,6 +47,8 @@ const props = defineProps<{
const emit = defineEmits<{ selected: []; unselected: [] }>();
const showEditModal = ref(false);
function updateTimeEntryDescription(description: string) {
props.updateTimeEntry({ ...props.timeEntry, description });
}
@@ -87,6 +90,20 @@ function onSelectChange(checked: boolean) {
emit('unselected');
}
}
function handleEdit() {
showEditModal.value = true;
}
async function handleUpdateTimeEntry(updatedEntry: TimeEntry) {
props.updateTimeEntry(updatedEntry);
showEditModal.value = false;
}
async function handleDeleteTimeEntry() {
props.deleteTimeEntry();
showEditModal.value = false;
}
</script>
<template>
@@ -148,11 +165,26 @@ function onSelectChange(checked: boolean) {
class="opacity-20 flex focus-visible:opacity-100 group-hover:opacity-100"
@changed="onStartStopClick"></TimeTrackerStartStop>
<TimeEntryMoreOptionsDropdown
@edit="handleEdit"
@delete="deleteTimeEntry"></TimeEntryMoreOptionsDropdown>
</div>
</div>
</MainContainer>
</div>
<TimeEntryEditModal
v-model:show="showEditModal"
:time-entry="timeEntry"
:enable-estimated-time="enableEstimatedTime"
:update-time-entry="handleUpdateTimeEntry"
:delete-time-entry="handleDeleteTimeEntry"
:create-client="createClient"
:create-project="createProject"
:create-tag="createTag"
:tags="tags"
:projects="projects"
:tasks="tasks"
:clients="clients" />
</template>
<style scoped></style>