mirror of https://github.com/nocodb/nocodb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
4.4 KiB
126 lines
4.4 KiB
<script lang="ts" setup> |
|
import dayjs from 'dayjs' |
|
import { computed } from '#imports' |
|
|
|
const { selectedDate, selectedMonth, selectedDateRange, activeCalendarView, paginateCalendarView, activeDates, pageDate } = |
|
useCalendarViewStoreOrThrow() |
|
|
|
const calendarRangeDropdown = ref(false) |
|
|
|
const headerText = computed(() => { |
|
switch (activeCalendarView.value) { |
|
case 'day': |
|
return dayjs(selectedDate.value).format('D MMM YYYY') |
|
case 'week': |
|
if (selectedDateRange.value.start.isSame(selectedDateRange.value.end, 'month')) { |
|
return `${selectedDateRange.value.start.format('D')} - ${selectedDateRange.value.end.format('D MMM YY')}` |
|
} else if (selectedDateRange.value.start.isSame(selectedDateRange.value.end, 'year')) { |
|
return `${selectedDateRange.value.start.format('D MMM')} - ${selectedDateRange.value.end.format('D MMM YY')}` |
|
} else { |
|
return `${selectedDateRange.value.start.format('D MMM YY')} - ${selectedDateRange.value.end.format('D MMM YY')}` |
|
} |
|
case 'month': |
|
return dayjs(selectedMonth.value).format('MMM YYYY') |
|
case 'year': |
|
return dayjs(selectedDate.value).format('YYYY') |
|
default: |
|
return '' |
|
} |
|
}) |
|
</script> |
|
|
|
<template> |
|
<div class="flex gap-1"> |
|
<NcTooltip> |
|
<template #title> {{ $t('labels.previous') }}</template> |
|
<a-button |
|
v-e="`['c:calendar:calendar-${activeCalendarView}-prev-btn']`" |
|
class="w-6 h-6 !rounded-lg flex items-center justify-center !bg-gray-100 !border-0" |
|
data-testid="nc-calendar-prev-btn" |
|
size="small" |
|
@click="paginateCalendarView('prev')" |
|
> |
|
<component :is="iconMap.arrowLeft" class="h-4 !mb-0.9 !-ml-0.8 w-4" /> |
|
</a-button> |
|
</NcTooltip> |
|
|
|
<NcDropdown v-model:visible="calendarRangeDropdown" :auto-close="false" :trigger="['click']"> |
|
<NcButton |
|
:class="{ |
|
'w-20': activeCalendarView === 'year', |
|
'w-26.5': activeCalendarView === 'month', |
|
'w-29': activeCalendarView === 'day', |
|
'w-38': activeCalendarView === 'week', |
|
}" |
|
class="!h-6 !bg-gray-100 !border-0" |
|
full-width |
|
size="small" |
|
type="secondary" |
|
> |
|
<div class="flex w-full px-1 items-center justify-between"> |
|
<span |
|
:class="{ |
|
'max-w-38 truncate': activeCalendarView === 'week', |
|
}" |
|
class="font-bold text-[13px] text-center text-gray-800" |
|
data-testid="nc-calendar-active-date" |
|
>{{ headerText }}</span |
|
> |
|
<div class="flex-1" /> |
|
<component :is="iconMap.arrowDown" class="h-4 min-w-4 text-gray-700" /> |
|
</div> |
|
</NcButton> |
|
|
|
<template #overlay> |
|
<div v-if="calendarRangeDropdown" class="w-[287px]" @click.stop> |
|
<NcDateWeekSelector |
|
v-if="activeCalendarView === ('day' as const)" |
|
v-model:active-dates="activeDates" |
|
v-model:page-date="pageDate" |
|
v-model:selected-date="selectedDate" |
|
size="medium" |
|
/> |
|
<NcDateWeekSelector |
|
v-else-if="activeCalendarView === ('week' as const)" |
|
v-model:active-dates="activeDates" |
|
v-model:page-date="pageDate" |
|
v-model:selected-week="selectedDateRange" |
|
is-week-picker |
|
size="medium" |
|
/> |
|
<NcMonthYearSelector |
|
v-else-if="activeCalendarView === ('month' as const)" |
|
v-model:page-date="pageDate" |
|
v-model:selected-date="selectedMonth" |
|
size="medium" |
|
/> |
|
<NcMonthYearSelector |
|
v-else-if="activeCalendarView === ('year' as const)" |
|
v-model:page-date="pageDate" |
|
v-model:selected-date="selectedDate" |
|
is-year-picker |
|
size="medium" |
|
/> |
|
</div> |
|
</template> |
|
</NcDropdown> |
|
<NcTooltip> |
|
<template #title> {{ $t('labels.next') }}</template> |
|
<a-button |
|
v-e="`['c:calendar:calendar-${activeCalendarView}-next-btn']`" |
|
class="w-6 h-6 !rounded-lg flex items-center !bg-gray-100 !border-0 justify-center" |
|
data-testid="nc-calendar-next-btn" |
|
size="small" |
|
@click="paginateCalendarView('next')" |
|
> |
|
<component :is="iconMap.arrowRight" class="h-4 !mb-0.8 !-ml-0.5 w-4" /> |
|
</a-button> |
|
</NcTooltip> |
|
</div> |
|
</template> |
|
|
|
<style lang="scss" scoped> |
|
.nc-cal-toolbar-header { |
|
@apply !h-6 !w-6; |
|
} |
|
</style>
|
|
|