feat : add export button to time-tracking page
Some checks failed
Auto Tag Develop / tag (push) Has been cancelled
Some checks failed
Auto Tag Develop / tag (push) Has been cancelled
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -75,6 +75,14 @@
|
|||||||
text-value="text-sm"
|
text-value="text-sm"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<button
|
||||||
|
class="flex shrink-0 items-center gap-2 rounded-md border border-neutral-200 bg-white px-3 py-2 text-sm font-medium text-neutral-700 hover:bg-neutral-50 transition"
|
||||||
|
@click="exportTimeEntries"
|
||||||
|
>
|
||||||
|
<Icon name="mdi:download" size="18" />
|
||||||
|
{{ $t('timeEntries.export') }}
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -297,6 +305,40 @@ async function onDelete(entry: TimeEntry) {
|
|||||||
await loadEntries()
|
await loadEntries()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getExportDateRange(): { after: string, before: string } {
|
||||||
|
if (Array.isArray(selectedDateFilter.value) && selectedDateFilter.value.length === 2) {
|
||||||
|
return {
|
||||||
|
after: selectedDateFilter.value[0].toISOString().slice(0, 10),
|
||||||
|
before: selectedDateFilter.value[1].toISOString().slice(0, 10),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const end = new Date(startDate.value)
|
||||||
|
end.setDate(end.getDate() + (viewMode.value === 'day' ? 1 : 7))
|
||||||
|
return {
|
||||||
|
after: startDate.value.toISOString().slice(0, 10),
|
||||||
|
before: end.toISOString().slice(0, 10),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function exportTimeEntries() {
|
||||||
|
const { after, before } = getExportDateRange()
|
||||||
|
|
||||||
|
const url = timeEntryService.getExportUrl({
|
||||||
|
after,
|
||||||
|
before,
|
||||||
|
user: selectedUserId.value ?? undefined,
|
||||||
|
project: selectedProjectId.value ?? undefined,
|
||||||
|
tags: selectedTagId.value ? [selectedTagId.value] : undefined,
|
||||||
|
})
|
||||||
|
|
||||||
|
const a = document.createElement('a')
|
||||||
|
a.href = url
|
||||||
|
a.download = ''
|
||||||
|
document.body.appendChild(a)
|
||||||
|
a.click()
|
||||||
|
document.body.removeChild(a)
|
||||||
|
}
|
||||||
|
|
||||||
async function loadEntries() {
|
async function loadEntries() {
|
||||||
const end = new Date(startDate.value)
|
const end = new Date(startDate.value)
|
||||||
end.setDate(end.getDate() + (viewMode.value === 'day' ? 1 : 7))
|
end.setDate(end.getDate() + (viewMode.value === 'day' ? 1 : 7))
|
||||||
|
|||||||
Reference in New Issue
Block a user