Skip to content

Commit ea8e5f6

Browse files
committed
add edit time entry dropdown option to timeentryrow
1 parent 7281ed5 commit ea8e5f6

File tree

3 files changed

+54
-3
lines changed

3 files changed

+54
-3
lines changed

resources/js/packages/ui/src/TimeEntry/TimeEntryAggregateRow.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ function onSelectChange(checked: boolean) {
9292
class="border-b border-default-background-separator bg-row-background min-w-0 transition"
9393
data-testid="time_entry_row">
9494
<MainContainer class="min-w-0">
95-
<div class="sm:flex py-1.5 items-center min-w-0 justify-between group">
95+
<div class="sm:flex py-2 items-center min-w-0 justify-between group">
9696
<div class="flex space-x-3 items-center min-w-0">
9797
<Checkbox
9898
:checked="
@@ -172,6 +172,7 @@ function onSelectChange(checked: boolean) {
172172
class="opacity-20 flex group-hover:opacity-100 focus-visible:opacity-100"
173173
@changed="onStartStopClick(timeEntry)"></TimeTrackerStartStop>
174174
<TimeEntryMoreOptionsDropdown
175+
:show-edit="false"
175176
@delete="
176177
deleteTimeEntries(timeEntry?.timeEntries ?? [])
177178
"></TimeEntryMoreOptionsDropdown>

resources/js/packages/ui/src/TimeEntry/TimeEntryMoreOptionsDropdown.vue

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
<script setup lang="ts">
2-
import { TrashIcon } from '@heroicons/vue/20/solid';
2+
import { TrashIcon, PencilIcon } from '@heroicons/vue/20/solid';
33
import {
44
DropdownMenu,
55
DropdownMenuContent,
66
DropdownMenuItem,
77
DropdownMenuTrigger,
88
} from '@/Components/ui/dropdown-menu';
99
10+
const props = withDefaults(
11+
defineProps<{
12+
showEdit?: boolean;
13+
}>(),
14+
{
15+
showEdit: true,
16+
}
17+
);
18+
1019
const emit = defineEmits<{
20+
edit: [];
1121
delete: [];
1222
}>();
1323
</script>
@@ -33,6 +43,14 @@ const emit = defineEmits<{
3343
</button>
3444
</DropdownMenuTrigger>
3545
<DropdownMenuContent class="min-w-[150px]" align="end">
46+
<DropdownMenuItem
47+
v-if="props.showEdit"
48+
data-testid="time_entry_edit"
49+
class="flex items-center space-x-3 cursor-pointer"
50+
@click="emit('edit')">
51+
<PencilIcon class="w-5" />
52+
<span>Edit</span>
53+
</DropdownMenuItem>
3654
<DropdownMenuItem
3755
data-testid="time_entry_delete"
3856
class="flex items-center space-x-3 cursor-pointer text-destructive focus:text-destructive"

resources/js/packages/ui/src/TimeEntry/TimeEntryRow.vue

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ import TimeEntryDescriptionInput from '@/packages/ui/src/TimeEntry/TimeEntryDesc
1616
import TimeEntryRowTagDropdown from '@/packages/ui/src/TimeEntry/TimeEntryRowTagDropdown.vue';
1717
import TimeEntryRowDurationInput from '@/packages/ui/src/TimeEntry/TimeEntryRowDurationInput.vue';
1818
import TimeEntryMoreOptionsDropdown from '@/packages/ui/src/TimeEntry/TimeEntryMoreOptionsDropdown.vue';
19+
import { TimeEntryEditModal } from '@/packages/ui/src';
1920
import BillableToggleButton from '@/packages/ui/src/Input/BillableToggleButton.vue';
20-
import { computed } from 'vue';
21+
import { computed, ref } from 'vue';
2122
import TimeTrackerProjectTaskDropdown from '@/packages/ui/src/TimeTracker/TimeTrackerProjectTaskDropdown.vue';
2223
import { Checkbox } from '@/packages/ui/src';
2324
import { twMerge } from 'tailwind-merge';
@@ -46,6 +47,8 @@ const props = defineProps<{
4647
4748
const emit = defineEmits<{ selected: []; unselected: [] }>();
4849
50+
const showEditModal = ref(false);
51+
4952
function updateTimeEntryDescription(description: string) {
5053
props.updateTimeEntry({ ...props.timeEntry, description });
5154
}
@@ -87,6 +90,20 @@ function onSelectChange(checked: boolean) {
8790
emit('unselected');
8891
}
8992
}
93+
94+
function handleEdit() {
95+
showEditModal.value = true;
96+
}
97+
98+
async function handleUpdateTimeEntry(updatedEntry: TimeEntry) {
99+
props.updateTimeEntry(updatedEntry);
100+
showEditModal.value = false;
101+
}
102+
103+
async function handleDeleteTimeEntry() {
104+
props.deleteTimeEntry();
105+
showEditModal.value = false;
106+
}
90107
</script>
91108

92109
<template>
@@ -148,11 +165,26 @@ function onSelectChange(checked: boolean) {
148165
class="opacity-20 flex focus-visible:opacity-100 group-hover:opacity-100"
149166
@changed="onStartStopClick"></TimeTrackerStartStop>
150167
<TimeEntryMoreOptionsDropdown
168+
@edit="handleEdit"
151169
@delete="deleteTimeEntry"></TimeEntryMoreOptionsDropdown>
152170
</div>
153171
</div>
154172
</MainContainer>
155173
</div>
174+
175+
<TimeEntryEditModal
176+
v-model:show="showEditModal"
177+
:time-entry="timeEntry"
178+
:enable-estimated-time="enableEstimatedTime"
179+
:update-time-entry="handleUpdateTimeEntry"
180+
:delete-time-entry="handleDeleteTimeEntry"
181+
:create-client="createClient"
182+
:create-project="createProject"
183+
:create-tag="createTag"
184+
:tags="tags"
185+
:projects="projects"
186+
:tasks="tasks"
187+
:clients="clients" />
156188
</template>
157189

158190
<style scoped></style>

0 commit comments

Comments
 (0)