diff --git a/package-lock.json b/package-lock.json index 6871cca..2fc774e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "kener", - "version": "3.2.15", + "version": "3.2.19", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "kener", - "version": "3.2.15", + "version": "3.2.19", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.10", diff --git a/src/lib/server/controllers/controller.js b/src/lib/server/controllers/controller.js index 31ab69e..13069a0 100644 --- a/src/lib/server/controllers/controller.js +++ b/src/lib/server/controllers/controller.js @@ -279,7 +279,7 @@ export const SystemDataMessage = async () => { upsPercentage, degradedPercentage, downsPercentage, - maintenancePercentage + maintenancePercentage, }; }; @@ -1530,10 +1530,10 @@ export const GetSiteMap = async (cookies) => { } //get today's date in January-2025 format date-fns - const today = format(new Date(), "MMMM-yyyy"); + const today = format(new Date(), "LLLL-yyyy"); //last month - const lastMonth = format(subMonths(new Date(), 1), "MMMM-yyyy", { addMonths: -1 }); - const nextMonth = format(addMonths(new Date(), 1), "MMMM-yyyy", { addMonths: -1 }); + const lastMonth = format(subMonths(new Date(), 1), "LLLL-yyyy", { addMonths: -1 }); + const nextMonth = format(addMonths(new Date(), 1), "LLLL-yyyy", { addMonths: -1 }); siteMapData.push({ url: siteURLData + "/incidents/" + today, diff --git a/src/routes/(kener)/+page.svelte b/src/routes/(kener)/+page.svelte index dc197f3..bec9530 100644 --- a/src/routes/(kener)/+page.svelte +++ b/src/routes/(kener)/+page.svelte @@ -302,7 +302,7 @@ id="" > diff --git a/src/routes/(kener)/incidents/+page.server.js b/src/routes/(kener)/incidents/+page.server.js index 7b727f5..508049d 100644 --- a/src/routes/(kener)/incidents/+page.server.js +++ b/src/routes/(kener)/incidents/+page.server.js @@ -5,5 +5,5 @@ import { base } from "$app/paths"; import { format } from "date-fns"; export async function load({ parent, url }) { - throw redirect(302, base + "/incidents/" + format(new Date(), "MMMM-yyyy")); + throw redirect(302, base + "/incidents/" + format(new Date(), "LLLL-yyyy")); } diff --git a/src/routes/(kener)/incidents/[month]/+page.server.js b/src/routes/(kener)/incidents/[month]/+page.server.js index 24e7bf4..94418e9 100644 --- a/src/routes/(kener)/incidents/[month]/+page.server.js +++ b/src/routes/(kener)/incidents/[month]/+page.server.js @@ -3,8 +3,11 @@ import { GetMonitors, GetIncidentsPage, GetLocaleFromCookie } from "$lib/server/controllers/controller.js"; import { BeginningOfDay } from "$lib/server/tool.js"; import db from "$lib/server/db/db.js"; -import { format, addDays, subDays, parse, getUnixTime, startOfMonth, endOfMonth } from "date-fns"; +import { format, addDays, subDays, parse, getUnixTime, startOfMonth, endOfMonth, addMonths, getYear } from "date-fns"; import { f } from "$lib/i18n/client"; +import { error } from "@sveltejs/kit"; + +const MIN_YEAR = 2023; export async function load({ parent, url, params, cookies }) { const parentData = await parent(); @@ -15,10 +18,33 @@ export async function load({ parent, url, params, cookies }) { let month = params.month; //January-2021 if (!!!month) { - month = format(new Date(), "MMMM-yyyy"); + month = format(new Date(), "LLLL-yyyy"); } - let monthStart = startOfMonth(parse(month, "MMMM-yyyy", new Date())); - let monthEnd = endOfMonth(parse(month, "MMMM-yyyy", new Date())); + + let parsedDate; + try { + parsedDate = parse(month, "LLLL-yyyy", new Date()); + if (isNaN(parsedDate.getTime())) { + throw error(404, "Invalid date format"); + } + } catch (e) { + throw error(404, "Invalid date format"); + } + + const year = getYear(parsedDate); + const currentDate = new Date(); + const maxDate = addMonths(currentDate, 12); + const maxYear = getYear(maxDate); + + if (year < MIN_YEAR || year > maxYear) { + throw error(404, "Date out of allowed range"); + } + + if (year === maxYear && parsedDate > maxDate) { + throw error(404, "Date out of allowed range"); + } + let monthStart = startOfMonth(parse(month, "LLLL-yyyy", new Date())); + let monthEnd = endOfMonth(parse(month, "LLLL-yyyy", new Date())); let nextMonth = addDays(monthEnd, 1); let prevMonth = subDays(monthStart, 1); @@ -58,14 +84,24 @@ export async function load({ parent, url, params, cookies }) { return incident; }); + const prevMonthDate = subDays(monthStart, 1); + const nextMonthDate = addDays(monthEnd, 1); + + const minDate = new Date(MIN_YEAR, 0, 1); + + const showPrevButton = prevMonthDate >= minDate; + const showNextButton = nextMonthDate <= maxDate; + return { incidents: incidents, - nextMonthName: f(new Date(midnightNextMonthUTCTimestamp * 1000), "MMMM-yyyy", "en", parentData.localTz), - prevMonthName: f(new Date(midnightPrevMonthUTCTimestamp * 1000), "MMMM-yyyy", "en", parentData.localTz), - thisMonthName: f(monthEnd, "MMMM-yyyy", "en", parentData.localTz), + nextMonthName: f(new Date(midnightNextMonthUTCTimestamp * 1000), "LLLL-yyyy", "en", parentData.localTz), + prevMonthName: f(new Date(midnightPrevMonthUTCTimestamp * 1000), "LLLL-yyyy", "en", parentData.localTz), + thisMonthName: f(monthEnd, "LLLL-yyyy", "en", parentData.localTz), canonical: siteData.siteURL + "/incidents/" + month, midnightNextMonthUTCTimestamp: midnightNextMonthUTCTimestamp, midnightPrevMonthUTCTimestamp: midnightPrevMonthUTCTimestamp, midnightMonthStartUTCTimestamp: midnightMonthStartUTCTimestamp + 86400, + showPrevButton: showPrevButton, + showNextButton: showNextButton, }; } diff --git a/src/routes/(kener)/incidents/[month]/+page.svelte b/src/routes/(kener)/incidents/[month]/+page.svelte index 1ca1753..61d63fa 100644 --- a/src/routes/(kener)/incidents/[month]/+page.svelte +++ b/src/routes/(kener)/incidents/[month]/+page.svelte @@ -47,13 +47,13 @@ }); //sort the incidentSmartDates ascending - let sortedIncidentSmartDates = Object.keys(incidentSmartDates).sort((a, b) => a - b); + let sortedIncidentSmartDates = Object.keys(incidentSmartDates).sort((a, b) => parseInt(a) - parseInt(b)); let canonical = data.canonical; - {f(parse(data.thisMonthName, "MMMM-yyyy", new Date()), "MMMM, yyyy", selectedLang, $page.data.localTz)} + {f(parse(data.thisMonthName, "LLLL-yyyy", new Date()), "LLLL, yyyy", selectedLang, $page.data.localTz)} {l(data.lang, "Incident Updates")} | {data.site.title} @@ -62,7 +62,7 @@ content="{l(data.lang, 'Incident Updates')} | {l(data.lang, 'Recent Incidents')} | {l( data.lang, 'Recent Maintenances' - )} {f(parse(data.thisMonthName, 'MMMM-yyyy', new Date()), 'MMMM, yyyy', selectedLang, $page.data.localTz)} | + )} {f(parse(data.thisMonthName, 'LLLL-yyyy', new Date()), 'LLLL, yyyy', selectedLang, $page.data.localTz)} | {data.site.title}" /> @@ -85,7 +85,7 @@

- {f(new Date(data.midnightMonthStartUTCTimestamp * 1000), "MMMM, yyyy", selectedLang, $page.data.localTz)} + {f(new Date(data.midnightMonthStartUTCTimestamp * 1000), "LLLL, yyyy", selectedLang, $page.data.localTz)}

{l(data.lang, "Incident Updates")} @@ -109,7 +109,7 @@ {l(data.lang, "No Incident in %date", { date: f( new Date(data.midnightMonthStartUTCTimestamp * 1000), - "MMMM, yyyy", + "LLLL, yyyy", selectedLang, $page.data.localTz ) @@ -120,7 +120,7 @@ {#each sortedIncidentSmartDates as date}

- {f(new Date(date * 1000), "EEEE, MMMM do", data.selectedLang, $page.data.localTz)} + {f(new Date(parseInt(date) * 1000), "EEEE, MMMM do", data.selectedLang, $page.data.localTz)}
{#if incidentSmartDates[date].length === 0}
@@ -129,7 +129,7 @@ {/if} {#each incidentSmartDates[date] as incident, index}
- +
{/each}
@@ -137,27 +137,35 @@
- - + {#if data.showPrevButton} + + {:else} +
+ {/if} + {#if data.showNextButton} + + {:else} +
+ {/if}