137 lines
No EOL
5.3 KiB
Text
137 lines
No EOL
5.3 KiB
Text
@{
|
|
ViewData["Title"] = "Lawn Care Calendar";
|
|
}
|
|
|
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
<h1>@ViewData["Title"]</h1>
|
|
<a asp-action="Create" asp-controller="LawnCareEvents" class="btn btn-primary">
|
|
<i class="bi bi-plus-circle-fill"></i> Create New Event
|
|
</a>
|
|
</div>
|
|
|
|
<div class="calendar-container">
|
|
<div class="calendar-header">
|
|
<button id="prevMonth" class="btn btn-secondary">< Prev</button>
|
|
<h2 id="currentMonthYear"></h2>
|
|
<button id="nextMonth" class="btn btn-secondary">Next ></button>
|
|
</div>
|
|
<div class="calendar-grid">
|
|
<div class="day-name">Sun</div>
|
|
<div class="day-name">Mon</div>
|
|
<div class="day-name">Tue</div>
|
|
<div class="day-name">Wed</div>
|
|
<div class="day-name">Thu</div>
|
|
<div class="day-name">Fri</div>
|
|
<div class="day-name">Sat</div>
|
|
</div>
|
|
<div id="calendarDays" class="calendar-grid">
|
|
|
|
</div>
|
|
</div>
|
|
|
|
@section Scripts {
|
|
<script src="~/lib/jquery/dist/jquery.min.js"></script>
|
|
<script type="text/javascript">
|
|
$(document).ready(function () {
|
|
const calendarDaysEl = $('#calendarDays');
|
|
const currentMonthYearEl = $('#currentMonthYear');
|
|
const prevMonthBtn = $('#prevMonth');
|
|
const nextMonthBtn = $('#nextMonth');
|
|
|
|
let currentMonth = new Date().getMonth();
|
|
let currentYear = new Date().getFullYear();
|
|
let allEvents = [];
|
|
|
|
function renderCalendar(month, year) {
|
|
calendarDaysEl.empty();
|
|
currentMonthYearEl.text(new Date(year, month).toLocaleString('default', { month: 'long', year: 'numeric' }));
|
|
|
|
const firstDayOfMonth = new Date(year, month, 1);
|
|
const lastDayOfMonth = new Date(year, month + 1, 0);
|
|
const daysInMonth = lastDayOfMonth.getDate();
|
|
|
|
const startDayOfWeek = firstDayOfMonth.getDay();
|
|
|
|
const prevMonthLastDay = new Date(year, month, 0).getDate();
|
|
for (let i = startDayOfWeek; i > 0; i--) {
|
|
const dayNum = prevMonthLastDay - i + 1;
|
|
calendarDaysEl.append(`<div class="calendar-day other-month"><span class="day-number">${dayNum}</span></div>`);
|
|
}
|
|
|
|
for (let day = 1; day <= daysInMonth; day++) {
|
|
const date = new Date(year, month, day);
|
|
const dateString = date.toISOString().split('T')[0];
|
|
|
|
let dayHtml = `<div class="calendar-day" data-date="${dateString}">`;
|
|
dayHtml += `<span class="day-number">${day}</span>`;
|
|
|
|
const eventsOnThisDay = allEvents.filter(event => event.start === dateString);
|
|
|
|
eventsOnThisDay.forEach(event => {
|
|
const typeClass = event.title.split(' ')[0].toLowerCase().replace(/[^a-z0-9]/g, '');
|
|
dayHtml += `<div class="event-indicator ${typeClass}" data-event-id="${event.id}" data-event-url="${event.url}">${event.title}</div>`;
|
|
});
|
|
|
|
dayHtml += `</div>`;
|
|
calendarDaysEl.append(dayHtml);
|
|
}
|
|
|
|
const totalDaysDisplayed = startDayOfWeek + daysInMonth;
|
|
const remainingCells = 42 - totalDaysDisplayed;
|
|
for (let i = 1; i <= remainingCells && totalDaysDisplayed + i <= 42; i++) {
|
|
calendarDaysEl.append(`<div class="calendar-day other-month"><span class="day-number">${i}</span></div>`);
|
|
}
|
|
|
|
$('.calendar-day .event-indicator').on('click', function (e) {
|
|
e.stopPropagation();
|
|
const url = $(this).data('event-url');
|
|
if (url) {
|
|
window.location.href = url;
|
|
}
|
|
});
|
|
|
|
$('.calendar-day:not(.other-month)').on('click', function () {
|
|
const date = $(this).data('date');
|
|
window.location.href = `/LawnCareEvents/Create?date=${date}`;
|
|
});
|
|
}
|
|
|
|
async function fetchEvents() {
|
|
try {
|
|
const response = await fetch('/LawnCareEvents/GetEventsJson');
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! status: ${response.status}`);
|
|
}
|
|
allEvents = await response.json();
|
|
renderCalendar(currentMonth, currentYear);
|
|
} catch (error) {
|
|
console.error('Error fetching events:', error);
|
|
}
|
|
}
|
|
|
|
prevMonthBtn.on('click', function () {
|
|
currentMonth--;
|
|
if (currentMonth < 0) {
|
|
currentMonth = 11;
|
|
currentYear--;
|
|
}
|
|
renderCalendar(currentMonth, currentYear);
|
|
});
|
|
|
|
nextMonthBtn.on('click', function () {
|
|
currentMonth++;
|
|
if (currentMonth > 11) {
|
|
currentMonth = 0;
|
|
currentYear++;
|
|
}
|
|
renderCalendar(currentMonth, currentYear);
|
|
});
|
|
|
|
fetchEvents();
|
|
});
|
|
</script>
|
|
}
|
|
|
|
@section Styles {
|
|
<link href="~/css/calendar.css" rel="stylesheet" asp-append-version="true" />
|
|
} |