@@ -336,18 +338,22 @@ export default function Events({
new Date() &&
+ : new Date(event.start_date + event.duration) >
+ new Date() &&
new Date(event.start_date) < new Date()
? 'bg-green-500'
: 'bg-yellow-500'
}`}
/>
- {new Date(event.end_date) < new Date()
+ {new Date(event.start_date + event.duration) <
+ new Date()
? t('event.ended')
- : new Date(event.end_date) > new Date() &&
+ : new Date(event.start_date + event.duration) >
+ new Date() &&
new Date(event.start_date) < new Date()
? t('event.ongoing')
: t('event.upcoming')}
diff --git a/frontend/src/app/i18n/locales/en/bulletin.json b/frontend/src/app/i18n/locales/en/bulletin.json
index 09213718..752045d3 100644
--- a/frontend/src/app/i18n/locales/en/bulletin.json
+++ b/frontend/src/app/i18n/locales/en/bulletin.json
@@ -11,8 +11,16 @@
"event.form.language": "Language",
"event.form.date": "Date",
"event.form.start_time": "Start Time",
- "event.form.end_time": "End Time",
+ "event.form.duration": "Duration (minutes)",
"event.form.repeats": "Repeats",
+ "event.form.daily": "Daily",
+ "event.form.weekly": "Weekly",
+ "event.form.monthly": "Monthly",
+ "event.form.yearly": "Yearly",
+ "event.form.frequency": "Frequency",
+ "event.form.select_frequency": "Select Frequency",
+ "event.form.end_date": "End Date",
+ "event.form.max_occurrences": "Max Occurrences",
"event.form.location": "Location",
"event.form.bg_color": "Background Colour",
"event.form.preset_colors": "Preset Colours",
diff --git a/frontend/src/app/i18n/locales/sv/bulletin.json b/frontend/src/app/i18n/locales/sv/bulletin.json
index 5dc3f107..d7d1232a 100644
--- a/frontend/src/app/i18n/locales/sv/bulletin.json
+++ b/frontend/src/app/i18n/locales/sv/bulletin.json
@@ -11,8 +11,16 @@
"event.form.language": "Språk",
"event.form.date": "Datum",
"event.form.start_time": "Start Tid",
- "event.form.end_time": "Avslutnings Tid",
+ "event.form.duration": "Varaktighet (minuter)",
"event.form.repeats": "Upprepas",
+ "event.form.daily": "Dagligen",
+ "event.form.weekly": "Veckovis",
+ "event.form.monthly": "Månadsvis",
+ "event.form.yearly": "Årligen",
+ "event.form.frequency": "Frekvens",
+ "event.form.select_frequency": "Välj Frekvens",
+ "event.form.end_date": "Avslutnings Datum",
+ "event.form.max_occurrences": "Max Förekomster",
"event.form.location": "Plats",
"event.form.bg_color": "Bakgrundsfärg",
"event.form.preset_colors": "Utvalda Färger",
diff --git a/frontend/src/components/calendar/Calendar.tsx b/frontend/src/components/calendar/Calendar.tsx
index ae409f87..3d9b1201 100644
--- a/frontend/src/components/calendar/Calendar.tsx
+++ b/frontend/src/components/calendar/Calendar.tsx
@@ -1,9 +1,5 @@
import { Event } from '@/models/Items'
import {
- startOfMonth,
- subWeeks,
- startOfWeek,
- addDays,
getDaysInMonth,
setDate,
addMonths,
@@ -13,7 +9,7 @@ import {
} from 'date-fns'
import { useCalendar } from '@/providers/CalendarProvider'
import './calendar.css'
-import { useEffect, useMemo } from 'react'
+import { useMemo } from 'react'
import EventComponent from './EventComponent'
interface CalendarProps {
@@ -28,20 +24,29 @@ interface CalendarProps {
* @param {Date} currentDate - The current date.
* @return {Date[]} An array of dates representing the last week of the previous month adjusted to include only dates that are before the start of the current month.
*/
-function getPreviousMonthsLastWeekAdjusted(currentDate: Date): Date[] {
- const startOfCurrentMonth = startOfMonth(currentDate)
+function getPreviousMonthLastWeekToCurrent(date: Date): Date[] {
+ const firstDayOfCurrentMonth = new Date(
+ date.getFullYear(),
+ date.getMonth(),
+ 1
+ )
+ const lastDayOfPreviousMonth = new Date(firstDayOfCurrentMonth)
+ lastDayOfPreviousMonth.setDate(0)
+
+ const result: Date[] = []
+ let currentDay = new Date(lastDayOfPreviousMonth)
- const lastWeekOfPreviousMonthEnd = subWeeks(startOfCurrentMonth, 0)
- const lastWeekOfPreviousMonthStart = startOfWeek(lastWeekOfPreviousMonthEnd)
+ // Go back to the Monday (or first day of the week) of the last week
+ const daysToSubtract = (currentDay.getDay() + 6) % 7
+ currentDay.setDate(currentDay.getDate() - daysToSubtract)
- let lastWeekAdjusted = []
- for (let i = 1; i <= 5; i++) {
- const date = addDays(lastWeekOfPreviousMonthStart, i)
- if (date < startOfCurrentMonth) {
- lastWeekAdjusted.push(date)
- }
+ // Add days until we reach the first day of the current month
+ while (currentDay < firstDayOfCurrentMonth) {
+ result.push(new Date(currentDay))
+ currentDay.setDate(currentDay.getDate() + 1)
}
- return lastWeekAdjusted
+
+ return result
}
/**
@@ -64,11 +69,9 @@ const sortEvents = (events: Event[]): Event[] =>
* @return {Event[]} The filtered list of events for the given date.
*/
const filterEventsForDate = (events: Event[], date: Date): Event[] =>
- events.filter(
- (event) =>
- isSameMonth(new Date(event.start_date), date) &&
- isSameDay(new Date(event.start_date), date)
- )
+ events.filter((event) => {
+ return isSameDay(new Date(event.start_date), date)
+ })
function displayEvents(
events: Event[],
@@ -90,14 +93,14 @@ function displayEvents(
}
export default function Calendar({
- onDateClickCallback = () => {},
- onEventClickCallback = () => {},
+ onDateClickCallback = (date: Date) => {},
+ onEventClickCallback = (event: Event) => {},
children,
}: CalendarProps) {
const { date, selectedDate, setSelectedDate, events } = useCalendar()
const totalDays = useMemo(() => getDaysInMonth(new Date(date)), [date])
const previousMonthLastWeek = useMemo(
- () => getPreviousMonthsLastWeekAdjusted(new Date(date)),
+ () => getPreviousMonthLastWeekToCurrent(date),
[date]
)
@@ -163,8 +166,12 @@ export default function Calendar({
isSameMonth(new Date(), date)
? 'text-red-400'
: 'text-neutral-400'
- }
- `}
+ }`}
+ onClick={(e) => {
+ e.stopPropagation()
+ setSelectedDate(new Date(setDate(date, index + 1)))
+ onDateClickCallback(new Date(setDate(date, index + 1)))
+ }}
>
{
- e.stopPropagation()
- setSelectedDate(new Date(setDate(date, index + 1)))
- onDateClickCallback(new Date(setDate(date, index + 1)))
- }}
/>
{displayEvents(
@@ -212,7 +214,7 @@ export default function Calendar({