mirror of
https://github.com/solidtime-io/solidtime.git
synced 2026-10-14 16:53:17 +01:00
add date range navigation, unify picker components
This commit is contained in:
@@ -1,13 +1,12 @@
|
||||
<script setup lang="ts">
|
||||
import { Button } from '..';
|
||||
import { ChevronLeft, ChevronRight } from '@lucide/vue';
|
||||
import { Tabs, TabsList } from '../tabs';
|
||||
import TabBarItem from '../TabBar/TabBarItem.vue';
|
||||
import DateRangeNavigator from '../Input/DateRangeNavigator.vue';
|
||||
import CalendarSettingsPopover from './CalendarSettingsPopover.vue';
|
||||
import type { CalendarSettings } from './calendarSettings';
|
||||
|
||||
defineProps<{
|
||||
viewTitle: string;
|
||||
rangeLabel: string;
|
||||
activeView: string;
|
||||
settings: CalendarSettings;
|
||||
}>();
|
||||
@@ -23,31 +22,13 @@ const emit = defineEmits<{
|
||||
|
||||
<template>
|
||||
<div class="flex items-center justify-between bg-default-background px-2 py-1.5">
|
||||
<!-- Left: Navigation -->
|
||||
<div class="flex items-center gap-1">
|
||||
<Button
|
||||
variant="outline"
|
||||
size="sm"
|
||||
class="h-8 w-8 p-0"
|
||||
aria-label="Previous"
|
||||
@click="emit('prev')">
|
||||
<ChevronLeft class="h-4 w-4" />
|
||||
</Button>
|
||||
<Button
|
||||
variant="outline"
|
||||
size="sm"
|
||||
class="h-8 w-8 p-0"
|
||||
aria-label="Next"
|
||||
@click="emit('next')">
|
||||
<ChevronRight class="h-4 w-4" />
|
||||
</Button>
|
||||
<Button variant="outline" size="sm" @click="emit('today')"> today </Button>
|
||||
</div>
|
||||
|
||||
<!-- Center: Title -->
|
||||
<span data-testid="calendar-title" class="text-base font-semibold text-foreground">{{
|
||||
viewTitle
|
||||
}}</span>
|
||||
<DateRangeNavigator
|
||||
:label="rangeLabel"
|
||||
trigger-test-id="calendar-title"
|
||||
trigger-aria-label="today"
|
||||
@previous="emit('prev')"
|
||||
@next="emit('next')"
|
||||
@select="emit('today')" />
|
||||
|
||||
<!-- Right: View switcher + Settings -->
|
||||
<div class="flex items-center gap-1">
|
||||
|
||||
@@ -138,7 +138,7 @@ const {
|
||||
const {
|
||||
activeView,
|
||||
viewDays,
|
||||
viewTitle,
|
||||
rangeLabel,
|
||||
emitDatesChange,
|
||||
handlePrev,
|
||||
handleNext,
|
||||
@@ -514,7 +514,7 @@ function getEventDurationSeconds(dayEvent: DayEvent, dayStr: string): number {
|
||||
|
||||
<template v-if="!loading">
|
||||
<CalendarToolbar
|
||||
:view-title="viewTitle"
|
||||
:range-label="rangeLabel"
|
||||
:active-view="activeView"
|
||||
:settings="calendarSettings"
|
||||
@prev="handlePrev"
|
||||
|
||||
@@ -2,6 +2,7 @@ import { computed, ref } from 'vue';
|
||||
import type { Dayjs } from 'dayjs';
|
||||
import { getLocalizedDayJs } from '../utils/time';
|
||||
import { getWeekStartDayNumber } from '../utils/settings';
|
||||
import { getDateRangeLabel } from '../utils/dateRange';
|
||||
|
||||
export function useCalendarNavigation(callbacks: {
|
||||
onDatesChange: (payload: { start: Dayjs; end: Dayjs }) => void;
|
||||
@@ -34,24 +35,10 @@ export function useCalendarNavigation(callbacks: {
|
||||
return days;
|
||||
});
|
||||
|
||||
const viewTitle = computed(() => {
|
||||
if (activeView.value === 'timeGridDay') {
|
||||
return currentDate.value.format('MMMM YYYY');
|
||||
}
|
||||
|
||||
const rangeLabel = computed(() => {
|
||||
const days = viewDays.value;
|
||||
if (days.length === 0) return '';
|
||||
|
||||
const first = days[0]!;
|
||||
const last = days[days.length - 1]!;
|
||||
|
||||
if (first.year() !== last.year()) {
|
||||
return `${first.format('MMM YYYY')} \u2013 ${last.format('MMM YYYY')}`;
|
||||
}
|
||||
if (first.month() !== last.month()) {
|
||||
return `${first.format('MMM')} \u2013 ${last.format('MMM YYYY')}`;
|
||||
}
|
||||
return first.format('MMMM YYYY');
|
||||
return getDateRangeLabel(days[0]!, days[days.length - 1]!);
|
||||
});
|
||||
|
||||
function emitDatesChange() {
|
||||
@@ -99,7 +86,7 @@ export function useCalendarNavigation(callbacks: {
|
||||
activeView,
|
||||
currentDate,
|
||||
viewDays,
|
||||
viewTitle,
|
||||
rangeLabel,
|
||||
emitDatesChange,
|
||||
handlePrev,
|
||||
handleNext,
|
||||
|
||||
Reference in New Issue
Block a user