move calendar, dropdown-menu, select, dialog, number-field components to

the ui package
This commit is contained in:
Gregor Vostrak
2026-03-03 18:15:29 +01:00
parent bce6cb9395
commit c581ad8854
66 changed files with 106 additions and 191 deletions

View File

@@ -1,11 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/packages/ui/src';
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/Components/ui/select';
import type { BillableKey } from '@/types/projects'; import type { BillableKey } from '@/types/projects';
const model = defineModel<BillableKey>({ const model = defineModel<BillableKey>({

View File

@@ -7,13 +7,7 @@ import PrimaryButton from '@/packages/ui/src/Buttons/PrimaryButton.vue';
import { type MemberBillableKey, useMembersStore } from '@/utils/useMembers'; import { type MemberBillableKey, useMembersStore } from '@/utils/useMembers';
import BillableRateInput from '@/packages/ui/src/Input/BillableRateInput.vue'; import BillableRateInput from '@/packages/ui/src/Input/BillableRateInput.vue';
import { Field, FieldLabel, FieldDescription } from '@/packages/ui/src/field'; import { Field, FieldLabel, FieldDescription } from '@/packages/ui/src/field';
import { import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/packages/ui/src';
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/Components/ui/select';
import { import {
Tooltip, Tooltip,
TooltipContent, TooltipContent,

View File

@@ -1,11 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/packages/ui/src';
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/Components/ui/select';
import type { Role } from '@/types/jetstream'; import type { Role } from '@/types/jetstream';
import { usePage } from '@inertiajs/vue3'; import { usePage } from '@inertiajs/vue3';

View File

@@ -1,11 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { XMarkIcon, ChevronDownIcon } from '@heroicons/vue/16/solid'; import { XMarkIcon, ChevronDownIcon } from '@heroicons/vue/16/solid';
import type { Component } from 'vue'; import type { Component } from 'vue';
import { import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from '@/packages/ui/src';
DropdownMenu,
DropdownMenuContent,
DropdownMenuTrigger,
} from '@/packages/ui/src';
defineProps<{ defineProps<{
icon: Component; icon: Component;

View File

@@ -8,13 +8,7 @@ import ClientMultiselectDropdown from '@/Components/Common/Client/ClientMultisel
import MemberMultiselectDropdown from '@/Components/Common/Member/MemberMultiselectDropdown.vue'; import MemberMultiselectDropdown from '@/Components/Common/Member/MemberMultiselectDropdown.vue';
import ReportingFilterBadge from '@/Components/Common/Reporting/ReportingFilterBadge.vue'; import ReportingFilterBadge from '@/Components/Common/Reporting/ReportingFilterBadge.vue';
import ProjectMultiselectDropdown from '@/Components/Common/Project/ProjectMultiselectDropdown.vue'; import ProjectMultiselectDropdown from '@/Components/Common/Project/ProjectMultiselectDropdown.vue';
import { import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/packages/ui/src';
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/Components/ui/select';
import MainContainer from '@/packages/ui/src/MainContainer.vue'; import MainContainer from '@/packages/ui/src/MainContainer.vue';
import DateRangePicker from '@/packages/ui/src/Input/DateRangePicker.vue'; import DateRangePicker from '@/packages/ui/src/Input/DateRangePicker.vue';
import TagDropdown from '@/packages/ui/src/Tag/TagDropdown.vue'; import TagDropdown from '@/packages/ui/src/Tag/TagDropdown.vue';

View File

@@ -1,11 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/packages/ui/src';
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/Components/ui/select';
import { type Component, computed } from 'vue'; import { type Component, computed } from 'vue';
const model = defineModel<string | null>({ default: null }); const model = defineModel<string | null>({ default: null });

View File

@@ -2,13 +2,7 @@
import { Switch } from '@/Components/ui/switch'; import { Switch } from '@/Components/ui/switch';
import { Popover, PopoverContent, PopoverTrigger } from '@/packages/ui/src'; import { Popover, PopoverContent, PopoverTrigger } from '@/packages/ui/src';
import { Button } from '@/packages/ui/src'; import { Button } from '@/packages/ui/src';
import { import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/packages/ui/src';
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/Components/ui/select';
import { Field, FieldLabel } from '@/packages/ui/src/field'; import { Field, FieldLabel } from '@/packages/ui/src/field';
import { import {
NumberField, NumberField,
@@ -16,7 +10,7 @@ import {
NumberFieldContent, NumberFieldContent,
NumberFieldIncrement, NumberFieldIncrement,
NumberFieldDecrement, NumberFieldDecrement,
} from '@/Components/ui/number-field'; } from '@/packages/ui/src';
import { ArrowsUpDownIcon } from '@heroicons/vue/20/solid'; import { ArrowsUpDownIcon } from '@heroicons/vue/20/solid';
import { computed, ref, watch } from 'vue'; import { computed, ref, watch } from 'vue';
import { twMerge } from 'tailwind-merge'; import { twMerge } from 'tailwind-merge';

View File

@@ -1,71 +0,0 @@
<script setup lang="ts">
import { Popover, PopoverContent, PopoverTrigger } from '@/packages/ui/src';
import { Button } from '@/packages/ui/src';
import { Calendar } from '@/Components/ui/calendar';
import { CalendarIcon, XIcon } from 'lucide-vue-next';
import { formatDate } from '@/packages/ui/src/utils/time';
import { parseDate } from '@internationalized/date';
import { computed, inject, type ComputedRef } from 'vue';
import { type Organization } from '@/packages/api/src';
const model = defineModel<string | null>();
const emit = defineEmits<{
blur: [];
}>();
defineProps<{
clearable?: boolean;
}>();
const handleChange = (date: string) => {
model.value = date;
};
const handleBlur = () => {
emit('blur');
};
const handleClear = (event: Event) => {
event.stopPropagation();
model.value = null;
};
const date = computed(() => {
return model.value ? parseDate(model.value) : undefined;
});
const organization = inject<ComputedRef<Organization>>('organization');
</script>
<template>
<Popover>
<PopoverTrigger as-child>
<Button
variant="input"
:class="[
'w-full justify-start text-left font-normal',
!model && 'text-muted-foreground',
]">
<CalendarIcon class="mr-2 h-4 w-4" />
<span class="flex-1">
{{ model ? formatDate(model, organization?.date_format) : 'Pick a date' }}
</span>
<button
v-if="clearable && model"
class="ml-2 hover:bg-muted rounded p-1 transition-colors"
type="button"
@click="handleClear">
<XIcon class="h-4 w-4" />
</button>
</Button>
</PopoverTrigger>
<PopoverContent class="w-auto p-0">
<Calendar
mode="single"
:model-value="date"
:initial-focus="true"
@update:model-value="(date) => handleChange(date ? date.toString() : '')"
@blur="handleBlur" />
</PopoverContent>
</Popover>
</template>

View File

@@ -1,13 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import FormSection from '@/Components/FormSection.vue'; import FormSection from '@/Components/FormSection.vue';
import { Field, FieldLabel, FieldDescription } from '@/packages/ui/src/field'; import { Field, FieldLabel, FieldDescription } from '@/packages/ui/src/field';
import { import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/packages/ui/src';
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/Components/ui/select';
import { usePreferredColorScheme } from '@vueuse/core'; import { usePreferredColorScheme } from '@vueuse/core';
import { themeSetting } from '@/utils/theme'; import { themeSetting } from '@/utils/theme';

View File

@@ -6,13 +6,7 @@ import { Field, FieldLabel } from '@/packages/ui/src/field';
import type { UpdateOrganizationBody } from '@/packages/api/src'; import type { UpdateOrganizationBody } from '@/packages/api/src';
import { useOrganizationStore } from '@/utils/useOrganization'; import { useOrganizationStore } from '@/utils/useOrganization';
import { storeToRefs } from 'pinia'; import { storeToRefs } from 'pinia';
import { import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/packages/ui/src';
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/Components/ui/select';
import { useMutation, useQueryClient } from '@tanstack/vue-query'; import { useMutation, useQueryClient } from '@tanstack/vue-query';
import type { DateFormat, TimeFormat, IntervalFormat } from '@/packages/ui/src/utils/time'; import type { DateFormat, TimeFormat, IntervalFormat } from '@/packages/ui/src/utils/time';
import type { CurrencyFormat } from '@/packages/ui/src/utils/money'; import type { CurrencyFormat } from '@/packages/ui/src/utils/money';

View File

@@ -1,12 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { Popover, PopoverContent, PopoverTrigger, Button } from '..'; import { Popover, PopoverContent, PopoverTrigger, Button } from '..';
import { import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '..';
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/Components/ui/select';
import { Field, FieldLabel } from '../field'; import { Field, FieldLabel } from '../field';
import { Settings } from 'lucide-vue-next'; import { Settings } from 'lucide-vue-next';
import { ref, watch } from 'vue'; import { ref, watch } from 'vue';

View File

@@ -7,7 +7,7 @@ import {
NumberFieldDecrement, NumberFieldDecrement,
NumberFieldIncrement, NumberFieldIncrement,
NumberFieldInput, NumberFieldInput,
} from '@/Components/ui/number-field'; } from '..';
const props = defineProps<{ const props = defineProps<{
name: string; name: string;

View File

@@ -7,7 +7,7 @@ import {
type WeekStartDay, type WeekStartDay,
} from '@/packages/ui/src/utils/time'; } from '@/packages/ui/src/utils/time';
import { Popover, PopoverContent, PopoverTrigger } from '@/packages/ui/src/popover'; import { Popover, PopoverContent, PopoverTrigger } from '@/packages/ui/src/popover';
import { Calendar } from '@/Components/ui/calendar'; import { Calendar } from '..';
import { Button } from '@/packages/ui/src/Buttons'; import { Button } from '@/packages/ui/src/Buttons';
import { CalendarIcon } from 'lucide-vue-next'; import { CalendarIcon } from 'lucide-vue-next';
import { parseDate, type DateValue } from '@internationalized/date'; import { parseDate, type DateValue } from '@internationalized/date';

View File

@@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { Dialog, DialogContent, DialogFooter } from '@/Components/ui/dialog'; import { Dialog, DialogContent, DialogFooter } from './dialog/index';
import { computed } from 'vue'; import { computed } from 'vue';
const props = defineProps({ const props = defineProps({

View File

@@ -1,11 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '..';
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/Components/ui/select';
import type { BillableKey } from '@/types/projects'; import type { BillableKey } from '@/types/projects';
const model = defineModel<BillableKey>({ const model = defineModel<BillableKey>({

View File

@@ -1,13 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { Field, FieldDescription, FieldLabel } from '../field'; import { Field, FieldDescription, FieldLabel } from '../field';
import BillableRateInput from '@/packages/ui/src/Input/BillableRateInput.vue'; import BillableRateInput from '@/packages/ui/src/Input/BillableRateInput.vue';
import { import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '..';
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/Components/ui/select';
import { import {
Tooltip, Tooltip,
TooltipContent, TooltipContent,

View File

@@ -17,13 +17,7 @@ import type {
} from '@/packages/api/src'; } from '@/packages/api/src';
import TagDropdown from '@/packages/ui/src/Tag/TagDropdown.vue'; import TagDropdown from '@/packages/ui/src/Tag/TagDropdown.vue';
import BillableIcon from '@/packages/ui/src/Icons/BillableIcon.vue'; import BillableIcon from '@/packages/ui/src/Icons/BillableIcon.vue';
import { import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '..';
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/Components/ui/select';
import { Button } from '@/packages/ui/src/Buttons'; import { Button } from '@/packages/ui/src/Buttons';
import DatePicker from '@/packages/ui/src/Input/DatePicker.vue'; import DatePicker from '@/packages/ui/src/Input/DatePicker.vue';
import DurationHumanInput from '@/packages/ui/src/Input/DurationHumanInput.vue'; import DurationHumanInput from '@/packages/ui/src/Input/DurationHumanInput.vue';

View File

@@ -17,13 +17,7 @@ import type {
} from '@/packages/api/src'; } from '@/packages/api/src';
import TagDropdown from '@/packages/ui/src/Tag/TagDropdown.vue'; import TagDropdown from '@/packages/ui/src/Tag/TagDropdown.vue';
import BillableIcon from '@/packages/ui/src/Icons/BillableIcon.vue'; import BillableIcon from '@/packages/ui/src/Icons/BillableIcon.vue';
import { import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '..';
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/Components/ui/select';
import { Button } from '@/packages/ui/src/Buttons'; import { Button } from '@/packages/ui/src/Buttons';
import DatePicker from '@/packages/ui/src/Input/DatePicker.vue'; import DatePicker from '@/packages/ui/src/Input/DatePicker.vue';
import DurationHumanInput from '@/packages/ui/src/Input/DurationHumanInput.vue'; import DurationHumanInput from '@/packages/ui/src/Input/DurationHumanInput.vue';

View File

@@ -16,13 +16,7 @@ import {
} from '@/packages/api/src'; } from '@/packages/api/src';
import { Checkbox } from '@/packages/ui/src'; import { Checkbox } from '@/packages/ui/src';
import { TagIcon } from '@heroicons/vue/20/solid'; import { TagIcon } from '@heroicons/vue/20/solid';
import { import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '..';
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from '@/Components/ui/select';
import { Button } from '@/packages/ui/src/Buttons'; import { Button } from '@/packages/ui/src/Buttons';
import TagDropdown from '@/packages/ui/src/Tag/TagDropdown.vue'; import TagDropdown from '@/packages/ui/src/Tag/TagDropdown.vue';
import type { Tag, Task } from '@/packages/api/src'; import type { Tag, Task } from '@/packages/api/src';

View File

@@ -1,11 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { TrashIcon, PencilIcon, DocumentDuplicateIcon } from '@heroicons/vue/20/solid'; import { TrashIcon, PencilIcon, DocumentDuplicateIcon } from '@heroicons/vue/20/solid';
import { import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '..';
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from '..';
const props = withDefaults( const props = withDefaults(
defineProps<{ defineProps<{

View File

@@ -1,11 +1,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { PlusIcon, XMarkIcon } from '@heroicons/vue/20/solid'; import { PlusIcon, XMarkIcon } from '@heroicons/vue/20/solid';
import { import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '..';
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from '..';
const props = defineProps<{ const props = defineProps<{
hasActiveTimer: boolean; hasActiveTimer: boolean;

View File

@@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import type { Component, HTMLAttributes } from 'vue'; import type { Component, HTMLAttributes } from 'vue';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';
import { Label } from '@/Components/ui/label'; import { Label } from '../label/index';
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes['class']; class?: HTMLAttributes['class'];

View File

@@ -78,6 +78,52 @@ import {
DropdownMenuSubTrigger, DropdownMenuSubTrigger,
DropdownMenuTrigger, DropdownMenuTrigger,
} from './dropdown-menu/index'; } from './dropdown-menu/index';
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectItemText,
SelectLabel,
SelectScrollDownButton,
SelectScrollUpButton,
SelectSeparator,
SelectTrigger,
SelectValue,
} from './select/index';
import {
NumberField,
NumberFieldContent,
NumberFieldDecrement,
NumberFieldIncrement,
NumberFieldInput,
} from './number-field/index';
import {
Dialog,
DialogClose,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogScrollContent,
DialogTitle,
DialogTrigger,
} from './dialog/index';
import {
Calendar,
CalendarCell,
CalendarCellTrigger,
CalendarGrid,
CalendarGridBody,
CalendarGridHead,
CalendarGridRow,
CalendarHeadCell,
CalendarHeader,
CalendarHeading,
CalendarNextButton,
CalendarPrevButton,
} from './calendar/index';
import { Label } from './label/index';
import { import {
Field, Field,
FieldContent, FieldContent,
@@ -185,4 +231,42 @@ export {
DropdownMenuSubContent, DropdownMenuSubContent,
DropdownMenuSubTrigger, DropdownMenuSubTrigger,
DropdownMenuTrigger, DropdownMenuTrigger,
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectItemText,
SelectLabel,
SelectScrollDownButton,
SelectScrollUpButton,
SelectSeparator,
SelectTrigger,
SelectValue,
NumberField,
NumberFieldContent,
NumberFieldDecrement,
NumberFieldIncrement,
NumberFieldInput,
Dialog,
DialogClose,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogScrollContent,
DialogTitle,
DialogTrigger,
Calendar,
CalendarCell,
CalendarCellTrigger,
CalendarGrid,
CalendarGridBody,
CalendarGridHead,
CalendarGridRow,
CalendarHeadCell,
CalendarHeader,
CalendarHeading,
CalendarNextButton,
CalendarPrevButton,
Label,
}; };