Skip to content

Commit 1603fbc

Browse files
committed
wip
1 parent 66a61d0 commit 1603fbc

File tree

3 files changed

+28
-2
lines changed

3 files changed

+28
-2
lines changed

.github/workflows/phpunit.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ jobs:
7373
run: php artisan test --stop-on-failure --coverage-text --coverage-clover=coverage.xml
7474

7575
- name: "Upload coverage reports to Codecov"
76-
uses: codecov/[email protected]
76+
uses: codecov/[email protected]
7777
with:
7878
token: ${{ secrets.CODECOV_TOKEN }}
7979
slug: solidtime-io/solidtime

app/Http/Requests/V1/TimeEntry/TimeEntryUpdateMultipleRequest.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@ public function rules(): array
9393
return $builder->whereBelongsTo($this->organization, 'organization');
9494
})->uuid(),
9595
],
96+
// When time entry was invoiced (ISO 8601, UTC). Used to mark as invoiced.
97+
'changes.invoiced_at' => [
98+
'nullable',
99+
'date_format:Y-m-d\\TH:i:s\\Z',
100+
],
96101
];
97102
}
98103
}

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

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script setup lang="ts">
22
import MainContainer from '@/packages/ui/src/MainContainer.vue';
3-
import { PencilSquareIcon, TrashIcon } from '@heroicons/vue/20/solid';
3+
import { PencilSquareIcon, TrashIcon, DocumentTextIcon } from '@heroicons/vue/20/solid';
44
import TimeEntryMassUpdateModal from '@/packages/ui/src/TimeEntry/TimeEntryMassUpdateModal.vue';
55
import type {
66
Client,
@@ -15,6 +15,8 @@ import type {
1515
import { ref } from 'vue';
1616
import { twMerge } from 'tailwind-merge';
1717
import { Checkbox, InputLabel } from '@/packages/ui/src';
18+
import dayjs from 'dayjs';
19+
import { getCurrentRole } from '@/utils/useUser';
1820
1921
const props = defineProps<{
2022
selectedTimeEntries: TimeEntry[];
@@ -41,6 +43,18 @@ const emit = defineEmits<{
4143
}>();
4244
4345
const showMassUpdateModal = ref(false);
46+
47+
async function markAsInvoiced() {
48+
if (props.selectedTimeEntries.length === 0) return;
49+
await props.updateTimeEntries({
50+
invoiced_at: dayjs().utc().format('YYYY-MM-DDTHH:mm:ss[Z]'),
51+
});
52+
emit('submit');
53+
}
54+
55+
const canMarkAsInvoiced = ['owner', 'administrator', 'manager'].includes(
56+
(getCurrentRole() || '').toString()
57+
);
4458
</script>
4559

4660
<template>
@@ -87,6 +101,13 @@ const showMassUpdateModal = ref(false);
87101
<PencilSquareIcon class="w-4"></PencilSquareIcon>
88102
<span> Edit </span>
89103
</button>
104+
<button
105+
v-if="selectedTimeEntries.length && canMarkAsInvoiced"
106+
class="text-emerald-500 h-full px-2 space-x-1 items-center flex hover:text-emerald-600 transition focus-visible:ring-2 outline-0 focus-visible:text-emerald-600 focus-visible:ring-ring rounded"
107+
@click="markAsInvoiced">
108+
<DocumentTextIcon class="w-4"></DocumentTextIcon>
109+
<span> Mark as invoiced </span>
110+
</button>
90111
<button
91112
v-if="selectedTimeEntries.length"
92113
class="text-red-400 h-full px-2 space-x-1 items-center flex hover:text-red-500 transition focus-visible:ring-2 outline-0 focus-visible:text-red-500 focus-visible:ring-ring rounded"

0 commit comments

Comments
 (0)