Skip to content

Commit 639f533

Browse files
KasparRosinOnatcer
authored andcommitted
feat: add duplicate time entry fields
1 parent 4a50145 commit 639f533

File tree

5 files changed

+21
-1
lines changed

5 files changed

+21
-1
lines changed

resources/js/Pages/ReportingDetailed.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,7 @@ async function downloadExport(format: ExportFormat) {
400400
:on-start-stop-click="() => startTimeEntryFromExisting(entry)"
401401
:delete-time-entry="() => deleteTimeEntries([entry])"
402402
:currency="getOrganizationCurrencyString()"
403+
:duplicate-time-entry="() => createTimeEntry(entry)"
403404
:members="members"
404405
show-date
405406
show-member

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const props = defineProps<{
3333
createProject: (project: CreateProjectBody) => Promise<Project | undefined>;
3434
createClient: (client: CreateClientBody) => Promise<Client | undefined>;
3535
onStartStopClick: (timeEntry: TimeEntry) => void;
36+
duplicateTimeEntry: (timeEntry: TimeEntry) => void;
3637
updateTimeEntries: (ids: string[], changes: Partial<TimeEntry>) => void;
3738
updateTimeEntry: (timeEntry: TimeEntry) => void;
3839
deleteTimeEntries: (timeEntries: TimeEntry[]) => void;
@@ -173,6 +174,7 @@ function onSelectChange(checked: boolean) {
173174
@changed="onStartStopClick(timeEntry)"></TimeTrackerStartStop>
174175
<TimeEntryMoreOptionsDropdown
175176
:show-edit="false"
177+
:show-duplicate="false"
176178
@delete="
177179
deleteTimeEntries(timeEntry?.timeEntries ?? [])
178180
"></TimeEntryMoreOptionsDropdown>
@@ -202,6 +204,7 @@ function onSelectChange(checked: boolean) {
202204
:update-time-entry="(timeEntry: TimeEntry) => updateTimeEntry(timeEntry)"
203205
:on-start-stop-click="() => onStartStopClick(subEntry)"
204206
:delete-time-entry="() => deleteTimeEntries([subEntry])"
207+
:duplicate-time-entry="() => duplicateTimeEntry(subEntry)"
205208
:currency="currency"
206209
:create-tag
207210
:time-entry="subEntry"

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ function startTimeEntryFromExisting(entry: TimeEntry) {
108108
tags: [...entry.tags],
109109
});
110110
}
111+
111112
function sumDuration(timeEntries: TimeEntry[]) {
112113
return timeEntries.reduce((acc, entry) => acc + (entry?.duration ?? 0), 0);
113114
}
@@ -158,6 +159,7 @@ function unselectAllTimeEntries(value: TimeEntriesGroupedByType[]) {
158159
:tags="tags"
159160
:clients
160161
:on-start-stop-click="startTimeEntryFromExisting"
162+
:duplicate-time-entry="createTimeEntry"
161163
:update-time-entries
162164
:update-time-entry
163165
:delete-time-entries
@@ -198,6 +200,7 @@ function unselectAllTimeEntries(value: TimeEntriesGroupedByType[]) {
198200
:update-time-entry
199201
:on-start-stop-click="() => startTimeEntryFromExisting(entry)"
200202
:delete-time-entry="() => deleteTimeEntries([entry])"
203+
:duplicate-time-entry="() => createTimeEntry(entry)"
201204
:currency="currency"
202205
:time-entry="entry.timeEntries[0]"
203206
@selected="selectedTimeEntries.push(entry)"

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup lang="ts">
2-
import { TrashIcon, PencilIcon } from '@heroicons/vue/20/solid';
2+
import { TrashIcon, PencilIcon, DocumentDuplicateIcon } from '@heroicons/vue/20/solid';
33
import {
44
DropdownMenu,
55
DropdownMenuContent,
@@ -10,15 +10,18 @@ import {
1010
const props = withDefaults(
1111
defineProps<{
1212
showEdit?: boolean;
13+
showDuplicate?: boolean;
1314
}>(),
1415
{
16+
showDuplicate: true,
1517
showEdit: true,
1618
}
1719
);
1820
1921
const emit = defineEmits<{
2022
edit: [];
2123
delete: [];
24+
duplicate: [];
2225
}>();
2326
</script>
2427

@@ -51,6 +54,14 @@ const emit = defineEmits<{
5154
<PencilIcon class="w-5" />
5255
<span>Edit</span>
5356
</DropdownMenuItem>
57+
<DropdownMenuItem
58+
v-if="props.showDuplicate"
59+
data-testid="time_entry_duplicate"
60+
class="flex items-center space-x-3 cursor-pointer"
61+
@click="emit('duplicate')">
62+
<DocumentDuplicateIcon class="w-5" />
63+
<span>Duplicate</span>
64+
</DropdownMenuItem>
5465
<DropdownMenuItem
5566
data-testid="time_entry_delete"
5667
class="flex items-center space-x-3 cursor-pointer text-destructive focus:text-destructive"

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ const props = defineProps<{
3636
createClient: (client: CreateClientBody) => Promise<Client | undefined>;
3737
onStartStopClick: () => void;
3838
deleteTimeEntry: () => void;
39+
duplicateTimeEntry?: () => void;
3940
updateTimeEntry: (timeEntry: TimeEntry) => void;
4041
currency: string;
4142
showMember?: boolean;
@@ -166,6 +167,7 @@ async function handleDeleteTimeEntry() {
166167
@changed="onStartStopClick"></TimeTrackerStartStop>
167168
<TimeEntryMoreOptionsDropdown
168169
@edit="handleEdit"
170+
@duplicate="duplicateTimeEntry"
169171
@delete="deleteTimeEntry"></TimeEntryMoreOptionsDropdown>
170172
</div>
171173
</div>

0 commit comments

Comments
 (0)