+
Loading reporting data…
@@ -153,12 +164,15 @@ const tableData = computed(() => {
v-for="entry in tableData"
:key="entry.description ?? 'none'"
:currency="getOrganizationCurrencyString()"
+ :show-cost="showBillableRate"
:entry="entry">
Total
-
+
{{
formatHumanReadableDuration(
aggregatedTableTimeEntries.seconds,
@@ -167,7 +181,9 @@ const tableData = computed(() => {
)
}}
-
+
{{
aggregatedTableTimeEntries.cost
? formatCents(
@@ -183,7 +199,10 @@ const tableData = computed(() => {
-
+
No time entries found
Try to track some time entries this week
diff --git a/resources/js/packages/ui/src/Client/ClientDropdown.vue b/resources/js/packages/ui/src/Client/ClientDropdown.vue
index 0cee73bc..ae033bd5 100644
--- a/resources/js/packages/ui/src/Client/ClientDropdown.vue
+++ b/resources/js/packages/ui/src/Client/ClientDropdown.vue
@@ -1,7 +1,5 @@
-
+
@@ -92,35 +91,41 @@ function updateValue(client: { id: string | null; name: string }) {
-
+
-
+ class="relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground">
+ No Client
+
+
+
-
+ {{ client.name }}
+
+
+
-
-
-
Add "{{ searchValue }}" as a new Client
-
+ class="flex items-center gap-2 rounded-sm px-2 py-1.5 text-sm cursor-pointer hover:bg-accent hover:text-accent-foreground"
+ @click="addClientIfNoneExists">
+
+
Add "{{ searchValue }}" as a new Client
diff --git a/resources/js/packages/ui/src/EstimatedTimeSection.vue b/resources/js/packages/ui/src/EstimatedTimeSection.vue
index 8425c8e7..39975290 100644
--- a/resources/js/packages/ui/src/EstimatedTimeSection.vue
+++ b/resources/js/packages/ui/src/EstimatedTimeSection.vue
@@ -1,26 +1,23 @@
-
-
-
- Time Estimated
-
-
-
-
- Info:
- You can type natural language like
- 2h 30m
-
-
+
+ Time Estimated
+
+
+ You can type natural language like
+ 2h 30m
+
diff --git a/resources/js/packages/ui/src/Input/BillableRateInput.vue b/resources/js/packages/ui/src/Input/BillableRateInput.vue
index 3e60fc3c..bb07f587 100644
--- a/resources/js/packages/ui/src/Input/BillableRateInput.vue
+++ b/resources/js/packages/ui/src/Input/BillableRateInput.vue
@@ -13,6 +13,7 @@ const props = defineProps<{
name: string;
focus?: boolean;
currency: string;
+ disabled?: boolean;
}>();
const model = defineModel({
@@ -33,6 +34,7 @@ function formatValue(modelValue: number | null) {
:id="name"
ref="billableRateInput"
:model-value="formatValue(model)"
+ :disabled="disabled"
:step-snapping="false"
class="block w-full"
:format-options="{
diff --git a/resources/js/packages/ui/src/Project/ProjectColorSelector.vue b/resources/js/packages/ui/src/Project/ProjectColorSelector.vue
index bfa18b42..c82b5f64 100644
--- a/resources/js/packages/ui/src/Project/ProjectColorSelector.vue
+++ b/resources/js/packages/ui/src/Project/ProjectColorSelector.vue
@@ -10,12 +10,12 @@ const model = defineModel({ default: '' });
diff --git a/resources/js/packages/ui/src/Project/ProjectCreateModal.vue b/resources/js/packages/ui/src/Project/ProjectCreateModal.vue
index 9c8fb7b2..da3338a6 100644
--- a/resources/js/packages/ui/src/Project/ProjectCreateModal.vue
+++ b/resources/js/packages/ui/src/Project/ProjectCreateModal.vue
@@ -8,11 +8,12 @@ import { getRandomColor } from '@/packages/ui/src/utils/color';
import PrimaryButton from '@/packages/ui/src/Buttons/PrimaryButton.vue';
import { useFocus } from '@vueuse/core';
import ClientDropdown from '@/packages/ui/src/Client/ClientDropdown.vue';
-import Badge from '@/packages/ui/src/Badge.vue';
import ProjectColorSelector from '@/packages/ui/src/Project/ProjectColorSelector.vue';
+import { Button } from '@/packages/ui/src/Buttons';
+import { ChevronDown } from 'lucide-vue-next';
import { UserCircleIcon } from '@heroicons/vue/20/solid';
import EstimatedTimeSection from '@/packages/ui/src/EstimatedTimeSection.vue';
-import { Field, FieldLabel } from '../field';
+import { Field, FieldGroup, FieldLabel } from '../field';
import ProjectEditBillableSection from '@/packages/ui/src/Project/ProjectEditBillableSection.vue';
import type { Client } from '@/packages/api/src';
@@ -74,9 +75,9 @@ const currentClientName = computed(() => {
-
-
-
+
+
+
Color
@@ -94,43 +95,30 @@ const currentClientName = computed(() => {
autocomplete="projectName"
@keydown.enter="submit()" />
-
+
- Client
+ Client
-
-
-
-
- {{ currentClientName }}
-
-
-
+
-
-
+
+
+
Cancel
diff --git a/resources/js/packages/ui/src/Project/ProjectEditBillableSection.vue b/resources/js/packages/ui/src/Project/ProjectEditBillableSection.vue
index 02d35adb..c49e58d9 100644
--- a/resources/js/packages/ui/src/Project/ProjectEditBillableSection.vue
+++ b/resources/js/packages/ui/src/Project/ProjectEditBillableSection.vue
@@ -1,82 +1,137 @@
-
-
-
-
- Billable Default
-
-
-
-
- Billable Rate
+
+ Billable Default
+
+ {{ billableDescription }}
+
+
+ Billable Rate
+
+
+
+
+
+
+
+
+
+ Uses the default rate of the organization
+
+
-
-
-
-
- Info:
- {{ billableOptionInfoText }}
-
-
+
+
diff --git a/resources/js/packages/ui/src/TimeEntry/TimeEntryEditModal.vue b/resources/js/packages/ui/src/TimeEntry/TimeEntryEditModal.vue
index 81dca82f..5c71f0c5 100644
--- a/resources/js/packages/ui/src/TimeEntry/TimeEntryEditModal.vue
+++ b/resources/js/packages/ui/src/TimeEntry/TimeEntryEditModal.vue
@@ -166,7 +166,7 @@ const billableProxy = computed({
@keydown.enter="submit" />
-
+
-import type { HTMLAttributes } from 'vue';
+import type { Component, HTMLAttributes } from 'vue';
import { cn } from '@/lib/utils';
import { Label } from '@/Components/ui/label';
const props = defineProps<{
class?: HTMLAttributes['class'];
+ icon?: Component;
}>();
@@ -13,12 +14,14 @@ const props = defineProps<{
data-slot="field-label"
:class="
cn(
- 'group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50',
+ 'group/field-label peer/field-label flex w-fit gap-1.5 leading-snug group-data-[disabled=true]/field:opacity-50',
'has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&_>[data-slot=field]]:p-3',
'has-[[data-state=checked]]:bg-primary/5 has-[[data-state=checked]]:border-primary dark:has-[[data-state=checked]]:bg-primary/10',
+ icon ? 'items-center' : '',
props.class
)
">
+