diff --git a/packages/ui/src/components/calendar/DayCalendar.svelte b/packages/ui/src/components/calendar/DayCalendar.svelte index bd0e786f00..029c12cd3f 100644 --- a/packages/ui/src/components/calendar/DayCalendar.svelte +++ b/packages/ui/src/components/calendar/DayCalendar.svelte @@ -101,20 +101,20 @@ let maxHeightAD: number = 0 let shownHeightAD: number = 0 let shownAD: boolean = false - let shortAlldays: { id: string; day: number }[] = [] + let shortAlldays: { id: string; day: number; fixRow?: boolean }[] = [] let moreCounts: number[] = Array(displayedDaysCount) $: if (newEvents !== events) { + newEvents = events grid = new Array(displayedDaysCount) alldaysGrid = new Array(displayedDaysCount) - newEvents = events alldays = [] shortAlldays = [] moreCounts = new Array(displayedDaysCount) - prepareAllDays() if (shownAD && adMaxRow <= maxAD) shownAD = false + prepareAllDays() } - $: minimizedAD = maxHeightAD === minHeightAD + $: minimizedAD = maxHeightAD === minHeightAD && maxHeightAD !== 0 $: newEvents .filter((ev) => !ev.allDay) .forEach((event, i, arr) => { @@ -232,8 +232,13 @@ } } else if (alldaysGrid[d].alldays[r] === null) { tempEventID = '' - if (filtered.length > 0) moreCounts[d] = filtered.length - else moreCounts[d] = 0 + if (filtered.length > 1) moreCounts[d] = filtered.length + else { + if (filtered.length === 1 && filtered[0] !== null) { + shortAlldays.push({ id: filtered[0], day: d, fixRow: true }) + } + moreCounts[d] = 0 + } } else if (alldaysGrid[d].alldays[r] === tempEventID) { if (filtered.length > 0) { tempEventID = '' @@ -263,14 +268,17 @@ const getRect = ( event: CalendarItem - ): { top: number; bottom: number; left: number; right: number; width: number } => { - const result = { top: 0, bottom: 0, left: 0, right: 0, width: 0 } + ): { top: number; bottom: number; left: number; right: number; width: number; visibility: number } => { + const result = { top: 0, bottom: 0, left: 0, right: 0, width: 0, visibility: 1 } const checkDate = new Date(currentDate.getTime() + MILLISECONDS_IN_DAY * event.day) - const startDay = checkDate.setHours(startHour, 0, 0) - const endDay = checkDate.setHours(displayedHours - 1, 59, 59) + const startDay = checkDate.setHours(startHour, 0, 0, 0) + const endDay = checkDate.setHours(displayedHours - 1, 59, 59, 999) const startTime = event.date < startDay ? { hours: 0, mins: 0 } : convertToTime(event.date) const endTime = event.dueDate > endDay ? { hours: displayedHours - startHour, mins: 0 } : convertToTime(event.dueDate) + if (getDay(weekMonday, event.day).setHours(endTime.hours, endTime.mins, 0, 0) <= todayDate.getTime()) { + result.visibility = 0 + } result.top = rem(3.5) + styleAD + @@ -301,13 +309,30 @@ (cols - index - 1) * rem(0.125) return result } - const getADRect = (id: string, day?: number): { top: number; left: number; width: number; fit: boolean } => { - const result = { top: 0, left: 0, width: 0, fit: true } + const getADRect = ( + id: string, + day?: number, + fixRow?: boolean + ): { top: number; left: number; width: number; height: number; fit: boolean; visibility: number } => { + const result = { top: 0, left: 0, width: 0, height: rem(heightAD), fit: true, visibility: 1 } const index = adRows.findIndex((ev) => ev.id === id) + + const checkTime = new Date().setHours(0, 0, 0, 0) + const startEvent = getDay(weekMonday, typeof day !== 'undefined' ? day : adRows[index].startCol).getTime() + const endEvent = getDay(weekMonday, adRows[index].endCol).setHours(24) + if (endEvent <= checkTime) result.visibility = 0 + else if (startEvent <= checkTime && endEvent > checkTime) { + const eventTime = endEvent - startEvent + const remained = endEvent - checkTime + const proc = remained / eventTime + result.visibility = proc + } + const shown = minimizedAD ? minAD : maxAD - const lastRow = adRows[index].row === shown - 1 + const row = fixRow ? shown - 1 : adRows[index].row + const lastRow = row === shown - 1 const fitting = !shownAD && lastRow && typeof day !== 'undefined' - result.top = rem(0.125 + adRows[index].row * (heightAD + 0.125)) + result.top = rem(0.125 + row * (heightAD + 0.125)) if (fitting) { result.left = rem(0.125) + day * (colWidth + 0.125) if (day < adRows[index].endCol) { @@ -318,7 +343,7 @@ } else if (d === adRows[index].endCol) result.width = colWidth + colWidth * (d - day) - rem(0.25) } } else result.width = colWidth - rem(0.25) - } else if (fitting && (adRows[index].row > shown - 1 || (lastRow && moreCounts[day] > 0))) { + } else if (fitting && (row > shown - 1 || (lastRow && moreCounts[day] > 0))) { result.fit = false } else { result.left = rem(0.125) + adRows[index].startCol * (colWidth + 0.125) @@ -327,6 +352,11 @@ } return result } + const getMask = (visibility: number): string => { + return visibility === 0 || visibility === 1 + ? 'none' + : `linear-gradient(-90deg, rgba(0, 0, 0, 1) ${visibility * 100}%, rgba(0, 0, 0, .4) ${visibility * 100}%)` + } const getMore = (day: number): { top: number; left: number; width: number } => { const result = { top: 0, left: 0, width: 0 } const lastRow = (minimizedAD ? minAD : maxAD) - 1 @@ -398,78 +428,85 @@