Browse Source

feat(nc-gui): month view handle overflow

pull/7611/head
DarkPhoenix2704 10 months ago
parent
commit
17ecfc2df1
  1. 56
      packages/nc-gui/components/smartsheet/calendar/MonthView.vue

56
packages/nc-gui/components/smartsheet/calendar/MonthView.vue

@ -49,14 +49,31 @@ const dates = computed(() => {
return weeksArray return weeksArray
}) })
const recordsToDisplay = computed<Array<Row>>(() => { const recordsToDisplay = computed<{
records: Array<Row>
count: {
[key: string]:
| {
overflow: boolean
count: number
overflowCount: number
}
| undefined
}
}>(() => {
if (!dates.value || !calendarRange.value) return [] if (!dates.value || !calendarRange.value) return []
const perWidth = gridContainerWidth.value / 7 const perWidth = gridContainerWidth.value / 7
const perHeight = gridContainerHeight.value / dates.value.length const perHeight = gridContainerHeight.value / dates.value.length
const perRecordHeight = '40' const perRecordHeight = '40'
const recordsInDay: { [key: string]: number } = {} const recordsInDay: {
[key: string]: {
overflow: boolean
count: number
overflowCount: number
}
} = {}
if (!calendarRange.value) return [] if (!calendarRange.value) return []
const recordsToDisplay: Array<Row> = [] const recordsToDisplay: Array<Row> = []
@ -66,7 +83,13 @@ const recordsToDisplay = computed<Array<Row>>(() => {
formattedData.value.forEach((record: Row) => { formattedData.value.forEach((record: Row) => {
if (!endCol && startCol) { if (!endCol && startCol) {
const startDate = dayjs(record.row[startCol.title]) const startDate = dayjs(record.row[startCol.title])
recordsInDay[startDate.format('YYYY-MM-DD')] = recordsInDay[startDate.format('YYYY-MM-DD')] + 1 || 1
const dateKey = startDate.format('YYYY-MM-DD')
if (!recordsInDay[dateKey]) {
recordsInDay[dateKey] = { overflow: false, count: 0, overflowCount: 0 }
}
recordsInDay[dateKey].count++
const weekIndex = dates.value.findIndex((week) => { const weekIndex = dates.value.findIndex((week) => {
return ( return (
@ -85,14 +108,16 @@ const recordsToDisplay = computed<Array<Row>>(() => {
width: `${perWidth}px`, width: `${perWidth}px`,
} }
const recordIndex = recordsInDay[startDate.format('YYYY-MM-DD')] const recordIndex = recordsInDay[dateKey].count
const top = weekIndex * perHeight + 40 + (recordIndex - 1) * perRecordHeight const top = weekIndex * perHeight + 42 + (recordIndex - 1) * perRecordHeight
const heightRequired = perRecordHeight * recordIndex + 40 const heightRequired = perRecordHeight * recordIndex + 42
if (heightRequired > perHeight) { if (heightRequired > perHeight) {
style.display = 'none' style.display = 'none'
recordsInDay[dateKey].overflow = true
recordsInDay[dateKey].overflowCount++
} else { } else {
style.top = `${top}px` style.top = `${top}px`
} }
@ -110,8 +135,10 @@ const recordsToDisplay = computed<Array<Row>>(() => {
} }
}) })
}) })
console.log(recordsInDay) return {
return recordsToDisplay records: recordsToDisplay,
count: recordsInDay,
}
}) })
const selectDate = (date: Date) => { const selectDate = (date: Date) => {
@ -152,7 +179,7 @@ const isDateSelected = (date: Date) => {
'border-brand-500 border-2': isDateSelected(day), 'border-brand-500 border-2': isDateSelected(day),
'!text-gray-400': !isDayInPagedMonth(day), '!text-gray-400': !isDayInPagedMonth(day),
}" }"
class="text-right group py-1 text-sm h-full border-1 bg-white border-gray-200 font-semibold hover:bg-gray-50 text-gray-800" class="text-right relative group py-1 text-sm h-full border-1 bg-white border-gray-200 font-semibold hover:bg-gray-50 text-gray-800"
@click="selectDate(day)" @click="selectDate(day)"
> >
<div class="flex justify-between p-1"> <div class="flex justify-between p-1">
@ -177,12 +204,21 @@ const isDateSelected = (date: Date) => {
</NcButton> </NcButton>
<span class="px-1 py-2">{{ dayjs(day).format('DD') }}</span> <span class="px-1 py-2">{{ dayjs(day).format('DD') }}</span>
</div> </div>
<div
v-if="
recordsToDisplay.count[dayjs(day).format('YYYY-MM-DD')] &&
recordsToDisplay.count[dayjs(day).format('YYYY-MM-DD')]?.overflow
"
class="text-xs absolute bottom-2 text-center inset-x-0 text-gray-500"
>
+ {{ recordsToDisplay.count[dayjs(day).format('YYYY-MM-DD')]?.overflowCount }} more
</div>
</div> </div>
</div> </div>
</div> </div>
<div class="absolute inset-0 pointer-events-none mt-8 pb-7.5"> <div class="absolute inset-0 pointer-events-none mt-8 pb-7.5">
<div <div
v-for="(record, recordIndex) in recordsToDisplay" v-for="(record, recordIndex) in recordsToDisplay.records"
:key="recordIndex" :key="recordIndex"
:style="record.rowMeta.style" :style="record.rowMeta.style"
class="absolute pointer-events-auto" class="absolute pointer-events-auto"

Loading…
Cancel
Save