Skip to content

Commit 8524e01

Browse files
committed
refactor: extract ReportingFilterBar and migrate reporting to TanStack Query
1 parent bca1e8b commit 8524e01

File tree

6 files changed

+134
-399
lines changed

6 files changed

+134
-399
lines changed

resources/js/Components/Common/Reporting/ReportingExportButton.vue

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
<script setup lang="ts">
22
import { SecondaryButton } from '@/packages/ui/src';
33
import { ArrowDownTrayIcon, LockClosedIcon } from '@heroicons/vue/20/solid';
4-
import Dropdown from '@/packages/ui/src/Input/Dropdown.vue';
4+
import {
5+
DropdownMenu,
6+
DropdownMenuContent,
7+
DropdownMenuItem,
8+
DropdownMenuTrigger,
9+
} from '@/Components/ui/dropdown-menu';
510
import type { ExportFormat } from '@/types/reporting';
611
import { ref } from 'vue';
712
import { isAllowedToPerformPremiumAction } from '@/utils/billing';
@@ -25,32 +30,24 @@ function triggerDownload(format: ExportFormat) {
2530
</script>
2631

2732
<template>
28-
<Dropdown align="end">
29-
<template #trigger>
33+
<DropdownMenu>
34+
<DropdownMenuTrigger as-child>
3035
<SecondaryButton :icon="ArrowDownTrayIcon" :loading> Export </SecondaryButton>
31-
</template>
32-
<template #content>
33-
<div class="flex flex-col space-y-1 p-1.5">
34-
<SecondaryButton class="border-0 px-2" @click="triggerDownload('pdf')">
35-
<div class="flex items-center space-x-2">
36-
<span> Export as PDF </span>
37-
<LockClosedIcon
38-
v-if="!isAllowedToPerformPremiumAction()"
39-
class="w-3.5 text-text-tertiary"></LockClosedIcon>
40-
</div>
41-
</SecondaryButton>
42-
<SecondaryButton class="border-0 px-2" @click="triggerDownload('xlsx')"
43-
>Export as Excel</SecondaryButton
44-
>
45-
<SecondaryButton class="border-0 px-2" @click="triggerDownload('csv')"
46-
>Export as CSV</SecondaryButton
47-
>
48-
<SecondaryButton class="border-0 px-2" @click="triggerDownload('ods')"
49-
>Export as ODS
50-
</SecondaryButton>
51-
</div>
52-
</template>
53-
</Dropdown>
36+
</DropdownMenuTrigger>
37+
<DropdownMenuContent align="end">
38+
<DropdownMenuItem @click="triggerDownload('pdf')">
39+
<div class="flex items-center space-x-2">
40+
<span>Export as PDF</span>
41+
<LockClosedIcon
42+
v-if="!isAllowedToPerformPremiumAction()"
43+
class="w-3.5 text-text-tertiary" />
44+
</div>
45+
</DropdownMenuItem>
46+
<DropdownMenuItem @click="triggerDownload('xlsx')"> Export as Excel </DropdownMenuItem>
47+
<DropdownMenuItem @click="triggerDownload('csv')"> Export as CSV </DropdownMenuItem>
48+
<DropdownMenuItem @click="triggerDownload('ods')"> Export as ODS </DropdownMenuItem>
49+
</DropdownMenuContent>
50+
</DropdownMenu>
5451
<UpgradeModal v-model:show="showPremiumModal">
5552
<strong>PDF Reports</strong> are only available in solidtime Professional.
5653
</UpgradeModal>
Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
<script setup lang="ts">
2-
import SelectDropdown from '@/packages/ui/src/Input/SelectDropdown.vue';
3-
import Badge from '@/packages/ui/src/Badge.vue';
2+
import {
3+
Select,
4+
SelectContent,
5+
SelectItem,
6+
SelectTrigger,
7+
SelectValue,
8+
} from '@/Components/ui/select';
49
import { type Component, computed } from 'vue';
510
611
const model = defineModel<string | null>({ default: null });
712
const props = defineProps<{
813
groupByOptions: { value: string; label: string; icon: Component }[];
914
}>();
15+
const emit = defineEmits<{
16+
changed: [];
17+
}>();
1018
const icon = computed(() => {
1119
return props.groupByOptions.find((option) => option.value === model.value)?.icon;
1220
});
@@ -16,21 +24,19 @@ const title = computed(() => {
1624
</script>
1725

1826
<template>
19-
<SelectDropdown
20-
v-model="model"
21-
:get-key-from-item="(item) => item.value"
22-
:get-name-for-item="(item) => item.label"
23-
:items="groupByOptions">
24-
<template #trigger>
25-
<Badge
26-
size="large"
27-
tag="button"
28-
class="cursor-pointer hover:bg-card-background transition space-x-5 flex">
29-
<component :is="icon" class="h-4 text-text-secondary"></component>
30-
<span> {{ title }} </span>
31-
</Badge>
32-
</template>
33-
</SelectDropdown>
27+
<Select v-model="model" @update:model-value="emit('changed')">
28+
<SelectTrigger size="small" :show-chevron="false">
29+
<SelectValue class="flex items-center gap-2">
30+
<component :is="icon" class="h-4 text-icon-default" />
31+
<span>{{ title }}</span>
32+
</SelectValue>
33+
</SelectTrigger>
34+
<SelectContent>
35+
<SelectItem v-for="option in groupByOptions" :key="option.value" :value="option.value">
36+
{{ option.label }}
37+
</SelectItem>
38+
</SelectContent>
39+
</Select>
3440
</template>
3541

3642
<style scoped></style>

0 commit comments

Comments
 (0)